summaryrefslogtreecommitdiff
path: root/bgpd/bgp_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_zebra.c')
-rw-r--r--bgpd/bgp_zebra.c55
1 files changed, 39 insertions, 16 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index becd99167f..ac5aef6515 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -1308,7 +1308,6 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
struct bgp_path_info local_info;
struct bgp_path_info *mpinfo_cp = &local_info;
route_tag_t tag;
- struct bgp_sid_info *sid_info;
mpls_label_t *labels;
uint32_t num_labels = 0;
mpls_label_t nh_label;
@@ -1348,7 +1347,8 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
/*
* vrf leaking support (will have only one nexthop)
*/
- if (info->extra && info->extra->bgp_orig)
+ if (info->extra && info->extra->vrfleak &&
+ info->extra->vrfleak->bgp_orig)
nh_othervrf = 1;
/* Make Zebra API structure. */
@@ -1364,8 +1364,10 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
&& info->sub_type == BGP_ROUTE_IMPORTED) {
/* Obtain peer from parent */
- if (info->extra && info->extra->parent)
- peer = ((struct bgp_path_info *)(info->extra->parent))
+ if (info->extra && info->extra->vrfleak &&
+ info->extra->vrfleak->parent)
+ peer = ((struct bgp_path_info *)(info->extra->vrfleak
+ ->parent))
->peer;
}
@@ -1553,15 +1555,21 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
api_nh->weight = nh_weight;
- if (mpinfo->extra && !is_evpn &&
- bgp_is_valid_label(&labels[0]) &&
- !sid_zero(&mpinfo->extra->sid[0].sid)) {
- sid_info = &mpinfo->extra->sid[0];
-
- memcpy(&api_nh->seg6_segs, &sid_info->sid,
+ if (((mpinfo->attr->srv6_l3vpn &&
+ !sid_zero(&mpinfo->attr->srv6_l3vpn->sid)) ||
+ (mpinfo->attr->srv6_vpn &&
+ !sid_zero(&mpinfo->attr->srv6_vpn->sid))) &&
+ !is_evpn && bgp_is_valid_label(&labels[0])) {
+ struct in6_addr *sid_tmp =
+ mpinfo->attr->srv6_l3vpn
+ ? (&mpinfo->attr->srv6_l3vpn->sid)
+ : (&mpinfo->attr->srv6_vpn->sid);
+
+ memcpy(&api_nh->seg6_segs, sid_tmp,
sizeof(api_nh->seg6_segs));
- if (sid_info->transposition_len != 0) {
+ if (mpinfo->attr->srv6_l3vpn &&
+ mpinfo->attr->srv6_l3vpn->transposition_len != 0) {
mpls_lse_decode(labels[0], &nh_label, &ttl,
&exp, &bos);
@@ -1573,8 +1581,10 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
}
transpose_sid(&api_nh->seg6_segs, nh_label,
- sid_info->transposition_offset,
- sid_info->transposition_len);
+ mpinfo->attr->srv6_l3vpn
+ ->transposition_offset,
+ mpinfo->attr->srv6_l3vpn
+ ->transposition_len);
}
SET_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_SEG6);
@@ -2436,8 +2446,14 @@ static int rule_notify_owner(ZAPI_CALLBACK_ARGS)
/* link bgp_info to bgp_pbr */
path = (struct bgp_path_info *)bgp_pbr->path;
extra = bgp_path_info_extra_get(path);
- listnode_add_force(&extra->bgp_fs_iprule,
- bgp_pbr);
+ if (!extra->flowspec) {
+ extra->flowspec =
+ XCALLOC(MTYPE_BGP_ROUTE_EXTRA_FS,
+ sizeof(struct bgp_path_info_extra_fs));
+ extra->flowspec->bgp_fs_iprule = NULL;
+ extra->flowspec->bgp_fs_pbr = NULL;
+ }
+ listnode_add_force(&extra->flowspec->bgp_fs_iprule, bgp_pbr);
}
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("%s: Received RULE_INSTALLED", __func__);
@@ -2539,7 +2555,14 @@ static int ipset_entry_notify_owner(ZAPI_CALLBACK_ARGS)
/* link bgp_path_info to bpme */
path = (struct bgp_path_info *)bgp_pbime->path;
extra = bgp_path_info_extra_get(path);
- listnode_add_force(&extra->bgp_fs_pbr, bgp_pbime);
+ if (!extra->flowspec) {
+ extra->flowspec =
+ XCALLOC(MTYPE_BGP_ROUTE_EXTRA_FS,
+ sizeof(struct bgp_path_info_extra_fs));
+ extra->flowspec->bgp_fs_iprule = NULL;
+ extra->flowspec->bgp_fs_pbr = NULL;
+ }
+ listnode_add_force(&extra->flowspec->bgp_fs_pbr, bgp_pbime);
}
break;
case ZAPI_IPSET_ENTRY_FAIL_REMOVE: