43 |
43 |
|
44 |
44 |
static void add_usage(const char *name)
|
45 |
45 |
{
|
46 |
|
printf("%s add <gtp device> <v0> <tid> <ms-addr> <sgsn-addr>\n",
|
|
46 |
printf("%s add <gtp device> <v0> <tid> <family> <ms-addr> <sgsn-addr>\n",
|
47 |
47 |
name);
|
48 |
|
printf("%s add <gtp device> <v1> <i_tei> <o_tei> <ms-addr> <sgsn-addr>\n",
|
|
48 |
printf("%s add <gtp device> <v1> <i_tei> <o_tei> <family> <ms-addr> <sgsn-addr>\n",
|
49 |
49 |
name);
|
50 |
50 |
}
|
51 |
51 |
|
52 |
52 |
static int
|
53 |
53 |
add_tunnel(int argc, char *argv[], int genl_id, struct mnl_socket *nl)
|
54 |
54 |
{
|
|
55 |
union {
|
|
56 |
struct in_addr addr;
|
|
57 |
struct in6_addr addr6;
|
|
58 |
} ms;
|
|
59 |
union {
|
|
60 |
struct in_addr addr;
|
|
61 |
struct in6_addr addr6;
|
|
62 |
} sgsn;
|
55 |
63 |
struct gtp_tunnel *t;
|
56 |
|
uint32_t gtp_ifidx;
|
57 |
|
struct in_addr ms, sgsn;
|
58 |
64 |
uint32_t gtp_version;
|
59 |
|
int optidx;
|
|
65 |
uint32_t gtp_ifidx;
|
|
66 |
int optidx, family;
|
60 |
67 |
|
61 |
|
if (argc < 7 || argc > 8) {
|
|
68 |
if (argc < 8 || argc > 9) {
|
62 |
69 |
add_usage(argv[0]);
|
63 |
70 |
return EXIT_FAILURE;
|
64 |
71 |
}
|
... | ... | |
95 |
102 |
gtp_tunnel_set_o_tei(t, atoi(argv[optidx++]));
|
96 |
103 |
}
|
97 |
104 |
|
98 |
|
if (inet_aton(argv[optidx++], &ms) < 0) {
|
99 |
|
perror("bad address for ms");
|
|
105 |
if (!strcmp(argv[optidx], "ip")) {
|
|
106 |
family = AF_INET;
|
|
107 |
} else if (!strcmp(argv[optidx], "ip6")) {
|
|
108 |
family = AF_INET6;
|
|
109 |
} else {
|
|
110 |
fprintf(stderr, "wrong family `%s', expecting `ip' or `ip6'\n", argv[optidx]);
|
|
111 |
return EXIT_FAILURE;
|
|
112 |
}
|
|
113 |
|
|
114 |
gtp_tunnel_set_family(t, family);
|
|
115 |
|
|
116 |
optidx++;
|
|
117 |
|
|
118 |
if (inet_pton(family, argv[optidx++], &ms) <= 0) {
|
|
119 |
fprintf(stderr, "bad address for ms\n");
|
100 |
120 |
exit(EXIT_FAILURE);
|
101 |
121 |
}
|
102 |
|
gtp_tunnel_set_ms_ip4(t, &ms);
|
103 |
122 |
|
104 |
|
if (inet_aton(argv[optidx++], &sgsn) < 0) {
|
105 |
|
perror("bad address for sgsn");
|
|
123 |
switch (family) {
|
|
124 |
case AF_INET:
|
|
125 |
gtp_tunnel_set_ms_ip4(t, &ms.addr);
|
|
126 |
break;
|
|
127 |
case AF_INET6:
|
|
128 |
gtp_tunnel_set_ms_ip6(t, &ms.addr6);
|
|
129 |
break;
|
|
130 |
}
|
|
131 |
|
|
132 |
if (inet_pton(family, argv[optidx++], &sgsn) <= 0) {
|
|
133 |
fprintf(stderr, "bad address for sgsn\n");
|
106 |
134 |
exit(EXIT_FAILURE);
|
107 |
135 |
}
|
108 |
|
gtp_tunnel_set_sgsn_ip4(t, &sgsn);
|
|
136 |
|
|
137 |
switch (family) {
|
|
138 |
case AF_INET:
|
|
139 |
gtp_tunnel_set_sgsn_ip4(t, &sgsn.addr);
|
|
140 |
break;
|
|
141 |
case AF_INET6:
|
|
142 |
gtp_tunnel_set_sgsn_ip6(t, &sgsn.addr6);
|
|
143 |
break;
|
|
144 |
}
|
109 |
145 |
|
110 |
146 |
gtp_add_tunnel(genl_id, nl, t);
|
111 |
147 |
|