aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/libiproute/iproute.c84
-rw-r--r--networking/libiproute/iprule.c1
2 files changed, 48 insertions, 37 deletions
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index ec0952668..d4437b923 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -111,11 +111,11 @@ static int print_route(struct sockaddr_nl *who ATTRIBUTE_UNUSED,
111 if (r->rtm_family == AF_INET6) { 111 if (r->rtm_family == AF_INET6) {
112 if (filter.tb) { 112 if (filter.tb) {
113 if (filter.tb < 0) { 113 if (filter.tb < 0) {
114 if (!(r->rtm_flags&RTM_F_CLONED)) { 114 if (!(r->rtm_flags & RTM_F_CLONED)) {
115 return 0; 115 return 0;
116 } 116 }
117 } else { 117 } else {
118 if (r->rtm_flags&RTM_F_CLONED) { 118 if (r->rtm_flags & RTM_F_CLONED) {
119 return 0; 119 return 0;
120 } 120 }
121 if (filter.tb == RT_TABLE_LOCAL) { 121 if (filter.tb == RT_TABLE_LOCAL) {
@@ -366,7 +366,7 @@ USE_FEATURE_IP_RULE(ARG_table,)
366 unsigned mtu; 366 unsigned mtu;
367 NEXT_ARG(); 367 NEXT_ARG();
368 if (index_in_strings(keywords, *argv) == PARM_lock) { 368 if (index_in_strings(keywords, *argv) == PARM_lock) {
369 mxlock |= (1<<RTAX_MTU); 369 mxlock |= (1 << RTAX_MTU);
370 NEXT_ARG(); 370 NEXT_ARG();
371 } 371 }
372 if (get_unsigned(&mtu, *argv, 0)) 372 if (get_unsigned(&mtu, *argv, 0))
@@ -398,7 +398,7 @@ USE_FEATURE_IP_RULE(ARG_table,)
398 NEXT_ARG(); 398 NEXT_ARG();
399 } 399 }
400 if ((**argv < '0' || **argv > '9') 400 if ((**argv < '0' || **argv > '9')
401 && rtnl_rtntype_a2n(&type, *argv) == 0) { 401 && rtnl_rtntype_a2n(&type, *argv) == 0) {
402 NEXT_ARG(); 402 NEXT_ARG();
403 req.r.rtm_type = type; 403 req.r.rtm_type = type;
404 ok |= type_ok; 404 ok |= type_ok;
@@ -518,19 +518,30 @@ static int iproute_list_or_flush(char **argv, int flush)
518 char *id = NULL; 518 char *id = NULL;
519 char *od = NULL; 519 char *od = NULL;
520 static const char keywords[] ALIGN1 = 520 static const char keywords[] ALIGN1 =
521 "protocol\0""all\0""dev\0""oif\0""iif\0""via\0""table\0""cache\0" /*all*/ 521 /* "ip route list/flush" parameters: */
522 "from\0""root\0""match\0""exact\0""to\0"/*root match exact*/; 522 "protocol\0" "dev\0" "oif\0" "iif\0"
523 "via\0" "table\0" "cache\0"
524 "from\0" "to\0"
525 /* and possible further keywords */
526 "all\0"
527 "root\0"
528 "match\0"
529 "exact\0"
530 "main\0"
531 ;
523 enum { 532 enum {
524 ARG_proto, PARM_all, 533 KW_proto, KW_dev, KW_oif, KW_iif,
525 ARG_dev, 534 KW_via, KW_table, KW_cache,
526 ARG_oif, 535 KW_from, KW_to,
527 ARG_iif, 536 /* */
528 ARG_via, 537 KW_all,
529 ARG_table, PARM_cache, /*PARM_all,*/ 538 KW_root,
530 ARG_from, PARM_root, PARM_match, PARM_exact, 539 KW_match,
531 ARG_to /*PARM_root, PARM_match, PARM_exact*/ 540 KW_exact,
541 KW_main,
532 }; 542 };
533 int arg, parm; 543 int arg, parm;
544
534 iproute_reset_filter(); 545 iproute_reset_filter();
535 filter.tb = RT_TABLE_MAIN; 546 filter.tb = RT_TABLE_MAIN;
536 547
@@ -539,64 +550,66 @@ static int iproute_list_or_flush(char **argv, int flush)
539 550
540 while (*argv) { 551 while (*argv) {
541 arg = index_in_substrings(keywords, *argv); 552 arg = index_in_substrings(keywords, *argv);
542 if (arg == ARG_proto) { 553 if (arg == KW_proto) {
543 uint32_t prot = 0; 554 uint32_t prot = 0;
544 NEXT_ARG(); 555 NEXT_ARG();
545 filter.protocolmask = -1; 556 filter.protocolmask = -1;
546 if (rtnl_rtprot_a2n(&prot, *argv)) { 557 if (rtnl_rtprot_a2n(&prot, *argv)) {
547 if (index_in_strings(keywords, *argv) != PARM_all) 558 if (index_in_strings(keywords, *argv) != KW_all)
548 invarg(*argv, "protocol"); 559 invarg(*argv, "protocol");
549 prot = 0; 560 prot = 0;
550 filter.protocolmask = 0; 561 filter.protocolmask = 0;
551 } 562 }
552 filter.protocol = prot; 563 filter.protocol = prot;
553 } else if (arg == ARG_dev || arg == ARG_oif) { 564 } else if (arg == KW_dev || arg == KW_oif) {
554 NEXT_ARG(); 565 NEXT_ARG();
555 od = *argv; 566 od = *argv;
556 } else if (arg == ARG_iif) { 567 } else if (arg == KW_iif) {
557 NEXT_ARG(); 568 NEXT_ARG();
558 id = *argv; 569 id = *argv;
559 } else if (arg == ARG_via) { 570 } else if (arg == KW_via) {
560 NEXT_ARG(); 571 NEXT_ARG();
561 get_prefix(&filter.rvia, *argv, do_ipv6); 572 get_prefix(&filter.rvia, *argv, do_ipv6);
562 } else if (arg == ARG_table) { 573 } else if (arg == KW_table) { /* table all/cache/main */
563 NEXT_ARG(); 574 NEXT_ARG();
564 parm = index_in_substrings(keywords, *argv); 575 parm = index_in_substrings(keywords, *argv);
565 if (parm == PARM_cache) 576 if (parm == KW_cache)
566 filter.tb = -1; 577 filter.tb = -1;
567 else if (parm == PARM_all) 578 else if (parm == KW_all)
568 filter.tb = 0; 579 filter.tb = 0;
569 else 580 else if (parm != KW_main)
570 invarg(*argv, "table"); 581 invarg(*argv, "table");
571 } else if (arg == ARG_from) { 582 } else if (arg == KW_cache) { // hmm is it valid - "ip r flush cache"?
583 filter.tb = -1;
584 } else if (arg == KW_from) {
572 NEXT_ARG(); 585 NEXT_ARG();
573 parm = index_in_substrings(keywords, *argv); 586 parm = index_in_substrings(keywords, *argv);
574 if (parm == PARM_root) { 587 if (parm == KW_root) {
575 NEXT_ARG(); 588 NEXT_ARG();
576 get_prefix(&filter.rsrc, *argv, do_ipv6); 589 get_prefix(&filter.rsrc, *argv, do_ipv6);
577 } else if (parm == PARM_match) { 590 } else if (parm == KW_match) {
578 NEXT_ARG(); 591 NEXT_ARG();
579 get_prefix(&filter.msrc, *argv, do_ipv6); 592 get_prefix(&filter.msrc, *argv, do_ipv6);
580 } else { 593 } else {
581 if (parm == PARM_exact) 594 if (parm == KW_exact)
582 NEXT_ARG(); 595 NEXT_ARG();
583 get_prefix(&filter.msrc, *argv, do_ipv6); 596 get_prefix(&filter.msrc, *argv, do_ipv6);
584 filter.rsrc = filter.msrc; 597 filter.rsrc = filter.msrc;
585 } 598 }
586 } else { 599 } else { /* "to" is the default parameter */
587 /* parm = arg; // would be more plausible, we reuse arg here */ 600 if (arg == KW_to) {
588 if (arg == ARG_to) {
589 NEXT_ARG(); 601 NEXT_ARG();
590 arg = index_in_substrings(keywords, *argv); 602 arg = index_in_substrings(keywords, *argv);
591 } 603 }
592 if (arg == PARM_root) { 604 /* parm = arg; - would be more plausible, but we reuse 'arg' here */
605 if (arg == KW_root) {
593 NEXT_ARG(); 606 NEXT_ARG();
594 get_prefix(&filter.rdst, *argv, do_ipv6); 607 get_prefix(&filter.rdst, *argv, do_ipv6);
595 } else if (arg == PARM_match) { 608 } else if (arg == KW_match) {
596 NEXT_ARG(); 609 NEXT_ARG();
597 get_prefix(&filter.mdst, *argv, do_ipv6); 610 get_prefix(&filter.mdst, *argv, do_ipv6);
598 } else { 611 } else { /* "to exact" is the default */
599 if (arg == PARM_exact) 612 if (arg == KW_exact)
600 NEXT_ARG(); 613 NEXT_ARG();
601 get_prefix(&filter.mdst, *argv, do_ipv6); 614 get_prefix(&filter.mdst, *argv, do_ipv6);
602 filter.rdst = filter.mdst; 615 filter.rdst = filter.mdst;
@@ -610,7 +623,6 @@ static int iproute_list_or_flush(char **argv, int flush)
610 } 623 }
611 624
612 xrtnl_open(&rth); 625 xrtnl_open(&rth);
613
614 ll_init_map(&rth); 626 ll_init_map(&rth);
615 627
616 if (id || od) { 628 if (id || od) {
@@ -631,7 +643,7 @@ static int iproute_list_or_flush(char **argv, int flush)
631 if (flush) { 643 if (flush) {
632 char flushb[4096-512]; 644 char flushb[4096-512];
633 645
634 if (filter.tb == -1) { 646 if (filter.tb == -1) { /* "flush table cache" */
635 if (do_ipv6 != AF_INET6) 647 if (do_ipv6 != AF_INET6)
636 iproute_flush_cache(); 648 iproute_flush_cache();
637 if (do_ipv6 == AF_INET) 649 if (do_ipv6 == AF_INET)
diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c
index 6442992b4..6b22061a7 100644
--- a/networking/libiproute/iprule.c
+++ b/networking/libiproute/iprule.c
@@ -17,7 +17,6 @@
17 */ 17 */
18 18
19#include <syslog.h> 19#include <syslog.h>
20//#include <sys/socket.h>
21#include <netinet/in.h> 20#include <netinet/in.h>
22#include <netinet/ip.h> 21#include <netinet/ip.h>
23#include <arpa/inet.h> 22#include <arpa/inet.h>