On 2017 Jun 23 (Fri) at 16:01:58 +0200 (+0200), Job Snijders wrote: :Dear team, : :This patch makes 'unknown' well-known communities more of a first-class :citizen. : :A powerful property of well-known communities is that (often) operators :can implement the feature associated with a given well-known community :through their local routing policy, ahead of time before their vendor :releasing native support in the implementation. : :Things that work now: : : $ bgpctl show rib community 65535:0 : ..
OK : $ bgpctl show rib community WELLKNOWN:0 : .. : $ bgpctl show rib community WELLKNOWN:* : .. : Ehhhhh, I don't really see a reason to have syntatic sugar for '65535'. In this case, I'm more likely to remember then number than which string to use ;). : $ doas cat /etc/bgpd.conf | grep set : match from any set { community WELLKNOWN:0 community 65535:1 } : Same as before. OK for setting 65535:1, but 'Ehhhh' for 'WELLKNOWN:0'. However, if we have one, then we need to have the other. :Kind regards, : :Job : :--- : usr.sbin/bgpctl/parser.c | 15 +++++++-------- : usr.sbin/bgpd/parse.y | 14 ++++++-------- : 2 files changed, 13 insertions(+), 16 deletions(-) : :diff --git a/usr.sbin/bgpctl/parser.c b/usr.sbin/bgpctl/parser.c :index 85300d1cd32..0d1e5d9fb3a 100644 :--- a/usr.sbin/bgpctl/parser.c :+++ b/usr.sbin/bgpctl/parser.c :@@ -413,7 +413,7 @@ int parse_addr(const char *, struct bgpd_addr *); : int parse_asnum(const char *, size_t, u_int32_t *); : int parse_number(const char *, struct parse_result *, : enum token_type); :-int getcommunity(const char *); :+int getcommunity(const char *, int); : int parse_community(const char *, struct parse_result *); : u_int getlargecommunity(const char *); : int parse_largecommunity(const char *, struct parse_result *); :@@ -927,7 +927,7 @@ parse_number(const char *word, struct parse_result *r, enum token_type type) : } : : int :-getcommunity(const char *s) :+getcommunity(const char *s, int msb) : { : const char *errstr; : u_int16_t uval; :@@ -935,6 +935,9 @@ getcommunity(const char *s) : if (strcmp(s, "*") == 0) : return (COMMUNITY_ANY); : :+ if (msb == 1 && strcmp(s, "WELLKNOWN") == 0) :+ return (COMMUNITY_WELLKNOWN); :+ : uval = strtonum(s, 0, USHRT_MAX, &errstr); : if (errstr) : errx(1, "Community is %s: %s", errstr, s); :@@ -978,8 +981,8 @@ parse_community(const char *word, struct parse_result *r) : } : *p++ = 0; : :- as = getcommunity(word); :- type = getcommunity(p); :+ as = getcommunity(word, 1); :+ type = getcommunity(p, 0); : : done: : if (as == 0) { :@@ -994,10 +997,6 @@ done: : case COMMUNITY_BLACKHOLE: : /* valid */ : break; :- default: :- /* unknown */ :- fprintf(stderr, "Unknown well-known community\n"); :- return (0); : } : : if ((fs = calloc(1, sizeof(struct filter_set))) == NULL) :diff --git a/usr.sbin/bgpd/parse.y b/usr.sbin/bgpd/parse.y :index f0c96051e17..73bdb3a0cb9 100644 :--- a/usr.sbin/bgpd/parse.y :+++ b/usr.sbin/bgpd/parse.y :@@ -146,7 +146,7 @@ void copy_filterset(struct filter_set_head *, : void merge_filter_lists(struct filter_head *, struct filter_head *); : struct filter_rule *get_rule(enum action_types); : :-int getcommunity(char *); :+int getcommunity(char *, int); : int parsecommunity(struct filter_community *, char *); : int64_t getlargecommunity(char *); : int parselargecommunity(struct filter_largecommunity *, char *); :@@ -2963,11 +2963,13 @@ symget(const char *nam) : } : : int :-getcommunity(char *s) :+getcommunity(char *s, int msb) : { : int val; : const char *errstr; : :+ if (msb == 1 && strcmp(s, "WELLKNOWN") == 0) :+ return (COMMUNITY_WELLKNOWN); : if (strcmp(s, "*") == 0) : return (COMMUNITY_ANY); : if (strcmp(s, "neighbor-as") == 0) :@@ -3017,15 +3019,11 @@ parsecommunity(struct filter_community *c, char *s) : } : *p++ = 0; : :- if ((i = getcommunity(s)) == COMMUNITY_ERROR) :+ if ((i = getcommunity(s, 1)) == COMMUNITY_ERROR) : return (-1); :- if (i == COMMUNITY_WELLKNOWN) { :- yyerror("Bad community AS number"); :- return (-1); :- } : as = i; : :- if ((i = getcommunity(p)) == COMMUNITY_ERROR) :+ if ((i = getcommunity(p, 0)) == COMMUNITY_ERROR) : return (-1); : c->as = as; : c->type = i; : -- There is nothing wrong with Southern California that a rise in the ocean level wouldn't cure. -- Ross MacDonald