Project

General

Profile

Bug #1952 » 0004-gtp-add-flags-to-gtp_tunnel-object.patch

pablo, 01/31/2024 06:44 PM

View differences:

src/gtp-genl.c
44 44

  
45 45
static void gtp_build_payload(struct nlmsghdr *nlh, struct gtp_tunnel *t)
46 46
{
47
	mnl_attr_put_u8(nlh, GTPA_FAMILY, t->ms_addr.family);
48
	mnl_attr_put_u32(nlh, GTPA_VERSION, t->gtp_version);
49
	if (t->ifns >= 0)
47
	if (t->flags & GTP_TUN_FAMILY)
48
		mnl_attr_put_u8(nlh, GTPA_FAMILY, t->ms_addr.family);
49
	if (t->flags & GTP_TUN_VERSION)
50
		mnl_attr_put_u32(nlh, GTPA_VERSION, t->gtp_version);
51
	if (t->flags & GTP_TUN_IFNS)
50 52
		mnl_attr_put_u32(nlh, GTPA_NET_NS_FD, t->ifns);
51
	mnl_attr_put_u32(nlh, GTPA_LINK, t->ifidx);
52

  
53
	switch (t->ms_addr.family) {
54
	case AF_INET:
55
		mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ms_addr.ip4.s_addr);
56
		break;
57
	case AF_INET6:
58
		mnl_attr_put(nlh, GTPA_MS_ADDR6, sizeof(t->ms_addr.ip6), &t->ms_addr.ip6);
59
		break;
60
	default:
61
		/* No addr is set when deleting a tunnel */
62
		break;
53
	if (t->flags & GTP_TUN_IFIDX)
54
		mnl_attr_put_u32(nlh, GTPA_LINK, t->ifidx);
55

  
56
	if (t->flags & GTP_TUN_MS_ADDR) {
57
		switch (t->ms_addr.family) {
58
		case AF_INET:
59
			mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ms_addr.ip4.s_addr);
60
			break;
61
		case AF_INET6:
62
			mnl_attr_put(nlh, GTPA_MS_ADDR6, sizeof(t->ms_addr.ip6), &t->ms_addr.ip6);
63
			break;
64
		default:
65
			/* No addr is set when deleting a tunnel */
66
			break;
67
		}
63 68
	}
64 69

  
65
	switch (t->sgsn_addr.family) {
66
	case AF_INET:
67
		mnl_attr_put_u32(nlh, GTPA_PEER_ADDRESS, t->sgsn_addr.ip4.s_addr);
68
		break;
69
	case AF_INET6:
70
		mnl_attr_put(nlh, GTPA_PEER_ADDR6, sizeof(t->sgsn_addr.ip6), &t->sgsn_addr.ip6);
71
		break;
72
	default:
73
		/* No addr is set when deleting a tunnel */
74
		break;
70
	if (t->flags & GTP_TUN_SGSN_ADDR) {
71
		switch (t->sgsn_addr.family) {
72
		case AF_INET:
73
			mnl_attr_put_u32(nlh, GTPA_PEER_ADDRESS, t->sgsn_addr.ip4.s_addr);
74
			break;
75
		case AF_INET6:
76
			mnl_attr_put(nlh, GTPA_PEER_ADDR6, sizeof(t->sgsn_addr.ip6), &t->sgsn_addr.ip6);
77
			break;
78
		default:
79
			/* No addr is set when deleting a tunnel */
80
			break;
81
		}
75 82
	}
76 83

  
77
	if (t->gtp_version == GTP_V0) {
78
		mnl_attr_put_u64(nlh, GTPA_TID, t->u.v0.tid);
79
		mnl_attr_put_u16(nlh, GTPA_FLOW, t->u.v0.flowid);
80
	} else if (t->gtp_version == GTP_V1) {
81
		mnl_attr_put_u32(nlh, GTPA_I_TEI, t->u.v1.i_tei);
82
		mnl_attr_put_u32(nlh, GTPA_O_TEI, t->u.v1.o_tei);
84
	if (t->flags & GTP_TUN_VERSION) {
85
		if (t->gtp_version == GTP_V0) {
86
			if (t->flags & GTP_TUN_V0_TID)
87
				mnl_attr_put_u64(nlh, GTPA_TID, t->u.v0.tid);
88
			if (t->flags & GTP_TUN_V0_FLOWID)
89
				mnl_attr_put_u16(nlh, GTPA_FLOW, t->u.v0.flowid);
90
		} else if (t->gtp_version == GTP_V1) {
91
			if (t->flags & GTP_TUN_V1_I_TEI)
92
				mnl_attr_put_u32(nlh, GTPA_I_TEI, t->u.v1.i_tei);
93
			if (t->flags & GTP_TUN_V1_O_TEI)
94
				mnl_attr_put_u32(nlh, GTPA_O_TEI, t->u.v1.o_tei);
95
		}
83 96
	}
84 97
}
85 98

  
src/gtp.c
49 49
void gtp_tunnel_set_ifns(struct gtp_tunnel *t, int ifns)
50 50
{
51 51
	t->ifns = ifns;
52
	t->flags |= GTP_TUN_IFNS;
52 53
}
53 54
EXPORT_SYMBOL(gtp_tunnel_set_ifns);
54 55

  
55 56
void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx)
56 57
{
57 58
	t->ifidx = ifidx;
59
	t->flags |= GTP_TUN_IFIDX;
58 60
}
59 61
EXPORT_SYMBOL(gtp_tunnel_set_ifidx);
60 62

  
61 63
void gtp_tunnel_set_family(struct gtp_tunnel *t, uint16_t family)
62 64
{
63 65
	t->ms_addr.family = family;
66
	t->flags |= GTP_TUN_FAMILY;
64 67
}
65 68
EXPORT_SYMBOL(gtp_tunnel_set_family);
66 69

  
......
68 71
{
69 72
	t->ms_addr.family = AF_INET;
70 73
	t->ms_addr.ip4 = *ms_addr;
74
	t->flags |= GTP_TUN_FAMILY | GTP_TUN_MS_ADDR;
71 75
}
72 76
EXPORT_SYMBOL(gtp_tunnel_set_ms_ip4);
73 77

  
......
75 79
{
76 80
	t->sgsn_addr.family = AF_INET;
77 81
	t->sgsn_addr.ip4 = *sgsn_addr;
82
	t->flags |= GTP_TUN_SGSN_ADDR;
78 83
}
79 84
EXPORT_SYMBOL(gtp_tunnel_set_sgsn_ip4);
80 85

  
......
82 87
{
83 88
	t->ms_addr.family = AF_INET6;
84 89
	t->ms_addr.ip6 = *ms_addr;
90
	t->flags |= GTP_TUN_FAMILY | GTP_TUN_MS_ADDR;
85 91
}
86 92
EXPORT_SYMBOL(gtp_tunnel_set_ms_ip6);
87 93

  
......
89 95
{
90 96
	t->sgsn_addr.family = AF_INET6;
91 97
	t->sgsn_addr.ip6 = *sgsn_addr;
98
	t->flags |= GTP_TUN_SGSN_ADDR;
92 99
}
93 100
EXPORT_SYMBOL(gtp_tunnel_set_sgsn_ip6);
94 101

  
95 102
void gtp_tunnel_set_version(struct gtp_tunnel *t, uint32_t version)
96 103
{
97 104
	t->gtp_version = version;
105
	t->flags |= GTP_TUN_VERSION;
98 106
}
99 107
EXPORT_SYMBOL(gtp_tunnel_set_version);
100 108

  
101 109
void gtp_tunnel_set_tid(struct gtp_tunnel *t, uint64_t tid)
102 110
{
103 111
	t->u.v0.tid = tid;
112
	t->flags |= GTP_TUN_V0_TID;
104 113
}
105 114
EXPORT_SYMBOL(gtp_tunnel_set_tid);
106 115

  
107 116
void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid)
108 117
{
109 118
	t->u.v0.flowid = flowid;
119
	t->flags |= GTP_TUN_V0_FLOWID;
110 120
}
111 121
EXPORT_SYMBOL(gtp_tunnel_set_flowid);
112 122

  
113 123
void gtp_tunnel_set_i_tei(struct gtp_tunnel *t, uint32_t i_tei)
114 124
{
115 125
	t->u.v1.i_tei = i_tei;
126
	t->flags |= GTP_TUN_V1_I_TEI;
116 127
}
117 128
EXPORT_SYMBOL(gtp_tunnel_set_i_tei);
118 129

  
119 130
void gtp_tunnel_set_o_tei(struct gtp_tunnel *t, uint32_t o_tei)
120 131
{
121 132
	t->u.v1.o_tei = o_tei;
133
	t->flags |= GTP_TUN_V1_O_TEI;
122 134
}
123 135
EXPORT_SYMBOL(gtp_tunnel_set_o_tei);
124 136

  
src/internal.h
20 20
	};
21 21
};
22 22

  
23
enum {
24
	GTP_TUN_IFNS		= (1 << 0),
25
	GTP_TUN_IFIDX		= (1 << 1),
26
	GTP_TUN_FAMILY		= (1 << 2),
27
	GTP_TUN_MS_ADDR		= (1 << 3),
28
	GTP_TUN_SGSN_ADDR	= (1 << 4),
29
	GTP_TUN_VERSION		= (1 << 5),
30
	GTP_TUN_V0_TID		= (1 << 6),
31
	GTP_TUN_V0_FLOWID	= (1 << 7),
32
	GTP_TUN_V1_I_TEI	= (1 << 8),
33
	GTP_TUN_V1_O_TEI	= (1 << 9),
34
};
35

  
23 36
struct gtp_tunnel {
24 37
	int             ifns;
25 38
	uint32_t	ifidx;
......
36 49
			uint32_t o_tei;
37 50
		} v1;
38 51
	} u;
52
	uint32_t	flags;
39 53
};
40 54

  
41 55
#endif
tools/gtp-tunnel.c
108 108

  
109 109
	optidx++;
110 110

  
111
	if (gtp_version == GTP_V0)
111
	if (gtp_version == GTP_V0) {
112 112
		gtp_tunnel_set_tid(t, atoi(argv[optidx++]));
113
	else if (gtp_version == GTP_V1) {
113
		gtp_tunnel_set_flowid(t, 0);
114
	} else if (gtp_version == GTP_V1) {
114 115
		gtp_tunnel_set_i_tei(t, atoi(argv[optidx++]));
115 116
		gtp_tunnel_set_o_tei(t, atoi(argv[optidx++]));
116 117
	}
(20-20/33)
Add picture from clipboard (Maximum size: 48.8 MB)