OK

On 2017 Jun 23 (Fri) at 16:02:13 +0200 (+0200), Job Snijders wrote:
:Dear team,
:
:This patch adds support for the "graceful shutdown" well-known
:community as described in draft-ietf-grow-bgp-gshut.
:
:An example implementation would be to add the following to your
:bgpd.conf:
:
:    match from any community GRACEFUL_SHUTDOWN set { localpref 0 }
:
:Kind regards,
:
:Job
:
:---
: etc/examples/bgpd.conf    | 4 ++++
: usr.sbin/bgpctl/bgpctl.c  | 3 +++
: usr.sbin/bgpctl/parser.c  | 7 ++++++-
: usr.sbin/bgpd/bgpd.conf.5 | 2 ++
: usr.sbin/bgpd/bgpd.h      | 1 +
: usr.sbin/bgpd/parse.y     | 6 +++++-
: 6 files changed, 21 insertions(+), 2 deletions(-)
:
:diff --git a/etc/examples/bgpd.conf b/etc/examples/bgpd.conf
:index 2ec37b2c752..1caf200ceab 100644
:--- a/etc/examples/bgpd.conf
:+++ b/etc/examples/bgpd.conf
:@@ -87,6 +87,10 @@ allow from any inet6 prefixlen 16 - 48
: #allow from any prefix 0.0.0.0/0
: #allow from any prefix ::/0
: 
:+# Honor requests to gracefully shutdown BGP sessions
:+# https://tools.ietf.org/html/draft-ietf-grow-bgp-gshut
:+match from any community GRACEFUL_SHUTDOWN set { localpref 0 }
:+
: # https://www.arin.net/announcements/2014/20140130.html
: # This block will be subject to a minimum size allocation of /28 and a
: # maximum size allocation of /24. ARIN should use sparse allocation when
:diff --git a/usr.sbin/bgpctl/bgpctl.c b/usr.sbin/bgpctl/bgpctl.c
:index 4d9701da35b..8baa8be0ff2 100644
:--- a/usr.sbin/bgpctl/bgpctl.c
:+++ b/usr.sbin/bgpctl/bgpctl.c
:@@ -1532,6 +1532,9 @@ show_community(u_char *data, u_int16_t len)
:               v = ntohs(v);
:               if (a == COMMUNITY_WELLKNOWN)
:                       switch (v) {
:+                      case COMMUNITY_GRACEFUL_SHUTDOWN:
:+                              printf("GRACEFUL_SHUTDOWN");
:+                              break;
:                       case COMMUNITY_NO_EXPORT:
:                               printf("NO_EXPORT");
:                               break;
:diff --git a/usr.sbin/bgpctl/parser.c b/usr.sbin/bgpctl/parser.c
:index 0d1e5d9fb3a..4ea16533b71 100644
:--- a/usr.sbin/bgpctl/parser.c
:+++ b/usr.sbin/bgpctl/parser.c
:@@ -953,7 +953,11 @@ parse_community(const char *word, struct parse_result *r)
:       int                      as, type;
: 
:       /* Well-known communities */
:-      if (strcasecmp(word, "NO_EXPORT") == 0) {
:+      if (strcasecmp(word, "GRACEFUL_SHUTDOWN") == 0) {
:+              as = COMMUNITY_WELLKNOWN;
:+              type = COMMUNITY_GRACEFUL_SHUTDOWN;
:+              goto done;
:+      } else if (strcasecmp(word, "NO_EXPORT") == 0) {
:               as = COMMUNITY_WELLKNOWN;
:               type = COMMUNITY_NO_EXPORT;
:               goto done;
:@@ -991,6 +995,7 @@ done:
:       }
:       if (as == COMMUNITY_WELLKNOWN)
:               switch (type) {
:+              case COMMUNITY_GRACEFUL_SHUTDOWN:
:               case COMMUNITY_NO_EXPORT:
:               case COMMUNITY_NO_ADVERTISE:
:               case COMMUNITY_NO_EXPSUBCONFED:
:diff --git a/usr.sbin/bgpd/bgpd.conf.5 b/usr.sbin/bgpd/bgpd.conf.5
:index 6cecd7a5a80..3afc54ef385 100644
:--- a/usr.sbin/bgpd/bgpd.conf.5
:+++ b/usr.sbin/bgpd/bgpd.conf.5
:@@ -1173,6 +1173,7 @@ to do wildcard matching.
: Alternatively, well-known communities may be given by name instead and
: include
: .Ic BLACKHOLE ,
:+.Ic GRACEFUL_SHUTDOWN ,
: .Ic NO_EXPORT ,
: .Ic NO_ADVERTISE ,
: .Ic NO_EXPORT_SUBCONFED ,
:@@ -1444,6 +1445,7 @@ is an AS number and
: is a locally-significant number between zero and
: .Li 65535 .
: Alternately, well-known communities may be specified by name:
:+.Ic GRACEFUL_SHUTDOWN ,
: .Ic NO_EXPORT ,
: .Ic NO_ADVERTISE ,
: .Ic NO_EXPORT_SUBCONFED ,
:diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
:index db52f858241..ef4e30ffd94 100644
:--- a/usr.sbin/bgpd/bgpd.h
:+++ b/usr.sbin/bgpd/bgpd.h
:@@ -750,6 +750,7 @@ struct filter_peers {
: #define       COMMUNITY_LOCAL_AS              -4
: #define       COMMUNITY_UNSET                 -5
: #define       COMMUNITY_WELLKNOWN             0xffff
:+#define       COMMUNITY_GRACEFUL_SHUTDOWN     0x0000  /* 
draft-ietf-grow-bgp-gshut */
: #define       COMMUNITY_BLACKHOLE             0x029A  /* RFC 7999 */
: #define       COMMUNITY_NO_EXPORT             0xff01
: #define       COMMUNITY_NO_ADVERTISE          0xff02
:diff --git a/usr.sbin/bgpd/parse.y b/usr.sbin/bgpd/parse.y
:index 73bdb3a0cb9..0b09f83bc0a 100644
:--- a/usr.sbin/bgpd/parse.y
:+++ b/usr.sbin/bgpd/parse.y
:@@ -2991,7 +2991,11 @@ parsecommunity(struct filter_community *c, char *s)
:       int i, as;
: 
:       /* Well-known communities */
:-      if (strcasecmp(s, "NO_EXPORT") == 0) {
:+      if (strcasecmp(s, "GRACEFUL_SHUTDOWN") == 0) {
:+              c->as = COMMUNITY_WELLKNOWN;
:+              c->type = COMMUNITY_GRACEFUL_SHUTDOWN;
:+              return (0);
:+      } else if (strcasecmp(s, "NO_EXPORT") == 0) {
:               c->as = COMMUNITY_WELLKNOWN;
:               c->type = COMMUNITY_NO_EXPORT;
:               return (0);
:

-- 
There's so much plastic in this culture that vinyl leopard skin is
becoming an endangered synthetic.
                -- Lily Tomlin

Reply via email to