]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add func to build Sub-TLV from SRv6 End SID
authorCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Wed, 15 Feb 2023 11:15:45 +0000 (12:15 +0100)
committerCarmine Scarpitta <carmine.scarpitta@uniroma2.it>
Mon, 11 Sep 2023 20:11:38 +0000 (22:11 +0200)
Add a function to build an SRv6 End SID TLV (RFC 9352 section #7.2) to
advertise a specific SRv6 End SID passed as an argument.

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

index 8d0047de7680d8eb68739fd863a8f7f217eb72e6..da62725311702c626253621f983cd78f61412eeb 100644 (file)
@@ -7732,6 +7732,40 @@ void isis_tlvs_set_purge_originator(struct isis_tlvs *tlvs,
        }
 }
 
+/* Add an SRv6 End SID to the SRv6 End SID Sub-TLV */
+void isis_subtlvs_add_srv6_end_sid(struct isis_subtlvs *subtlvs,
+                                  struct isis_srv6_sid *sid)
+{
+       struct isis_srv6_end_sid_subtlv *sid_subtlv;
+
+       if (!sid)
+               return;
+
+       /* The SRv6 End SID Sub-TLV advertises SRv6 SIDs with Endpoint behaviors
+        * that do not require a particular neighbor in order to be correctly
+        * applied (e.g. End, End.DT6, ...). Before proceeding, let's make sure
+        * we are encoding one of the supported behaviors. */
+       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)
+               return;
+
+       /* Allocate memory for the Sub-TLV */
+       sid_subtlv = XCALLOC(MTYPE_ISIS_SUBTLV, sizeof(*sid_subtlv));
+
+       /* Fill in the SRv6 End SID Sub-TLV according to the SRv6 SID
+        * configuration */
+       isis_srv6_end_sid2subtlv(sid, sid_subtlv);
+
+       /* Append the SRv6 End SID Sub-TLV to the Sub-TLVs list */
+       append_item(&subtlvs->srv6_end_sids, (struct isis_item *)sid_subtlv);
+}
+
 /* Add an SRv6 Locator to the SRv6 Locator TLV */
 void isis_tlvs_add_srv6_locator(struct isis_tlvs *tlvs, uint16_t mtid,
                                struct isis_srv6_locator *loc)
index 552ffc151bf5ad36d1d8f8853c1bfa1b9a73f672..a03f9285c111462c1c58e3388b3983994539c265 100644 (file)
@@ -22,6 +22,7 @@ DECLARE_MTYPE(ISIS_SUBTLV);
 
 struct lspdb_head;
 struct sr_prefix_cfg;
+struct isis_srv6_sid;
 struct isis_srv6_locator;
 
 struct isis_area_address {
@@ -834,6 +835,8 @@ void isis_tlvs_set_purge_originator(struct isis_tlvs *tlvs,
                                    const uint8_t *generator,
                                    const uint8_t *sender);
 
+void isis_subtlvs_add_srv6_end_sid(struct isis_subtlvs *subtlvs,
+                                  struct isis_srv6_sid *sid);
 void isis_tlvs_add_srv6_locator(struct isis_tlvs *tlvs, uint16_t mtid,
                                struct isis_srv6_locator *loc);
 #endif