@@ -118,6 +118,8 @@ isis_copy_subsubtlvs(struct isis_subsubtlvs *subsubtlvs);
118
118
static void isis_format_subsubtlvs (struct isis_subsubtlvs * subsubtlvs ,
119
119
struct sbuf * buf , struct json_object * json ,
120
120
int indent );
121
+ static int isis_pack_subsubtlvs (struct isis_subsubtlvs * subsubtlvs ,
122
+ struct stream * s );
121
123
122
124
/* For tests/isisd, TLV text requires ipv4-unicast instead of standard */
123
125
static const char * isis_mtid2str_fake (uint16_t mtid )
@@ -1340,6 +1342,89 @@ static int pack_item_ext_subtlvs(struct isis_ext_subtlvs *exts,
1340
1342
stream_putl (s , lan -> sid );
1341
1343
}
1342
1344
}
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
+ }
1343
1428
1344
1429
for (ALL_LIST_ELEMENTS_RO (exts -> aslas , node , asla )) {
1345
1430
ret = pack_item_ext_subtlv_asla (asla , s , min_len );
0 commit comments