]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge branch 'frr/pull/536'
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 18 May 2017 09:30:04 +0000 (11:30 +0200)
committerDavid Lamparter <equinox@opensourcerouting.org>
Thu, 18 May 2017 09:30:04 +0000 (11:30 +0200)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
bgpd/bgp_attr.c
bgpd/bgp_attr.h
bgpd/bgp_updgrp_packet.c

index 9923f94923203732f75bd34e26d48c652ef22cb2..9c06c74aac1b803e089676286e36c56de6037de1 100644 (file)
@@ -2806,13 +2806,15 @@ bgp_attr_parse (struct peer *peer, struct attr *attr, bgp_size_t size,
 }
 
 size_t
-bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi,
+bgp_packet_mpattr_start (struct stream *s, struct peer *peer,
+                         afi_t afi, safi_t safi,
                         struct bpacket_attr_vec_arr *vecarr,
                         struct attr *attr)
 {
   size_t sizep;
   iana_afi_t pkt_afi;
   safi_t pkt_safi;
+  afi_t nh_afi;
 
   /* Set extended bit always to encode the attribute length as 2 bytes */
   stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN);
@@ -2826,10 +2828,18 @@ bgp_packet_mpattr_start (struct stream *s, afi_t afi, safi_t safi, afi_t nh_afi,
 
   stream_putw (s, pkt_afi);    /* AFI */
   stream_putc (s, pkt_safi);   /* SAFI */
-  if (afi == AFI_L2VPN)
-    nh_afi = AFI_L2VPN;
-  else if (nh_afi == AFI_MAX)
-    nh_afi = BGP_NEXTHOP_AFI_FROM_NHLEN(attr->extra->mp_nexthop_len);
+
+  /* Nexthop AFI */
+  if (peer_cap_enhe(peer, afi, safi)) {
+    nh_afi = AFI_IP6;
+  } else {
+    if (afi == AFI_L2VPN)
+      nh_afi = AFI_L2VPN;
+    else if (safi == SAFI_LABELED_UNICAST)
+      nh_afi = afi;
+    else
+      nh_afi = BGP_NEXTHOP_AFI_FROM_NHLEN(attr->extra->mp_nexthop_len);
+  }
 
   /* Nexthop */
   switch (nh_afi)
@@ -3126,10 +3136,7 @@ bgp_packet_attribute (struct bgp *bgp, struct peer *peer,
     {
       size_t mpattrlen_pos = 0;
 
-      mpattrlen_pos = bgp_packet_mpattr_start(s, afi, safi,
-                                              (peer_cap_enhe(peer, afi, safi) ? AFI_IP6 :
-                                               AFI_MAX), /* get from NH */
-                                              vecarr, attr);
+      mpattrlen_pos = bgp_packet_mpattr_start(s, peer, afi, safi, vecarr, attr);
       bgp_packet_mpattr_prefix(s, afi, safi, p, prd, tag,
                                addpath_encode, addpath_tx_id, attr);
       bgp_packet_mpattr_end(s, mpattrlen_pos);
index 7dfd397bb9dcf4b441337c63c8e47304f61b667a..f25df3a8b9e5a0075107cf1890cd764d2aa250d5 100644 (file)
@@ -297,8 +297,8 @@ bgp_attr_flush_encap(struct attr *attr);
  * one for each NLRI that needs to be encoded into the UPDATE message, and
  * finally the _end() function.
  */
-extern size_t bgp_packet_mpattr_start(struct stream *s, afi_t afi, safi_t safi,
-                                      afi_t nh_afi,
+extern size_t bgp_packet_mpattr_start(struct stream *s, struct peer *peer,
+                                      afi_t afi, safi_t safi,
                                       struct bpacket_attr_vec_arr *vecarr,
                                      struct attr *attr);
 extern void bgp_packet_mpattr_prefix(struct stream *s, afi_t afi, safi_t safi,
index 95e9360d4352f58ccebdef441db7959e1c21e8b7..692436a93508761421c2b4d3145c31463ed3324b 100644 (file)
@@ -767,9 +767,7 @@ subgroup_update_packet (struct update_subgroup *subgrp)
             sprintf (label_buf, "label %u", label_pton(tag));
 
          if (stream_empty (snlri))
-           mpattrlen_pos = bgp_packet_mpattr_start (snlri, afi, safi,
-                                                     (peer_cap_enhe(peer, afi, safi) ? AFI_IP6 :
-                                                      AFI_MAX), /* get from NH */
+            mpattrlen_pos = bgp_packet_mpattr_start (snlri, peer, afi, safi,
                                                      &vecarr, adv->baa->attr);
 
           bgp_packet_mpattr_prefix (snlri, afi, safi, &rn->p, prd,