diff --git a/release/src-rt-6.x.4708/router/Makefile b/release/src-rt-6.x.4708/router/Makefile index 5ea49053c6..2761840336 100644 --- a/release/src-rt-6.x.4708/router/Makefile +++ b/release/src-rt-6.x.4708/router/Makefile @@ -1519,7 +1519,7 @@ libbcm-install: iproute2: @$(SEP) @$(MAKE) -C $@ KERNEL_INCLUDE=$(LINUXDIR)/include \ - EXTRACFLAGS="$(EXTRACFLAGS) $(if $(TCONFIG_IPV6),-DUSE_IPV6,-DNO_IPV6)" + EXTRACFLAGS="$(EXTRACFLAGS)" iproute2-install: install -D iproute2/tc/tc $(INSTALLDIR)/iproute2/usr/sbin/tc @@ -1531,7 +1531,7 @@ iproute2-3.x: kernel_header iptables-1.8.x @$(SEP) $(call patch_files,iproute2-3.x) @$(MAKE) -C $@ KERNEL_INCLUDE=$(LINUXDIR)/include \ - EXTRACFLAGS="$(EXTRACFLAGS) $(if $(TCONFIG_IPV6),-DUSE_IPV6,-DNO_IPV6)" \ + EXTRACFLAGS="$(EXTRACFLAGS)" \ PKG_CONFIG_PATH="$(PKG_CONFIG_PATH):$(TOP)/iptables-1.8.x/iptables" \ $(PARALLEL_BUILD) diff --git a/release/src-rt-6.x.4708/router/patches/iproute2-3.x/105-fixes-from-upstream.patch b/release/src-rt-6.x.4708/router/patches/iproute2-3.x/105-fixes-from-upstream.patch new file mode 100644 index 0000000000..e155c1f0d3 --- /dev/null +++ b/release/src-rt-6.x.4708/router/patches/iproute2-3.x/105-fixes-from-upstream.patch @@ -0,0 +1,717 @@ +--- iproute2-3.x/bridge/fdb.c ++++ iproute2-3.x/bridge/fdb.c +@@ -316,7 +316,7 @@ + + if (d == NULL || addr == NULL) { + fprintf(stderr, "Device and address are required arguments.\n"); +- exit(-1); ++ return -1; + } + + /* Assume self */ +@@ -331,7 +331,7 @@ + abuf, abuf+1, abuf+2, + abuf+3, abuf+4, abuf+5) != 6) { + fprintf(stderr, "Invalid mac address %s\n", addr); +- exit(-1); ++ return -1; + } + + addattr_l(&req.n, sizeof(req), NDA_LLADDR, abuf, ETH_ALEN); +@@ -359,7 +359,7 @@ + } + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- exit(2); ++ return -1; + + return 0; + } +--- iproute2-3.x/bridge/link.c ++++ iproute2-3.x/bridge/link.c +@@ -283,31 +283,31 @@ + } else if (strcmp(*argv, "guard") == 0) { + NEXT_ARG(); + if (!on_off("guard", &bpdu_guard, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "hairpin") == 0) { + NEXT_ARG(); + if (!on_off("hairping", &hairpin, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "fastleave") == 0) { + NEXT_ARG(); + if (!on_off("fastleave", &fast_leave, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "root_block") == 0) { + NEXT_ARG(); + if (!on_off("root_block", &root_block, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "learning") == 0) { + NEXT_ARG(); + if (!on_off("learning", &learning, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "learning_sync") == 0) { + NEXT_ARG(); + if (!on_off("learning_sync", &learning_sync, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "flood") == 0) { + NEXT_ARG(); + if (!on_off("flood", &flood, *argv)) +- exit(-1); ++ return -1; + } else if (strcmp(*argv, "cost") == 0) { + NEXT_ARG(); + cost = atoi(*argv); +@@ -328,7 +328,7 @@ + fprintf(stderr, + "Mode argument must be \"vepa\" or " + "\"veb\".\n"); +- exit(-1); ++ return -1; + } + } else if (strcmp(*argv, "self") == 0) { + flags = BRIDGE_FLAGS_SELF; +@@ -339,14 +339,14 @@ + } + if (d == NULL) { + fprintf(stderr, "Device is a required argument.\n"); +- exit(-1); ++ return -1; + } + + + req.ifm.ifi_index = ll_name_to_index(d); + if (req.ifm.ifi_index == 0) { + fprintf(stderr, "Cannot find bridge device \"%s\"\n", d); +- exit(-1); ++ return -1; + } + + /* Nested PROTINFO attribute. Contains: port flags, cost, priority and +@@ -401,7 +401,7 @@ + } + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- exit(2); ++ return -1; + + return 0; + } +--- iproute2-3.x/bridge/mdb.c ++++ iproute2-3.x/bridge/mdb.c +@@ -145,12 +145,12 @@ + + if (rtnl_wilddump_request(&rth, PF_BRIDGE, RTM_GETMDB) < 0) { + perror("Cannot send dump request"); +- exit(1); ++ return -1; + } + + if (rtnl_dump_filter(&rth, print_mdb, stdout) < 0) { + fprintf(stderr, "Dump terminated\n"); +- exit(1); ++ return -1; + } + + return 0; +@@ -198,7 +198,7 @@ + + if (d == NULL || grp == NULL || p == NULL) { + fprintf(stderr, "Device, group address and port name are required arguments.\n"); +- exit(-1); ++ return -1; + } + + req.bpm.ifindex = ll_name_to_index(d); +@@ -225,7 +225,7 @@ + addattr_l(&req.n, sizeof(req), MDBA_SET_ENTRY, &entry, sizeof(entry)); + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- exit(2); ++ return -1; + + return 0; + } +--- iproute2-3.x/bridge/vlan.c ++++ iproute2-3.x/bridge/vlan.c +@@ -69,7 +69,7 @@ + + if (d == NULL || vid == -1) { + fprintf(stderr, "Device and VLAN ID are required arguments.\n"); +- exit(-1); ++ return -1; + } + + req.ifm.ifi_index = ll_name_to_index(d); +@@ -96,7 +96,7 @@ + addattr_nest_end(&req.n, afspec); + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- exit(2); ++ return -1; + + return 0; + } +--- iproute2-3.x/include/namespace.h ++++ iproute2-3.x/include/namespace.h +@@ -3,6 +3,7 @@ + + #include + #include ++#include + #include + #include + +--- iproute2-3.x/ip/ipaddrlabel.c ++++ iproute2-3.x/ip/ipaddrlabel.c +@@ -183,7 +183,7 @@ + req.ifal.ifal_family = AF_INET6; + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- return 2; ++ return -2; + + return 0; + } +@@ -232,12 +232,12 @@ + + if (rtnl_wilddump_request(&rth, af, RTM_GETADDRLABEL) < 0) { + perror("Cannot send dump request"); +- return 1; ++ return -1; + } + + if (rtnl_dump_filter(&rth, flush_addrlabel, NULL) < 0) { + fprintf(stderr, "Flush terminated\n"); +- return 1; ++ return -1; + } + + return 0; +--- iproute2-3.x/ip/iplink_bond.c ++++ iproute2-3.x/ip/iplink_bond.c +@@ -166,10 +166,8 @@ + while (argc > 0) { + if (matches(*argv, "mode") == 0) { + NEXT_ARG(); +- if (get_index(mode_tbl, *argv) < 0) { ++ if (get_index(mode_tbl, *argv) < 0) + invarg("invalid mode", *argv); +- return -1; +- } + mode = get_index(mode_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_MODE, mode); + } else if (matches(*argv, "active_slave") == 0) { +@@ -182,38 +180,28 @@ + addattr32(n, 1024, IFLA_BOND_ACTIVE_SLAVE, 0); + } else if (matches(*argv, "miimon") == 0) { + NEXT_ARG(); +- if (get_u32(&miimon, *argv, 0)) { ++ if (get_u32(&miimon, *argv, 0)) + invarg("invalid miimon", *argv); +- return -1; +- } + addattr32(n, 1024, IFLA_BOND_MIIMON, miimon); + } else if (matches(*argv, "updelay") == 0) { + NEXT_ARG(); +- if (get_u32(&updelay, *argv, 0)) { ++ if (get_u32(&updelay, *argv, 0)) + invarg("invalid updelay", *argv); +- return -1; +- } + addattr32(n, 1024, IFLA_BOND_UPDELAY, updelay); + } else if (matches(*argv, "downdelay") == 0) { + NEXT_ARG(); +- if (get_u32(&downdelay, *argv, 0)) { ++ if (get_u32(&downdelay, *argv, 0)) + invarg("invalid downdelay", *argv); +- return -1; +- } + addattr32(n, 1024, IFLA_BOND_DOWNDELAY, downdelay); + } else if (matches(*argv, "use_carrier") == 0) { + NEXT_ARG(); +- if (get_u8(&use_carrier, *argv, 0)) { ++ if (get_u8(&use_carrier, *argv, 0)) + invarg("invalid use_carrier", *argv); +- return -1; +- } + addattr8(n, 1024, IFLA_BOND_USE_CARRIER, use_carrier); + } else if (matches(*argv, "arp_interval") == 0) { + NEXT_ARG(); +- if (get_u32(&arp_interval, *argv, 0)) { ++ if (get_u32(&arp_interval, *argv, 0)) + invarg("invalid arp_interval", *argv); +- return -1; +- } + addattr32(n, 1024, IFLA_BOND_ARP_INTERVAL, arp_interval); + } else if (matches(*argv, "arp_ip_target") == 0) { + struct rtattr * nest = addattr_nest(n, 1024, +@@ -234,18 +222,14 @@ + addattr_nest_end(n, nest); + } else if (matches(*argv, "arp_validate") == 0) { + NEXT_ARG(); +- if (get_index(arp_validate_tbl, *argv) < 0) { ++ if (get_index(arp_validate_tbl, *argv) < 0) + invarg("invalid arp_validate", *argv); +- return -1; +- } + arp_validate = get_index(arp_validate_tbl, *argv); + addattr32(n, 1024, IFLA_BOND_ARP_VALIDATE, arp_validate); + } else if (matches(*argv, "arp_all_targets") == 0) { + NEXT_ARG(); +- if (get_index(arp_all_targets_tbl, *argv) < 0) { ++ if (get_index(arp_all_targets_tbl, *argv) < 0) + invarg("invalid arp_all_targets", *argv); +- return -1; +- } + arp_all_targets = get_index(arp_all_targets_tbl, *argv); + addattr32(n, 1024, IFLA_BOND_ARP_ALL_TARGETS, arp_all_targets); + } else if (matches(*argv, "primary") == 0) { +@@ -256,92 +240,79 @@ + addattr32(n, 1024, IFLA_BOND_PRIMARY, ifindex); + } else if (matches(*argv, "primary_reselect") == 0) { + NEXT_ARG(); +- if (get_index(primary_reselect_tbl, *argv) < 0) { ++ if (get_index(primary_reselect_tbl, *argv) < 0) + invarg("invalid primary_reselect", *argv); +- return -1; +- } + primary_reselect = get_index(primary_reselect_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_PRIMARY_RESELECT, + primary_reselect); + } else if (matches(*argv, "fail_over_mac") == 0) { + NEXT_ARG(); +- if (get_index(fail_over_mac_tbl, *argv) < 0) { ++ if (get_index(fail_over_mac_tbl, *argv) < 0) + invarg("invalid fail_over_mac", *argv); +- return -1; +- } + fail_over_mac = get_index(fail_over_mac_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_FAIL_OVER_MAC, + fail_over_mac); + } else if (matches(*argv, "xmit_hash_policy") == 0) { + NEXT_ARG(); +- if (get_index(xmit_hash_policy_tbl, *argv) < 0) { ++ if (get_index(xmit_hash_policy_tbl, *argv) < 0) + invarg("invalid xmit_hash_policy", *argv); +- return -1; +- } ++ + xmit_hash_policy = get_index(xmit_hash_policy_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_XMIT_HASH_POLICY, + xmit_hash_policy); + } else if (matches(*argv, "resend_igmp") == 0) { + NEXT_ARG(); +- if (get_u32(&resend_igmp, *argv, 0)) { ++ if (get_u32(&resend_igmp, *argv, 0)) + invarg("invalid resend_igmp", *argv); +- return -1; +- } ++ + addattr32(n, 1024, IFLA_BOND_RESEND_IGMP, resend_igmp); + } else if (matches(*argv, "num_grat_arp") == 0 || + matches(*argv, "num_unsol_na") == 0) { + NEXT_ARG(); +- if (get_u8(&num_peer_notif, *argv, 0)) { ++ if (get_u8(&num_peer_notif, *argv, 0)) + invarg("invalid num_grat_arp|num_unsol_na", + *argv); +- return -1; +- } ++ + addattr8(n, 1024, IFLA_BOND_NUM_PEER_NOTIF, + num_peer_notif); + } else if (matches(*argv, "all_slaves_active") == 0) { + NEXT_ARG(); +- if (get_u8(&all_slaves_active, *argv, 0)) { ++ if (get_u8(&all_slaves_active, *argv, 0)) + invarg("invalid all_slaves_active", *argv); +- return -1; +- } ++ + addattr8(n, 1024, IFLA_BOND_ALL_SLAVES_ACTIVE, + all_slaves_active); + } else if (matches(*argv, "min_links") == 0) { + NEXT_ARG(); +- if (get_u32(&min_links, *argv, 0)) { ++ if (get_u32(&min_links, *argv, 0)) + invarg("invalid min_links", *argv); +- return -1; +- } ++ + addattr32(n, 1024, IFLA_BOND_MIN_LINKS, min_links); + } else if (matches(*argv, "lp_interval") == 0) { + NEXT_ARG(); +- if (get_u32(&lp_interval, *argv, 0)) { ++ if (get_u32(&lp_interval, *argv, 0)) + invarg("invalid lp_interval", *argv); +- return -1; +- } ++ + addattr32(n, 1024, IFLA_BOND_LP_INTERVAL, lp_interval); + } else if (matches(*argv, "packets_per_slave") == 0) { + NEXT_ARG(); +- if (get_u32(&packets_per_slave, *argv, 0)) { ++ if (get_u32(&packets_per_slave, *argv, 0)) + invarg("invalid packets_per_slave", *argv); +- return -1; +- } ++ + addattr32(n, 1024, IFLA_BOND_PACKETS_PER_SLAVE, + packets_per_slave); + } else if (matches(*argv, "lacp_rate") == 0) { + NEXT_ARG(); +- if (get_index(lacp_rate_tbl, *argv) < 0) { ++ if (get_index(lacp_rate_tbl, *argv) < 0) + invarg("invalid lacp_rate", *argv); +- return -1; +- } ++ + lacp_rate = get_index(lacp_rate_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_AD_LACP_RATE, lacp_rate); + } else if (matches(*argv, "ad_select") == 0) { + NEXT_ARG(); +- if (get_index(ad_select_tbl, *argv) < 0) { ++ if (get_index(ad_select_tbl, *argv) < 0) + invarg("invalid ad_select", *argv); +- return -1; +- } ++ + ad_select = get_index(ad_select_tbl, *argv); + addattr8(n, 1024, IFLA_BOND_AD_SELECT, ad_select); + } else if (matches(*argv, "help") == 0) { +--- iproute2-3.x/ip/ipmonitor.c ++++ iproute2-3.x/ip/ipmonitor.c +@@ -251,12 +251,16 @@ + } + if (file) { + FILE *fp; ++ int err; ++ + fp = fopen(file, "r"); + if (fp == NULL) { + perror("Cannot fopen"); + exit(-1); + } +- return rtnl_from_file(fp, accept_msg, stdout); ++ err = rtnl_from_file(fp, accept_msg, stdout); ++ fclose(fp); ++ return err; + } + + if (rtnl_open(&rth, groups) < 0) +--- iproute2-3.x/ip/iproute.c ++++ iproute2-3.x/ip/iproute.c +@@ -1059,7 +1059,7 @@ + req.r.rtm_family = AF_INET; + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- exit(2); ++ return -2; + + return 0; + } +--- iproute2-3.x/ip/iprule.c ++++ iproute2-3.x/ip/iprule.c +@@ -386,7 +386,7 @@ + req.r.rtm_table = RT_TABLE_MAIN; + + if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) +- return 2; ++ return -2; + + return 0; + } +--- iproute2-3.x/ip/link_gre.c ++++ iproute2-3.x/ip/link_gre.c +@@ -244,7 +244,8 @@ + if (uval > 255) + invarg("TTL must be <= 255\n", *argv); + ttl = uval; +- } ++ } else ++ ttl = 0; + } else if (!matches(*argv, "tos") || + !matches(*argv, "tclass") || + !matches(*argv, "dsfield")) { +--- iproute2-3.x/ip/tcp_metrics.c ++++ iproute2-3.x/ip/tcp_metrics.c +@@ -153,7 +153,8 @@ + saddr.bytelen = 16; + stype = TCP_METRICS_ATTR_SADDR_IPV6; + slen = RTA_PAYLOAD(a); +- } ++ } else ++ stype = 0; + } + + if (f.daddr.family && f.daddr.bitlen >= 0 && +--- iproute2-3.x/ip/tunnel.c ++++ iproute2-3.x/ip/tunnel.c +@@ -73,7 +73,13 @@ + + strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = (void*)p; ++ + fd = socket(preferred_family, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ fprintf(stderr, "create socket failed: %s\n", strerror(errno)); ++ return -1; ++ } ++ + err = ioctl(fd, SIOCGETTUNNEL, &ifr); + if (err) + fprintf(stderr, "get tunnel \"%s\" failed: %s\n", basedev, +@@ -94,7 +100,13 @@ + else + strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = p; ++ + fd = socket(preferred_family, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ fprintf(stderr, "create socket failed: %s\n", strerror(errno)); ++ return -1; ++ } ++ + err = ioctl(fd, cmd, &ifr); + if (err) + fprintf(stderr, "add tunnel \"%s\" failed: %s\n", ifr.ifr_name, +@@ -115,7 +127,13 @@ + strncpy(ifr.ifr_name, basedev, IFNAMSIZ); + + ifr.ifr_ifru.ifru_data = p; ++ + fd = socket(preferred_family, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ fprintf(stderr, "create socket failed: %s\n", strerror(errno)); ++ return -1; ++ } ++ + err = ioctl(fd, SIOCDELTUNNEL, &ifr); + if (err) + fprintf(stderr, "delete tunnel \"%s\" failed: %s\n", +@@ -133,7 +151,13 @@ + + strncpy(ifr.ifr_name, name, IFNAMSIZ); + ifr.ifr_ifru.ifru_data = p; ++ + fd = socket(preferred_family, SOCK_DGRAM, 0); ++ if (fd < 0) { ++ fprintf(stderr, "create socket failed: %s\n", strerror(errno)); ++ return -1; ++ } ++ + err = ioctl(fd, cmd, &ifr); + if (err && errno != skiperr) + fprintf(stderr, "%s: ioctl %x failed: %s\n", name, +--- iproute2-3.x/ip/xfrm_monitor.c ++++ iproute2-3.x/ip/xfrm_monitor.c +@@ -396,12 +396,16 @@ + + if (file) { + FILE *fp; ++ int err; ++ + fp = fopen(file, "r"); + if (fp == NULL) { + perror("Cannot fopen"); + exit(-1); + } +- return rtnl_from_file(fp, xfrm_accept_msg, (void*)stdout); ++ err = rtnl_from_file(fp, xfrm_accept_msg, stdout); ++ fclose(fp); ++ return err; + } + + if (rtnl_open_byproto(&rth, groups, NETLINK_XFRM) < 0) +--- iproute2-3.x/lib/namespace.c ++++ iproute2-3.x/lib/namespace.c +@@ -57,8 +57,10 @@ + if (setns(netns, CLONE_NEWNET) < 0) { + fprintf(stderr, "setting the network namespace \"%s\" failed: %s\n", + name, strerror(errno)); ++ close(netns); + return -1; + } ++ close(netns); + + if (unshare(CLONE_NEWNS) < 0) { + fprintf(stderr, "unshare failed: %s\n", strerror(errno)); +--- iproute2-3.x/misc/lnstat_util.c ++++ iproute2-3.x/misc/lnstat_util.c +@@ -175,8 +175,10 @@ + + /* allocate */ + lf = malloc(sizeof(*lf)); +- if (!lf) ++ if (!lf) { ++ fprintf(stderr, "out of memory\n"); + return NULL; ++ } + + /* initialize */ + memset(lf, 0, sizeof(*lf)); +@@ -193,6 +195,7 @@ + /* open */ + lf->fp = fopen(lf->path, "r"); + if (!lf->fp) { ++ perror(lf->path); + free(lf); + return NULL; + } +@@ -259,12 +262,16 @@ + continue; + + lf = alloc_and_open(path, de->d_name); +- if (!lf) ++ if (!lf) { ++ closedir(dir); + return NULL; ++ } + + /* fill in field structure */ +- if (lnstat_scan_fields(lf) < 0) ++ if (lnstat_scan_fields(lf) < 0) { ++ closedir(dir); + return NULL; ++ } + + /* prepend to global list */ + lf->next = lnstat_files; +--- iproute2-3.x/tc/m_simple.c ++++ iproute2-3.x/tc/m_simple.c +@@ -138,7 +138,7 @@ + } + + if (strlen(simpdata) > (SIMP_MAX_DATA - 1)) { +- fprintf(stderr, "simple: Illegal string len %ld <%s> \n", ++ fprintf(stderr, "simple: Illegal string len %zu <%s> \n", + strlen(simpdata), simpdata); + return -1; + } +--- iproute2-3.x/tc/m_xt.c ++++ iproute2-3.x/tc/m_xt.c +@@ -90,7 +90,8 @@ + if (NULL == t) { + target->t = xtables_calloc(1, size); + target->t->u.target_size = size; +- strcpy(target->t->u.user.name, target->name); ++ strncpy(target->t->u.user.name, target->name, ++ sizeof(target->t->u.user.name) - 1); + target->t->u.user.revision = target->revision; + + if (target->init != NULL) +@@ -252,8 +253,8 @@ + m->print(NULL, m->t, 0); + fprintf(stdout, " index %d\n", index); + +- if (strlen(tname) > 16) { +- size = 16; ++ if (strlen(tname) >= 16) { ++ size = 15; + k[15] = 0; + } else { + size = 1 + strlen(tname); +--- iproute2-3.x/tc/tc_monitor.c ++++ iproute2-3.x/tc/tc_monitor.c +@@ -87,13 +87,17 @@ + } + + if (file) { +- FILE *fp; +- fp = fopen(file, "r"); ++ FILE *fp = fopen(file, "r"); ++ int ret; ++ + if (fp == NULL) { + perror("Cannot fopen"); + exit(-1); + } +- return rtnl_from_file(fp, accept_tcmsg, (void*)stdout); ++ ++ ret = rtnl_from_file(fp, accept_tcmsg, stdout); ++ fclose(fp); ++ return ret; + } + + if (rtnl_open(&rth, groups) < 0) +--- iproute2-3.x/tc/tc_stab.c ++++ iproute2-3.x/tc/tc_stab.c +@@ -67,42 +67,32 @@ + NEXT_ARG(); + if (s.mtu) + duparg("mtu", *argv); +- if (get_u32(&s.mtu, *argv, 10)) { ++ if (get_u32(&s.mtu, *argv, 10)) + invarg("mtu", "invalid mtu"); +- return -1; +- } + } else if (matches(*argv, "mpu") == 0) { + NEXT_ARG(); + if (s.mpu) + duparg("mpu", *argv); +- if (get_u32(&s.mpu, *argv, 10)) { ++ if (get_u32(&s.mpu, *argv, 10)) + invarg("mpu", "invalid mpu"); +- return -1; +- } + } else if (matches(*argv, "overhead") == 0) { + NEXT_ARG(); + if (s.overhead) + duparg("overhead", *argv); +- if (get_integer(&s.overhead, *argv, 10)) { ++ if (get_integer(&s.overhead, *argv, 10)) + invarg("overhead", "invalid overhead"); +- return -1; +- } + } else if (matches(*argv, "tsize") == 0) { + NEXT_ARG(); + if (s.tsize) + duparg("tsize", *argv); +- if (get_u32(&s.tsize, *argv, 10)) { ++ if (get_u32(&s.tsize, *argv, 10)) + invarg("tsize", "invalid table size"); +- return -1; +- } + } else if (matches(*argv, "linklayer") == 0) { + NEXT_ARG(); + if (s.linklayer != LINKLAYER_UNSPEC) + duparg("linklayer", *argv); +- if (get_linklayer(&s.linklayer, *argv)) { ++ if (get_linklayer(&s.linklayer, *argv)) + invarg("linklayer", "invalid linklayer"); +- return -1; +- } + } else + break; + argc--; argv++; +--- iproute2-3.x/tc/tc_util.c ++++ iproute2-3.x/tc/tc_util.c +@@ -202,18 +202,19 @@ + extern int use_iec; + unsigned long kilo = use_iec ? 1024 : 1000; + const char *str = use_iec ? "i" : ""; +- int i = 0; + static char *units[5] = {"", "K", "M", "G", "T"}; ++ int i; + + rate <<= 3; /* bytes/sec -> bits/sec */ + +- for (i = 0; i < ARRAY_SIZE(units); i++) { ++ for (i = 0; i < ARRAY_SIZE(units) - 1; i++) { + if (rate < kilo) + break; + if (((rate % kilo) != 0) && rate < 1000*kilo) + break; + rate /= kilo; + } ++ + snprintf(buf, len, "%.0f%s%sbit", (double)rate, units[i], str); + } +