summaryrefslogtreecommitdiff
path: root/networking/libiproute/iptunnel.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/libiproute/iptunnel.c')
-rw-r--r--networking/libiproute/iptunnel.c41
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 */
129static void parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p) 129static 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 */
520int do_iptunnel(int argc, char **argv) 520int 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;