isisd: Add SRv6 End.X SID to Sub-TLV copy func

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>
This commit is contained in:
Carmine Scarpitta 2023-06-03 02:37:07 +02:00
parent 3740efacfb
commit e083282e83

View 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)) {