]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: Remove SIDs when parent locator is deleted
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Tue, 30 May 2023 16:55:44 +0000 (18:55 +0200)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Mon, 11 Sep 2023 20:11:49 +0000 (22:11 +0200)
Clean up SRv6 SIDs when the parent locator is deleted.

Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
isisd/isis_zebra.c

index cce0bd061ead08b0170229241232fbef1998aa17..9df030345a592e6183051bb73b56d582cc4cad8f 100644 (file)
@@ -1262,6 +1262,8 @@ static int isis_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
        struct isis_area *area;
        struct listnode *node, *nnode;
        struct srv6_locator_chunk *chunk;
+       struct isis_srv6_sid *sid;
+       struct srv6_adjacency *sra;
 
        /* Decode the received zebra message */
        if (zapi_srv6_locator_decode(zclient->ibuf, &loc) < 0)
@@ -1280,6 +1282,28 @@ static int isis_zebra_process_srv6_locator_delete(ZAPI_CALLBACK_ARGS)
                            sizeof(area->srv6db.config.srv6_locator_name)) != 0)
                        continue;
 
+               /* Delete SRv6 SIDs */
+               for (ALL_LIST_ELEMENTS(area->srv6db.srv6_sids, node, nnode,
+                                      sid)) {
+
+                       sr_debug(
+                               "Deleting SRv6 SID (locator %s, sid %pI6) from IS-IS area %s",
+                               area->srv6db.config.srv6_locator_name,
+                               &sid->sid, area->area_tag);
+
+                       /* Uninstall the SRv6 SID from the forwarding plane
+                        * through Zebra */
+                       isis_zebra_srv6_sid_uninstall(area, sid);
+
+                       listnode_delete(area->srv6db.srv6_sids, sid);
+                       isis_srv6_sid_free(sid);
+               }
+
+               /* Uninstall all local Adjacency-SIDs. */
+               for (ALL_LIST_ELEMENTS(area->srv6db.srv6_endx_sids, node, nnode,
+                                      sra))
+                       srv6_endx_sid_del(sra);
+
                /* Free the SRv6 locator chunks */
                for (ALL_LIST_ELEMENTS(area->srv6db.srv6_locator_chunks, node,
                                       nnode, chunk)) {