summaryrefslogtreecommitdiff
path: root/bgpd/bgp_updgrp_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_updgrp_packet.c')
-rw-r--r--bgpd/bgp_updgrp_packet.c57
1 files changed, 45 insertions, 12 deletions
diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c
index e04d5ae245..bff52c80d8 100644
--- a/bgpd/bgp_updgrp_packet.c
+++ b/bgpd/bgp_updgrp_packet.c
@@ -523,11 +523,16 @@ struct stream *bpacket_reformat_for_peer(struct bpacket *pkt,
gnh_modified = 1;
}
- if (IN6_IS_ADDR_UNSPECIFIED(mod_v6nhg)) {
- if (peer->nexthop.v4.s_addr != INADDR_ANY) {
- ipv4_to_ipv4_mapped_ipv6(mod_v6nhg,
- peer->nexthop.v4);
- }
+ if (peer->nexthop.v4.s_addr != INADDR_ANY &&
+ (IN6_IS_ADDR_UNSPECIFIED(mod_v6nhg) ||
+ (peer->connection->su.sa.sa_family == AF_INET &&
+ paf->afi == AFI_IP6))) {
+ /* set a IPv4 mapped IPv6 address if no global IPv6
+ * address is found or if announcing IPv6 prefix
+ * over an IPv4 BGP session.
+ */
+ ipv4_to_ipv4_mapped_ipv6(mod_v6nhg, peer->nexthop.v4);
+ gnh_modified = 1;
}
if (IS_MAPPED_IPV6(&peer->nexthop.v6_global)) {
@@ -789,6 +794,29 @@ struct bpacket *subgroup_update_packet(struct update_subgroup *subgrp)
safi);
label_pnt = &label;
num_labels = 1;
+ } else if (safi == SAFI_MPLS_VPN && path &&
+ CHECK_FLAG(path->flags,
+ BGP_PATH_MPLSVPN_NH_LABEL_BIND) &&
+ path->mplsvpn.bmnc.nh_label_bind_cache &&
+ path->peer && path->peer != peer &&
+ path->sub_type != BGP_ROUTE_IMPORTED &&
+ path->sub_type != BGP_ROUTE_STATIC &&
+ bgp_mplsvpn_path_uses_valid_mpls_label(
+ path) &&
+ bgp_path_info_nexthop_changed(path, peer,
+ afi)) {
+ /* Redistributed mpls vpn route between distinct
+ * peers from 'pi->peer' to 'to',
+ * and an mpls label is used in this path,
+ * and there is a nh label bind entry,
+ * then get appropriate mpls local label. When
+ * called here, 'get_label()' returns a valid
+ * label.
+ */
+ label = bgp_mplsvpn_nh_label_bind_get_label(
+ path);
+ label_pnt = &label;
+ num_labels = 1;
} else if (path && path->extra) {
label_pnt = &path->extra->label[0];
num_labels = path->extra->num_labels;
@@ -1057,8 +1085,7 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp,
safi_t safi;
struct bpacket_attr_vec_arr vecarr;
bool addpath_capable = false;
- uint8_t default_originate_label[4] = {0x80, 0x00, 0x00};
- mpls_label_t *label = NULL;
+ mpls_label_t label = MPLS_LABEL_IMPLICIT_NULL;
uint32_t num_labels = 0;
if (DISABLE_BGP_ANNOUNCE)
@@ -1074,7 +1101,11 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp,
addpath_capable = bgp_addpath_encode_tx(peer, afi, safi);
if (safi == SAFI_LABELED_UNICAST) {
- label = (mpls_label_t *)default_originate_label;
+ label = mpls_lse_encode((afi == AFI_IP)
+ ? MPLS_LABEL_IPV4_EXPLICIT_NULL
+ : MPLS_LABEL_IPV6_EXPLICIT_NULL,
+ 0, 0, 1);
+ bgp_set_valid_label(&label);
num_labels = 1;
}
@@ -1119,10 +1150,12 @@ void subgroup_default_update_packet(struct update_subgroup *subgrp,
/* Make place for total attribute length. */
pos = stream_get_endp(s);
stream_putw(s, 0);
- total_attr_len = bgp_packet_attribute(
- NULL, peer, s, attr, &vecarr, &p, afi, safi, from, NULL, label,
- num_labels, addpath_capable,
- BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE, NULL);
+ total_attr_len =
+ bgp_packet_attribute(NULL, peer, s, attr, &vecarr, &p, afi,
+ safi, from, NULL, &label, num_labels,
+ addpath_capable,
+ BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE,
+ NULL);
/* Set Total Path Attribute Length. */
stream_putw_at(s, pos, total_attr_len);