Skip to content

Commit 8b6a73c

Browse files
committed
isisd: Pack SRv6 (LAN) End.X SID Sub-TLV
Extend the Extended IS Reachability TLV pack function to pack the SRv6 End.X SID Sub-TLV and SRv6 LAN End.X SID Sub-TLV, if present. Signed-off-by: Carmine Scarpitta <[email protected]>
1 parent 294c9c7 commit 8b6a73c

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

isisd/isis_tlvs.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ isis_copy_subsubtlvs(struct isis_subsubtlvs *subsubtlvs);
118118
static void isis_format_subsubtlvs(struct isis_subsubtlvs *subsubtlvs,
119119
struct sbuf *buf, struct json_object *json,
120120
int indent);
121+
static int isis_pack_subsubtlvs(struct isis_subsubtlvs *subsubtlvs,
122+
struct stream *s);
121123

122124
/* For tests/isisd, TLV text requires ipv4-unicast instead of standard */
123125
static const char *isis_mtid2str_fake(uint16_t mtid)
@@ -1340,6 +1342,89 @@ static int pack_item_ext_subtlvs(struct isis_ext_subtlvs *exts,
13401342
stream_putl(s, lan->sid);
13411343
}
13421344
}
1345+
/* SRv6 End.X SID as per RFC9352 section #8.1 */
1346+
if (IS_SUBTLV(exts, EXT_SRV6_ENDX_SID)) {
1347+
struct isis_srv6_endx_sid_subtlv *adj;
1348+
size_t subtlv_len;
1349+
size_t subtlv_len_pos;
1350+
1351+
for (adj = (struct isis_srv6_endx_sid_subtlv *)
1352+
exts->srv6_endx_sid.head;
1353+
adj; adj = adj->next) {
1354+
stream_putc(s, ISIS_SUBTLV_SRV6_ENDX_SID);
1355+
1356+
subtlv_len_pos = stream_get_endp(s);
1357+
stream_putc(s, 0); /* length will be filled later */
1358+
1359+
stream_putc(s, adj->flags);
1360+
stream_putc(s, adj->algorithm);
1361+
stream_putc(s, adj->weight);
1362+
stream_putw(s, adj->behavior);
1363+
stream_put(s, &adj->sid, IPV6_MAX_BYTELEN);
1364+
1365+
if (adj->subsubtlvs) {
1366+
/* Pack Sub-Sub-TLVs */
1367+
if (isis_pack_subsubtlvs(adj->subsubtlvs, s))
1368+
return 1;
1369+
} else {
1370+
/* No Sub-Sub-TLVs */
1371+
if (STREAM_WRITEABLE(s) < 1) {
1372+
*min_len =
1373+
ISIS_SUBTLV_SRV6_ENDX_SID_SIZE;
1374+
return 1;
1375+
}
1376+
1377+
/* Put 0 as Sub-Sub-TLV length, because we have
1378+
* no Sub-Sub-TLVs */
1379+
stream_putc(s, 0);
1380+
}
1381+
1382+
subtlv_len = stream_get_endp(s) - subtlv_len_pos - 1;
1383+
stream_putc_at(s, subtlv_len_pos, subtlv_len);
1384+
}
1385+
}
1386+
/* SRv6 LAN End.X SID as per RFC9352 section #8.2 */
1387+
if (IS_SUBTLV(exts, EXT_SRV6_LAN_ENDX_SID)) {
1388+
struct isis_srv6_lan_endx_sid_subtlv *lan;
1389+
size_t subtlv_len;
1390+
size_t subtlv_len_pos;
1391+
1392+
for (lan = (struct isis_srv6_lan_endx_sid_subtlv *)
1393+
exts->srv6_lan_endx_sid.head;
1394+
lan; lan = lan->next) {
1395+
stream_putc(s, ISIS_SUBTLV_SRV6_LAN_ENDX_SID);
1396+
1397+
subtlv_len_pos = stream_get_endp(s);
1398+
stream_putc(s, 0); /* length will be filled later */
1399+
1400+
stream_put(s, lan->neighbor_id, 6);
1401+
stream_putc(s, lan->flags);
1402+
stream_putc(s, lan->algorithm);
1403+
stream_putc(s, lan->weight);
1404+
stream_putw(s, lan->behavior);
1405+
stream_put(s, &lan->sid, IPV6_MAX_BYTELEN);
1406+
1407+
if (lan->subsubtlvs) {
1408+
/* Pack Sub-Sub-TLVs */
1409+
if (isis_pack_subsubtlvs(lan->subsubtlvs, s))
1410+
return 1;
1411+
} else {
1412+
/* No Sub-Sub-TLVs */
1413+
if (STREAM_WRITEABLE(s) < 1) {
1414+
*min_len =
1415+
ISIS_SUBTLV_SRV6_LAN_ENDX_SID_SIZE;
1416+
return 1;
1417+
}
1418+
1419+
/* Put 0 as Sub-Sub-TLV length, because we have
1420+
* no Sub-Sub-TLVs */
1421+
stream_putc(s, 0);
1422+
}
1423+
1424+
subtlv_len = stream_get_endp(s) - subtlv_len_pos - 1;
1425+
stream_putc_at(s, subtlv_len_pos, subtlv_len);
1426+
}
1427+
}
13431428

13441429
for (ALL_LIST_ELEMENTS_RO(exts->aslas, node, asla)) {
13451430
ret = pack_item_ext_subtlv_asla(asla, s, min_len);

0 commit comments

Comments
 (0)