ROA entires are allowing to define a prefix with a maxlen. In the end this is just another way to specify a prefixlen range and mostly an or-longer case with an upper limit. So these two prefix statements are equivalent: prefix 10.0.0.0/8 prefixlen 8 - 24 prefix 10.0.0.0/8 maxlen 24
I think this is a worthwhile addition. While there also make 'prefixlen = 17' a OP_RANGE and because of that also usable in prefix-set tables. Finally adjust printconf.c for those to changes to print them nicely. -- :wq Claudio Index: parse.y =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v retrieving revision 1.350 diff -u -p -r1.350 parse.y --- parse.y 10 Sep 2018 11:09:25 -0000 1.350 +++ parse.y 13 Sep 2018 09:30:54 -0000 @@ -218,7 +219,7 @@ typedef struct { %token IPSEC ESP AH SPI IKE %token IPV4 IPV6 %token QUALIFY VIA -%token NE LE GE XRANGE LONGER +%token NE LE GE XRANGE LONGER MAXLEN %token <v.string> STRING %token <v.number> NUMBER %type <v.number> asnumber as4number as4number_any optnumber @@ -2189,6 +2174,17 @@ prefixlenop : /* empty */ { bzero(&$$, $$.len_min = -1; $$.len_max = -1; } + | MAXLEN NUMBER { + bzero(&$$, sizeof($$)); + if ($2 < 0 || $2 > 128) { + yyerror("prefixlen must be >= 0 and <= 128"); + YYERROR; + } + + $$.op = OP_RANGE; + $$.len_min = -1; + $$.len_max = $2; + } | PREFIXLEN unaryop NUMBER { int min, max; @@ -2204,10 +2200,10 @@ prefixlenop : /* empty */ { bzero(&$$, $$.op = OP_RANGE; switch ($2) { - case OP_EQ: case OP_NE: - min = max = $3; $$.op = $2; + case OP_EQ: + min = max = $3; break; case OP_LT: if ($3 == 0) { @@ -2713,6 +2709,7 @@ lookup(char *s) { "max-as-len", MAXASLEN}, { "max-as-seq", MAXASSEQ}, { "max-prefix", MAXPREFIX}, + { "maxlen", MAXLEN}, { "md5sig", MD5SIG}, { "med", MED}, { "metric", METRIC}, Index: printconf.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/printconf.c,v retrieving revision 1.117 diff -u -p -r1.117 printconf.c --- printconf.c 10 Sep 2018 11:01:15 -0000 1.117 +++ printconf.c 13 Sep 2018 09:29:25 -0000 @@ -77,9 +77,6 @@ print_prefix(struct filter_prefix *p) switch (p->op) { case OP_NONE: break; - case OP_EQ: - printf(" prefixlen = %u", p->len_min); - break; case OP_NE: printf(" prefixlen != %u", p->len_min); break; @@ -87,8 +84,12 @@ print_prefix(struct filter_prefix *p) printf(" prefixlen %u >< %u ", p->len_min, p->len_max); break; case OP_RANGE: - if (p->len == p->len_min && p->len_max == max_len) + if (p->len == p->len_min && p->len == p->len_max) + printf(" prefixlen = %u", p->len); + else if (p->len == p->len_min && p->len_max == max_len) printf(" or-longer"); + else if (p->len == p->len_min) + printf(" maxlen %u", p->len_max); else if (p->len_max == max_len) printf(" prefixlen >= %u", p->len_min); else