Add support for RTA_MULTIPATH attribute parsing for AF_MPLS routes.

BIRD is capable of installing a multipath route into kernel on Linux,
but it would not be seen because parsing fails. This made BIRD attempt
to install the same route repeatedly.

Signed-off-by: Kazuki Yamaguchi <[email protected]>
---
 sysdep/linux/netlink.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index a9e711b4dae0..622c193bb795 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -357,6 +357,11 @@ static struct nl_want_attrs 
nexthop_attr_want6[BIRD_RTA_MAX] = {
 };
 
 #ifdef HAVE_MPLS_KERNEL
+static struct nl_want_attrs nexthop_attr_want_mpls[BIRD_RTA_MAX] = {
+  [RTA_VIA]      = { 1, 0, 0 },
+  [RTA_NEWDST]   = { 1, 0, 0 },
+};
+
 static struct nl_want_attrs encap_mpls_want[BIRD_RTA_MAX] = {
   [RTA_DST]       = { 1, 0, 0 },
 };
@@ -401,6 +406,7 @@ static struct nl_want_attrs 
rtm_attr_want_mpls[BIRD_RTA_MAX] = {
   [RTA_OIF]      = { 1, 1, sizeof(u32) },
   [RTA_PRIORITY]  = { 1, 1, sizeof(u32) },
   [RTA_METRICS]          = { 1, 0, 0 },
+  [RTA_MULTIPATH] = { 1, 0, 0 },
   [RTA_FLOW]     = { 1, 1, sizeof(u32) },
   [RTA_TABLE]    = { 1, 1, sizeof(u32) },
   [RTA_VIA]      = { 1, 0, 0 },
@@ -703,6 +709,13 @@ nl_parse_multipath(struct nl_parse_state *s, struct 
krt_proto *p, struct rtattr
            return NULL;
          break;
 
+#ifdef HAVE_MPLS_KERNEL
+       case AF_MPLS:
+         if (!nl_parse_attrs(RTNH_DATA(nh), nexthop_attr_want_mpls, a, 
sizeof(a)))
+           return NULL;
+         break;
+#endif
+
        default:
          return NULL;
        }
@@ -728,6 +741,9 @@ nl_parse_multipath(struct nl_parse_state *s, struct 
krt_proto *p, struct rtattr
        }
 
 #ifdef HAVE_MPLS_KERNEL
+      if (af == AF_MPLS && a[RTA_NEWDST])
+       rv->labels = rta_get_mpls(a[RTA_NEWDST], rv->label);
+
       if (a[RTA_ENCAP] && a[RTA_ENCAP_TYPE])
       {
        if (rta_get_u16(a[RTA_ENCAP_TYPE]) != LWTUNNEL_ENCAP_MPLS) {
-- 
2.27.0

Reply via email to