123 lines
3.9 KiB
Diff
123 lines
3.9 KiB
Diff
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
|
|
|