3232 * RFC 8966
3333 * RFC 8967
3434 * RFC 9079
35+ * RFC 9229
3536 */
3637
3738#ifdef HAVE_CONFIG_H
@@ -206,7 +207,7 @@ network_prefix(int ae, int plen, unsigned int omitted,
206207
207208 if (plen >= 0 )
208209 pb = (plen + 7 ) / 8 ;
209- else if (ae == 1 )
210+ else if (ae == 1 || ae == 4 )
210211 pb = 4 ;
211212 else
212213 pb = 16 ;
@@ -219,6 +220,7 @@ network_prefix(int ae, int plen, unsigned int omitted,
219220 switch (ae ) {
220221 case 0 : break ;
221222 case 1 :
223+ case 4 :
222224 if (omitted > 4 || pb > 4 || (pb > omitted && len < pb - omitted ))
223225 return -1 ;
224226 memcpy (prefix , v4prefix , 12 );
@@ -381,6 +383,8 @@ babel_print_v2_tlvs(netdissect_options *ndo,
381383 u_char v4_prefix [16 ] =
382384 {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0xFF , 0xFF , 0 , 0 , 0 , 0 };
383385 u_char v6_prefix [16 ] = {0 };
386+ u_char v4viav6_prefix [16 ] =
387+ {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0xFF , 0xFF , 0 , 0 , 0 , 0 };
384388
385389 i = 0 ;
386390 while (i < tlvs_length ) {
@@ -535,31 +539,45 @@ babel_print_v2_tlvs(netdissect_options *ndo,
535539 u_char ae , plen ;
536540 int rc ;
537541 u_char prefix [16 ];
542+ u_char * update_prefix ;
538543 ND_PRINT ("\n\tUpdate" );
539544 if (len < 10 ) goto invalid ;
540545 ae = GET_U_1 (message + 2 );
541- plen = GET_U_1 (message + 4 ) + (GET_U_1 (message + 2 ) == 1 ? 96 : 0 );
546+ switch (ae ) {
547+ case 0 :
548+ case 2 :
549+ case 3 :
550+ update_prefix = v6_prefix ;
551+ break ;
552+ case 1 :
553+ update_prefix = v4_prefix ;
554+ break ;
555+ case 4 :
556+ update_prefix = v4viav6_prefix ;
557+ break ;
558+ default :
559+ goto invalid ;
560+ }
561+ plen = GET_U_1 (message + 4 ) + ((ae == 1 || ae == 4 ) ? 96 : 0 );
542562 rc = network_prefix (ae ,
543563 GET_U_1 (message + 4 ),
544564 GET_U_1 (message + 5 ),
545565 message + 12 ,
546- GET_U_1 ( message + 2 ) == 1 ? v4_prefix : v6_prefix ,
566+ update_prefix ,
547567 len - 10 , prefix );
548568 if (rc < 0 ) goto invalid ;
549569 interval = GET_BE_U_2 (message + 6 );
550570 seqno = GET_BE_U_2 (message + 8 );
551571 metric = GET_BE_U_2 (message + 10 );
552- ND_PRINT ("%s%s%s %s metric %u seqno %u interval %s" ,
572+ ND_PRINT ("%s%s%s %s metric %u seqno %u interval %s%s " ,
553573 (GET_U_1 (message + 3 ) & 0x80 ) ? "/prefix" : "" ,
554574 (GET_U_1 (message + 3 ) & 0x40 ) ? "/id" : "" ,
555575 (GET_U_1 (message + 3 ) & 0x3f ) ? "/unknown" : "" ,
556576 ae == 0 ? "any" : format_prefix (ndo , prefix , plen ),
557- metric , seqno , format_interval_update (interval ));
577+ metric , seqno , format_interval_update (interval ),
578+ ae == 4 ? " (v4-via-v6)" : "" );
558579 if (GET_U_1 (message + 3 ) & 0x80 ) {
559- if (GET_U_1 (message + 2 ) == 1 )
560- memcpy (v4_prefix , prefix , 16 );
561- else
562- memcpy (v6_prefix , prefix , 16 );
580+ memcpy (update_prefix , prefix , 16 );
563581 }
564582 /* extra data? */
565583 if ((u_int )rc < len - 10 )
@@ -582,8 +600,9 @@ babel_print_v2_tlvs(netdissect_options *ndo,
582600 GET_U_1 (message + 3 ), 0 ,
583601 message + 4 , NULL , len - 2 , prefix );
584602 if (rc < 0 ) goto invalid ;
585- ND_PRINT ("for %s" ,
586- ae == 0 ? "any" : format_prefix (ndo , prefix , plen ));
603+ ND_PRINT ("for %s%s" ,
604+ ae == 0 ? "any" : format_prefix (ndo , prefix , plen ),
605+ ae == 4 ? " (v4-via-v6)" : "" );
587606 }
588607 }
589608 break ;
@@ -604,10 +623,11 @@ babel_print_v2_tlvs(netdissect_options *ndo,
604623 message + 16 , NULL , len - 14 , prefix );
605624 if (rc < 0 ) goto invalid ;
606625 plen = GET_U_1 (message + 3 ) + (GET_U_1 (message + 2 ) == 1 ? 96 : 0 );
607- ND_PRINT ("(%u hops) for %s seqno %u id %s" ,
626+ ND_PRINT ("(%u hops) for %s seqno %u id %s%s " ,
608627 GET_U_1 (message + 6 ),
609628 ae == 0 ? "invalid AE 0" : format_prefix (ndo , prefix , plen ),
610- seqno , format_id (ndo , message + 8 ));
629+ seqno , format_id (ndo , message + 8 ),
630+ ae == 4 ? " (v4-via-v6)" : "" );
611631 }
612632 }
613633 break ;
@@ -710,6 +730,9 @@ babel_print_v2_tlvs(netdissect_options *ndo,
710730 ND_PRINT ("for (%s, " , format_prefix (ndo , prefix , plen ));
711731 ND_PRINT ("%s)" , format_prefix (ndo , src_prefix , src_plen ));
712732 }
733+ if (ae == 4 ) {
734+ ND_PRINT (" (v4-via-v6)" );
735+ }
713736 }
714737 }
715738 break ;
@@ -746,6 +769,9 @@ babel_print_v2_tlvs(netdissect_options *ndo,
746769 ND_PRINT ("%s) seqno %u id %s" ,
747770 format_prefix (ndo , src_prefix , src_plen ),
748771 seqno , format_id (ndo , router_id ));
772+ if (ae == 4 ) {
773+ ND_PRINT (" (v4-via-v6)" );
774+ }
749775 }
750776 }
751777 break ;
0 commit comments