diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c index 8f497015..85ab13cb 100644 --- a/ip/iproute_lwtunnel.c +++ b/ip/iproute_lwtunnel.c @@ -860,7 +860,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, argc--; argv++; - if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator)) + if (rta_addattr64(rta, len, ILA_ATTR_LOCATOR, locator)) return -1; while (argc > 0) { @@ -874,7 +874,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, invarg("\"csum-mode\" value is invalid\n", *argv); - ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, + ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE, (__u8)csum_mode); argc--; argv++; @@ -888,7 +888,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, invarg("\"ident-type\" value is invalid\n", *argv); - ret = rta_addattr8(rta, 1024, ILA_ATTR_IDENT_TYPE, + ret = rta_addattr8(rta, len, ILA_ATTR_IDENT_TYPE, (__u8)ident_type); argc--; argv++; @@ -902,7 +902,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len, invarg("\"hook-type\" value is invalid\n", *argv); - ret = rta_addattr8(rta, 1024, ILA_ATTR_HOOK_TYPE, + ret = rta_addattr8(rta, len, ILA_ATTR_HOOK_TYPE, (__u8)hook_type); argc--; argv++; @@ -1034,7 +1034,7 @@ static int parse_encap_bpf(struct rtattr *rta, size_t len, int *argcp, if (get_unsigned(&headroom, *argv, 0) || headroom == 0) invarg("headroom is invalid\n", *argv); if (!headroom_set) - rta_addattr32(rta, 1024, LWT_BPF_XMIT_HEADROOM, + rta_addattr32(rta, len, LWT_BPF_XMIT_HEADROOM, headroom); headroom_set = 1; } else if (strcmp(*argv, "help") == 0) { @@ -1075,7 +1075,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) exit(-1); } - nest = rta_nest(rta, 1024, RTA_ENCAP); + nest = rta_nest(rta, len, RTA_ENCAP); switch (type) { case LWTUNNEL_ENCAP_MPLS: ret = parse_encap_mpls(rta, len, &argc, &argv); @@ -1108,7 +1108,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp) rta_nest_end(rta, nest); - ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type); + ret = rta_addattr16(rta, len, RTA_ENCAP_TYPE, type); *argcp = argc; *argvp = argv; diff --git a/man/man8/ip-route.8.in b/man/man8/ip-route.8.in index a33ce1f0..11dd4ca7 100644 --- a/man/man8/ip-route.8.in +++ b/man/man8/ip-route.8.in @@ -589,6 +589,15 @@ argument lists: route reflecting its relative bandwidth or quality. .in -8 +The internal buffer used in iproute2 limits the maximum number of nexthops that +may be specified in one go. If only +.I ADDRESS +is given, the current buffer size allows for 144 IPv6 nexthops and 253 IPv4 +ones. For IPv4, this effectively limits the number of nexthops possible per +route. With IPv6, further nexthops may be appended to the same route via +.B "ip route append" +command. + .TP .BI scope " SCOPE_VAL" the scope of the destinations covered by the route prefix. diff --git a/testsuite/Makefile b/testsuite/Makefile index b3aebec1..46b243b0 100644 --- a/testsuite/Makefile +++ b/testsuite/Makefile @@ -85,11 +85,11 @@ endif TC="$$i/tc/tc" IP="$$i/ip/ip" SS=$$i/misc/ss DEV="$(DEV)" IPVER="$@" SNAME="$$i" \ ERRF="$(RESULTS_DIR)/$@.$$o.err" $(PREFIX) tests/$@ > $(RESULTS_DIR)/$@.$$o.out; \ if [ "$$?" = "127" ]; then \ - echo "SKIPPED"; \ + echo "\e[1;35mSKIPPED\e[0m"; \ elif [ -e "$(RESULTS_DIR)/$@.$$o.err" ]; then \ - echo "FAILED"; \ + echo "\e[0;31mFAILED\e[0m"; \ else \ - echo "PASS"; \ + echo "\e[0;32mPASS\e[0m"; \ fi; \ rm "$$TMP_ERR" "$$TMP_OUT"; \ sudo dmesg > $(RESULTS_DIR)/$@.$$o.dmesg; \