Skip to content

Commit 3028c68

Browse files
committed
Babel: add support for draft-ietf-babel-v4viav6
1 parent 2533204 commit 3028c68

File tree

1 file changed

+39
-13
lines changed

1 file changed

+39
-13
lines changed

print-babel.c

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
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

Comments
 (0)