From: Roopa Prabhu <ro...@cumulusnetworks.com> 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 <ro...@cumulusnetworks.com> --- ip/iproute.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ip/iproute.c b/ip/iproute.c index 4e022d7..a735d28 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; -- 1.9.1