diff options
| author | Carmine Scarpitta <carmine.scarpitta@uniroma2.it> | 2023-06-03 02:08:08 +0200 | 
|---|---|---|
| committer | Carmine Scarpitta <carmine.scarpitta@uniroma2.it> | 2023-09-11 22:11:47 +0200 | 
| commit | ecb2675f1ef4819f3e6f9e729ad0f6e2a59da898 (patch) | |
| tree | 01e55cb00f70de803431691373d7e895ae5e0851 /isisd/isis_tlvs.c | |
| parent | 7db1a9047553ab11a10c15350d0fa8f1688476ec (diff) | |
isisd: Add support for SRv6 Adjacency SIDs
An SRv6 adjacency SID is a SID that is associated with a particular
adjacency. Adjacency SIDs are advertised using the SRv6 End.X SID
Sub-TLV (RFC 9352 section #8.1) or SRv6 LAN End.X SID Sub-TLV (RFC 9352
section #8.2).
This commit defines the following Adj SIDs management functions:
* srv6_endx_sid_add_single: add a new SRv6 Adjacency SID
* srv6_endx_sid_del: delete an SRv6 Adjacency SID
* isis_srv6_endx_sid_find: lookup SRv6 End.X SID by type
It also attaches some callbacks to the hooks isis_adj_state_change_hook,
isis_adj_ip_enabled_hook, isis_adj_ip_disabled_hook, which are
responsible for installing/removing an SRv6 Adjacency SID automatically
when the state of an IS-IS adjacency changes.
Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to 'isisd/isis_tlvs.c')
| -rw-r--r-- | isisd/isis_tlvs.c | 38 | 
1 files changed, 38 insertions, 0 deletions
diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c index fb88aa13da..cd7b3b8842 100644 --- a/isisd/isis_tlvs.c +++ b/isisd/isis_tlvs.c @@ -7913,6 +7913,44 @@ void isis_tlvs_del_lan_adj_sid(struct isis_ext_subtlvs *exts,  		UNSET_SUBTLV(exts, EXT_LAN_ADJ_SID);  } +/* Add IS-IS SRv6 End.X SID subTLVs */ +void isis_tlvs_add_srv6_endx_sid(struct isis_ext_subtlvs *exts, +				 struct isis_srv6_endx_sid_subtlv *adj) +{ +	append_item(&exts->srv6_endx_sid, (struct isis_item *)adj); +	SET_SUBTLV(exts, EXT_SRV6_ENDX_SID); +} + +/* Delete IS-IS SRv6 End.X SID subTLVs */ +void isis_tlvs_del_srv6_endx_sid(struct isis_ext_subtlvs *exts, +				 struct isis_srv6_endx_sid_subtlv *adj) +{ +	isis_free_subsubtlvs(adj->subsubtlvs); +	delete_item(&exts->srv6_endx_sid, (struct isis_item *)adj); +	XFREE(MTYPE_ISIS_SUBTLV, adj); +	if (exts->srv6_endx_sid.count == 0) +		UNSET_SUBTLV(exts, EXT_SRV6_ENDX_SID); +} + +/* Add IS-IS SRv6 LAN End.X SID subTLVs */ +void isis_tlvs_add_srv6_lan_endx_sid(struct isis_ext_subtlvs *exts, +				     struct isis_srv6_lan_endx_sid_subtlv *lan) +{ +	append_item(&exts->srv6_lan_endx_sid, (struct isis_item *)lan); +	SET_SUBTLV(exts, EXT_SRV6_LAN_ENDX_SID); +} + +/* Delete IS-IS SRv6 LAN End.X SID subTLVs */ +void isis_tlvs_del_srv6_lan_endx_sid(struct isis_ext_subtlvs *exts, +				     struct isis_srv6_lan_endx_sid_subtlv *lan) +{ +	isis_free_subsubtlvs(lan->subsubtlvs); +	delete_item(&exts->srv6_lan_endx_sid, (struct isis_item *)lan); +	XFREE(MTYPE_ISIS_SUBTLV, lan); +	if (exts->srv6_lan_endx_sid.count == 0) +		UNSET_SUBTLV(exts, EXT_SRV6_LAN_ENDX_SID); +} +  void isis_tlvs_del_asla_flex_algo(struct isis_ext_subtlvs *ext,  				  struct isis_asla_subtlvs *asla)  {  | 
