]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add SRv6 End.X SID to Sub-TLV copy func
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Sat, 3 Jun 2023 00:37:07 +0000 (02:37 +0200)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Mon, 11 Sep 2023 20:11:43 +0000 (22:11 +0200)
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>
isisd/isis_tlvs.c

index 9fc602c2095bd5583a9aa53c54c5df738b4a64e8..cf81532e8a468dc26c8adff87bdd2cb2151edf1c 100644 (file)
@@ -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)) {