mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 16:04:49 +00:00
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:
parent
3740efacfb
commit
e083282e83
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user