}
}
+/* 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)
struct lspdb_head;
struct sr_prefix_cfg;
+struct isis_srv6_sid;
struct isis_srv6_locator;
struct isis_area_address {
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