From 3069539fb8efd8353d46a6be1a501f77871888ca Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Tue, 16 Feb 2016 16:08:51 +0100 Subject: [PATCH 1/7] iplink: bridge_slave: export read-only values Export all the read-only values that get returned about a bridge port such as the timers, the ids, designated_port and cost, topology_change_ack and config_pending. For the bridge ids the br_dump_bridge_id function is exported from iplink_bridge. Signed-off-by: Nikolay Aleksandrov --- ip/ip_common.h | 2 ++ ip/iplink_bridge.c | 3 +- ip/iplink_bridge_slave.c | 70 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/ip/ip_common.h b/ip/ip_common.h index 9a846df3..815487a0 100644 --- a/ip/ip_common.h +++ b/ip/ip_common.h @@ -87,6 +87,8 @@ struct link_util struct link_util *get_link_kind(const char *kind); struct link_util *get_link_slave_kind(const char *slave_kind); +void br_dump_bridge_id(const struct ifla_bridge_id *id, char *buf, size_t len); + #ifndef INFINITY_LIFE_TIME #define INFINITY_LIFE_TIME 0xFFFFFFFFU #endif diff --git a/ip/iplink_bridge.c b/ip/iplink_bridge.c index 1b666f0a..79f15eff 100644 --- a/ip/iplink_bridge.c +++ b/ip/iplink_bridge.c @@ -60,8 +60,7 @@ static void explain(void) print_explain(stderr); } -static void br_dump_bridge_id(const struct ifla_bridge_id *id, char *buf, - size_t len) +void br_dump_bridge_id(const struct ifla_bridge_id *id, char *buf, size_t len) { char eaddr[32]; diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_slave.c index 4593872e..c58f5529 100644 --- a/ip/iplink_bridge_slave.c +++ b/ip/iplink_bridge_slave.c @@ -98,6 +98,76 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f, if (tb[IFLA_BRPORT_UNICAST_FLOOD]) print_onoff(f, "flood", rta_getattr_u8(tb[IFLA_BRPORT_UNICAST_FLOOD])); + + if (tb[IFLA_BRPORT_ID]) + fprintf(f, "port_id 0x%x ", + rta_getattr_u16(tb[IFLA_BRPORT_ID])); + + if (tb[IFLA_BRPORT_NO]) + fprintf(f, "port_no 0x%x ", + rta_getattr_u16(tb[IFLA_BRPORT_NO])); + + if (tb[IFLA_BRPORT_DESIGNATED_PORT]) + fprintf(f, "designated_port %u ", + rta_getattr_u16(tb[IFLA_BRPORT_DESIGNATED_PORT])); + + if (tb[IFLA_BRPORT_DESIGNATED_COST]) + fprintf(f, "designated_cost %u ", + rta_getattr_u16(tb[IFLA_BRPORT_DESIGNATED_COST])); + + if (tb[IFLA_BRPORT_BRIDGE_ID]) { + char bridge_id[32]; + + br_dump_bridge_id(RTA_DATA(tb[IFLA_BRPORT_BRIDGE_ID]), + bridge_id, sizeof(bridge_id)); + fprintf(f, "designated_bridge %s ", bridge_id); + } + + if (tb[IFLA_BRPORT_ROOT_ID]) { + char root_id[32]; + + br_dump_bridge_id(RTA_DATA(tb[IFLA_BRPORT_ROOT_ID]), + root_id, sizeof(root_id)); + fprintf(f, "designated_root %s ", root_id); + } + + if (tb[IFLA_BRPORT_HOLD_TIMER]) { + struct timeval tv; + __u64 htimer; + + htimer = rta_getattr_u64(tb[IFLA_BRPORT_HOLD_TIMER]); + __jiffies_to_tv(&tv, htimer); + fprintf(f, "hold_timer %4i.%.2i ", (int)tv.tv_sec, + (int)tv.tv_usec/10000); + } + + if (tb[IFLA_BRPORT_MESSAGE_AGE_TIMER]) { + struct timeval tv; + __u64 agetimer; + + agetimer = rta_getattr_u64(tb[IFLA_BRPORT_MESSAGE_AGE_TIMER]); + __jiffies_to_tv(&tv, agetimer); + fprintf(f, "message_age_timer %4i.%.2i ", (int)tv.tv_sec, + (int)tv.tv_usec/10000); + } + + if (tb[IFLA_BRPORT_FORWARD_DELAY_TIMER]) { + struct timeval tv; + __u64 fwdtimer; + + fwdtimer = rta_getattr_u64(tb[IFLA_BRPORT_FORWARD_DELAY_TIMER]); + __jiffies_to_tv(&tv, fwdtimer); + fprintf(f, "forward_delay_timer %4i.%.2i ", (int)tv.tv_sec, + (int)tv.tv_usec/10000); + } + + if (tb[IFLA_BRPORT_TOPOLOGY_CHANGE_ACK]) + fprintf(f, "topology_change_ack %u ", + rta_getattr_u8(tb[IFLA_BRPORT_TOPOLOGY_CHANGE_ACK])); + + if (tb[IFLA_BRPORT_CONFIG_PENDING]) + fprintf(f, "config_pending %u ", + rta_getattr_u8(tb[IFLA_BRPORT_CONFIG_PENDING])); } static void bridge_slave_parse_on_off(char *arg_name, char *arg_val, From f6e615dec9ee9b688308e85a03a51125a9c9fdb9 Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Tue, 16 Feb 2016 16:08:52 +0100 Subject: [PATCH 2/7] iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP Add support to be able to view and change IFLA_BRPORT_PROXYARP port attribute. Signed-off-by: Nikolay Aleksandrov --- ip/iplink_bridge_slave.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_slave.c index c58f5529..c27d7183 100644 --- a/ip/iplink_bridge_slave.c +++ b/ip/iplink_bridge_slave.c @@ -29,6 +29,7 @@ static void print_explain(FILE *f) " [ root_block {on | off} ]\n" " [ learning {on | off} ]\n" " [ flood {on | off} ]\n" + " [ proxy_arp {on | off} ]\n" ); } @@ -168,6 +169,9 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f, if (tb[IFLA_BRPORT_CONFIG_PENDING]) fprintf(f, "config_pending %u ", rta_getattr_u8(tb[IFLA_BRPORT_CONFIG_PENDING])); + if (tb[IFLA_BRPORT_PROXYARP]) + print_onoff(f, "proxy_arp", + rta_getattr_u8(tb[IFLA_BRPORT_PROXYARP])); } static void bridge_slave_parse_on_off(char *arg_name, char *arg_val, @@ -232,6 +236,10 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv, NEXT_ARG(); bridge_slave_parse_on_off("flood", *argv, n, IFLA_BRPORT_UNICAST_FLOOD); + } else if (matches(*argv, "proxy_arp") == 0) { + NEXT_ARG(); + bridge_slave_parse_on_off("proxy_arp", *argv, n, + IFLA_BRPORT_PROXYARP); } else if (matches(*argv, "help") == 0) { explain(); return -1; From 38b31a78da859e4b72037b66477871ba8fc7bd1e Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Tue, 16 Feb 2016 16:08:53 +0100 Subject: [PATCH 3/7] iplink: bridge_slave: add support for IFLA_BRPORT_PROXYARP_WIFI Add support to be able to view and change IFLA_BRPORT_PROXYARP_WIFI port attribute. Signed-off-by: Nikolay Aleksandrov --- ip/iplink_bridge_slave.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_slave.c index c27d7183..68d14089 100644 --- a/ip/iplink_bridge_slave.c +++ b/ip/iplink_bridge_slave.c @@ -30,6 +30,7 @@ static void print_explain(FILE *f) " [ learning {on | off} ]\n" " [ flood {on | off} ]\n" " [ proxy_arp {on | off} ]\n" + " [ proxy_arp_wifi {on | off} ]\n" ); } @@ -172,6 +173,10 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f, if (tb[IFLA_BRPORT_PROXYARP]) print_onoff(f, "proxy_arp", rta_getattr_u8(tb[IFLA_BRPORT_PROXYARP])); + + if (tb[IFLA_BRPORT_PROXYARP_WIFI]) + print_onoff(f, "proxy_arp_wifi", + rta_getattr_u8(tb[IFLA_BRPORT_PROXYARP_WIFI])); } static void bridge_slave_parse_on_off(char *arg_name, char *arg_val, @@ -240,6 +245,10 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv, NEXT_ARG(); bridge_slave_parse_on_off("proxy_arp", *argv, n, IFLA_BRPORT_PROXYARP); + } else if (matches(*argv, "proxy_arp_wifi") == 0) { + NEXT_ARG(); + bridge_slave_parse_on_off("proxy_arp_wifi", *argv, n, + IFLA_BRPORT_PROXYARP_WIFI); } else if (matches(*argv, "help") == 0) { explain(); return -1; From 10759a90ab5896b5b0ca8ddd7b91c5b3a7466062 Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Tue, 16 Feb 2016 16:08:54 +0100 Subject: [PATCH 4/7] iplink: bridge_slave: add support for IFLA_BRPORT_MULTICAST_ROUTER Add support to be able to view and change IFLA_BRPORT_MULTICAST_ROUTER port attribute. Signed-off-by: Nikolay Aleksandrov --- ip/iplink_bridge_slave.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_slave.c index 68d14089..16b364f6 100644 --- a/ip/iplink_bridge_slave.c +++ b/ip/iplink_bridge_slave.c @@ -31,6 +31,7 @@ static void print_explain(FILE *f) " [ flood {on | off} ]\n" " [ proxy_arp {on | off} ]\n" " [ proxy_arp_wifi {on | off} ]\n" + " [ mcast_router MULTICAST_ROUTER ]\n" ); } @@ -177,6 +178,10 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f, if (tb[IFLA_BRPORT_PROXYARP_WIFI]) print_onoff(f, "proxy_arp_wifi", rta_getattr_u8(tb[IFLA_BRPORT_PROXYARP_WIFI])); + + if (tb[IFLA_BRPORT_MULTICAST_ROUTER]) + fprintf(f, "mcast_router %u ", + rta_getattr_u8(tb[IFLA_BRPORT_MULTICAST_ROUTER])); } static void bridge_slave_parse_on_off(char *arg_name, char *arg_val, @@ -249,6 +254,14 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv, NEXT_ARG(); bridge_slave_parse_on_off("proxy_arp_wifi", *argv, n, IFLA_BRPORT_PROXYARP_WIFI); + } else if (matches(*argv, "mcast_router") == 0) { + __u8 mcast_router; + + NEXT_ARG(); + if (get_u8(&mcast_router, *argv, 0)) + invarg("invalid mcast_router", *argv); + addattr8(n, 1024, IFLA_BRPORT_MULTICAST_ROUTER, + mcast_router); } else if (matches(*argv, "help") == 0) { explain(); return -1; From 478a8e59206841b2a2d32a29fdd0cbec1965cd5e Mon Sep 17 00:00:00 2001 From: Nikolay Aleksandrov Date: Tue, 16 Feb 2016 16:08:55 +0100 Subject: [PATCH 5/7] iplink: bridge_slave: add support for IFLA_BRPORT_FAST_LEAVE Add support to be able to view and change IFLA_BRPORT_FAST_LEAVE port attribute. Signed-off-by: Nikolay Aleksandrov --- ip/iplink_bridge_slave.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ip/iplink_bridge_slave.c b/ip/iplink_bridge_slave.c index 16b364f6..3ec2bba7 100644 --- a/ip/iplink_bridge_slave.c +++ b/ip/iplink_bridge_slave.c @@ -32,6 +32,7 @@ static void print_explain(FILE *f) " [ proxy_arp {on | off} ]\n" " [ proxy_arp_wifi {on | off} ]\n" " [ mcast_router MULTICAST_ROUTER ]\n" + " [ mcast_fast_leave {on | off} ]\n" ); } @@ -182,6 +183,10 @@ static void bridge_slave_print_opt(struct link_util *lu, FILE *f, if (tb[IFLA_BRPORT_MULTICAST_ROUTER]) fprintf(f, "mcast_router %u ", rta_getattr_u8(tb[IFLA_BRPORT_MULTICAST_ROUTER])); + + if (tb[IFLA_BRPORT_FAST_LEAVE]) + print_onoff(f, "mcast_fast_leave", + rta_getattr_u8(tb[IFLA_BRPORT_FAST_LEAVE])); } static void bridge_slave_parse_on_off(char *arg_name, char *arg_val, @@ -262,6 +267,10 @@ static int bridge_slave_parse_opt(struct link_util *lu, int argc, char **argv, invarg("invalid mcast_router", *argv); addattr8(n, 1024, IFLA_BRPORT_MULTICAST_ROUTER, mcast_router); + } else if (matches(*argv, "mcast_fast_leave") == 0) { + NEXT_ARG(); + bridge_slave_parse_on_off("mcast_fast_leave", *argv, n, + IFLA_BRPORT_FAST_LEAVE); } else if (matches(*argv, "help") == 0) { explain(); return -1; From 1aea7fea262c3ce72febc84934719a51d74d93a1 Mon Sep 17 00:00:00 2001 From: Dmitrii Shcherbakov Date: Sat, 19 Dec 2015 18:25:52 +0300 Subject: [PATCH 6/7] htb: remove printing of a deprecated overhead value Remove printing according to the previously used encoding of mpu and overhead values within the tc_ratespec's mpu field. This encoding is no longer being used as a separate 'overhead' field in the ratespec structure has been introduced. Signed-off-by: Dmitrii Shcherbakov Acked-by: Jesper Dangaard Brouer Acked-by: Phil Sutter --- tc/q_htb.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tc/q_htb.c b/tc/q_htb.c index 7075a4c0..e76d20a4 100644 --- a/tc/q_htb.c +++ b/tc/q_htb.c @@ -273,7 +273,6 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) __u64 rate64, ceil64; SPRINT_BUF(b1); SPRINT_BUF(b2); - SPRINT_BUF(b3); SPRINT_BUF(b4); if (opt == NULL) @@ -313,16 +312,14 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) if (linklayer > TC_LINKLAYER_ETHERNET || show_details) fprintf(f, "linklayer %s ", sprint_linklayer(linklayer, b4)); if (show_details) { - fprintf(f, "burst %s/%u mpu %s overhead %s ", + fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1), 1<rate.cell_log, - sprint_size(hopt->rate.mpu&0xFF, b2), - sprint_size((hopt->rate.mpu>>8)&0xFF, b3)); - fprintf(f, "cburst %s/%u mpu %s overhead %s ", + sprint_size(hopt->rate.mpu, b2)); + fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1), 1<ceil.cell_log, - sprint_size(hopt->ceil.mpu&0xFF, b2), - sprint_size((hopt->ceil.mpu>>8)&0xFF, b3)); + sprint_size(hopt->ceil.mpu, b2)); fprintf(f, "level %d ", (int)hopt->level); } else { fprintf(f, "burst %s ", sprint_size(buffer, b1)); From 467f9fce60ebd66d02b81b4c9c6aa9ca2f5ccdbd Mon Sep 17 00:00:00 2001 From: Dmitrii Shcherbakov Date: Sat, 19 Dec 2015 18:26:03 +0300 Subject: [PATCH 7/7] htb: rename b4 buffer to b3 to make its name more consistent b3 buffer has been deleted previously so b2 is followed by b4 which is not consistent. Signed-off-by: Dmitrii Shcherbakov Acked-by: Jesper Dangaard Brouer Acked-by: Phil Sutter --- tc/q_htb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tc/q_htb.c b/tc/q_htb.c index e76d20a4..7d540908 100644 --- a/tc/q_htb.c +++ b/tc/q_htb.c @@ -273,7 +273,7 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) __u64 rate64, ceil64; SPRINT_BUF(b1); SPRINT_BUF(b2); - SPRINT_BUF(b4); + SPRINT_BUF(b3); if (opt == NULL) return 0; @@ -310,7 +310,7 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) cbuffer = tc_calc_xmitsize(ceil64, hopt->cbuffer); linklayer = (hopt->rate.linklayer & TC_LINKLAYER_MASK); if (linklayer > TC_LINKLAYER_ETHERNET || show_details) - fprintf(f, "linklayer %s ", sprint_linklayer(linklayer, b4)); + fprintf(f, "linklayer %s ", sprint_linklayer(linklayer, b3)); if (show_details) { fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1),