diff options
Diffstat (limited to 'networking/libiproute/iptunnel.c')
-rw-r--r-- | networking/libiproute/iptunnel.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/networking/libiproute/iptunnel.c b/networking/libiproute/iptunnel.c index 90d0e1186..a2933879c 100644 --- a/networking/libiproute/iptunnel.c +++ b/networking/libiproute/iptunnel.c | |||
@@ -128,16 +128,13 @@ static int do_del_ioctl(const char *basedev, struct ip_tunnel_parm *p) | |||
128 | /* Dies on error */ | 128 | /* Dies on error */ |
129 | static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) | 129 | static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) |
130 | { | 130 | { |
131 | int count = 0; | 131 | static const char keywords[] = |
132 | char medium[IFNAMSIZ]; | 132 | "mode\0""ipip\0""ip/ip\0""gre\0""gre/ip\0""sit\0""ipv6/ip\0" |
133 | static const char * const keywords[] = { | 133 | "key\0""ikey\0""okey\0""seq\0""iseq\0""oseq\0" |
134 | "mode", "ipip", "ip/ip", "gre", "gre/ip", "sit", "ipv6/ip", | 134 | "csum\0""icsum\0""ocsum\0""nopmtudisc\0""pmtudisc\0" |
135 | "key", "ikey", "okey", "seq", "iseq", "oseq", | 135 | "remote\0""any\0""local\0""dev\0" |
136 | "csum", "icsum", "ocsum", "nopmtudisc", "pmtudisc", | 136 | "ttl\0""inherit\0""tos\0""dsfield\0" |
137 | "remote", "any", "local", "dev", | 137 | "name\0"; |
138 | "ttl", "inherit", "tos", "dsfield", | ||
139 | "name", NULL | ||
140 | }; | ||
141 | enum { | 138 | enum { |
142 | ARG_mode, ARG_ipip, ARG_ip_ip, ARG_gre, ARG_gre_ip, ARG_sit, ARG_ip6_ip, | 139 | ARG_mode, ARG_ipip, ARG_ip_ip, ARG_gre, ARG_gre_ip, ARG_sit, ARG_ip6_ip, |
143 | ARG_key, ARG_ikey, ARG_okey, ARG_seq, ARG_iseq, ARG_oseq, | 140 | ARG_key, ARG_ikey, ARG_okey, ARG_seq, ARG_iseq, ARG_oseq, |
@@ -146,22 +143,25 @@ static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) | |||
146 | ARG_ttl, ARG_inherit, ARG_tos, ARG_dsfield, | 143 | ARG_ttl, ARG_inherit, ARG_tos, ARG_dsfield, |
147 | ARG_name | 144 | ARG_name |
148 | }; | 145 | }; |
146 | int count = 0; | ||
147 | char medium[IFNAMSIZ]; | ||
149 | int key; | 148 | int key; |
149 | |||
150 | memset(p, 0, sizeof(*p)); | 150 | memset(p, 0, sizeof(*p)); |
151 | memset(&medium, 0, sizeof(medium)); | 151 | memset(&medium, 0, sizeof(medium)); |
152 | 152 | ||
153 | p->iph.version = 4; | 153 | p->iph.version = 4; |
154 | p->iph.ihl = 5; | 154 | p->iph.ihl = 5; |
155 | #ifndef IP_DF | 155 | #ifndef IP_DF |
156 | #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ | 156 | #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ |
157 | #endif | 157 | #endif |
158 | p->iph.frag_off = htons(IP_DF); | 158 | p->iph.frag_off = htons(IP_DF); |
159 | 159 | ||
160 | while (argc > 0) { | 160 | while (argc > 0) { |
161 | key = index_in_str_array(keywords, *argv); | 161 | key = index_in_strings(keywords, *argv); |
162 | if (key == ARG_mode) { | 162 | if (key == ARG_mode) { |
163 | NEXT_ARG(); | 163 | NEXT_ARG(); |
164 | key = index_in_str_array(keywords, *argv); | 164 | key = index_in_strings(keywords, *argv); |
165 | if (key == ARG_ipip || | 165 | if (key == ARG_ipip || |
166 | key == ARG_ip_ip) { | 166 | key == ARG_ip_ip) { |
167 | if (p->iph.protocol && p->iph.protocol != IPPROTO_IPIP) { | 167 | if (p->iph.protocol && p->iph.protocol != IPPROTO_IPIP) { |
@@ -240,12 +240,12 @@ static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) | |||
240 | p->iph.frag_off = htons(IP_DF); | 240 | p->iph.frag_off = htons(IP_DF); |
241 | } else if (key == ARG_remote) { | 241 | } else if (key == ARG_remote) { |
242 | NEXT_ARG(); | 242 | NEXT_ARG(); |
243 | key = index_in_str_array(keywords, *argv); | 243 | key = index_in_strings(keywords, *argv); |
244 | if (key == ARG_any) | 244 | if (key == ARG_any) |
245 | p->iph.daddr = get_addr32(*argv); | 245 | p->iph.daddr = get_addr32(*argv); |
246 | } else if (key == ARG_local) { | 246 | } else if (key == ARG_local) { |
247 | NEXT_ARG(); | 247 | NEXT_ARG(); |
248 | key = index_in_str_array(keywords, *argv); | 248 | key = index_in_strings(keywords, *argv); |
249 | if (key == ARG_any) | 249 | if (key == ARG_any) |
250 | p->iph.saddr = get_addr32(*argv); | 250 | p->iph.saddr = get_addr32(*argv); |
251 | } else if (key == ARG_dev) { | 251 | } else if (key == ARG_dev) { |
@@ -254,7 +254,7 @@ static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) | |||
254 | } else if (key == ARG_ttl) { | 254 | } else if (key == ARG_ttl) { |
255 | unsigned uval; | 255 | unsigned uval; |
256 | NEXT_ARG(); | 256 | NEXT_ARG(); |
257 | key = index_in_str_array(keywords, *argv); | 257 | key = index_in_strings(keywords, *argv); |
258 | if (key != ARG_inherit) { | 258 | if (key != ARG_inherit) { |
259 | if (get_unsigned(&uval, *argv, 0)) | 259 | if (get_unsigned(&uval, *argv, 0)) |
260 | invarg(*argv, "TTL"); | 260 | invarg(*argv, "TTL"); |
@@ -266,7 +266,7 @@ static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) | |||
266 | key == ARG_dsfield) { | 266 | key == ARG_dsfield) { |
267 | uint32_t uval; | 267 | uint32_t uval; |
268 | NEXT_ARG(); | 268 | NEXT_ARG(); |
269 | key = index_in_str_array(keywords, *argv); | 269 | key = index_in_strings(keywords, *argv); |
270 | if (key != ARG_inherit) { | 270 | if (key != ARG_inherit) { |
271 | if (rtnl_dsfield_a2n(&uval, *argv)) | 271 | if (rtnl_dsfield_a2n(&uval, *argv)) |
272 | invarg(*argv, "TOS"); | 272 | invarg(*argv, "TOS"); |
@@ -519,14 +519,13 @@ static int do_show(int argc, char **argv) | |||
519 | /* Return value becomes exitcode. It's okay to not return at all */ | 519 | /* Return value becomes exitcode. It's okay to not return at all */ |
520 | int do_iptunnel(int argc, char **argv) | 520 | int do_iptunnel(int argc, char **argv) |
521 | { | 521 | { |
522 | static const char *const keywords[] = { | 522 | static const char keywords[] = |
523 | "add", "change", "delete", "show", "list", "lst", NULL | 523 | "add\0""change\0""delete\0""show\0""list\0""lst\0"; |
524 | }; | ||
525 | enum { ARG_add = 0, ARG_change, ARG_del, ARG_show, ARG_list, ARG_lst }; | 524 | enum { ARG_add = 0, ARG_change, ARG_del, ARG_show, ARG_list, ARG_lst }; |
526 | int key; | 525 | int key; |
527 | 526 | ||
528 | if (argc) { | 527 | if (argc) { |
529 | key = index_in_substr_array(keywords, *argv); | 528 | key = index_in_substrings(keywords, *argv); |
530 | if (key < 0) | 529 | if (key < 0) |
531 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); | 530 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); |
532 | --argc; | 531 | --argc; |