ASDOT started out as sort of a joke, but unfortunately gained some popularity in the 2010s with the rise of 4-byte ASNs and some people thinking "cute, I can write my longish number in a shorter exotic notation".
Then, many operators came to realize that using a '.' (dot) in places which used to be simple integers is quite annoying (for example when regular expressions also are in play), and more fundamentally: why go through the trouble of using a complicated syntax when you can just write number itself? Perhaps time to bring ASDOT to the gardenshed? :-) Kind regards, Job Index: bgpd.conf.5 =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/bgpd.conf.5,v retrieving revision 1.230 diff -u -p -r1.230 bgpd.conf.5 --- bgpd.conf.5 24 Jan 2023 14:13:11 -0000 1.230 +++ bgpd.conf.5 29 Jan 2023 13:53:02 -0000 @@ -127,17 +127,9 @@ for Latin America and the Caribbean for Europe, the Middle East, and parts of Asia .El .Pp -The AS numbers 64512 \(en 65534 are designated for private use. +The AS numbers 64496 \(en 65534 and 4200000000 \(en 4294967294 are designated +for private use. The AS number 23456 is reserved and should not be used. -4-byte AS numbers may be specified in either the ASPLAIN format: -.Bd -literal -offset indent -AS 196618 -.Ed -.Pp -or in the older ASDOT format: -.Bd -literal -offset indent -AS 3.10 -.Ed .Pp .It Ic connect-retry Ar seconds Set the number of seconds to wait before attempting to re-open @@ -1991,7 +1983,7 @@ Communities are encoded as .Ar as-number : Ns Ar local . Four-octet encoding is used if the .Ar as-number -is bigger than 65535 or if the AS_DOT encoding is used. +is bigger than 65535. IPv4 Address Specific Extended Communities are encoded as .Ar IP : Ns Ar local . Opaque Extended Communities are encoded with a single numeric value. Index: parse.y =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v retrieving revision 1.440 diff -u -p -r1.440 parse.y --- parse.y 24 Jan 2023 14:13:11 -0000 1.440 +++ parse.y 29 Jan 2023 13:53:02 -0000 @@ -242,7 +242,7 @@ typedef struct { %token NE LE GE XRANGE LONGER MAXLEN MAX %token <v.string> STRING %token <v.number> NUMBER -%type <v.number> asnumber as4number as4number_any optnumber +%type <v.number> asnumber as4number optnumber %type <v.number> espah family safi restart origincode nettype %type <v.number> yesno inout restricted expires enforce %type <v.number> validity aspa_validity @@ -297,39 +297,7 @@ asnumber : NUMBER { } } -as4number : STRING { - const char *errstr; - char *dot; - uint32_t uvalh = 0, uval; - - if ((dot = strchr($1,'.')) != NULL) { - *dot++ = '\0'; - uvalh = strtonum($1, 0, USHRT_MAX, &errstr); - if (errstr) { - yyerror("number %s is %s", $1, errstr); - free($1); - YYERROR; - } - uval = strtonum(dot, 0, USHRT_MAX, &errstr); - if (errstr) { - yyerror("number %s is %s", dot, errstr); - free($1); - YYERROR; - } - free($1); - } else { - yyerror("AS %s is bad", $1); - free($1); - YYERROR; - } - if (uvalh == 0 && (uval == AS_TRANS || uval == 0)) { - yyerror("AS %u is reserved and may not be used", - uval); - YYERROR; - } - $$ = uval | (uvalh << 16); - } - | asnumber { +as4number : asnumber { if ($1 == AS_TRANS || $1 == 0) { yyerror("AS %u is reserved and may not be used", (uint32_t)$1); @@ -339,38 +307,6 @@ as4number : STRING { } ; -as4number_any : STRING { - const char *errstr; - char *dot; - uint32_t uvalh = 0, uval; - - if ((dot = strchr($1,'.')) != NULL) { - *dot++ = '\0'; - uvalh = strtonum($1, 0, USHRT_MAX, &errstr); - if (errstr) { - yyerror("number %s is %s", $1, errstr); - free($1); - YYERROR; - } - uval = strtonum(dot, 0, USHRT_MAX, &errstr); - if (errstr) { - yyerror("number %s is %s", dot, errstr); - free($1); - YYERROR; - } - free($1); - } else { - yyerror("AS %s is bad", $1); - free($1); - YYERROR; - } - $$ = uval | (uvalh << 16); - } - | asnumber { - $$ = $1; - } - ; - string : string STRING { if (asprintf(&$$, "%s %s", $1, $2) == -1) fatal("string: asprintf"); @@ -460,8 +396,8 @@ as_set : ASSET STRING '{' optnl { free($2); } -as_set_l : as4number_any { add_as_set($1); } - | as_set_l comma as4number_any { add_as_set($3); } +as_set_l : asnumber { add_as_set($1); } + | as_set_l comma asnumber { add_as_set($3); } prefixset : PREFIXSET STRING '{' optnl { if ((curpset = new_prefix_set($2, 0)) == NULL) { @@ -575,7 +511,7 @@ expires : /* empty */ { $$ = $2; } -roa_set_l : prefixset_item SOURCEAS as4number_any expires { +roa_set_l : prefixset_item SOURCEAS asnumber expires { if ($1->p.len_min != $1->p.len) { yyerror("unsupported prefixlen operation in " "roa-set"); @@ -585,7 +521,7 @@ roa_set_l : prefixset_item SOURCEAS as4n add_roa_set($1, $3, $1->p.len_max, $4); free($1); } - | roa_set_l comma prefixset_item SOURCEAS as4number_any expires { + | roa_set_l comma prefixset_item SOURCEAS asnumber expires { if ($3->p.len_min != $3->p.len) { yyerror("unsupported prefixlen operation in " "roa-set"); @@ -630,14 +566,14 @@ aspa_tas_l : aspa_tas { $$ = $1; } } ; -aspa_tas : as4number_any { +aspa_tas : asnumber { if (($$ = calloc(1, sizeof(*$$))) == NULL) fatal(NULL); $$->as = $1; $$->aid = AID_UNSPEC; $$->num = 1; } - | as4number_any family { + | asnumber family { if (($$ = calloc(1, sizeof(*$$))) == NULL) fatal(NULL); $$->as = $1; @@ -2337,7 +2273,7 @@ filter_as_l : filter_as } ; -filter_as : as4number_any { +filter_as : asnumber { if (($$ = calloc(1, sizeof(struct filter_as_l))) == NULL) fatal(NULL); @@ -2351,7 +2287,7 @@ filter_as : as4number_any { fatal(NULL); $$->a.flags = AS_FLAG_NEIGHBORAS; } - | equalityop as4number_any { + | equalityop asnumber { if (($$ = calloc(1, sizeof(struct filter_as_l))) == NULL) fatal(NULL); @@ -2359,7 +2295,7 @@ filter_as : as4number_any { $$->a.as_min = $2; $$->a.as_max = $2; } - | as4number_any binaryop as4number_any { + | asnumber binaryop asnumber { if (($$ = calloc(1, sizeof(struct filter_as_l))) == NULL) fatal(NULL);