From eb15f4773acaadce78efeddb425030e14d014116 Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Mon, 15 May 2017 17:03:10 +0000 Subject: [PATCH 1/4] bgpd: added bgp_nexthop_afi() Signed-off-by: Daniel Walton Added bgp_nexthop_afi() to have one place that determines what the Nexthop AFI is for bgp_packet_mpattr_start() --- bgpd/bgp_attr.c | 32 ++++++++++++++++++++++++-------- bgpd/bgp_attr.h | 2 ++ bgpd/bgp_updgrp_packet.c | 9 +++++---- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index d80b9f237b..5c444869b4 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -2827,10 +2827,6 @@ 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 */ switch (nh_afi) @@ -3099,6 +3095,27 @@ bgp_packet_mpattr_end (struct stream *s, size_t sizep) stream_putw_at (s, sizep, (stream_get_endp (s) - sizep) - 2); } + +/* Return the Nexthop AFI that should be used */ +afi_t +bgp_nexthop_afi (struct peer *peer, afi_t afi, safi_t safi, struct attr *attr) +{ + afi_t nh_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); + } + + return nh_afi; +} + /* Make attribute packet. */ bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *peer, @@ -3115,6 +3132,7 @@ bgp_packet_attribute (struct bgp *bgp, struct peer *peer, int send_as4_path = 0; int send_as4_aggregator = 0; int use32bit = (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV)) ? 1 : 0; + afi_t nh_afi; if (! bgp) bgp = peer->bgp; @@ -3127,10 +3145,8 @@ 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); + nh_afi = bgp_nexthop_afi(peer, afi, safi, attr); + mpattrlen_pos = bgp_packet_mpattr_start(s, afi, safi, nh_afi, 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); diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 1df1faf939..2931b2f2b6 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -249,6 +249,8 @@ extern struct attr *bgp_attr_default_set (struct attr *attr, u_char); extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char, struct aspath *, struct community *, int as_set, u_char); +extern afi_t bgp_nexthop_afi (struct peer *peer, afi_t afi, safi_t safi, + struct attr *attr); extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, struct stream *, struct attr *, struct bpacket_attr_vec_arr *vecarr, diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index f734763b70..8a4824f859 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -656,6 +656,7 @@ subgroup_update_packet (struct update_subgroup *subgrp) u_int32_t addpath_tx_id = 0; struct prefix_rd *prd = NULL; char label_buf[20]; + afi_t nh_afi; if (!subgrp) return NULL; @@ -767,11 +768,11 @@ subgroup_update_packet (struct update_subgroup *subgrp) if (bgp_labeled_safi(safi)) 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 */ + if (stream_empty (snlri)) { + nh_afi = bgp_nexthop_afi(peer, afi, safi, adv->baa->attr); + mpattrlen_pos = bgp_packet_mpattr_start (snlri, afi, safi, nh_afi, &vecarr, adv->baa->attr); + } bgp_packet_mpattr_prefix (snlri, afi, safi, &rn->p, prd, tag, addpath_encode, addpath_tx_id, adv->baa->attr); From 2b26882d28fb6c28930c97c4ad53d0bc3e1f29d3 Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Tue, 16 May 2017 17:28:12 +0000 Subject: [PATCH 2/4] bgpd: fix nh_afi in bgp_packet_mpattr_start() Signed-off-by: Daniel Walton --- bgpd/bgp_attr.c | 39 +++++++++++++++------------------------ bgpd/bgp_attr.h | 4 ++-- bgpd/bgp_updgrp_packet.c | 7 ++----- 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 5c444869b4..0eb84bda02 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -2807,13 +2807,26 @@ 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; + + 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); + } /* Set extended bit always to encode the attribute length as 2 bytes */ stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN); @@ -3096,26 +3109,6 @@ bgp_packet_mpattr_end (struct stream *s, size_t sizep) } -/* Return the Nexthop AFI that should be used */ -afi_t -bgp_nexthop_afi (struct peer *peer, afi_t afi, safi_t safi, struct attr *attr) -{ - afi_t nh_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); - } - - return nh_afi; -} - /* Make attribute packet. */ bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *peer, @@ -3132,7 +3125,6 @@ bgp_packet_attribute (struct bgp *bgp, struct peer *peer, int send_as4_path = 0; int send_as4_aggregator = 0; int use32bit = (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV)) ? 1 : 0; - afi_t nh_afi; if (! bgp) bgp = peer->bgp; @@ -3145,8 +3137,7 @@ bgp_packet_attribute (struct bgp *bgp, struct peer *peer, { size_t mpattrlen_pos = 0; - nh_afi = bgp_nexthop_afi(peer, afi, safi, attr); - mpattrlen_pos = bgp_packet_mpattr_start(s, afi, safi, nh_afi, 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); diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 2931b2f2b6..e7f3e25c41 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -299,8 +299,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, diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index 8a4824f859..2408a8ca30 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -656,7 +656,6 @@ subgroup_update_packet (struct update_subgroup *subgrp) u_int32_t addpath_tx_id = 0; struct prefix_rd *prd = NULL; char label_buf[20]; - afi_t nh_afi; if (!subgrp) return NULL; @@ -768,11 +767,9 @@ subgroup_update_packet (struct update_subgroup *subgrp) if (bgp_labeled_safi(safi)) sprintf (label_buf, "label %u", label_pton(tag)); - if (stream_empty (snlri)) { - nh_afi = bgp_nexthop_afi(peer, afi, safi, adv->baa->attr); - mpattrlen_pos = bgp_packet_mpattr_start (snlri, afi, safi, nh_afi, + if (stream_empty (snlri)) + mpattrlen_pos = bgp_packet_mpattr_start (snlri, peer, afi, safi, &vecarr, adv->baa->attr); - } bgp_packet_mpattr_prefix (snlri, afi, safi, &rn->p, prd, tag, addpath_encode, addpath_tx_id, adv->baa->attr); From a080e8fbcbbfe05287ad4f7935c81a3816965e00 Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Tue, 16 May 2017 18:05:45 +0000 Subject: [PATCH 3/4] bgpd: fix nh_afi in bgp_packet_mpattr_start() Signed-off-by: Daniel Walton --- bgpd/bgp_attr.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 0eb84bda02..f21194149f 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -2817,17 +2817,6 @@ bgp_packet_mpattr_start (struct stream *s, struct peer *peer, safi_t pkt_safi; afi_t nh_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); - } - /* Set extended bit always to encode the attribute length as 2 bytes */ stream_putc (s, BGP_ATTR_FLAG_OPTIONAL|BGP_ATTR_FLAG_EXTLEN); stream_putc (s, BGP_ATTR_MP_REACH_NLRI); @@ -2841,6 +2830,18 @@ bgp_packet_mpattr_start (struct stream *s, struct peer *peer, stream_putw (s, pkt_afi); /* AFI */ stream_putc (s, pkt_safi); /* SAFI */ + /* 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) { @@ -3108,7 +3109,6 @@ bgp_packet_mpattr_end (struct stream *s, size_t sizep) stream_putw_at (s, sizep, (stream_get_endp (s) - sizep) - 2); } - /* Make attribute packet. */ bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *peer, From d79d90b297c5b6fde0d839988e8a07be09baba90 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Thu, 18 May 2017 11:29:28 +0200 Subject: [PATCH 4/4] bgpd: remove bgp_nexthop_afi prototype as pointed out by Renato Westphal in #536 Signed-off-by: David Lamparter --- bgpd/bgp_attr.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index e7f3e25c41..b28197cdd2 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -249,8 +249,6 @@ extern struct attr *bgp_attr_default_set (struct attr *attr, u_char); extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char, struct aspath *, struct community *, int as_set, u_char); -extern afi_t bgp_nexthop_afi (struct peer *peer, afi_t afi, safi_t safi, - struct attr *attr); extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, struct stream *, struct attr *, struct bpacket_attr_vec_arr *vecarr,