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

Reply via email to