Bug #1952 » 0004-gtp-add-flags-to-gtp_tunnel-object.patch
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 | ||
---|---|---|
109 | 109 | |
110 | 110 |
optidx++; |
111 | 111 | |
112 |
if (gtp_version == GTP_V0) |
|
112 |
if (gtp_version == GTP_V0) {
|
|
113 | 113 |
gtp_tunnel_set_tid(t, atoi(argv[optidx++])); |
114 |
else if (gtp_version == GTP_V1) { |
|
114 |
gtp_tunnel_set_flowid(t, 0); |
|
115 |
} else if (gtp_version == GTP_V1) { |
|
115 | 116 |
gtp_tunnel_set_i_tei(t, atoi(argv[optidx++])); |
116 | 117 |
gtp_tunnel_set_o_tei(t, atoi(argv[optidx++])); |
117 | 118 |
} |