aboutsummaryrefslogtreecommitdiffstats
path: root/ip
diff options
context:
space:
mode:
authorRoopa Prabhu <roopa@cumulusnetworks.com>2017-07-07 15:08:11 -0700
committerStephen Hemminger <stephen@networkplumber.org>2017-07-18 17:17:27 -0700
commit2e86ed542d0d89e57115ba2115303f327652f3a7 (patch)
treebcdfb178afd60d121987c3d376439402247fe7ac /ip
parent89ec74a3eae28c1a48c81de47cf43527b914cbc4 (diff)
downloadplatform_external_iproute2-2e86ed542d0d89e57115ba2115303f327652f3a7.tar.gz
platform_external_iproute2-2e86ed542d0d89e57115ba2115303f327652f3a7.tar.bz2
platform_external_iproute2-2e86ed542d0d89e57115ba2115303f327652f3a7.zip
iproute: extend route get for mpls routes
This patch extends route get to support mpls specific route attributes like RTA_NEWDST. Input: RTA_DST - input label RTA_NEWDST - labels in packet for multipath selection By default the getroute handler returns matched nexthop label, via and oif With fibmatch keyword (RTM_F_FIB_MATCH flag), full matched route is returned. example: $ip -f mpls route show 101 nexthop as to 102/103 via inet 172.16.2.2 dev virt1-2 nexthop as to 302/303 via inet 172.16.12.2 dev virt1-12 201 nexthop as to 202/203 via inet6 2001:db8:2::2 dev virt1-2 nexthop as to 402/403 via inet6 2001:db8:12::2 dev virt1-12 $ip -f mpls route get 103 RTNETLINK answers: Network is unreachable $ip -f mpls route get 101 101 as to 102/103 via inet 172.16.2.2 dev virt1-2 $ip -f mpls route get as to 302/303 101 101 as to 302/303 via inet 172.16.12.2 dev virt1-12 $ip -f mpls route get fibmatch 103 RTNETLINK answers: Network is unreachable $ip -f mpls route get fibmatch 101 101 nexthop as to 102/103 via inet 172.16.2.2 dev virt1-2 nexthop as to 302/303 via inet 172.16.12.2 dev virt1-12 Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Diffstat (limited to 'ip')
-rw-r--r--ip/iproute.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/ip/iproute.c b/ip/iproute.c
index 4e022d77..a735d281 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -1731,6 +1731,16 @@ static int iproute_get(int argc, char **argv)
addattr32(&req.n, sizeof(req), RTA_UID, uid);
} else if (matches(*argv, "fibmatch") == 0) {
fib_match = 1;
+ } else if (strcmp(*argv, "as") == 0) {
+ inet_prefix addr;
+
+ NEXT_ARG();
+ if (strcmp(*argv, "to") == 0)
+ NEXT_ARG();
+ get_addr(&addr, *argv, req.r.rtm_family);
+ if (req.r.rtm_family == AF_UNSPEC)
+ req.r.rtm_family = addr.family;
+ addattr_l(&req.n, sizeof(req), RTA_NEWDST, &addr.data, addr.bytelen);
} else {
inet_prefix addr;