summaryrefslogtreecommitdiff
path: root/isisd/isis_tlvs.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-03-16 10:24:04 +0100
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-09-11 22:11:39 +0200
commitcfc90fc490940752b2e3e2abeeb399942bde1541 (patch)
tree7a014481476a6989a7844962464c438a2c7f7f1f /isisd/isis_tlvs.c
parent1804d70cbd975ef8a014719df5833a9233663811 (diff)
isisd: Add End SID when building SRv6 Locator TLV
Encode SRv6 End SID Sub-TLVs when building the SRv6 Locator TLV. Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to 'isisd/isis_tlvs.c')
-rw-r--r--isisd/isis_tlvs.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c
index da62725311..3f56f83367 100644
--- a/isisd/isis_tlvs.c
+++ b/isisd/isis_tlvs.c
@@ -7770,6 +7770,9 @@ void isis_subtlvs_add_srv6_end_sid(struct isis_subtlvs *subtlvs,
void isis_tlvs_add_srv6_locator(struct isis_tlvs *tlvs, uint16_t mtid,
struct isis_srv6_locator *loc)
{
+ bool subtlvs_present = false;
+ struct listnode *node;
+ struct isis_srv6_sid *sid;
struct isis_srv6_locator_tlv *loc_tlv =
XCALLOC(MTYPE_ISIS_TLV, sizeof(*loc_tlv));
@@ -7777,6 +7780,27 @@ void isis_tlvs_add_srv6_locator(struct isis_tlvs *tlvs, uint16_t mtid,
* configuration */
isis_srv6_locator2tlv(loc, loc_tlv);
+ /* Add the SRv6 End SID Sub-TLVs */
+ loc_tlv->subtlvs = isis_alloc_subtlvs(ISIS_CONTEXT_SUBTLV_SRV6_LOCATOR);
+ for (ALL_LIST_ELEMENTS_RO(loc->srv6_sid, node, sid)) {
+ if (sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_NEXT_CSID ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT6 ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT6_USID ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT4 ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT4_USID ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT46 ||
+ sid->behavior == SRV6_ENDPOINT_BEHAVIOR_END_DT46_USID) {
+ isis_subtlvs_add_srv6_end_sid(loc_tlv->subtlvs, sid);
+ subtlvs_present = true;
+ }
+ }
+
+ if (!subtlvs_present) {
+ isis_free_subtlvs(loc_tlv->subtlvs);
+ loc_tlv->subtlvs = NULL;
+ }
+
/* Append the SRv6 Locator TLV to the TLVs list */
struct isis_item_list *l;
l = isis_get_mt_items(&tlvs->srv6_locator, mtid);