]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iproute: extend route get for mpls routes
authorRoopa Prabhu <roopa@cumulusnetworks.com>
Fri, 7 Jul 2017 22:08:11 +0000 (15:08 -0700)
committerStephen Hemminger <stephen@networkplumber.org>
Wed, 19 Jul 2017 00:17:27 +0000 (17:17 -0700)
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>
ip/iproute.c

index 4e022d77275f6b8e8585fff45ec4ad44b2ae293b..a735d281eb8aa46bb38ef17e57e93900a706a25a 100644 (file)
@@ -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;