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.c139
1 files changed, 64 insertions, 75 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 8d07e050f8..f7c4b04adf 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -41,6 +41,7 @@
#include "bgpd/bgpd.h"
#include "bgpd/bgp_route.h"
#include "bgpd/bgp_attr.h"
+#include "bgpd/bgp_aspath.h"
#include "bgpd/bgp_nexthop.h"
#include "bgpd/bgp_zebra.h"
#include "bgpd/bgp_fsm.h"
@@ -526,10 +527,10 @@ static int zebra_read_route(ZAPI_CALLBACK_ARGS)
inet_ntop(api.prefix.family, &nexthop, buf,
sizeof(buf));
zlog_debug(
- "Rx route ADD VRF %u %s[%d] %pFX nexthop %s (type %d if %u) metric %u tag %" ROUTE_TAG_PRI,
+ "Rx route ADD VRF %u %s[%d] %pFX nexthop %s (type %d if %u) metric %u distance %u tag %" ROUTE_TAG_PRI,
vrf_id, zebra_route_string(api.type),
api.instance, &api.prefix, buf, nhtype, ifindex,
- api.metric, api.tag);
+ api.metric, api.distance, api.tag);
} else {
zlog_debug("Rx route DEL VRF %u %s[%d] %pFX", vrf_id,
zebra_route_string(api.type), api.instance,
@@ -1304,43 +1305,36 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
ATTR_FLAG_BIT(BGP_ATTR_SRTE_COLOR)))
api_nh->srte_color = info->attr->srte_color;
- if (nh_family == AF_INET) {
- if (bgp_debug_zebra(&api.prefix)) {
- if (mpinfo->extra) {
- zlog_debug(
- "%s: p=%s, bgp_is_valid_label: %d",
- __func__, buf_prefix,
- bgp_is_valid_label(
- &mpinfo->extra
- ->label[0]));
- } else {
- zlog_debug(
- "%s: p=%s, extra is NULL, no label",
- __func__, buf_prefix);
- }
- }
-
- if (bgp->table_map[afi][safi].name) {
- /* Copy info and attributes, so the route-map
- apply doesn't modify the BGP route info. */
- local_attr = *mpinfo->attr;
- mpinfo_cp->attr = &local_attr;
+ if (bgp_debug_zebra(&api.prefix)) {
+ if (mpinfo->extra) {
+ zlog_debug("%s: p=%s, bgp_is_valid_label: %d",
+ __func__, buf_prefix,
+ bgp_is_valid_label(
+ &mpinfo->extra->label[0]));
+ } else {
+ zlog_debug("%s: p=%s, extra is NULL, no label",
+ __func__, buf_prefix);
}
+ }
- if (bgp->table_map[afi][safi].name) {
- if (!bgp_table_map_apply(
- bgp->table_map[afi][safi].map, p,
- mpinfo_cp))
- continue;
+ if (bgp->table_map[afi][safi].name) {
+ /* Copy info and attributes, so the route-map
+ apply doesn't modify the BGP route info. */
+ local_attr = *mpinfo->attr;
+ mpinfo_cp->attr = &local_attr;
+ if (!bgp_table_map_apply(bgp->table_map[afi][safi].map,
+ p, mpinfo_cp))
+ continue;
- /* metric/tag is only allowed to be
- * overridden on 1st nexthop */
- if (mpinfo == info) {
- metric = mpinfo_cp->attr->med;
- tag = mpinfo_cp->attr->tag;
- }
+ /* metric/tag is only allowed to be
+ * overridden on 1st nexthop */
+ if (mpinfo == info) {
+ metric = mpinfo_cp->attr->med;
+ tag = mpinfo_cp->attr->tag;
}
+ }
+ if (nh_family == AF_INET) {
nh_updated = update_ipv4nh_for_route_install(
nh_othervrf,
nh_othervrf ?
@@ -1351,38 +1345,23 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
ifindex_t ifindex = IFINDEX_INTERNAL;
struct in6_addr *nexthop;
- if (bgp->table_map[afi][safi].name) {
- /* Copy info and attributes, so the route-map
- apply doesn't modify the BGP route info. */
- local_attr = *mpinfo->attr;
- mpinfo_cp->attr = &local_attr;
- }
-
- if (bgp->table_map[afi][safi].name) {
- /* Copy info and attributes, so the route-map
- apply doesn't modify the BGP route info. */
- local_attr = *mpinfo->attr;
- mpinfo_cp->attr = &local_attr;
-
- if (!bgp_table_map_apply(
- bgp->table_map[afi][safi].map, p,
- mpinfo_cp))
- continue;
-
- /* metric/tag is only allowed to be
- * overridden on 1st nexthop */
- if (mpinfo == info) {
- metric = mpinfo_cp->attr->med;
- tag = mpinfo_cp->attr->tag;
- }
- }
nexthop = bgp_path_info_to_ipv6_nexthop(mpinfo_cp,
&ifindex);
- nh_updated = update_ipv6nh_for_route_install(
- nh_othervrf, nh_othervrf ?
- info->extra->bgp_orig : bgp,
- nexthop, ifindex,
- mpinfo, info, is_evpn, api_nh);
+
+ if (!nexthop)
+ nh_updated = update_ipv4nh_for_route_install(
+ nh_othervrf,
+ nh_othervrf ? info->extra->bgp_orig
+ : bgp,
+ &mpinfo_cp->attr->nexthop,
+ mpinfo_cp->attr, is_evpn, api_nh);
+ else
+ nh_updated = update_ipv6nh_for_route_install(
+ nh_othervrf,
+ nh_othervrf ? info->extra->bgp_orig
+ : bgp,
+ nexthop, ifindex, mpinfo, info, is_evpn,
+ api_nh);
}
/* Did we get proper nexthop info to update zebra? */
@@ -1409,6 +1388,14 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
is_add = (valid_nh_count || nhg_id) ? true : false;
+ if (is_add && CHECK_FLAG(bm->flags, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA)) {
+ struct aspath *aspath = info->attr->aspath;
+
+ SET_FLAG(api.message, ZAPI_MESSAGE_OPAQUE);
+ api.opaque.length = strlen(aspath->str) + 1;
+ memcpy(api.opaque.data, aspath->str, api.opaque.length);
+ }
+
/*
* When we create an aggregate route we must also
* install a Null0 route in the RIB, so overwrite
@@ -1490,9 +1477,7 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
api_nh->vrf_id, api_nh->weight,
label_buf, eth_buf);
}
- }
- if (bgp_debug_zebra(p)) {
int recursion_flag = 0;
if (CHECK_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION))
@@ -2400,7 +2385,6 @@ static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
struct prefix p;
enum zapi_route_notify_owner note;
uint32_t table_id;
- char buf[PREFIX_STRLEN];
afi_t afi;
safi_t safi;
struct bgp_dest *dest;
@@ -2422,9 +2406,6 @@ static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
return -1;
}
- if (BGP_DEBUG(zebra, ZEBRA))
- prefix2str(&p, buf, sizeof(buf));
-
/* Find the bgp route node */
dest = bgp_afi_node_lookup(bgp->rib[afi][safi], afi, safi, &p,
&bgp->vrf_prd);
@@ -2443,7 +2424,7 @@ static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
BGP_NODE_FIB_INSTALL_PENDING);
SET_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED);
if (BGP_DEBUG(zebra, ZEBRA))
- zlog_debug("route %s : INSTALLED", buf);
+ zlog_debug("route %pRN : INSTALLED", dest);
/* Find the best route */
for (pi = dest->info; pi; pi = pi->next) {
/* Process aggregate route */
@@ -2459,8 +2440,8 @@ static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
dest, new_select);
else {
flog_err(EC_BGP_INVALID_ROUTE,
- "selected route %s not found",
- buf);
+ "selected route %pRN not found",
+ dest);
return -1;
}
}
@@ -2471,16 +2452,24 @@ static int bgp_zebra_route_notify_owner(int command, struct zclient *zclient,
* route add later
*/
UNSET_FLAG(dest->flags, BGP_NODE_FIB_INSTALLED);
+ if (BGP_DEBUG(zebra, ZEBRA))
+ zlog_debug("route %pRN: Removed from Fib", dest);
break;
case ZAPI_ROUTE_FAIL_INSTALL:
+ if (BGP_DEBUG(zebra, ZEBRA))
+ zlog_debug("route: %pRN Failed to Install into Fib",
+ dest);
/* Error will be logged by zebra module */
break;
case ZAPI_ROUTE_BETTER_ADMIN_WON:
+ if (BGP_DEBUG(zebra, ZEBRA))
+ zlog_debug("route: %pRN removed due to better admin won",
+ dest);
/* No action required */
break;
case ZAPI_ROUTE_REMOVE_FAIL:
- zlog_warn("%s: Route %s failure to remove",
- __func__, buf);
+ zlog_warn("%s: Route %pRN failure to remove",
+ __func__, dest);
break;
}
return 0;