| From ce4bc1ed048233e89ee4cb95830bf6f01d523d1e Mon Sep 17 00:00:00 2001 |
| From: Denys Vlasenko <vda.linux@googlemail.com> |
| Date: Wed, 30 Dec 2015 17:32:51 +0100 |
| Subject: [PATCH] iproute: support "scope". Closes 8561 |
| |
| function old new delta |
| iproute_modify 1051 1120 +69 |
| |
| Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| |
| Upstream-Status: Backport |
| Modified patch to build against busybox 1.24.1: |
| - s/invarg_1_to_2/invarg |
| Signed-off-by: André Draszik <adraszik@tycoint.com> |
| --- |
| networking/libiproute/iproute.c | 52 ++++++++++++++++++++++++++--------------- |
| 1 file changed, 33 insertions(+), 19 deletions(-) |
| |
| diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c |
| index d232ee6fd..82827488f 100644 |
| --- a/networking/libiproute/iproute.c |
| +++ b/networking/libiproute/iproute.c |
| @@ -313,12 +313,13 @@ static int FAST_FUNC print_route(const struct sockaddr_nl *who UNUSED_PARAM, |
| static int iproute_modify(int cmd, unsigned flags, char **argv) |
| { |
| static const char keywords[] ALIGN1 = |
| - "src\0""via\0""mtu\0""lock\0""protocol\0"IF_FEATURE_IP_RULE("table\0") |
| + "src\0""via\0""mtu\0""lock\0""scope\0""protocol\0"IF_FEATURE_IP_RULE("table\0") |
| "dev\0""oif\0""to\0""metric\0""onlink\0"; |
| enum { |
| ARG_src, |
| ARG_via, |
| ARG_mtu, PARM_lock, |
| + ARG_scope, |
| ARG_protocol, |
| IF_FEATURE_IP_RULE(ARG_table,) |
| ARG_dev, |
| @@ -344,6 +345,7 @@ IF_FEATURE_IP_RULE(ARG_table,) |
| unsigned mxlock = 0; |
| char *d = NULL; |
| smalluint ok = 0; |
| + smalluint scope_ok = 0; |
| int arg; |
| |
| memset(&req, 0, sizeof(req)); |
| @@ -352,15 +354,18 @@ IF_FEATURE_IP_RULE(ARG_table,) |
| req.n.nlmsg_flags = NLM_F_REQUEST | flags; |
| req.n.nlmsg_type = cmd; |
| req.r.rtm_family = preferred_family; |
| - if (RT_TABLE_MAIN) /* if it is zero, memset already did it */ |
| + if (RT_TABLE_MAIN != 0) /* if it is zero, memset already did it */ |
| req.r.rtm_table = RT_TABLE_MAIN; |
| - if (RT_SCOPE_NOWHERE) |
| + if (RT_SCOPE_NOWHERE != 0) |
| req.r.rtm_scope = RT_SCOPE_NOWHERE; |
| |
| if (cmd != RTM_DELROUTE) { |
| - req.r.rtm_protocol = RTPROT_BOOT; |
| - req.r.rtm_scope = RT_SCOPE_UNIVERSE; |
| - req.r.rtm_type = RTN_UNICAST; |
| + if (RTPROT_BOOT != 0) |
| + req.r.rtm_protocol = RTPROT_BOOT; |
| + if (RT_SCOPE_UNIVERSE != 0) |
| + req.r.rtm_scope = RT_SCOPE_UNIVERSE; |
| + if (RTN_UNICAST != 0) |
| + req.r.rtm_type = RTN_UNICAST; |
| } |
| |
| mxrta->rta_type = RTA_METRICS; |
| @@ -393,6 +398,13 @@ IF_FEATURE_IP_RULE(ARG_table,) |
| } |
| mtu = get_unsigned(*argv, "mtu"); |
| rta_addattr32(mxrta, sizeof(mxbuf), RTAX_MTU, mtu); |
| + } else if (arg == ARG_scope) { |
| + uint32_t scope; |
| + NEXT_ARG(); |
| + if (rtnl_rtscope_a2n(&scope, *argv)) |
| + invarg(*argv, "scope"); |
| + req.r.rtm_scope = scope; |
| + scope_ok = 1; |
| } else if (arg == ARG_protocol) { |
| uint32_t prot; |
| NEXT_ARG(); |
| @@ -469,20 +481,22 @@ IF_FEATURE_IP_RULE(ARG_table,) |
| addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); |
| } |
| |
| - if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) |
| - req.r.rtm_scope = RT_SCOPE_HOST; |
| - else |
| - if (req.r.rtm_type == RTN_BROADCAST |
| - || req.r.rtm_type == RTN_MULTICAST |
| - || req.r.rtm_type == RTN_ANYCAST |
| - ) { |
| - req.r.rtm_scope = RT_SCOPE_LINK; |
| - } |
| - else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { |
| - if (cmd == RTM_DELROUTE) |
| - req.r.rtm_scope = RT_SCOPE_NOWHERE; |
| - else if (!(ok & gw_ok)) |
| + if (!scope_ok) { |
| + if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) |
| + req.r.rtm_scope = RT_SCOPE_HOST; |
| + else |
| + if (req.r.rtm_type == RTN_BROADCAST |
| + || req.r.rtm_type == RTN_MULTICAST |
| + || req.r.rtm_type == RTN_ANYCAST |
| + ) { |
| req.r.rtm_scope = RT_SCOPE_LINK; |
| + } |
| + else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { |
| + if (cmd == RTM_DELROUTE) |
| + req.r.rtm_scope = RT_SCOPE_NOWHERE; |
| + else if (!(ok & gw_ok)) |
| + req.r.rtm_scope = RT_SCOPE_LINK; |
| + } |
| } |
| |
| if (req.r.rtm_family == AF_UNSPEC) { |
| -- |
| 2.11.0 |
| |