On Sun, Jan 29, 2023 at 02:02:08PM +0000, Job Snijders wrote: > 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?
Because in some cases you need 0.42 because that's the only way to enforce a 4byte ASnum with small ASnumbers. > Perhaps time to bring ASDOT to the gardenshed? :-) The diff is wrong. You removed too much. as4number and as4number_any are not the same thing and you broke ROA with source-as 0 with this. Also there is a lot missing. bgpd already uses ASPLAIN everywhere but accepts ASDOT as well. I have nothing against applying the first hunk of bgpd.conf.5 but the second but should not be removed. Because it documents how to force a 4byte ASnumber encoding for ext-communities. (ext-commuinity encoding is a nightmare but that is a different story). > 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); > -- :wq Claudio