diff options
Diffstat (limited to 'bgpd/bgp_updgrp_packet.c')
| -rw-r--r-- | bgpd/bgp_updgrp_packet.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index b63dfbed0a..9fa733a720 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -701,7 +701,8 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp) int addpath_overhead = 0; u_int32_t addpath_tx_id = 0; struct prefix_rd *prd = NULL; - mpls_label_t label = MPLS_INVALID_LABEL; + mpls_label_t label = MPLS_INVALID_LABEL, *label_pnt = NULL; + u_int32_t num_labels = 0; if (!subgrp) return NULL; @@ -772,7 +773,7 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp) * attr. */ total_attr_len = bgp_packet_attribute( NULL, peer, s, adv->baa->attr, &vecarr, NULL, - afi, safi, from, NULL, NULL, 0, 0); + afi, safi, from, NULL, NULL, 0, 0, 0); space_remaining = STREAM_CONCAT_REMAIN(s, snlri, STREAM_SIZE(s)) @@ -815,11 +816,15 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp) if (rn->prn) prd = (struct prefix_rd *)&rn->prn->p; - if (safi == SAFI_LABELED_UNICAST) + if (safi == SAFI_LABELED_UNICAST) { label = bgp_adv_label(rn, binfo, peer, afi, safi); - else if (binfo && binfo->extra) - label = binfo->extra->label; + label_pnt = &label; + num_labels = 1; + } else if (binfo && binfo->extra) { + label_pnt = &binfo->extra->label[0]; + num_labels = binfo->extra->num_labels; + } if (stream_empty(snlri)) mpattrlen_pos = bgp_packet_mpattr_start( @@ -827,8 +832,9 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp) adv->baa->attr); bgp_packet_mpattr_prefix(snlri, afi, safi, &rn->p, prd, - &label, addpath_encode, - addpath_tx_id, adv->baa->attr); + label_pnt, num_labels, + addpath_encode, addpath_tx_id, + adv->baa->attr); } num_pfx++; @@ -857,7 +863,8 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp) send_attr_printed = 1; } - bgp_debug_rdpfxpath2str(afi, safi, prd, &rn->p, &label, + bgp_debug_rdpfxpath2str(afi, safi, prd, &rn->p, + label_pnt, num_labels, addpath_encode, addpath_tx_id, pfx_buf, sizeof(pfx_buf)); zlog_debug("u%" PRIu64 ":s%" PRIu64 " send UPDATE %s", @@ -1009,7 +1016,7 @@ struct bpacket *subgroup_withdraw_packet(struct update_subgroup *subgrp) } bgp_packet_mpunreach_prefix(s, &rn->p, afi, safi, prd, - NULL, addpath_encode, + NULL, 0, addpath_encode, addpath_tx_id, NULL); } @@ -1018,7 +1025,7 @@ struct bpacket *subgroup_withdraw_packet(struct update_subgroup *subgrp) if (bgp_debug_update(NULL, &rn->p, subgrp->update_group, 0)) { char pfx_buf[BGP_PRD_PATH_STRLEN]; - bgp_debug_rdpfxpath2str(afi, safi, prd, &rn->p, NULL, + bgp_debug_rdpfxpath2str(afi, safi, prd, &rn->p, NULL, 0, addpath_encode, addpath_tx_id, pfx_buf, sizeof(pfx_buf)); zlog_debug("u%" PRIu64 ":s%" PRIu64 @@ -1132,7 +1139,7 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp, stream_putw(s, 0); total_attr_len = bgp_packet_attribute( NULL, peer, s, attr, &vecarr, &p, afi, safi, from, NULL, NULL, - addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE); + 0, addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE); /* Set Total Path Attribute Length. */ stream_putw_at(s, pos, total_attr_len); @@ -1227,7 +1234,7 @@ void subgroup_default_withdraw_packet(struct update_subgroup *subgrp) mp_start = stream_get_endp(s); mplen_pos = bgp_packet_mpunreach_start(s, afi, safi); bgp_packet_mpunreach_prefix( - s, &p, afi, safi, NULL, NULL, addpath_encode, + s, &p, afi, safi, NULL, NULL, 0, addpath_encode, BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, NULL); /* Set the mp_unreach attr's length */ |
