diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-08-10 08:39:51 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-10 08:39:51 -0400 | 
| commit | 8e3ac40d2cb5f38a2804d1b19eeb77aeebd7c7af (patch) | |
| tree | b543b31173d45d711fd229c83c50767e764f2494 /zebra/zapi_msg.c | |
| parent | 84a98cedfb3efac93aef1058730bf1e6ca585fcc (diff) | |
| parent | 98a3fb0ab9b92443c0c92e073d3f184b88dcbfc6 (diff) | |
Merge pull request #6483 from sylane/router-id-v6
zebra: add IPv6 router-id
Diffstat (limited to 'zebra/zapi_msg.c')
| -rw-r--r-- | zebra/zapi_msg.c | 47 | 
1 files changed, 38 insertions, 9 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 0a459b4d0a..48aa566136 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -907,17 +907,18 @@ void zsend_iptable_notify_owner(struct zebra_pbr_iptable *iptable,  	zserv_send_message(client, s);  } -/* Router-id is updated. Send ZEBRA_ROUTER_ID_ADD to client. */ -int zsend_router_id_update(struct zserv *client, struct prefix *p, +/* Router-id is updated. Send ZEBRA_ROUTER_ID_UPDATE to client. */ +int zsend_router_id_update(struct zserv *client, afi_t afi, struct prefix *p,  			   vrf_id_t vrf_id)  {  	int blen; +	struct stream *s;  	/* Check this client need interface information. */ -	if (!vrf_bitmap_check(client->ridinfo, vrf_id)) +	if (!vrf_bitmap_check(client->ridinfo[afi], vrf_id))  		return 0; -	struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ); +	s = stream_new(ZEBRA_MAX_PACKET_SIZ);  	/* Message type. */  	zclient_create_header(s, ZEBRA_ROUTER_ID_UPDATE, vrf_id); @@ -1897,20 +1898,48 @@ stream_failure:  /* Register zebra server router-id information.  Send current router-id */  static void zread_router_id_add(ZAPI_HANDLER_ARGS)  { +	afi_t afi; +  	struct prefix p; +	STREAM_GETW(msg, afi); + +	if (afi <= AFI_UNSPEC || afi >= AFI_MAX) { +		zlog_warn( +			"Invalid AFI %u while registering for router ID notifications", +			afi); +		goto stream_failure; +	} +  	/* Router-id information is needed. */ -	vrf_bitmap_set(client->ridinfo, zvrf_id(zvrf)); +	vrf_bitmap_set(client->ridinfo[afi], zvrf_id(zvrf)); -	router_id_get(&p, zvrf); +	router_id_get(afi, &p, zvrf); -	zsend_router_id_update(client, &p, zvrf_id(zvrf)); +	zsend_router_id_update(client, afi, &p, zvrf_id(zvrf)); + +stream_failure: +	return;  }  /* Unregister zebra server router-id information. */  static void zread_router_id_delete(ZAPI_HANDLER_ARGS)  { -	vrf_bitmap_unset(client->ridinfo, zvrf_id(zvrf)); +	afi_t afi; + +	STREAM_GETW(msg, afi); + +	if (afi <= AFI_UNSPEC || afi >= AFI_MAX) { +		zlog_warn( +			"Invalid AFI %u while unregistering from router ID notifications", +			afi); +		goto stream_failure; +	} + +	vrf_bitmap_unset(client->ridinfo[afi], zvrf_id(zvrf)); + +stream_failure: +	return;  }  static void zsend_capabilities(struct zserv *client, struct zebra_vrf *zvrf) @@ -1999,8 +2028,8 @@ static void zread_vrf_unregister(ZAPI_HANDLER_ARGS)  		for (i = 0; i < ZEBRA_ROUTE_MAX; i++)  			vrf_bitmap_unset(client->redist[afi][i], zvrf_id(zvrf));  		vrf_bitmap_unset(client->redist_default[afi], zvrf_id(zvrf)); +		vrf_bitmap_unset(client->ridinfo[afi], zvrf_id(zvrf));  	} -	vrf_bitmap_unset(client->ridinfo, zvrf_id(zvrf));  }  /*  | 
