diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2021-09-24 15:51:18 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@nvidia.com> | 2021-09-27 12:38:08 -0400 | 
| commit | ed6cec97d7f2c5abbc5a2ef2f087a614c54ddcb1 (patch) | |
| tree | e5804304819a41268360ca56509a8711be3ee09f | |
| parent | 4aabcba0f15d9a37088bfc1c2787d45ed58592e5 (diff) | |
*: Add resolve via default flag
| -rw-r--r-- | bgpd/bgp_nht.c | 14 | ||||
| -rw-r--r-- | lib/zclient.c | 5 | ||||
| -rw-r--r-- | lib/zclient.h | 2 | ||||
| -rw-r--r-- | ospf6d/ospf6_zebra.c | 3 | ||||
| -rw-r--r-- | pbrd/pbr_zebra.c | 2 | ||||
| -rw-r--r-- | pimd/pim_nht.c | 3 | ||||
| -rw-r--r-- | sharpd/sharp_zebra.c | 2 | ||||
| -rw-r--r-- | staticd/static_zebra.c | 2 | ||||
| -rw-r--r-- | zebra/rib.h | 7 | ||||
| -rw-r--r-- | zebra/zapi_msg.c | 12 | ||||
| -rw-r--r-- | zebra/zebra_rnh.c | 8 | 
11 files changed, 39 insertions, 21 deletions
diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index c77e240855..87d76489ba 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -843,6 +843,7 @@ static int make_prefix(int afi, struct bgp_path_info *pi, struct prefix *p)  static void sendmsg_zebra_rnh(struct bgp_nexthop_cache *bnc, int command)  {  	bool exact_match = false; +	bool resolve_via_default = false;  	int ret;  	if (!zclient) @@ -863,11 +864,12 @@ static void sendmsg_zebra_rnh(struct bgp_nexthop_cache *bnc, int command)  				"%s: We have not connected yet, cannot send nexthops",  				__func__);  	} -	if ((command == ZEBRA_NEXTHOP_REGISTER -	     || command == ZEBRA_IMPORT_ROUTE_REGISTER) -	    && (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED) -		|| CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH))) -		exact_match = true; +	if (command == ZEBRA_NEXTHOP_REGISTER) { +		if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED)) +			exact_match = true; +		if (CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH)) +			resolve_via_default = true; +	}  	if (BGP_DEBUG(zebra, ZEBRA))  		zlog_debug("%s: sending cmd %s for %pFX (vrf %s)", __func__, @@ -875,7 +877,7 @@ static void sendmsg_zebra_rnh(struct bgp_nexthop_cache *bnc, int command)  			   bnc->bgp->name_pretty);  	ret = zclient_send_rnh(zclient, command, &bnc->prefix, exact_match, -			       bnc->bgp->vrf_id); +			       resolve_via_default, bnc->bgp->vrf_id);  	/* TBD: handle the failure */  	if (ret == ZCLIENT_SEND_FAILURE)  		flog_warn(EC_BGP_ZEBRA_SEND, diff --git a/lib/zclient.c b/lib/zclient.c index dde60a6c90..bdc7cd5c75 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -765,7 +765,8 @@ static int zclient_connect(struct thread *t)  enum zclient_send_status zclient_send_rnh(struct zclient *zclient, int command,  					  const struct prefix *p, -					  bool exact_match, vrf_id_t vrf_id) +					  bool exact_match, +					  bool resolve_via_def, vrf_id_t vrf_id)  {  	struct stream *s; @@ -773,7 +774,7 @@ enum zclient_send_status zclient_send_rnh(struct zclient *zclient, int command,  	stream_reset(s);  	zclient_create_header(s, command, vrf_id);  	stream_putc(s, (exact_match) ? 1 : 0); - +	stream_putc(s, (resolve_via_def) ? 1 : 0);  	stream_putw(s, PREFIX_FAMILY(p));  	stream_putc(s, p->prefixlen);  	switch (PREFIX_FAMILY(p)) { diff --git a/lib/zclient.h b/lib/zclient.h index f9438d5db7..d21ea621e2 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -1107,7 +1107,7 @@ extern enum zclient_send_status zclient_route_send(uint8_t, struct zclient *,  						   struct zapi_route *);  extern enum zclient_send_status  zclient_send_rnh(struct zclient *zclient, int command, const struct prefix *p, -		 bool exact_match, vrf_id_t vrf_id); +		 bool exact_match, bool resolve_via_default, vrf_id_t vrf_id);  int zapi_nexthop_encode(struct stream *s, const struct zapi_nexthop *api_nh,  			uint32_t api_flags, uint32_t api_message);  extern int zapi_route_encode(uint8_t, struct stream *, struct zapi_route *); diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 1a0c5a9971..2e2b069fd6 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -154,7 +154,8 @@ void ospf6_zebra_import_default_route(struct ospf6 *ospf6, bool unreg)  			   zserv_command_string(command), &prefix,  			   ospf6->vrf_id); -	if (zclient_send_rnh(zclient, command, &prefix, true, ospf6->vrf_id) +	if (zclient_send_rnh(zclient, command, &prefix, false, true, +			     ospf6->vrf_id)  	    == ZCLIENT_SEND_FAILURE)  		flog_err(EC_LIB_ZAPI_SOCKET, "%s: zclient_send_rnh() failed",  			 __func__); diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c index 28def509d5..643269e34e 100644 --- a/pbrd/pbr_zebra.c +++ b/pbrd/pbr_zebra.c @@ -478,7 +478,7 @@ void pbr_send_rnh(struct nexthop *nhop, bool reg)  		break;  	} -	if (zclient_send_rnh(zclient, command, &p, false, nhop->vrf_id) +	if (zclient_send_rnh(zclient, command, &p, false, false, nhop->vrf_id)  	    == ZCLIENT_SEND_FAILURE) {  		zlog_warn("%s: Failure to send nexthop to zebra", __func__);  	} diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 23ba3498ae..50cfc297d4 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -54,7 +54,8 @@ void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient,  	int ret;  	p = &(pnc->rpf.rpf_addr); -	ret = zclient_send_rnh(zclient, command, p, false, pim->vrf->vrf_id); +	ret = zclient_send_rnh(zclient, command, p, false, false, +			       pim->vrf->vrf_id);  	if (ret == ZCLIENT_SEND_FAILURE)  		zlog_warn("sendmsg_nexthop: zclient_send_message() failed"); diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c index 2575475dd2..48c9e8ced5 100644 --- a/sharpd/sharp_zebra.c +++ b/sharpd/sharp_zebra.c @@ -638,7 +638,7 @@ void sharp_zebra_nexthop_watch(struct prefix *p, vrf_id_t vrf_id, bool import,  			command = ZEBRA_IMPORT_ROUTE_UNREGISTER;  	} -	if (zclient_send_rnh(zclient, command, p, connected, vrf_id) +	if (zclient_send_rnh(zclient, command, p, connected, false, vrf_id)  	    == ZCLIENT_SEND_FAILURE)  		zlog_warn("%s: Failure to send nexthop to zebra", __func__);  } diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c index 452b5c42a4..a01ecad815 100644 --- a/staticd/static_zebra.c +++ b/staticd/static_zebra.c @@ -332,7 +332,7 @@ void static_zebra_nht_register(struct static_nexthop *nh, bool reg)  		static_nht_hash_free(nhtd);  	} -	if (zclient_send_rnh(zclient, cmd, &p, false, nh->nh_vrf_id) +	if (zclient_send_rnh(zclient, cmd, &p, false, false, nh->nh_vrf_id)  	    == ZCLIENT_SEND_FAILURE)  		zlog_warn("%s: Failure to send nexthop to zebra", __func__);  } diff --git a/zebra/rib.h b/zebra/rib.h index 8887053a4c..0f9d32471f 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -54,9 +54,10 @@ PREDECL_LIST(rnh_list);  struct rnh {  	uint8_t flags; -#define ZEBRA_NHT_CONNECTED     0x1 -#define ZEBRA_NHT_DELETED       0x2 -#define ZEBRA_NHT_EXACT_MATCH   0x4 +#define ZEBRA_NHT_CONNECTED 0x1 +#define ZEBRA_NHT_DELETED 0x2 +#define ZEBRA_NHT_EXACT_MATCH 0x4 +#define ZEBRA_NHT_RESOLVE_VIA_DEFAULT 0x8  	/* VRF identifier. */  	vrf_id_t vrf_id; diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 496849251a..775e2a4b08 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -1179,6 +1179,7 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)  	struct prefix p;  	unsigned short l = 0;  	uint8_t flags = 0; +	uint8_t resolve_via_default;  	uint16_t type = cmd2type[hdr->command];  	bool exist;  	bool flag_changed = false; @@ -1198,9 +1199,10 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)  	while (l < hdr->length) {  		STREAM_GETC(s, flags); +		STREAM_GETC(s, resolve_via_default);  		STREAM_GETW(s, p.family);  		STREAM_GETC(s, p.prefixlen); -		l += 4; +		l += 5;  		if (p.family == AF_INET) {  			client->v4_nh_watch_add_cnt++;  			if (p.prefixlen > IPV4_MAX_BITLEN) { @@ -1250,6 +1252,9 @@ static void zread_rnh_register(ZAPI_HANDLER_ARGS)  				UNSET_FLAG(rnh->flags, ZEBRA_NHT_EXACT_MATCH);  		} +		if (resolve_via_default) +			SET_FLAG(rnh->flags, ZEBRA_NHT_RESOLVE_VIA_DEFAULT); +  		if (orig_flags != rnh->flags)  			flag_changed = true; @@ -1288,10 +1293,13 @@ static void zread_rnh_unregister(ZAPI_HANDLER_ARGS)  		STREAM_GETC(s, flags);  		if (flags != 0)  			goto stream_failure; +		STREAM_GETC(s, flags); +		if (flags != 0) +			goto stream_failure;  		STREAM_GETW(s, p.family);  		STREAM_GETC(s, p.prefixlen); -		l += 4; +		l += 5;  		if (p.family == AF_INET) {  			client->v4_nh_watch_rem_cnt++;  			if (p.prefixlen > IPV4_MAX_BITLEN) { diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c index 017a4aae7f..636fa92711 100644 --- a/zebra/zebra_rnh.c +++ b/zebra/zebra_rnh.c @@ -700,10 +700,14 @@ zebra_rnh_resolve_nexthop_entry(struct zebra_vrf *zvrf, afi_t afi,  		 * match route to be exact if so specified  		 */  		if (is_default_prefix(&rn->p) -		    && !rnh_resolve_via_default(zvrf, rn->p.family)) { +		    && (!CHECK_FLAG(rnh->flags, ZEBRA_NHT_RESOLVE_VIA_DEFAULT) +			&& !rnh_resolve_via_default(zvrf, rn->p.family))) {  			if (IS_ZEBRA_DEBUG_NHT_DETAILED)  				zlog_debug( -					"        Not allowed to resolve through default prefix"); +					"        Not allowed to resolve through default prefix: rnh->resolve_via_default: %u", +					CHECK_FLAG( +						rnh->flags, +						ZEBRA_NHT_RESOLVE_VIA_DEFAULT));  			return NULL;  		}  | 
