[PATCH] Netlink: Fix parsing of MPLS multipath routes

Kazuki Yamaguchi k at rhe.jp
Wed Jun 3 09:11:20 CEST 2020


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 <k at rhe.jp>
---
 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



More information about the Bird-users mailing list