]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add pack function for SRv6 Locator TLV
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Tue, 14 Feb 2023 10:30:45 +0000 (11:30 +0100)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Mon, 11 Sep 2023 15:35:13 +0000 (17:35 +0200)
Add a function to pack an SRv6 Locator TLV and all its Sub-TLVs
(RFC 9352 section #7.1).

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

index 2d24a98c46193462c41fdd52c368bad9087b617d..b0ec3d2d6473574d1cba7ef5596f2e41cb617c8d 100644 (file)
@@ -5588,6 +5588,43 @@ static void free_item_srv6_locator(struct isis_item *i)
        XFREE(MTYPE_ISIS_TLV, item);
 }
 
+static int pack_item_srv6_locator(struct isis_item *i, struct stream *s,
+                                 size_t *min_len)
+{
+       struct isis_srv6_locator_tlv *loc = (struct isis_srv6_locator_tlv *)i;
+
+       if (STREAM_WRITEABLE(s) < 7 + (unsigned)PSIZE(loc->prefix.prefixlen)) {
+               *min_len = 7 + (unsigned)PSIZE(loc->prefix.prefixlen);
+               return 1;
+       }
+
+       stream_putl(s, loc->metric);
+       stream_putc(s, loc->flags);
+       stream_putc(s, loc->algorithm);
+       /* Locator size */
+       stream_putc(s, loc->prefix.prefixlen);
+       /* Locator prefix */
+       stream_put(s, &loc->prefix.prefix.s6_addr,
+                  PSIZE(loc->prefix.prefixlen));
+
+       if (loc->subtlvs) {
+               /* Pack Sub-TLVs */
+               if (pack_subtlvs(loc->subtlvs, s))
+                       return 1;
+       } else {
+               /* No Sub-TLVs */
+               if (STREAM_WRITEABLE(s) < 1) {
+                       *min_len = 8 + (unsigned)PSIZE(loc->prefix.prefixlen);
+                       return 1;
+               }
+
+               /* Put 0 as Sub-TLV length, because we have no Sub-TLVs  */
+               stream_putc(s, 0);
+       }
+
+       return 0;
+}
+
 /* Functions related to tlvs in general */
 
 struct isis_tlvs *isis_alloc_tlvs(void)