summaryrefslogtreecommitdiffstats
path: root/isisd/isis_tlvs.c
diff options
context:
space:
mode:
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-06-03 02:37:07 +0200
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>2023-09-11 22:11:43 +0200
commite083282e837b3245a07d5d58c29ed5b58507d1a1 (patch)
tree831b2e66c42df4c57a5d9952e6b9338f1b16b117 /isisd/isis_tlvs.c
parentisisd: Add SRv6 End.X SID to IS ext reach Sub-TLVs (diff)
downloadfrr-e083282e837b3245a07d5d58c29ed5b58507d1a1.tar.xz
frr-e083282e837b3245a07d5d58c29ed5b58507d1a1.zip
isisd: Add SRv6 End.X SID to Sub-TLV copy func
Extend the Extended IS Reachability TLV copy function to copy the SRv6 End.X SID Sub-TLV and SRv6 LAN End.X SID Sub-TLV, if present. Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
Diffstat (limited to 'isisd/isis_tlvs.c')
-rw-r--r--isisd/isis_tlvs.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c
index 9fc602c20..cf81532e8 100644
--- a/isisd/isis_tlvs.c
+++ b/isisd/isis_tlvs.c
@@ -113,6 +113,8 @@ static const struct tlv_ops *const tlv_table[ISIS_CONTEXT_MAX][ISIS_TLV_MAX];
static void append_item(struct isis_item_list *dest, struct isis_item *item);
static void init_item_list(struct isis_item_list *items);
+static struct isis_subsubtlvs *
+isis_copy_subsubtlvs(struct isis_subsubtlvs *subsubtlvs);
static void isis_format_subsubtlvs(struct isis_subsubtlvs *subsubtlvs,
struct sbuf *buf, struct json_object *json,
int indent);
@@ -197,6 +199,8 @@ copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, uint16_t mtid)
struct isis_lan_adj_sid *lan;
struct listnode *node, *nnode;
struct isis_asla_subtlvs *new_asla, *asla;
+ struct isis_srv6_endx_sid_subtlv *srv6_adj;
+ struct isis_srv6_lan_endx_sid_subtlv *srv6_lan;
/* Copy the Extended IS main part */
memcpy(rv, exts, sizeof(struct isis_ext_subtlvs));
@@ -215,9 +219,16 @@ copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, uint16_t mtid)
init_item_list(&rv->adj_sid);
init_item_list(&rv->lan_sid);
+ /* Prepare SRv6 (LAN) End.X SID */
+ init_item_list(&rv->srv6_endx_sid);
+ init_item_list(&rv->srv6_lan_endx_sid);
+
UNSET_SUBTLV(rv, EXT_ADJ_SID);
UNSET_SUBTLV(rv, EXT_LAN_ADJ_SID);
+ UNSET_SUBTLV(rv, EXT_SRV6_ENDX_SID);
+ UNSET_SUBTLV(rv, EXT_SRV6_LAN_ENDX_SID);
+
/* Copy Adj SID list for IPv4 & IPv6 in function of MT ID */
for (adj = (struct isis_adj_sid *)exts->adj_sid.head; adj != NULL;
adj = adj->next) {
@@ -261,6 +272,50 @@ copy_item_ext_subtlvs(struct isis_ext_subtlvs *exts, uint16_t mtid)
SET_SUBTLV(rv, EXT_LAN_ADJ_SID);
}
+ /* Copy SRv6 End.X SID list for IPv4 & IPv6 in function of MT ID */
+ for (srv6_adj = (struct isis_srv6_endx_sid_subtlv *)
+ exts->srv6_endx_sid.head;
+ srv6_adj != NULL; srv6_adj = srv6_adj->next) {
+ if ((mtid != 65535) && (mtid != ISIS_MT_DISABLE) &&
+ ((mtid != ISIS_MT_IPV6_UNICAST)))
+ continue;
+
+ struct isis_srv6_endx_sid_subtlv *new;
+
+ new = XCALLOC(MTYPE_ISIS_SUBTLV,
+ sizeof(struct isis_srv6_endx_sid_subtlv));
+ new->flags = srv6_adj->flags;
+ new->algorithm = srv6_adj->algorithm;
+ new->weight = srv6_adj->weight;
+ new->behavior = srv6_adj->behavior;
+ new->sid = srv6_adj->sid;
+ new->subsubtlvs = isis_copy_subsubtlvs(srv6_adj->subsubtlvs);
+ append_item(&rv->srv6_endx_sid, (struct isis_item *)new);
+ SET_SUBTLV(rv, EXT_SRV6_ENDX_SID);
+ }
+ /* Same for SRv6 LAN End.X SID */
+ for (srv6_lan = (struct isis_srv6_lan_endx_sid_subtlv *)
+ exts->srv6_lan_endx_sid.head;
+ srv6_lan != NULL; srv6_lan = srv6_lan->next) {
+ if ((mtid != 65535) && (mtid != ISIS_MT_DISABLE) &&
+ ((mtid != ISIS_MT_IPV6_UNICAST)))
+ continue;
+
+ struct isis_srv6_lan_endx_sid_subtlv *new;
+
+ new = XCALLOC(MTYPE_ISIS_SUBTLV,
+ sizeof(struct isis_srv6_lan_endx_sid_subtlv));
+ memcpy(new->neighbor_id, srv6_lan->neighbor_id, 6);
+ new->flags = srv6_lan->flags;
+ new->algorithm = srv6_lan->algorithm;
+ new->weight = srv6_lan->weight;
+ new->behavior = srv6_lan->behavior;
+ new->sid = srv6_lan->sid;
+ new->subsubtlvs = isis_copy_subsubtlvs(srv6_lan->subsubtlvs);
+ append_item(&rv->srv6_lan_endx_sid, (struct isis_item *)new);
+ SET_SUBTLV(rv, EXT_SRV6_LAN_ENDX_SID);
+ }
+
rv->aslas = list_new();
for (ALL_LIST_ELEMENTS(exts->aslas, node, nnode, asla)) {