diff options
Diffstat (limited to 'bgpd/rfapi/rfapi_vty.c')
| -rw-r--r-- | bgpd/rfapi/rfapi_vty.c | 7652 |
1 files changed, 3648 insertions, 4004 deletions
diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c index 3de79dac04..f87a71a219 100644 --- a/bgpd/rfapi/rfapi_vty.c +++ b/bgpd/rfapi/rfapi_vty.c @@ -1,4 +1,4 @@ -/* +/* * * Copyright 2009-2016, LabN Consulting, L.L.C. * @@ -70,68 +70,53 @@ #define FMT_DAY (24 * FMT_HOUR) #define FMT_YEAR (365 * FMT_DAY) -char * -rfapiFormatSeconds (uint32_t seconds, char *buf, size_t len) +char *rfapiFormatSeconds(uint32_t seconds, char *buf, size_t len) { - int year, day, hour, min; - - if (seconds >= FMT_YEAR) - { - year = seconds / FMT_YEAR; - seconds -= year * FMT_YEAR; - } - else - year = 0; - - if (seconds >= FMT_DAY) - { - day = seconds / FMT_DAY; - seconds -= day * FMT_DAY; - } - else - day = 0; - - if (seconds >= FMT_HOUR) - { - hour = seconds / FMT_HOUR; - seconds -= hour * FMT_HOUR; - } - else - hour = 0; - - if (seconds >= FMT_MIN) - { - min = seconds / FMT_MIN; - seconds -= min * FMT_MIN; - } - else - min = 0; - - if (year > 0) - { - snprintf (buf, len, "%dy%dd%dh", year, day, hour); - } - else if (day > 0) - { - snprintf (buf, len, "%dd%dh%dm", day, hour, min); - } - else - { - snprintf (buf, len, "%02d:%02d:%02d", hour, min, seconds); - } - - return buf; + int year, day, hour, min; + + if (seconds >= FMT_YEAR) { + year = seconds / FMT_YEAR; + seconds -= year * FMT_YEAR; + } else + year = 0; + + if (seconds >= FMT_DAY) { + day = seconds / FMT_DAY; + seconds -= day * FMT_DAY; + } else + day = 0; + + if (seconds >= FMT_HOUR) { + hour = seconds / FMT_HOUR; + seconds -= hour * FMT_HOUR; + } else + hour = 0; + + if (seconds >= FMT_MIN) { + min = seconds / FMT_MIN; + seconds -= min * FMT_MIN; + } else + min = 0; + + if (year > 0) { + snprintf(buf, len, "%dy%dd%dh", year, day, hour); + } else if (day > 0) { + snprintf(buf, len, "%dd%dh%dm", day, hour, min); + } else { + snprintf(buf, len, "%02d:%02d:%02d", hour, min, seconds); + } + + return buf; } -char * -rfapiFormatAge (time_t age, char *buf, size_t len) +char *rfapiFormatAge(time_t age, char *buf, size_t len) { - time_t now, age_adjusted; + time_t now, age_adjusted; - now = rfapi_time (NULL); - age_adjusted = now - age; + now = rfapi_time(NULL); + age_adjusted = now - age; - return rfapiFormatSeconds (age_adjusted, buf, len); + return rfapiFormatSeconds(age_adjusted, buf, len); } @@ -139,47 +124,43 @@ rfapiFormatAge (time_t age, char *buf, size_t len) * Reimplementation of quagga/lib/prefix.c function, but * for RFAPI-style prefixes */ -void -rfapiRprefixApplyMask (struct rfapi_ip_prefix *rprefix) +void rfapiRprefixApplyMask(struct rfapi_ip_prefix *rprefix) { - uint8_t *pnt; - int index; - int offset; - - static uint8_t maskbit[] = - { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; - - switch (rprefix->prefix.addr_family) - { - case AF_INET: - index = rprefix->length / 8; - if (index < 4) - { - pnt = (uint8_t *) & rprefix->prefix.addr.v4; - offset = rprefix->length % 8; - pnt[index] &= maskbit[offset]; - index++; - while (index < 4) - pnt[index++] = 0; - } - break; - - case AF_INET6: - index = rprefix->length / 8; - if (index < 16) - { - pnt = (uint8_t *) & rprefix->prefix.addr.v6; - offset = rprefix->length % 8; - pnt[index] &= maskbit[offset]; - index++; - while (index < 16) - pnt[index++] = 0; - } - break; - - default: - assert (0); - } + uint8_t *pnt; + int index; + int offset; + + static uint8_t maskbit[] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, + 0xf8, 0xfc, 0xfe, 0xff}; + + switch (rprefix->prefix.addr_family) { + case AF_INET: + index = rprefix->length / 8; + if (index < 4) { + pnt = (uint8_t *)&rprefix->prefix.addr.v4; + offset = rprefix->length % 8; + pnt[index] &= maskbit[offset]; + index++; + while (index < 4) + pnt[index++] = 0; + } + break; + + case AF_INET6: + index = rprefix->length / 8; + if (index < 16) { + pnt = (uint8_t *)&rprefix->prefix.addr.v6; + offset = rprefix->length % 8; + pnt[index] &= maskbit[offset]; + index++; + while (index < 16) + pnt[index++] = 0; + } + break; + + default: + assert(0); + } } /* @@ -191,71 +172,67 @@ rfapiRprefixApplyMask (struct rfapi_ip_prefix *rprefix) * 0 Success * <0 Error */ -int -rfapiQprefix2Raddr (struct prefix *qprefix, struct rfapi_ip_addr *raddr) +int rfapiQprefix2Raddr(struct prefix *qprefix, struct rfapi_ip_addr *raddr) { - memset (raddr, 0, sizeof (struct rfapi_ip_addr)); - raddr->addr_family = qprefix->family; - switch (qprefix->family) - { - case AF_INET: - if (qprefix->prefixlen != 32) - return -1; - raddr->addr.v4 = qprefix->u.prefix4; - break; - case AF_INET6: - if (qprefix->prefixlen != 128) - return -1; - raddr->addr.v6 = qprefix->u.prefix6; - break; - default: - return -1; - } - return 0; + memset(raddr, 0, sizeof(struct rfapi_ip_addr)); + raddr->addr_family = qprefix->family; + switch (qprefix->family) { + case AF_INET: + if (qprefix->prefixlen != 32) + return -1; + raddr->addr.v4 = qprefix->u.prefix4; + break; + case AF_INET6: + if (qprefix->prefixlen != 128) + return -1; + raddr->addr.v6 = qprefix->u.prefix6; + break; + default: + return -1; + } + return 0; } -/* +/* * Translate Quagga prefix to RFAPI prefix */ /* rprefix->cost set to 0 */ -void -rfapiQprefix2Rprefix (struct prefix *qprefix, struct rfapi_ip_prefix *rprefix) +void rfapiQprefix2Rprefix(struct prefix *qprefix, + struct rfapi_ip_prefix *rprefix) { - memset (rprefix, 0, sizeof (struct rfapi_ip_prefix)); - rprefix->length = qprefix->prefixlen; - rprefix->prefix.addr_family = qprefix->family; - switch (qprefix->family) - { - case AF_INET: - rprefix->prefix.addr.v4 = qprefix->u.prefix4; - break; - case AF_INET6: - rprefix->prefix.addr.v6 = qprefix->u.prefix6; - break; - default: - assert (0); - } + memset(rprefix, 0, sizeof(struct rfapi_ip_prefix)); + rprefix->length = qprefix->prefixlen; + rprefix->prefix.addr_family = qprefix->family; + switch (qprefix->family) { + case AF_INET: + rprefix->prefix.addr.v4 = qprefix->u.prefix4; + break; + case AF_INET6: + rprefix->prefix.addr.v6 = qprefix->u.prefix6; + break; + default: + assert(0); + } } -int -rfapiRprefix2Qprefix (struct rfapi_ip_prefix *rprefix, struct prefix *qprefix) +int rfapiRprefix2Qprefix(struct rfapi_ip_prefix *rprefix, + struct prefix *qprefix) { - memset (qprefix, 0, sizeof (struct prefix)); - qprefix->prefixlen = rprefix->length; - qprefix->family = rprefix->prefix.addr_family; - - switch (rprefix->prefix.addr_family) - { - case AF_INET: - qprefix->u.prefix4 = rprefix->prefix.addr.v4; - break; - case AF_INET6: - qprefix->u.prefix6 = rprefix->prefix.addr.v6; - break; - default: - return EAFNOSUPPORT; - } - return 0; + memset(qprefix, 0, sizeof(struct prefix)); + qprefix->prefixlen = rprefix->length; + qprefix->family = rprefix->prefix.addr_family; + + switch (rprefix->prefix.addr_family) { + case AF_INET: + qprefix->u.prefix4 = rprefix->prefix.addr.v4; + break; + case AF_INET6: + qprefix->u.prefix6 = rprefix->prefix.addr.v6; + break; + default: + return EAFNOSUPPORT; + } + return 0; } /* @@ -265,122 +242,111 @@ rfapiRprefix2Qprefix (struct rfapi_ip_prefix *rprefix, struct prefix *qprefix) * For paralellism with quagga/lib/prefix.c. if we need a comparison * where host bits are ignored, call that function rfapiRprefixCmp. */ -int -rfapiRprefixSame (struct rfapi_ip_prefix *hp1, struct rfapi_ip_prefix *hp2) +int rfapiRprefixSame(struct rfapi_ip_prefix *hp1, struct rfapi_ip_prefix *hp2) { - if (hp1->prefix.addr_family != hp2->prefix.addr_family) - return 0; - if (hp1->length != hp2->length) - return 0; - if (hp1->prefix.addr_family == AF_INET) - if (IPV4_ADDR_SAME (&hp1->prefix.addr.v4, &hp2->prefix.addr.v4)) - return 1; - if (hp1->prefix.addr_family == AF_INET6) - if (IPV6_ADDR_SAME (&hp1->prefix.addr.v6, &hp2->prefix.addr.v6)) - return 1; - return 0; + if (hp1->prefix.addr_family != hp2->prefix.addr_family) + return 0; + if (hp1->length != hp2->length) + return 0; + if (hp1->prefix.addr_family == AF_INET) + if (IPV4_ADDR_SAME(&hp1->prefix.addr.v4, &hp2->prefix.addr.v4)) + return 1; + if (hp1->prefix.addr_family == AF_INET6) + if (IPV6_ADDR_SAME(&hp1->prefix.addr.v6, &hp2->prefix.addr.v6)) + return 1; + return 0; } -int -rfapiRaddr2Qprefix (struct rfapi_ip_addr *hia, struct prefix *pfx) +int rfapiRaddr2Qprefix(struct rfapi_ip_addr *hia, struct prefix *pfx) { - memset (pfx, 0, sizeof (struct prefix)); - pfx->family = hia->addr_family; - - switch (hia->addr_family) - { - case AF_INET: - pfx->prefixlen = 32; - pfx->u.prefix4 = hia->addr.v4; - break; - case AF_INET6: - pfx->prefixlen = 128; - pfx->u.prefix6 = hia->addr.v6; - break; - default: - return EAFNOSUPPORT; - } - return 0; + memset(pfx, 0, sizeof(struct prefix)); + pfx->family = hia->addr_family; + + switch (hia->addr_family) { + case AF_INET: + pfx->prefixlen = 32; + pfx->u.prefix4 = hia->addr.v4; + break; + case AF_INET6: + pfx->prefixlen = 128; + pfx->u.prefix6 = hia->addr.v6; + break; + default: + return EAFNOSUPPORT; + } + return 0; } -void -rfapiL2o2Qprefix (struct rfapi_l2address_option *l2o, struct prefix *pfx) +void rfapiL2o2Qprefix(struct rfapi_l2address_option *l2o, struct prefix *pfx) { - memset (pfx, 0, sizeof (struct prefix)); - pfx->family = AF_ETHERNET; - pfx->prefixlen = 48; - pfx->u.prefix_eth = l2o->macaddr; + memset(pfx, 0, sizeof(struct prefix)); + pfx->family = AF_ETHERNET; + pfx->prefixlen = 48; + pfx->u.prefix_eth = l2o->macaddr; } -char * -rfapiEthAddr2Str (const struct ethaddr *ea, char *buf, int bufsize) +char *rfapiEthAddr2Str(const struct ethaddr *ea, char *buf, int bufsize) { - return prefix_mac2str (ea, buf, bufsize); + return prefix_mac2str(ea, buf, bufsize); } -int -rfapiStr2EthAddr (const char *str, struct ethaddr *ea) +int rfapiStr2EthAddr(const char *str, struct ethaddr *ea) { - unsigned int a[6]; - int i; + unsigned int a[6]; + int i; - if (sscanf (str, "%2x:%2x:%2x:%2x:%2x:%2x", - a + 0, a + 1, a + 2, a + 3, a + 4, a + 5) != 6) - { + if (sscanf(str, "%2x:%2x:%2x:%2x:%2x:%2x", a + 0, a + 1, a + 2, a + 3, + a + 4, a + 5) + != 6) { - return EINVAL; - } + return EINVAL; + } - for (i = 0; i < 6; ++i) - ea->octet[i] = a[i] & 0xff; + for (i = 0; i < 6; ++i) + ea->octet[i] = a[i] & 0xff; - return 0; + return 0; } -const char * -rfapi_ntop (int af, const void *src, char *buf, socklen_t size) +const char *rfapi_ntop(int af, const void *src, char *buf, socklen_t size) { - if (af == AF_ETHERNET) - { - return rfapiEthAddr2Str ((const struct ethaddr *) src, buf, size); - } + if (af == AF_ETHERNET) { + return rfapiEthAddr2Str((const struct ethaddr *)src, buf, size); + } - return inet_ntop (af, src, buf, size); + return inet_ntop(af, src, buf, size); } -int -rfapiDebugPrintf (void *dummy, const char *format, ...) +int rfapiDebugPrintf(void *dummy, const char *format, ...) { - va_list args; - va_start (args, format); - vzlog (LOG_DEBUG, format, args); - va_end (args); - return 0; + va_list args; + va_start(args, format); + vzlog(LOG_DEBUG, format, args); + va_end(args); + return 0; } -static int -rfapiStdioPrintf (void *stream, const char *format, ...) +static int rfapiStdioPrintf(void *stream, const char *format, ...) { - FILE *file = NULL; - - va_list args; - va_start (args, format); - - switch ((uintptr_t) stream) - { - case 1: - file = stdout; - break; - case 2: - file = stderr; - break; - default: - assert (0); - } - - vfprintf (file, format, args); - va_end (args); - return 0; + FILE *file = NULL; + + va_list args; + va_start(args, format); + + switch ((uintptr_t)stream) { + case 1: + file = stdout; + break; + case 2: + file = stderr; + break; + default: + assert(0); + } + + vfprintf(file, format, args); + va_end(args); + return 0; } /* Fake out for debug logging */ @@ -388,1138 +354,1024 @@ static struct vty vty_dummy_zlog; static struct vty vty_dummy_stdio; #define HVTY_NEWLINE ((vty == &vty_dummy_zlog)? "": VTY_NEWLINE) -static const char * -str_vty_newline (struct vty *vty) +static const char *str_vty_newline(struct vty *vty) { - if (vty == &vty_dummy_zlog) - return ""; - return VTY_NEWLINE; + if (vty == &vty_dummy_zlog) + return ""; + return VTY_NEWLINE; } -int -rfapiStream2Vty ( - void *stream, /* input */ - int (**fp) (void *, const char *, ...), /* output */ - struct vty **vty, /* output */ - void **outstream, /* output */ - const char **vty_newline) /* output */ +int rfapiStream2Vty(void *stream, /* input */ + int (**fp)(void *, const char *, ...), /* output */ + struct vty **vty, /* output */ + void **outstream, /* output */ + const char **vty_newline) /* output */ { - if (!stream) - { - vty_dummy_zlog.type = VTY_SHELL; /* for VTY_NEWLINE */ - *vty = &vty_dummy_zlog; - *fp = (int (*)(void *, const char *,...)) rfapiDebugPrintf; - *outstream = NULL; - *vty_newline = str_vty_newline (*vty); - return (vzlog_test (LOG_DEBUG)); - } - - if (((uintptr_t) stream == (uintptr_t) 1) || - ((uintptr_t) stream == (uintptr_t) 2)) - { - - vty_dummy_stdio.type = VTY_SHELL; /* for VTY_NEWLINE */ - *vty = &vty_dummy_stdio; - *fp = (int (*)(void *, const char *,...)) rfapiStdioPrintf; - *outstream = stream; - *vty_newline = str_vty_newline (*vty); - return 1; - } - - if (stream) - { - *vty = stream; /* VTY_NEWLINE requires vty to be legit */ - *fp = (int (*)(void *, const char *,...)) vty_out; - *outstream = stream; - *vty_newline = str_vty_newline (*vty); - return 1; - } - - return 0; + if (!stream) { + vty_dummy_zlog.type = VTY_SHELL; /* for VTY_NEWLINE */ + *vty = &vty_dummy_zlog; + *fp = (int (*)(void *, const char *, ...))rfapiDebugPrintf; + *outstream = NULL; + *vty_newline = str_vty_newline(*vty); + return (vzlog_test(LOG_DEBUG)); + } + + if (((uintptr_t)stream == (uintptr_t)1) + || ((uintptr_t)stream == (uintptr_t)2)) { + + vty_dummy_stdio.type = VTY_SHELL; /* for VTY_NEWLINE */ + *vty = &vty_dummy_stdio; + *fp = (int (*)(void *, const char *, ...))rfapiStdioPrintf; + *outstream = stream; + *vty_newline = str_vty_newline(*vty); + return 1; + } + + if (stream) { + *vty = stream; /* VTY_NEWLINE requires vty to be legit */ + *fp = (int (*)(void *, const char *, ...))vty_out; + *outstream = stream; + *vty_newline = str_vty_newline(*vty); + return 1; + } + + return 0; } /* called from bgpd/bgp_vty.c'route_vty_out() */ -void -rfapi_vty_out_vncinfo ( - struct vty *vty, - struct prefix *p, - struct bgp_info *bi, - safi_t safi) +void rfapi_vty_out_vncinfo(struct vty *vty, struct prefix *p, + struct bgp_info *bi, safi_t safi) { - char *s; - uint32_t lifetime; - - /* - * Print, on an indented line: - * UN address [if VPN route and VNC UN addr subtlv] - * EC list - * VNC lifetime - */ - vty_out (vty, " "); - - if (safi == SAFI_MPLS_VPN) - { - struct prefix pfx_un; - - if (!rfapiGetVncTunnelUnAddr (bi->attr, &pfx_un)) - { - char buf[BUFSIZ]; - vty_out (vty, "UN=%s", inet_ntop (pfx_un.family, - pfx_un.u.val, buf, BUFSIZ)); - } - } - - if (bi->attr && bi->attr->extra && bi->attr->extra->ecommunity) - { - s = ecommunity_ecom2str (bi->attr->extra->ecommunity, - ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - vty_out (vty, " EC{%s}", s); - XFREE (MTYPE_ECOMMUNITY_STR, s); - } - - if (bi->extra != NULL) - vty_out (vty, " label=%u", decode_label (bi->extra->tag)); - - if (!rfapiGetVncLifetime (bi->attr, &lifetime)) - { - vty_out (vty, " life=%d", lifetime); - } - - vty_out (vty, " type=%s, subtype=%d", - zebra_route_string (bi->type), bi->sub_type); - - vty_out (vty, "%s", HVTY_NEWLINE); + char *s; + uint32_t lifetime; + + /* + * Print, on an indented line: + * UN address [if VPN route and VNC UN addr subtlv] + * EC list + * VNC lifetime + */ + vty_out(vty, " "); + + if (safi == SAFI_MPLS_VPN) { + struct prefix pfx_un; + + if (!rfapiGetVncTunnelUnAddr(bi->attr, &pfx_un)) { + char buf[BUFSIZ]; + vty_out(vty, "UN=%s", + inet_ntop(pfx_un.family, pfx_un.u.val, buf, + BUFSIZ)); + } + } + + if (bi->attr && bi->attr->extra && bi->attr->extra->ecommunity) { + s = ecommunity_ecom2str(bi->attr->extra->ecommunity, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + vty_out(vty, " EC{%s}", s); + XFREE(MTYPE_ECOMMUNITY_STR, s); + } + + if (bi->extra != NULL) + vty_out(vty, " label=%u", decode_label(bi->extra->tag)); + + if (!rfapiGetVncLifetime(bi->attr, &lifetime)) { + vty_out(vty, " life=%d", lifetime); + } + + vty_out(vty, " type=%s, subtype=%d", zebra_route_string(bi->type), + bi->sub_type); + + vty_out(vty, "%s", HVTY_NEWLINE); } -void -rfapiPrintAttrPtrs (void *stream, struct attr *attr) +void rfapiPrintAttrPtrs(void *stream, struct attr *attr) { - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - - struct attr_extra *ae; - char buf[BUFSIZ]; - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; - - fp (out, "Attr[%p]:%s", attr, HVTY_NEWLINE); - if (!attr) - return; - - /* IPv4 Nexthop */ - inet_ntop (AF_INET, &attr->nexthop, buf, BUFSIZ); - fp (out, " nexthop=%s%s", buf, HVTY_NEWLINE); - - fp (out, " aspath=%p, refcnt=%d%s", attr->aspath, - (attr->aspath ? attr->aspath->refcnt : 0), HVTY_NEWLINE); - fp (out, " community=%p, refcnt=%d%s", attr->community, - (attr->community ? attr->community->refcnt : 0), HVTY_NEWLINE); - - if ((ae = attr->extra)) - { - fp (out, " ecommunity=%p, refcnt=%d%s", ae->ecommunity, - (ae->ecommunity ? ae->ecommunity->refcnt : 0), HVTY_NEWLINE); - fp (out, " cluster=%p, refcnt=%d%s", ae->cluster, - (ae->cluster ? ae->cluster->refcnt : 0), HVTY_NEWLINE); - fp (out, " transit=%p, refcnt=%d%s", ae->transit, - (ae->transit ? ae->transit->refcnt : 0), HVTY_NEWLINE); - } + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + + struct attr_extra *ae; + char buf[BUFSIZ]; + + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; + + fp(out, "Attr[%p]:%s", attr, HVTY_NEWLINE); + if (!attr) + return; + + /* IPv4 Nexthop */ + inet_ntop(AF_INET, &attr->nexthop, buf, BUFSIZ); + fp(out, " nexthop=%s%s", buf, HVTY_NEWLINE); + + fp(out, " aspath=%p, refcnt=%d%s", attr->aspath, + (attr->aspath ? attr->aspath->refcnt : 0), HVTY_NEWLINE); + fp(out, " community=%p, refcnt=%d%s", attr->community, + (attr->community ? attr->community->refcnt : 0), HVTY_NEWLINE); + + if ((ae = attr->extra)) { + fp(out, " ecommunity=%p, refcnt=%d%s", ae->ecommunity, + (ae->ecommunity ? ae->ecommunity->refcnt : 0), HVTY_NEWLINE); + fp(out, " cluster=%p, refcnt=%d%s", ae->cluster, + (ae->cluster ? ae->cluster->refcnt : 0), HVTY_NEWLINE); + fp(out, " transit=%p, refcnt=%d%s", ae->transit, + (ae->transit ? ae->transit->refcnt : 0), HVTY_NEWLINE); + } } /* * Print BI in an Import Table */ -void -rfapiPrintBi (void *stream, struct bgp_info *bi) +void rfapiPrintBi(void *stream, struct bgp_info *bi) { - char buf[BUFSIZ]; - char *s; - - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - - char line[BUFSIZ]; - char *p = line; - int r; - int has_macaddr = 0; - struct ethaddr macaddr; - struct rfapi_l2address_option l2o_buf; - uint8_t l2hid=0; /* valid if has_macaddr */ + char buf[BUFSIZ]; + char *s; + + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + + char line[BUFSIZ]; + char *p = line; + int r; + int has_macaddr = 0; + struct ethaddr macaddr; + struct rfapi_l2address_option l2o_buf; + uint8_t l2hid = 0; /* valid if has_macaddr */ #define REMAIN (BUFSIZ - (p-line)) #define INCP {p += (r > REMAIN)? REMAIN: r;} - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; - - if (!bi) - return; - - if (CHECK_FLAG (bi->flags, BGP_INFO_REMOVED) && bi->extra - && bi->extra->vnc.import.timer) - { - struct thread *t = (struct thread *) bi->extra->vnc.import.timer; - r = snprintf (p, REMAIN, " [%4lu] ", thread_timer_remain_second (t)); - INCP; - - } - else - { - r = snprintf (p, REMAIN, " "); - INCP; - } - - if (bi->extra) - { - /* TBD This valid only for SAFI_MPLS_VPN, but not for encap */ - if (decode_rd_type(bi->extra->vnc.import.rd.val) == RD_TYPE_VNC_ETH) - { - has_macaddr = 1; - memcpy (macaddr.octet, bi->extra->vnc.import.rd.val + 2, 6); - l2hid = bi->extra->vnc.import.rd.val[1]; - } - } - - /* - * Print these items: - * type/subtype - * nexthop address - * lifetime - * RFP option sizes (they are opaque values) - * extended communities (RTs) - */ - if (bi->attr && bi->attr->extra) - { - uint32_t lifetime; - int printed_1st_gol = 0; - struct bgp_attr_encap_subtlv *pEncap; - struct prefix pfx_un; - int af = BGP_MP_NEXTHOP_FAMILY (bi->attr->extra->mp_nexthop_len); - - /* Nexthop */ - if (af == AF_INET) - { - r = snprintf (p, REMAIN, "%s", inet_ntop (AF_INET, - &bi->attr->extra->mp_nexthop_global_in, - buf, BUFSIZ)); - INCP; - } - else if (af == AF_INET6) - { - r = snprintf (p, REMAIN, "%s", inet_ntop (AF_INET6, - &bi->attr->extra->mp_nexthop_global, - buf, BUFSIZ)); - INCP; - } - else - { - r = snprintf (p, REMAIN, "?"); - INCP; - } - - /* - * VNC tunnel subtlv, if present, contains UN address - */ - if (!rfapiGetVncTunnelUnAddr (bi->attr, &pfx_un)) - { - r = snprintf (p, REMAIN, " un=%s", inet_ntop (pfx_un.family, - pfx_un.u.val, buf, - BUFSIZ)); - INCP; - - } - - /* Lifetime */ - if (rfapiGetVncLifetime (bi->attr, &lifetime)) - { - r = snprintf (p, REMAIN, " nolife"); - INCP; - } - else - { - if (lifetime == 0xffffffff) - r = snprintf (p, REMAIN, " %6s", "infini"); - else - r = snprintf (p, REMAIN, " %6u", lifetime); - INCP; - } - - /* RFP option lengths */ - for (pEncap = bi->attr->extra->vnc_subtlvs; pEncap; - pEncap = pEncap->next) - { - - if (pEncap->type == BGP_VNC_SUBTLV_TYPE_RFPOPTION) - { - if (printed_1st_gol) - { - r = snprintf (p, REMAIN, ","); - INCP; - } - else - { - r = snprintf (p, REMAIN, " "); /* leading space */ - INCP; - } - r = snprintf (p, REMAIN, "%d", pEncap->length); - INCP; - printed_1st_gol = 1; - } - } - - /* RT list */ - if (bi->attr->extra->ecommunity) - { - s = ecommunity_ecom2str (bi->attr->extra->ecommunity, - ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - r = snprintf (p, REMAIN, " %s", s); - INCP; - XFREE (MTYPE_ECOMMUNITY_STR, s); - } - - } - - r = snprintf (p, REMAIN, " bi@%p", bi); - INCP; - - r = snprintf (p, REMAIN, " p@%p", bi->peer); - INCP; - - if (CHECK_FLAG (bi->flags, BGP_INFO_REMOVED)) - { - r = snprintf (p, REMAIN, " HD=yes"); - INCP; - } - else - { - r = snprintf (p, REMAIN, " HD=no"); - INCP; - } - - if (bi->attr) - { - - if (bi->attr->extra) - { - r = snprintf (p, REMAIN, " W=%d", bi->attr->extra->weight); - INCP; - } - - if (bi->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)) - { - r = snprintf (p, REMAIN, " LP=%d", bi->attr->local_pref); - INCP; - } - else - { - r = snprintf (p, REMAIN, " LP=unset"); - INCP; - } - } - - r = - snprintf (p, REMAIN, " %c:%u", zebra_route_char (bi->type), bi->sub_type); - INCP; - - fp (out, "%s%s", line, HVTY_NEWLINE); - - if (has_macaddr) - { - fp (out, " RD HID=%d ETH=%02x:%02x:%02x:%02x:%02x:%02x%s", - l2hid, - macaddr.octet[0], - macaddr.octet[1], - macaddr.octet[2], - macaddr.octet[3], macaddr.octet[4], macaddr.octet[5], HVTY_NEWLINE); - } - - if (!rfapiGetL2o (bi->attr, &l2o_buf)) - { - fp (out, - " L2O ETH=%02x:%02x:%02x:%02x:%02x:%02x LBL=%d LNI=%d LHI=%hhu%s", - l2o_buf.macaddr.octet[0], l2o_buf.macaddr.octet[1], - l2o_buf.macaddr.octet[2], l2o_buf.macaddr.octet[3], - l2o_buf.macaddr.octet[4], l2o_buf.macaddr.octet[5], l2o_buf.label, - l2o_buf.logical_net_id, l2o_buf.local_nve_id, HVTY_NEWLINE); - } - if (bi->extra && bi->extra->vnc.import.aux_prefix.family) - { - char buf[BUFSIZ]; - const char *sp; - - sp = rfapi_ntop (bi->extra->vnc.import.aux_prefix.family, - &bi->extra->vnc.import.aux_prefix.u.prefix, - buf, BUFSIZ); - buf[BUFSIZ - 1] = 0; - if (sp) - { - fp (out, " IP: %s%s", sp, HVTY_NEWLINE); - } - } - { - struct rfapi_un_option *uo = rfapi_encap_tlv_to_un_option (bi->attr); - if (uo) - { - rfapi_print_tunneltype_option (stream, 8, &uo->v.tunnel); - rfapi_un_options_free (uo); - } - } + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; + + if (!bi) + return; + + if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED) && bi->extra + && bi->extra->vnc.import.timer) { + struct thread *t = (struct thread *)bi->extra->vnc.import.timer; + r = snprintf(p, REMAIN, " [%4lu] ", + thread_timer_remain_second(t)); + INCP; + + } else { + r = snprintf(p, REMAIN, " "); + INCP; + } + + if (bi->extra) { + /* TBD This valid only for SAFI_MPLS_VPN, but not for encap */ + if (decode_rd_type(bi->extra->vnc.import.rd.val) + == RD_TYPE_VNC_ETH) { + has_macaddr = 1; + memcpy(macaddr.octet, bi->extra->vnc.import.rd.val + 2, + 6); + l2hid = bi->extra->vnc.import.rd.val[1]; + } + } + + /* + * Print these items: + * type/subtype + * nexthop address + * lifetime + * RFP option sizes (they are opaque values) + * extended communities (RTs) + */ + if (bi->attr && bi->attr->extra) { + uint32_t lifetime; + int printed_1st_gol = 0; + struct bgp_attr_encap_subtlv *pEncap; + struct prefix pfx_un; + int af = BGP_MP_NEXTHOP_FAMILY(bi->attr->extra->mp_nexthop_len); + + /* Nexthop */ + if (af == AF_INET) { + r = snprintf( + p, REMAIN, "%s", + inet_ntop( + AF_INET, + &bi->attr->extra->mp_nexthop_global_in, + buf, BUFSIZ)); + INCP; + } else if (af == AF_INET6) { + r = snprintf( + p, REMAIN, "%s", + inet_ntop(AF_INET6, + &bi->attr->extra->mp_nexthop_global, + buf, BUFSIZ)); + INCP; + } else { + r = snprintf(p, REMAIN, "?"); + INCP; + } + + /* + * VNC tunnel subtlv, if present, contains UN address + */ + if (!rfapiGetVncTunnelUnAddr(bi->attr, &pfx_un)) { + r = snprintf(p, REMAIN, " un=%s", + inet_ntop(pfx_un.family, pfx_un.u.val, buf, + BUFSIZ)); + INCP; + } + + /* Lifetime */ + if (rfapiGetVncLifetime(bi->attr, &lifetime)) { + r = snprintf(p, REMAIN, " nolife"); + INCP; + } else { + if (lifetime == 0xffffffff) + r = snprintf(p, REMAIN, " %6s", "infini"); + else + r = snprintf(p, REMAIN, " %6u", lifetime); + INCP; + } + + /* RFP option lengths */ + for (pEncap = bi->attr->extra->vnc_subtlvs; pEncap; + pEncap = pEncap->next) { + + if (pEncap->type == BGP_VNC_SUBTLV_TYPE_RFPOPTION) { + if (printed_1st_gol) { + r = snprintf(p, REMAIN, ","); + INCP; + } else { + r = snprintf(p, REMAIN, + " "); /* leading space */ + INCP; + } + r = snprintf(p, REMAIN, "%d", pEncap->length); + INCP; + printed_1st_gol = 1; + } + } + + /* RT list */ + if (bi->attr->extra->ecommunity) { + s = ecommunity_ecom2str(bi->attr->extra->ecommunity, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + r = snprintf(p, REMAIN, " %s", s); + INCP; + XFREE(MTYPE_ECOMMUNITY_STR, s); + } + } + + r = snprintf(p, REMAIN, " bi@%p", bi); + INCP; + + r = snprintf(p, REMAIN, " p@%p", bi->peer); + INCP; + + if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED)) { + r = snprintf(p, REMAIN, " HD=yes"); + INCP; + } else { + r = snprintf(p, REMAIN, " HD=no"); + INCP; + } + + if (bi->attr) { + + if (bi->attr->extra) { + r = snprintf(p, REMAIN, " W=%d", + bi->attr->extra->weight); + INCP; + } + + if (bi->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) { + r = snprintf(p, REMAIN, " LP=%d", bi->attr->local_pref); + INCP; + } else { + r = snprintf(p, REMAIN, " LP=unset"); + INCP; + } + } + + r = snprintf(p, REMAIN, " %c:%u", zebra_route_char(bi->type), + bi->sub_type); + INCP; + + fp(out, "%s%s", line, HVTY_NEWLINE); + + if (has_macaddr) { + fp(out, " RD HID=%d ETH=%02x:%02x:%02x:%02x:%02x:%02x%s", + l2hid, macaddr.octet[0], macaddr.octet[1], macaddr.octet[2], + macaddr.octet[3], macaddr.octet[4], macaddr.octet[5], + HVTY_NEWLINE); + } + + if (!rfapiGetL2o(bi->attr, &l2o_buf)) { + fp(out, + " L2O ETH=%02x:%02x:%02x:%02x:%02x:%02x LBL=%d LNI=%d LHI=%hhu%s", + l2o_buf.macaddr.octet[0], l2o_buf.macaddr.octet[1], + l2o_buf.macaddr.octet[2], l2o_buf.macaddr.octet[3], + l2o_buf.macaddr.octet[4], l2o_buf.macaddr.octet[5], + l2o_buf.label, l2o_buf.logical_net_id, l2o_buf.local_nve_id, + HVTY_NEWLINE); + } + if (bi->extra && bi->extra->vnc.import.aux_prefix.family) { + char buf[BUFSIZ]; + const char *sp; + + sp = rfapi_ntop(bi->extra->vnc.import.aux_prefix.family, + &bi->extra->vnc.import.aux_prefix.u.prefix, buf, + BUFSIZ); + buf[BUFSIZ - 1] = 0; + if (sp) { + fp(out, " IP: %s%s", sp, HVTY_NEWLINE); + } + } + { + struct rfapi_un_option *uo = + rfapi_encap_tlv_to_un_option(bi->attr); + if (uo) { + rfapi_print_tunneltype_option(stream, 8, &uo->v.tunnel); + rfapi_un_options_free(uo); + } + } } -char * -rfapiMonitorVpn2Str (struct rfapi_monitor_vpn *m, char *buf, int size) +char *rfapiMonitorVpn2Str(struct rfapi_monitor_vpn *m, char *buf, int size) { - char buf_pfx[BUFSIZ]; - char buf_vn[BUFSIZ]; - char buf_un[BUFSIZ]; - int rc; - - rfapiRfapiIpAddr2Str (&m->rfd->un_addr, buf_vn, BUFSIZ); - rfapiRfapiIpAddr2Str (&m->rfd->vn_addr, buf_un, BUFSIZ); - - rc = snprintf (buf, size, - "m=%p, next=%p, rfd=%p(vn=%s un=%s), p=%s/%d, node=%p", - m, m->next, m->rfd, buf_vn, buf_un, - inet_ntop (m->p.family, &m->p.u.prefix, buf_pfx, BUFSIZ), - m->p.prefixlen, m->node); - buf[size - 1] = 0; - if (rc >= size) - return NULL; - return buf; + char buf_pfx[BUFSIZ]; + char buf_vn[BUFSIZ]; + char buf_un[BUFSIZ]; + int rc; + + rfapiRfapiIpAddr2Str(&m->rfd->un_addr, buf_vn, BUFSIZ); + rfapiRfapiIpAddr2Str(&m->rfd->vn_addr, buf_un, BUFSIZ); + + rc = snprintf(buf, size, + "m=%p, next=%p, rfd=%p(vn=%s un=%s), p=%s/%d, node=%p", m, + m->next, m->rfd, buf_vn, buf_un, + inet_ntop(m->p.family, &m->p.u.prefix, buf_pfx, BUFSIZ), + m->p.prefixlen, m->node); + buf[size - 1] = 0; + if (rc >= size) + return NULL; + return buf; } -static void -rfapiDebugPrintMonitorVpn (void *stream, struct rfapi_monitor_vpn *m) +static void rfapiDebugPrintMonitorVpn(void *stream, struct rfapi_monitor_vpn *m) { - char buf[BUFSIZ]; + char buf[BUFSIZ]; - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; - rfapiMonitorVpn2Str (m, buf, BUFSIZ); - fp (out, " Mon %s%s", buf, HVTY_NEWLINE); + rfapiMonitorVpn2Str(m, buf, BUFSIZ); + fp(out, " Mon %s%s", buf, HVTY_NEWLINE); } -static void -rfapiDebugPrintMonitorEncap (void *stream, struct rfapi_monitor_encap *m) +static void rfapiDebugPrintMonitorEncap(void *stream, + struct rfapi_monitor_encap *m) { - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out = NULL; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out = NULL; + const char *vty_newline; - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; - fp (out, " Mon m=%p, next=%p, node=%p, bi=%p%s", - m, m->next, m->node, m->bi, HVTY_NEWLINE); + fp(out, " Mon m=%p, next=%p, node=%p, bi=%p%s", m, m->next, m->node, + m->bi, HVTY_NEWLINE); } -void -rfapiShowItNode (void *stream, struct route_node *rn) +void rfapiShowItNode(void *stream, struct route_node *rn) { - struct bgp_info *bi; - char buf[BUFSIZ]; + struct bgp_info *bi; + char buf[BUFSIZ]; - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; - fp (out, "%s/%d @%p #%d%s", - rfapi_ntop (rn->p.family, &rn->p.u.prefix, buf, BUFSIZ), - rn->p.prefixlen, rn, rn->lock, HVTY_NEWLINE); + fp(out, "%s/%d @%p #%d%s", + rfapi_ntop(rn->p.family, &rn->p.u.prefix, buf, BUFSIZ), + rn->p.prefixlen, rn, rn->lock, HVTY_NEWLINE); - for (bi = rn->info; bi; bi = bi->next) - { - rfapiPrintBi (stream, bi); - } + for (bi = rn->info; bi; bi = bi->next) { + rfapiPrintBi(stream, bi); + } - /* doesn't show montors */ + /* doesn't show montors */ } -void -rfapiShowImportTable ( - void *stream, - const char *label, - struct route_table *rt, - int isvpn) +void rfapiShowImportTable(void *stream, const char *label, + struct route_table *rt, int isvpn) { - struct route_node *rn; - char buf[BUFSIZ]; - - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; - - fp (out, "Import Table [%s]%s", label, HVTY_NEWLINE); - - for (rn = route_top (rt); rn; rn = route_next (rn)) - { - struct bgp_info *bi; - - if (rn->p.family == AF_ETHERNET) - { - rfapiEthAddr2Str (&rn->p.u.prefix_eth, buf, BUFSIZ); - } - else - { - inet_ntop (rn->p.family, &rn->p.u.prefix, buf, BUFSIZ); - } - - fp (out, "%s/%d @%p #%d%s", buf, rn->p.prefixlen, rn, rn->lock - 1, /* account for loop iterator locking */ - HVTY_NEWLINE); - - for (bi = rn->info; bi; bi = bi->next) - { - rfapiPrintBi (stream, bi); - } - - if (isvpn) - { - struct rfapi_monitor_vpn *m; - for (m = RFAPI_MONITOR_VPN (rn); m; m = m->next) - { - rfapiDebugPrintMonitorVpn (stream, m); - } - } - else - { - struct rfapi_monitor_encap *m; - for (m = RFAPI_MONITOR_ENCAP (rn); m; m = m->next) - { - rfapiDebugPrintMonitorEncap (stream, m); - } - } - } + struct route_node *rn; + char buf[BUFSIZ]; + + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; + + fp(out, "Import Table [%s]%s", label, HVTY_NEWLINE); + + for (rn = route_top(rt); rn; rn = route_next(rn)) { + struct bgp_info *bi; + + if (rn->p.family == AF_ETHERNET) { + rfapiEthAddr2Str(&rn->p.u.prefix_eth, buf, BUFSIZ); + } else { + inet_ntop(rn->p.family, &rn->p.u.prefix, buf, BUFSIZ); + } + + fp(out, "%s/%d @%p #%d%s", buf, rn->p.prefixlen, rn, + rn->lock - 1, /* account for loop iterator locking */ + HVTY_NEWLINE); + + for (bi = rn->info; bi; bi = bi->next) { + rfapiPrintBi(stream, bi); + } + + if (isvpn) { + struct rfapi_monitor_vpn *m; + for (m = RFAPI_MONITOR_VPN(rn); m; m = m->next) { + rfapiDebugPrintMonitorVpn(stream, m); + } + } else { + struct rfapi_monitor_encap *m; + for (m = RFAPI_MONITOR_ENCAP(rn); m; m = m->next) { + rfapiDebugPrintMonitorEncap(stream, m); + } + } + } } -int -rfapiShowVncQueries (void *stream, struct prefix *pfx_match) +int rfapiShowVncQueries(void *stream, struct prefix *pfx_match) { - struct bgp *bgp; - struct rfapi *h; - struct listnode *node; - struct rfapi_descriptor *rfd; - - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - - int printedheader = 0; - - int nves_total = 0; - int nves_with_queries = 0; - int nves_displayed = 0; - - int queries_total = 0; - int queries_displayed = 0; - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return CMD_WARNING; - - bgp = bgp_get_default (); /* assume 1 instance for now */ - if (!bgp) - { - vty_out (vty, "No BGP instance%s", VTY_NEWLINE); - return CMD_WARNING; - } - - h = bgp->rfapi; - if (!h) - { - vty_out (vty, "No RFAPI instance%s", VTY_NEWLINE); - return CMD_WARNING; - } - - for (ALL_LIST_ELEMENTS_RO (&h->descriptors, node, rfd)) - { - - struct route_node *rn; - int printedquerier = 0; - - - ++nves_total; - - if (rfd->mon || (rfd->mon_eth && skiplist_count (rfd->mon_eth))) - { - ++nves_with_queries; - } - else - { - continue; - } - - /* - * IP Queries - */ - if (rfd->mon) - { - for (rn = route_top (rfd->mon); rn; rn = route_next (rn)) - { - struct rfapi_monitor_vpn *m; - char buf_remain[BUFSIZ]; - char buf_pfx[BUFSIZ]; - - if (!rn->info) - continue; - - m = rn->info; - - ++queries_total; - - if (pfx_match && !prefix_match (pfx_match, &rn->p) && - !prefix_match (&rn->p, pfx_match)) - continue; - - ++queries_displayed; - - if (!printedheader) - { - ++printedheader; - fp (out, "%s", VTY_NEWLINE); - fp (out, "%-15s %-15s %-15s %-10s%s", - "VN Address", "UN Address", - "Target", "Remaining", VTY_NEWLINE); - } - - if (!printedquerier) - { - char buf_vn[BUFSIZ]; - char buf_un[BUFSIZ]; - - rfapiRfapiIpAddr2Str (&rfd->un_addr, buf_un, BUFSIZ); - rfapiRfapiIpAddr2Str (&rfd->vn_addr, buf_vn, BUFSIZ); - - fp (out, "%-15s %-15s", buf_vn, buf_un); - printedquerier = 1; - - ++nves_displayed; - } - else - fp (out, "%-15s %-15s", "", ""); - buf_remain[0] = 0; - if (m->timer) - { - rfapiFormatSeconds (thread_timer_remain_second (m->timer), - buf_remain, BUFSIZ); - } - fp (out, " %-15s %-10s%s", - inet_ntop (m->p.family, &m->p.u.prefix, buf_pfx, BUFSIZ), - buf_remain, VTY_NEWLINE); - } - } - - /* - * Ethernet Queries - */ - if (rfd->mon_eth && skiplist_count (rfd->mon_eth)) - { - - int rc; - void *cursor; - struct rfapi_monitor_eth *mon_eth; - - for (cursor = NULL, - rc = - skiplist_next (rfd->mon_eth, NULL, (void **) &mon_eth, - &cursor); rc == 0; - rc = - skiplist_next (rfd->mon_eth, NULL, (void **) &mon_eth, - &cursor)) - { - - char buf_remain[BUFSIZ]; - char buf_pfx[BUFSIZ]; - struct prefix pfx_mac; - - ++queries_total; - - vnc_zlog_debug_verbose ("%s: checking rfd=%p mon_eth=%p", __func__, rfd, - mon_eth); - - memset ((void *) &pfx_mac, 0, sizeof (struct prefix)); - pfx_mac.family = AF_ETHERNET; - pfx_mac.prefixlen = 48; - pfx_mac.u.prefix_eth = mon_eth->macaddr; - - if (pfx_match && !prefix_match (pfx_match, &pfx_mac) && - !prefix_match (&pfx_mac, pfx_match)) - continue; - - ++queries_displayed; - - if (!printedheader) - { - ++printedheader; - fp (out, "%s", VTY_NEWLINE); - fp (out, "%-15s %-15s %-17s %10s %-10s%s", - "VN Address", "UN Address", - "Target", "LNI", "Remaining", VTY_NEWLINE); - } - - if (!printedquerier) - { - char buf_vn[BUFSIZ]; - char buf_un[BUFSIZ]; - - rfapiRfapiIpAddr2Str (&rfd->un_addr, buf_un, BUFSIZ); - rfapiRfapiIpAddr2Str (&rfd->vn_addr, buf_vn, BUFSIZ); - - fp (out, "%-15s %-15s", buf_vn, buf_un); - printedquerier = 1; - - ++nves_displayed; - } - else - fp (out, "%-15s %-15s", "", ""); - buf_remain[0] = 0; - if (mon_eth->timer) - { - rfapiFormatSeconds (thread_timer_remain_second - (mon_eth->timer), buf_remain, BUFSIZ); - } - fp (out, " %-17s %10d %-10s%s", - rfapi_ntop (pfx_mac.family, &pfx_mac.u.prefix, buf_pfx, - BUFSIZ), mon_eth->logical_net_id, buf_remain, - VTY_NEWLINE); - } - } - } - - if (queries_total) - { - fp (out, "%s", VTY_NEWLINE); - fp (out, "Displayed %d out of %d total queries%s", - queries_displayed, queries_total, VTY_NEWLINE); - } - return CMD_SUCCESS; + struct bgp *bgp; + struct rfapi *h; + struct listnode *node; + struct rfapi_descriptor *rfd; + + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + + int printedheader = 0; + + int nves_total = 0; + int nves_with_queries = 0; + int nves_displayed = 0; + + int queries_total = 0; + int queries_displayed = 0; + + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return CMD_WARNING; + + bgp = bgp_get_default(); /* assume 1 instance for now */ + if (!bgp) { + vty_out(vty, "No BGP instance%s", VTY_NEWLINE); + return CMD_WARNING; + } + + h = bgp->rfapi; + if (!h) { + vty_out(vty, "No RFAPI instance%s", VTY_NEWLINE); + return CMD_WARNING; + } + + for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) { + + struct route_node *rn; + int printedquerier = 0; + + + ++nves_total; + + if (rfd->mon + || (rfd->mon_eth && skiplist_count(rfd->mon_eth))) { + ++nves_with_queries; + } else { + continue; + } + + /* + * IP Queries + */ + if (rfd->mon) { + for (rn = route_top(rfd->mon); rn; + rn = route_next(rn)) { + struct rfapi_monitor_vpn *m; + char buf_remain[BUFSIZ]; + char buf_pfx[BUFSIZ]; + + if (!rn->info) + continue; + + m = rn->info; + + ++queries_total; + + if (pfx_match + && !prefix_match(pfx_match, &rn->p) + && !prefix_match(&rn->p, pfx_match)) + continue; + + ++queries_displayed; + + if (!printedheader) { + ++printedheader; + fp(out, "%s", VTY_NEWLINE); + fp(out, "%-15s %-15s %-15s %-10s%s", + "VN Address", "UN Address", "Target", + "Remaining", VTY_NEWLINE); + } + + if (!printedquerier) { + char buf_vn[BUFSIZ]; + char buf_un[BUFSIZ]; + + rfapiRfapiIpAddr2Str(&rfd->un_addr, + buf_un, BUFSIZ); + rfapiRfapiIpAddr2Str(&rfd->vn_addr, + buf_vn, BUFSIZ); + + fp(out, "%-15s %-15s", buf_vn, buf_un); + printedquerier = 1; + + ++nves_displayed; + } else + fp(out, "%-15s %-15s", "", ""); + buf_remain[0] = 0; + if (m->timer) { + rfapiFormatSeconds( + thread_timer_remain_second( + m->timer), + buf_remain, BUFSIZ); + } + fp(out, " %-15s %-10s%s", + inet_ntop(m->p.family, &m->p.u.prefix, + buf_pfx, BUFSIZ), + buf_remain, VTY_NEWLINE); + } + } + + /* + * Ethernet Queries + */ + if (rfd->mon_eth && skiplist_count(rfd->mon_eth)) { + + int rc; + void *cursor; + struct rfapi_monitor_eth *mon_eth; + + for (cursor = NULL, + rc = skiplist_next(rfd->mon_eth, NULL, + (void **)&mon_eth, &cursor); + rc == 0; + rc = skiplist_next(rfd->mon_eth, NULL, + (void **)&mon_eth, &cursor)) { + + char buf_remain[BUFSIZ]; + char buf_pfx[BUFSIZ]; + struct prefix pfx_mac; + + ++queries_total; + + vnc_zlog_debug_verbose( + "%s: checking rfd=%p mon_eth=%p", + __func__, rfd, mon_eth); + + memset((void *)&pfx_mac, 0, + sizeof(struct prefix)); + pfx_mac.family = AF_ETHERNET; + pfx_mac.prefixlen = 48; + pfx_mac.u.prefix_eth = mon_eth->macaddr; + + if (pfx_match + && !prefix_match(pfx_match, &pfx_mac) + && !prefix_match(&pfx_mac, pfx_match)) + continue; + + ++queries_displayed; + + if (!printedheader) { + ++printedheader; + fp(out, "%s", VTY_NEWLINE); + fp(out, + "%-15s %-15s %-17s %10s %-10s%s", + "VN Address", "UN Address", "Target", + "LNI", "Remaining", VTY_NEWLINE); + } + + if (!printedquerier) { + char buf_vn[BUFSIZ]; + char buf_un[BUFSIZ]; + + rfapiRfapiIpAddr2Str(&rfd->un_addr, + buf_un, BUFSIZ); + rfapiRfapiIpAddr2Str(&rfd->vn_addr, + buf_vn, BUFSIZ); + + fp(out, "%-15s %-15s", buf_vn, buf_un); + printedquerier = 1; + + ++nves_displayed; + } else + fp(out, "%-15s %-15s", "", ""); + buf_remain[0] = 0; + if (mon_eth->timer) { + rfapiFormatSeconds( + thread_timer_remain_second( + mon_eth->timer), + buf_remain, BUFSIZ); + } + fp(out, " %-17s %10d %-10s%s", + rfapi_ntop(pfx_mac.family, &pfx_mac.u.prefix, + buf_pfx, BUFSIZ), + mon_eth->logical_net_id, buf_remain, + VTY_NEWLINE); + } + } + } + + if (queries_total) { + fp(out, "%s", VTY_NEWLINE); + fp(out, "Displayed %d out of %d total queries%s", + queries_displayed, queries_total, VTY_NEWLINE); + } + return CMD_SUCCESS; } -static int -rfapiPrintRemoteRegBi ( - struct bgp *bgp, - void *stream, - struct route_node *rn, - struct bgp_info *bi) +static int rfapiPrintRemoteRegBi(struct bgp *bgp, void *stream, + struct route_node *rn, struct bgp_info *bi) { - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - struct prefix pfx_un; - struct prefix pfx_vn; - uint8_t cost; - uint32_t lifetime; - bgp_encap_types tun_type; - - char buf_pfx[BUFSIZ]; - char buf_ntop[BUFSIZ]; - char buf_un[BUFSIZ]; - char buf_vn[BUFSIZ]; - char buf_lifetime[BUFSIZ]; - int nlines = 0; - - if (!stream) - return 0; /* for debug log, print into buf & call output once */ - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return 0; - - /* - * Prefix - */ - buf_pfx[0] = 0; - snprintf (buf_pfx, BUFSIZ, "%s/%d", - rfapi_ntop (rn->p.family, &rn->p.u.prefix, buf_ntop, BUFSIZ), - rn->p.prefixlen); - buf_pfx[BUFSIZ - 1] = 0; - nlines++; - - /* - * UN addr - */ - buf_un[0] = 0; - if (!rfapiGetUnAddrOfVpnBi (bi, &pfx_un)) - { - snprintf (buf_un, BUFSIZ, "%s", - inet_ntop (pfx_un.family, &pfx_un.u.prefix, buf_ntop, - BUFSIZ)); - } - - rfapiGetTunnelType(bi->attr,&tun_type); - /* - * VN addr - */ - buf_vn[0] = 0; - rfapiNexthop2Prefix (bi->attr, &pfx_vn); - if (tun_type == BGP_ENCAP_TYPE_MPLS) - { - /* MPLS carries un in nrli next hop (same as vn for IP tunnels) */ - snprintf (buf_un, BUFSIZ, "%s", - inet_ntop (pfx_vn.family, &pfx_vn.u.prefix, buf_ntop, BUFSIZ)); - if (bi->extra) - { - u_int32_t l = decode_label (bi->extra->tag); - snprintf (buf_vn, BUFSIZ, "Label: %d", l); - } - else /* should never happen */ - { - snprintf (buf_vn, BUFSIZ, "Label: N/A"); - } - } - else - { - snprintf (buf_vn, BUFSIZ, "%s", - inet_ntop (pfx_vn.family, &pfx_vn.u.prefix, buf_ntop, BUFSIZ)); - } - buf_vn[BUFSIZ - 1] = 0; - buf_un[BUFSIZ - 1] = 0; - - /* - * Cost is encoded in local_pref as (255-cost) - * See rfapi_import.c'rfapiRouteInfo2NextHopEntry() for conversion - * back to cost. - */ - if (bi->attr) - { - uint32_t local_pref; - if (bi->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF)) - local_pref = bi->attr->local_pref; - else - local_pref = 0; - cost = (local_pref > 255) ? 0 : 255 - local_pref; - } - else - { - cost = 0; - } - - fp (out, "%-20s ", buf_pfx); - fp (out, "%-15s ", buf_vn); - fp (out, "%-15s ", buf_un); - fp (out, "%-4d ", cost); - - /* Lifetime */ - /* NB rfapiGetVncLifetime sets infinite value when returning !0 */ - if (rfapiGetVncLifetime (bi->attr, &lifetime) || - (lifetime == RFAPI_INFINITE_LIFETIME)) - { - - fp (out, "%-10s ", "infinite"); - } - else - { - time_t t_lifetime = lifetime; - rfapiFormatSeconds (t_lifetime, buf_lifetime, BUFSIZ); - fp (out, "%-10s ", buf_lifetime); - } - - if (CHECK_FLAG (bi->flags, BGP_INFO_REMOVED) && - bi->extra && bi->extra->vnc.import.timer) - { - - uint32_t remaining; - time_t age; - char buf_age[BUFSIZ]; - - struct thread *t = (struct thread *) bi->extra->vnc.import.timer; - remaining = thread_timer_remain_second (t); + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + struct prefix pfx_un; + struct prefix pfx_vn; + uint8_t cost; + uint32_t lifetime; + bgp_encap_types tun_type; + + char buf_pfx[BUFSIZ]; + char buf_ntop[BUFSIZ]; + char buf_un[BUFSIZ]; + char buf_vn[BUFSIZ]; + char buf_lifetime[BUFSIZ]; + int nlines = 0; + + if (!stream) + return 0; /* for debug log, print into buf & call output once */ + + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return 0; + + /* + * Prefix + */ + buf_pfx[0] = 0; + snprintf(buf_pfx, BUFSIZ, "%s/%d", + rfapi_ntop(rn->p.family, &rn->p.u.prefix, buf_ntop, BUFSIZ), + rn->p.prefixlen); + buf_pfx[BUFSIZ - 1] = 0; + nlines++; + + /* + * UN addr + */ + buf_un[0] = 0; + if (!rfapiGetUnAddrOfVpnBi(bi, &pfx_un)) { + snprintf(buf_un, BUFSIZ, "%s", + inet_ntop(pfx_un.family, &pfx_un.u.prefix, buf_ntop, + BUFSIZ)); + } + + rfapiGetTunnelType(bi->attr, &tun_type); + /* + * VN addr + */ + buf_vn[0] = 0; + rfapiNexthop2Prefix(bi->attr, &pfx_vn); + if (tun_type == BGP_ENCAP_TYPE_MPLS) { + /* MPLS carries un in nrli next hop (same as vn for IP tunnels) + */ + snprintf(buf_un, BUFSIZ, "%s", + inet_ntop(pfx_vn.family, &pfx_vn.u.prefix, buf_ntop, + BUFSIZ)); + if (bi->extra) { + u_int32_t l = decode_label(bi->extra->tag); + snprintf(buf_vn, BUFSIZ, "Label: %d", l); + } else /* should never happen */ + { + snprintf(buf_vn, BUFSIZ, "Label: N/A"); + } + } else { + snprintf(buf_vn, BUFSIZ, "%s", + inet_ntop(pfx_vn.family, &pfx_vn.u.prefix, buf_ntop, + BUFSIZ)); + } + buf_vn[BUFSIZ - 1] = 0; + buf_un[BUFSIZ - 1] = 0; + + /* + * Cost is encoded in local_pref as (255-cost) + * See rfapi_import.c'rfapiRouteInfo2NextHopEntry() for conversion + * back to cost. + */ + if (bi->attr) { + uint32_t local_pref; + if (bi->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF)) + local_pref = bi->attr->local_pref; + else + local_pref = 0; + cost = (local_pref > 255) ? 0 : 255 - local_pref; + } else { + cost = 0; + } + + fp(out, "%-20s ", buf_pfx); + fp(out, "%-15s ", buf_vn); + fp(out, "%-15s ", buf_un); + fp(out, "%-4d ", cost); + + /* Lifetime */ + /* NB rfapiGetVncLifetime sets infinite value when returning !0 */ + if (rfapiGetVncLifetime(bi->attr, &lifetime) + || (lifetime == RFAPI_INFINITE_LIFETIME)) { + + fp(out, "%-10s ", "infinite"); + } else { + time_t t_lifetime = lifetime; + rfapiFormatSeconds(t_lifetime, buf_lifetime, BUFSIZ); + fp(out, "%-10s ", buf_lifetime); + } + + if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED) && bi->extra + && bi->extra->vnc.import.timer) { + + uint32_t remaining; + time_t age; + char buf_age[BUFSIZ]; + + struct thread *t = (struct thread *)bi->extra->vnc.import.timer; + remaining = thread_timer_remain_second(t); #if RFAPI_REGISTRATIONS_REPORT_AGE - /* - * Calculate when the timer started. Doing so here saves - * us a timestamp field in "struct bgp_info". - * - * See rfapi_import.c'rfapiBiStartWithdrawTimer() for the - * original calculation. - */ - age = rfapiGetHolddownFromLifetime (lifetime, factor) - remaining; + /* + * Calculate when the timer started. Doing so here saves + * us a timestamp field in "struct bgp_info". + * + * See rfapi_import.c'rfapiBiStartWithdrawTimer() for the + * original calculation. + */ + age = rfapiGetHolddownFromLifetime(lifetime, factor) + - remaining; #else /* report remaining time */ - age = remaining; + age = remaining; #endif - rfapiFormatSeconds (age, buf_age, BUFSIZ); - - fp (out, "%-10s ", buf_age); - - } - else if (RFAPI_LOCAL_BI (bi)) - { - - char buf_age[BUFSIZ]; - - if (bi && bi->extra && bi->extra->vnc.import.create_time) - { - rfapiFormatAge (bi->extra->vnc.import.create_time, buf_age, BUFSIZ); - } - else - { - buf_age[0] = '?'; - buf_age[1] = 0; - } - fp (out, "%-10s ", buf_age); - } - fp (out, "%s", HVTY_NEWLINE); - - if (rn->p.family == AF_ETHERNET) - { - /* - * If there is a corresponding IP address && != VN address, - * print that on the next line - */ - - if (bi && bi->extra && bi->extra->vnc.import.aux_prefix.family) - { - const char *sp; - - sp = rfapi_ntop (bi->extra->vnc.import.aux_prefix.family, - &bi->extra->vnc.import.aux_prefix.u.prefix, - buf_ntop, BUFSIZ); - buf_ntop[BUFSIZ - 1] = 0; - - if (sp && strcmp (buf_vn, sp) != 0) - { - fp (out, " IP: %s", sp); - if (nlines == 1) - nlines++; - } - } - } - if (tun_type != BGP_ENCAP_TYPE_MPLS && bi->extra) - { - u_int32_t l = decode_label (bi->extra->tag); - if (!MPLS_LABEL_IS_NULL (l)) - { - fp (out, " Label: %d", l); - if (nlines == 1) - nlines++; - } - } - if (nlines > 1) - fp (out, "%s", HVTY_NEWLINE); - - return 1; + rfapiFormatSeconds(age, buf_age, BUFSIZ); + + fp(out, "%-10s ", buf_age); + + } else if (RFAPI_LOCAL_BI(bi)) { + + char buf_age[BUFSIZ]; + + if (bi && bi->extra && bi->extra->vnc.import.create_time) { + rfapiFormatAge(bi->extra->vnc.import.create_time, + buf_age, BUFSIZ); + } else { + buf_age[0] = '?'; + buf_age[1] = 0; + } + fp(out, "%-10s ", buf_age); + } + fp(out, "%s", HVTY_NEWLINE); + + if (rn->p.family == AF_ETHERNET) { + /* + * If there is a corresponding IP address && != VN address, + * print that on the next line + */ + + if (bi && bi->extra + && bi->extra->vnc.import.aux_prefix.family) { + const char *sp; + + sp = rfapi_ntop( + bi->extra->vnc.import.aux_prefix.family, + &bi->extra->vnc.import.aux_prefix.u.prefix, + buf_ntop, BUFSIZ); + buf_ntop[BUFSIZ - 1] = 0; + + if (sp && strcmp(buf_vn, sp) != 0) { + fp(out, " IP: %s", sp); + if (nlines == 1) + nlines++; + } + } + } + if (tun_type != BGP_ENCAP_TYPE_MPLS && bi->extra) { + u_int32_t l = decode_label(bi->extra->tag); + if (!MPLS_LABEL_IS_NULL(l)) { + fp(out, " Label: %d", l); + if (nlines == 1) + nlines++; + } + } + if (nlines > 1) + fp(out, "%s", HVTY_NEWLINE); + + return 1; } -static int -rfapiShowRemoteRegistrationsIt ( - struct bgp *bgp, - void *stream, - struct rfapi_import_table *it, - struct prefix *prefix_only, - int show_expiring, /* either/or */ - int show_local, - int show_remote, - int show_imported, /* either/or */ - uint32_t *pLni) /* AFI_L2VPN only */ +static int rfapiShowRemoteRegistrationsIt(struct bgp *bgp, void *stream, + struct rfapi_import_table *it, + struct prefix *prefix_only, + int show_expiring, /* either/or */ + int show_local, int show_remote, + int show_imported, /* either/or */ + uint32_t *pLni) /* AFI_L2VPN only */ { - afi_t afi; - int printed_rtlist_hdr = 0; - - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; - int total = 0; - int printed = 0; - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return printed; - - for (afi = AFI_IP; afi < AFI_MAX; ++afi) - { - - struct route_node *rn; - - if (!it->imported_vpn[afi]) - continue; - - for (rn = route_top (it->imported_vpn[afi]); rn; rn = route_next (rn)) - { - - struct bgp_info *bi; - int count_only; - - /* allow for wider or more narrow mask from user */ - if (prefix_only && - !prefix_match (prefix_only, &rn->p) && - !prefix_match (&rn->p, prefix_only)) - count_only = 1; - else - count_only = 0; - - for (bi = rn->info; bi; bi = bi->next) - { - - if (!show_local && RFAPI_LOCAL_BI (bi)) - { - - /* local route from RFP */ - continue; - } - - if (!show_remote && !RFAPI_LOCAL_BI (bi)) - { - - /* remote route */ - continue; - } - - if (show_expiring && !CHECK_FLAG (bi->flags, BGP_INFO_REMOVED)) - continue; - - if (!show_expiring && CHECK_FLAG (bi->flags, BGP_INFO_REMOVED)) - continue; - - if (bi->type == ZEBRA_ROUTE_BGP_DIRECT || - bi->type == ZEBRA_ROUTE_BGP_DIRECT_EXT) - { - if (!show_imported) - continue; - } - else - { - if (show_imported) - continue; - } - - total++; - if (count_only == 1) - continue; - if (!printed_rtlist_hdr) - { - const char *agetype = ""; - char *s; - const char *type = ""; - if (show_imported) - { - type = "Imported"; - } - else - { - if (show_expiring) - { - type = "Holddown"; - } - else - { - if (RFAPI_LOCAL_BI (bi)) - { - type = "Local"; - } - else - { - type = "Remote"; - } - } - } - - s = ecommunity_ecom2str (it->rt_import_list, - ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - - if (pLni) - { - fp (out, "%s[%s] L2VPN Network 0x%x (%u) RT={%s}", - HVTY_NEWLINE, type, *pLni, (*pLni & 0xfff), s); - } - else - { - fp (out, "%s[%s] Prefix RT={%s}", - HVTY_NEWLINE, type, s); - } - XFREE (MTYPE_ECOMMUNITY_STR, s); - - if (it->rfg && it->rfg->name) - { - fp (out, " %s \"%s\"", - (it->rfg->type == RFAPI_GROUP_CFG_VRF ? - "VRF" : "NVE group"), - it->rfg->name); - } - fp (out, "%s", HVTY_NEWLINE); - if (show_expiring) - { + afi_t afi; + int printed_rtlist_hdr = 0; + + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; + int total = 0; + int printed = 0; + + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return printed; + + for (afi = AFI_IP; afi < AFI_MAX; ++afi) { + + struct route_node *rn; + + if (!it->imported_vpn[afi]) + continue; + + for (rn = route_top(it->imported_vpn[afi]); rn; + rn = route_next(rn)) { + + struct bgp_info *bi; + int count_only; + + /* allow for wider or more narrow mask from user */ + if (prefix_only && !prefix_match(prefix_only, &rn->p) + && !prefix_match(&rn->p, prefix_only)) + count_only = 1; + else + count_only = 0; + + for (bi = rn->info; bi; bi = bi->next) { + + if (!show_local && RFAPI_LOCAL_BI(bi)) { + + /* local route from RFP */ + continue; + } + + if (!show_remote && !RFAPI_LOCAL_BI(bi)) { + + /* remote route */ + continue; + } + + if (show_expiring + && !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED)) + continue; + + if (!show_expiring + && CHECK_FLAG(bi->flags, BGP_INFO_REMOVED)) + continue; + + if (bi->type == ZEBRA_ROUTE_BGP_DIRECT + || bi->type == ZEBRA_ROUTE_BGP_DIRECT_EXT) { + if (!show_imported) + continue; + } else { + if (show_imported) + continue; + } + + total++; + if (count_only == 1) + continue; + if (!printed_rtlist_hdr) { + const char *agetype = ""; + char *s; + const char *type = ""; + if (show_imported) { + type = "Imported"; + } else { + if (show_expiring) { + type = "Holddown"; + } else { + if (RFAPI_LOCAL_BI( + bi)) { + type = "Local"; + } else { + type = "Remote"; + } + } + } + + s = ecommunity_ecom2str( + it->rt_import_list, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + + if (pLni) { + fp(out, + "%s[%s] L2VPN Network 0x%x (%u) RT={%s}", + HVTY_NEWLINE, type, *pLni, + (*pLni & 0xfff), s); + } else { + fp(out, "%s[%s] Prefix RT={%s}", + HVTY_NEWLINE, type, s); + } + XFREE(MTYPE_ECOMMUNITY_STR, s); + + if (it->rfg && it->rfg->name) { + fp(out, " %s \"%s\"", + (it->rfg->type == RFAPI_GROUP_CFG_VRF + ? "VRF" + : "NVE group"), + it->rfg->name); + } + fp(out, "%s", HVTY_NEWLINE); + if (show_expiring) { #if RFAPI_REGISTRATIONS_REPORT_AGE - agetype = "Age"; + agetype = "Age"; #else - agetype = "Remaining"; + agetype = "Remaining"; #endif - } - else if (show_local) - { - agetype = "Age"; - } - - printed_rtlist_hdr = 1; - - fp (out, "%-20s %-15s %-15s %4s %-10s %-10s%s", - (pLni ? "L2 Address/IP" : "Prefix"), - "VN Address", "UN Address", "Cost", - "Lifetime", agetype, HVTY_NEWLINE); - } - printed += rfapiPrintRemoteRegBi (bgp, stream, rn, bi); - } - } - } - - if (printed > 0) - { - - const char *type = "prefixes"; - - if (show_imported) - { - type = "imported prefixes"; - } - else - { - if (show_expiring) - { - type = "prefixes in holddown"; - } - else - { - if (show_local && !show_remote) - { - type = "locally registered prefixes"; - } - else if (!show_local && show_remote) - { - type = "remotely registered prefixes"; - } - } - } - - fp (out, "Displayed %d out of %d %s%s", - printed, total, type, HVTY_NEWLINE); + } else if (show_local) { + agetype = "Age"; + } + + printed_rtlist_hdr = 1; + + fp(out, + "%-20s %-15s %-15s %4s %-10s %-10s%s", + (pLni ? "L2 Address/IP" : "Prefix"), + "VN Address", "UN Address", "Cost", + "Lifetime", agetype, HVTY_NEWLINE); + } + printed += rfapiPrintRemoteRegBi(bgp, stream, + rn, bi); + } + } + } + + if (printed > 0) { + + const char *type = "prefixes"; + + if (show_imported) { + type = "imported prefixes"; + } else { + if (show_expiring) { + type = "prefixes in holddown"; + } else { + if (show_local && !show_remote) { + type = "locally registered prefixes"; + } else if (!show_local && show_remote) { + type = "remotely registered prefixes"; + } + } + } + + fp(out, "Displayed %d out of %d %s%s", printed, total, type, + HVTY_NEWLINE); #if DEBUG_SHOW_EXTRA - fp(out, "IT table above: it=%p%s", it, HVTY_NEWLINE); + fp(out, "IT table above: it=%p%s", it, HVTY_NEWLINE); #endif - } - return printed; + } + return printed; } - /* * rfapiShowRemoteRegistrations * @@ -1527,70 +1379,56 @@ rfapiShowRemoteRegistrationsIt ( * is mean to produce the "remote" portion of the output * of "show vnc registrations". */ -int -rfapiShowRemoteRegistrations ( - void *stream, - struct prefix *prefix_only, - int show_expiring, - int show_local, - int show_remote, - int show_imported) +int rfapiShowRemoteRegistrations(void *stream, struct prefix *prefix_only, + int show_expiring, int show_local, + int show_remote, int show_imported) { - struct bgp *bgp; - struct rfapi *h; - struct rfapi_import_table *it; - int printed = 0; - - bgp = bgp_get_default (); - if (!bgp) - { - return printed; - } - - h = bgp->rfapi; - if (!h) - { - return printed; - } - - for (it = h->imports; it; it = it->next) - { - printed += - rfapiShowRemoteRegistrationsIt (bgp, stream, it, prefix_only, - show_expiring, show_local, - show_remote, show_imported, NULL); - } - - if (h->import_mac) - { - void *cursor = NULL; - int rc; - uintptr_t lni_as_ptr; - uint32_t lni; - uint32_t *pLni; - - for (rc = - skiplist_next (h->import_mac, (void **) &lni_as_ptr, (void **) &it, - &cursor); !rc; - rc = - skiplist_next (h->import_mac, (void **) &lni_as_ptr, (void **) &it, - &cursor)) - { - pLni = NULL; - if ((lni_as_ptr & 0xffffffff) == lni_as_ptr) - { - lni = (uint32_t) (lni_as_ptr & 0xffffffff); - pLni = &lni; - } - - printed += - rfapiShowRemoteRegistrationsIt (bgp, stream, it, prefix_only, - show_expiring, show_local, - show_remote, show_imported, pLni); - } - } - - return printed; + struct bgp *bgp; + struct rfapi *h; + struct rfapi_import_table *it; + int printed = 0; + + bgp = bgp_get_default(); + if (!bgp) { + return printed; + } + + h = bgp->rfapi; + if (!h) { + return printed; + } + + for (it = h->imports; it; it = it->next) { + printed += rfapiShowRemoteRegistrationsIt( + bgp, stream, it, prefix_only, show_expiring, show_local, + show_remote, show_imported, NULL); + } + + if (h->import_mac) { + void *cursor = NULL; + int rc; + uintptr_t lni_as_ptr; + uint32_t lni; + uint32_t *pLni; + + for (rc = skiplist_next(h->import_mac, (void **)&lni_as_ptr, + (void **)&it, &cursor); + !rc; + rc = skiplist_next(h->import_mac, (void **)&lni_as_ptr, + (void **)&it, &cursor)) { + pLni = NULL; + if ((lni_as_ptr & 0xffffffff) == lni_as_ptr) { + lni = (uint32_t)(lni_as_ptr & 0xffffffff); + pLni = &lni; + } + + printed += rfapiShowRemoteRegistrationsIt( + bgp, stream, it, prefix_only, show_expiring, + show_local, show_remote, show_imported, pLni); + } + } + + return printed; } /*------------------------------------------ @@ -1598,7 +1436,7 @@ rfapiShowRemoteRegistrations ( * * UI helper: generate string from rfapi_ip_addr * - * input: + * input: * a IP v4/v6 address * * output @@ -1609,385 +1447,343 @@ rfapiShowRemoteRegistrations ( * NULL conversion failed * non-NULL pointer to buf --------------------------------------------*/ -const char * -rfapiRfapiIpAddr2Str (struct rfapi_ip_addr *a, char *buf, int bufsize) +const char *rfapiRfapiIpAddr2Str(struct rfapi_ip_addr *a, char *buf, + int bufsize) { - const char *rc = NULL; - - switch (a->addr_family) - { - case AF_INET: - rc = inet_ntop (a->addr_family, &a->addr.v4, buf, bufsize); - break; - case AF_INET6: - rc = inet_ntop (a->addr_family, &a->addr.v6, buf, bufsize); - break; - } - return rc; + const char *rc = NULL; + + switch (a->addr_family) { + case AF_INET: + rc = inet_ntop(a->addr_family, &a->addr.v4, buf, bufsize); + break; + case AF_INET6: + rc = inet_ntop(a->addr_family, &a->addr.v6, buf, bufsize); + break; + } + return rc; } -void -rfapiPrintRfapiIpAddr (void *stream, struct rfapi_ip_addr *a) +void rfapiPrintRfapiIpAddr(void *stream, struct rfapi_ip_addr *a) { - char buf[BUFSIZ]; - const char *rc = NULL; + char buf[BUFSIZ]; + const char *rc = NULL; - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out = NULL; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out = NULL; + const char *vty_newline; - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; - rc = rfapiRfapiIpAddr2Str (a, buf, BUFSIZ); + rc = rfapiRfapiIpAddr2Str(a, buf, BUFSIZ); - if (rc) - fp (out, "%s", buf); + if (rc) + fp(out, "%s", buf); } -const char * -rfapiRfapiIpPrefix2Str (struct rfapi_ip_prefix *p, char *buf, int bufsize) +const char *rfapiRfapiIpPrefix2Str(struct rfapi_ip_prefix *p, char *buf, + int bufsize) { - struct rfapi_ip_addr *a = &p->prefix; - const char *rc = NULL; - - switch (a->addr_family) - { - case AF_INET: - rc = inet_ntop (a->addr_family, &a->addr.v4, buf, bufsize); - break; - case AF_INET6: - rc = inet_ntop (a->addr_family, &a->addr.v6, buf, bufsize); - break; - } - - if (rc) - { - int alen = strlen (buf); - int remaining = bufsize - alen - 1; - int slen; - - if (remaining > 0) - { - slen = snprintf (buf + alen, remaining, "/%u", p->length); - if (slen < remaining) /* see man page for snprintf(3) */ - return rc; - } - } - - return NULL; + struct rfapi_ip_addr *a = &p->prefix; + const char *rc = NULL; + + switch (a->addr_family) { + case AF_INET: + rc = inet_ntop(a->addr_family, &a->addr.v4, buf, bufsize); + break; + case AF_INET6: + rc = inet_ntop(a->addr_family, &a->addr.v6, buf, bufsize); + break; + } + + if (rc) { + int alen = strlen(buf); + int remaining = bufsize - alen - 1; + int slen; + + if (remaining > 0) { + slen = snprintf(buf + alen, remaining, "/%u", + p->length); + if (slen < remaining) /* see man page for snprintf(3) */ + return rc; + } + } + + return NULL; } -void -rfapiPrintRfapiIpPrefix (void *stream, struct rfapi_ip_prefix *p) +void rfapiPrintRfapiIpPrefix(void *stream, struct rfapi_ip_prefix *p) { - char buf[BUFSIZ]; - const char *rc; + char buf[BUFSIZ]; + const char *rc; - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out = NULL; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out = NULL; + const char *vty_newline; - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; - rc = rfapiRfapiIpPrefix2Str (p, buf, BUFSIZ); + rc = rfapiRfapiIpPrefix2Str(p, buf, BUFSIZ); - if (rc) - fp (out, "%s:%u", buf, p->cost); - else - fp (out, "?/?:?"); + if (rc) + fp(out, "%s:%u", buf, p->cost); + else + fp(out, "?/?:?"); } -void -rfapiPrintRd (struct vty *vty, struct prefix_rd *prd) +void rfapiPrintRd(struct vty *vty, struct prefix_rd *prd) { - char buf[BUFSIZ]; + char buf[BUFSIZ]; - buf[0] = 0; - prefix_rd2str (prd, buf, BUFSIZ); - buf[BUFSIZ - 1] = 0; - vty_out (vty, "%s", buf); + buf[0] = 0; + prefix_rd2str(prd, buf, BUFSIZ); + buf[BUFSIZ - 1] = 0; + vty_out(vty, "%s", buf); } -void -rfapiPrintAdvertisedInfo ( - struct vty *vty, - struct rfapi_descriptor *rfd, - safi_t safi, - struct prefix *p) +void rfapiPrintAdvertisedInfo(struct vty *vty, struct rfapi_descriptor *rfd, + safi_t safi, struct prefix *p) { - afi_t afi; /* of the VN address */ - struct bgp_node *bn; - struct bgp_info *bi; - uint8_t type = ZEBRA_ROUTE_BGP; - struct bgp *bgp; - int printed = 0; - struct prefix_rd prd0; - struct prefix_rd *prd; - - /* - * Find the bgp_info in the RIB corresponding to this - * prefix and rfd - */ - - afi = family2afi (p->family); - assert (afi == AFI_IP || afi == AFI_IP6); - - bgp = bgp_get_default (); /* assume 1 instance for now */ - assert (bgp); - - if (safi == SAFI_ENCAP) - { - memset (&prd0, 0, sizeof (prd0)); - prd0.family = AF_UNSPEC; - prd0.prefixlen = 64; - prd = &prd0; - } - else - { - prd = &rfd->rd; - } - bn = bgp_afi_node_get (bgp->rib[afi][safi], afi, safi, p, prd); - - vty_out (vty, " bn=%p%s", bn, HVTY_NEWLINE); - - for (bi = bn->info; bi; bi = bi->next) - { - if (bi->peer == rfd->peer && - bi->type == type && - bi->sub_type == BGP_ROUTE_RFP && - bi->extra && bi->extra->vnc.export.rfapi_handle == (void *) rfd) - { - - rfapiPrintBi (vty, bi); - printed = 1; - } - } - - if (!printed) - { - vty_out (vty, " --?--%s", HVTY_NEWLINE); - return; - } - + afi_t afi; /* of the VN address */ + struct bgp_node *bn; + struct bgp_info *bi; + uint8_t type = ZEBRA_ROUTE_BGP; + struct bgp *bgp; + int printed = 0; + struct prefix_rd prd0; + struct prefix_rd *prd; + + /* + * Find the bgp_info in the RIB corresponding to this + * prefix and rfd + */ + + afi = family2afi(p->family); + assert(afi == AFI_IP || afi == AFI_IP6); + + bgp = bgp_get_default(); /* assume 1 instance for now */ + assert(bgp); + + if (safi == SAFI_ENCAP) { + memset(&prd0, 0, sizeof(prd0)); + prd0.family = AF_UNSPEC; + prd0.prefixlen = 64; + prd = &prd0; + } else { + prd = &rfd->rd; + } + bn = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd); + + vty_out(vty, " bn=%p%s", bn, HVTY_NEWLINE); + + for (bi = bn->info; bi; bi = bi->next) { + if (bi->peer == rfd->peer && bi->type == type + && bi->sub_type == BGP_ROUTE_RFP && bi->extra + && bi->extra->vnc.export.rfapi_handle == (void *)rfd) { + + rfapiPrintBi(vty, bi); + printed = 1; + } + } + + if (!printed) { + vty_out(vty, " --?--%s", HVTY_NEWLINE); + return; + } } -void -rfapiPrintDescriptor (struct vty *vty, struct rfapi_descriptor *rfd) +void rfapiPrintDescriptor(struct vty *vty, struct rfapi_descriptor *rfd) { - /* pHD un-addr vn-addr pCB cookie rd lifetime */ - /* RT export list */ - /* RT import list */ - /* list of advertised prefixes */ - /* dump import table */ - - char *s; - void *cursor; - int rc; - afi_t afi; - struct rfapi_adb *adb; - char buf[BUFSIZ]; - - vty_out (vty, "%-10p ", rfd); - rfapiPrintRfapiIpAddr (vty, &rfd->un_addr); - vty_out (vty, " "); - rfapiPrintRfapiIpAddr (vty, &rfd->vn_addr); - vty_out (vty, " %p %p ", rfd->response_cb, rfd->cookie); - rfapiPrintRd (vty, &rfd->rd); - vty_out (vty, " %d", rfd->response_lifetime); - vty_out (vty, " %s", (rfd->rfg ? rfd->rfg->name : "<orphaned>")); - vty_out (vty, "%s", HVTY_NEWLINE); - - vty_out (vty, " Peer %p #%d%s", rfd->peer, rfd->peer->lock, HVTY_NEWLINE); - - /* export RT list */ - if (rfd->rt_export_list) - { - s = - ecommunity_ecom2str (rfd->rt_export_list, - ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - vty_out (vty, " Export %s%s", s, HVTY_NEWLINE); - XFREE (MTYPE_ECOMMUNITY_STR, s); - } - else - { - vty_out (vty, " Export (nil)%s", HVTY_NEWLINE); - } - - /* import RT list */ - if (rfd->import_table) - { - s = ecommunity_ecom2str (rfd->import_table->rt_import_list, - ECOMMUNITY_FORMAT_ROUTE_MAP, 0); - vty_out (vty, " Import %s%s", s, HVTY_NEWLINE); - XFREE (MTYPE_ECOMMUNITY_STR, s); - } - else - { - vty_out (vty, " Import (nil)%s", HVTY_NEWLINE); - } - - for (afi = AFI_IP; afi < AFI_MAX; ++afi) - { - u_char family; - - family = afi2family (afi); - if (!family) - continue; - - cursor = NULL; - for (rc = - skiplist_next (rfd->advertised.ipN_by_prefix, NULL, (void **) &adb, - &cursor); rc == 0; - rc = - skiplist_next (rfd->advertised.ipN_by_prefix, NULL, (void **) &adb, - &cursor)) - { - - /* group like family prefixes together in output */ - if (family != adb->u.s.prefix_ip.family) - continue; - - prefix2str (&adb->u.s.prefix_ip, buf, BUFSIZ); - buf[BUFSIZ - 1] = 0; /* guarantee NUL-terminated */ - - vty_out (vty, " Adv Pfx: %s%s", buf, HVTY_NEWLINE); - rfapiPrintAdvertisedInfo (vty, rfd, SAFI_MPLS_VPN, &adb->u.s.prefix_ip); - } - } - for (rc = - skiplist_next (rfd->advertised.ip0_by_ether, NULL, (void **) &adb, - &cursor); rc == 0; - rc = - skiplist_next (rfd->advertised.ip0_by_ether, NULL, (void **) &adb, - &cursor)) - { - - prefix2str (&adb->u.s.prefix_eth, buf, BUFSIZ); - buf[BUFSIZ - 1] = 0; /* guarantee NUL-terminated */ - - vty_out (vty, " Adv Pfx: %s%s", buf, HVTY_NEWLINE); - - /* TBD update the following function to print ethernet info */ - /* Also need to pass/use rd */ - rfapiPrintAdvertisedInfo (vty, rfd, SAFI_MPLS_VPN, &adb->u.s.prefix_ip); - } - vty_out (vty, "%s", HVTY_NEWLINE); + /* pHD un-addr vn-addr pCB cookie rd lifetime */ + /* RT export list */ + /* RT import list */ + /* list of advertised prefixes */ + /* dump import table */ + + char *s; + void *cursor; + int rc; + afi_t afi; + struct rfapi_adb *adb; + char buf[BUFSIZ]; + + vty_out(vty, "%-10p ", rfd); + rfapiPrintRfapiIpAddr(vty, &rfd->un_addr); + vty_out(vty, " "); + rfapiPrintRfapiIpAddr(vty, &rfd->vn_addr); + vty_out(vty, " %p %p ", rfd->response_cb, rfd->cookie); + rfapiPrintRd(vty, &rfd->rd); + vty_out(vty, " %d", rfd->response_lifetime); + vty_out(vty, " %s", (rfd->rfg ? rfd->rfg->name : "<orphaned>")); + vty_out(vty, "%s", HVTY_NEWLINE); + + vty_out(vty, " Peer %p #%d%s", rfd->peer, rfd->peer->lock, + HVTY_NEWLINE); + + /* export RT list */ + if (rfd->rt_export_list) { + s = ecommunity_ecom2str(rfd->rt_export_list, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + vty_out(vty, " Export %s%s", s, HVTY_NEWLINE); + XFREE(MTYPE_ECOMMUNITY_STR, s); + } else { + vty_out(vty, " Export (nil)%s", HVTY_NEWLINE); + } + + /* import RT list */ + if (rfd->import_table) { + s = ecommunity_ecom2str(rfd->import_table->rt_import_list, + ECOMMUNITY_FORMAT_ROUTE_MAP, 0); + vty_out(vty, " Import %s%s", s, HVTY_NEWLINE); + XFREE(MTYPE_ECOMMUNITY_STR, s); + } else { + vty_out(vty, " Import (nil)%s", HVTY_NEWLINE); + } + + for (afi = AFI_IP; afi < AFI_MAX; ++afi) { + u_char family; + + family = afi2family(afi); + if (!family) + continue; + + cursor = NULL; + for (rc = skiplist_next(rfd->advertised.ipN_by_prefix, NULL, + (void **)&adb, &cursor); + rc == 0; + rc = skiplist_next(rfd->advertised.ipN_by_prefix, NULL, + (void **)&adb, &cursor)) { + + /* group like family prefixes together in output */ + if (family != adb->u.s.prefix_ip.family) + continue; + + prefix2str(&adb->u.s.prefix_ip, buf, BUFSIZ); + buf[BUFSIZ - 1] = 0; /* guarantee NUL-terminated */ + + vty_out(vty, " Adv Pfx: %s%s", buf, HVTY_NEWLINE); + rfapiPrintAdvertisedInfo(vty, rfd, SAFI_MPLS_VPN, + &adb->u.s.prefix_ip); + } + } + for (rc = skiplist_next(rfd->advertised.ip0_by_ether, NULL, + (void **)&adb, &cursor); + rc == 0; rc = skiplist_next(rfd->advertised.ip0_by_ether, NULL, + (void **)&adb, &cursor)) { + + prefix2str(&adb->u.s.prefix_eth, buf, BUFSIZ); + buf[BUFSIZ - 1] = 0; /* guarantee NUL-terminated */ + + vty_out(vty, " Adv Pfx: %s%s", buf, HVTY_NEWLINE); + + /* TBD update the following function to print ethernet info */ + /* Also need to pass/use rd */ + rfapiPrintAdvertisedInfo(vty, rfd, SAFI_MPLS_VPN, + &adb->u.s.prefix_ip); + } + vty_out(vty, "%s", HVTY_NEWLINE); } /* * test scripts rely on first line for each nve starting in 1st column, * leading whitespace for additional detail of that nve */ -void -rfapiPrintMatchingDescriptors (struct vty *vty, - struct prefix *vn_prefix, - struct prefix *un_prefix) +void rfapiPrintMatchingDescriptors(struct vty *vty, struct prefix *vn_prefix, + struct prefix *un_prefix) { - struct bgp *bgp; - struct rfapi *h; - struct listnode *ln; - struct rfapi_descriptor *rfd; - int printed = 0; - - bgp = bgp_get_default (); /* assume 1 instance for now */ - if (!bgp) - return; - - h = bgp->rfapi; - assert (h); - - for (ln = listhead (&h->descriptors); ln; ln = listnextnode (ln)) - { - rfd = listgetdata (ln); - - struct prefix pfx; - - if (vn_prefix) - { - assert (!rfapiRaddr2Qprefix (&rfd->vn_addr, &pfx)); - if (!prefix_match (vn_prefix, &pfx)) - continue; - } - - if (un_prefix) - { - assert (!rfapiRaddr2Qprefix (&rfd->un_addr, &pfx)); - if (!prefix_match (un_prefix, &pfx)) - continue; - } - - if (!printed) - { - /* print column header */ - vty_out (vty, - "%s %s %s %s %s %s %s %s%s", - "descriptor", "un-addr", "vn-addr", "callback", "cookie", - "RD", "lifetime", "group", HVTY_NEWLINE); - } - rfapiPrintDescriptor (vty, rfd); - printed = 1; - } + struct bgp *bgp; + struct rfapi *h; + struct listnode *ln; + struct rfapi_descriptor *rfd; + int printed = 0; + + bgp = bgp_get_default(); /* assume 1 instance for now */ + if (!bgp) + return; + + h = bgp->rfapi; + assert(h); + + for (ln = listhead(&h->descriptors); ln; ln = listnextnode(ln)) { + rfd = listgetdata(ln); + + struct prefix pfx; + + if (vn_prefix) { + assert(!rfapiRaddr2Qprefix(&rfd->vn_addr, &pfx)); + if (!prefix_match(vn_prefix, &pfx)) + continue; + } + + if (un_prefix) { + assert(!rfapiRaddr2Qprefix(&rfd->un_addr, &pfx)); + if (!prefix_match(un_prefix, &pfx)) + continue; + } + + if (!printed) { + /* print column header */ + vty_out(vty, "%s %s %s %s %s %s %s %s%s", "descriptor", + "un-addr", "vn-addr", "callback", "cookie", + "RD", "lifetime", "group", HVTY_NEWLINE); + } + rfapiPrintDescriptor(vty, rfd); + printed = 1; + } } /* * Parse an address and put into a struct prefix */ -int -rfapiCliGetPrefixAddr (struct vty *vty, const char *str, struct prefix *p) +int rfapiCliGetPrefixAddr(struct vty *vty, const char *str, struct prefix *p) { - if (!str2prefix (str, p)) - { - vty_out (vty, "Malformed address \"%s\"%s", str, HVTY_NEWLINE); - return CMD_WARNING; - } - switch (p->family) - { - case AF_INET: - if (p->prefixlen != 32) - { - vty_out (vty, "Not a host address: \"%s\"%s", str, HVTY_NEWLINE); - return CMD_WARNING; - } - break; - case AF_INET6: - if (p->prefixlen != 128) - { - vty_out (vty, "Not a host address: \"%s\"%s", str, HVTY_NEWLINE); - return CMD_WARNING; - } - break; - default: - vty_out (vty, "Invalid address \"%s\"%s", str, HVTY_NEWLINE); - return CMD_WARNING; - } - return 0; + if (!str2prefix(str, p)) { + vty_out(vty, "Malformed address \"%s\"%s", str, HVTY_NEWLINE); + return CMD_WARNING; + } + switch (p->family) { + case AF_INET: + if (p->prefixlen != 32) { + vty_out(vty, "Not a host address: \"%s\"%s", str, + HVTY_NEWLINE); + return CMD_WARNING; + } + break; + case AF_INET6: + if (p->prefixlen != 128) { + vty_out(vty, "Not a host address: \"%s\"%s", str, + HVTY_NEWLINE); + return CMD_WARNING; + } + break; + default: + vty_out(vty, "Invalid address \"%s\"%s", str, HVTY_NEWLINE); + return CMD_WARNING; + } + return 0; } -int -rfapiCliGetRfapiIpAddr ( - struct vty *vty, - const char *str, - struct rfapi_ip_addr *hai) +int rfapiCliGetRfapiIpAddr(struct vty *vty, const char *str, + struct rfapi_ip_addr *hai) { - struct prefix pfx; - int rc; + struct prefix pfx; + int rc; - rc = rfapiCliGetPrefixAddr (vty, str, &pfx); - if (rc) - return rc; + rc = rfapiCliGetPrefixAddr(vty, str, &pfx); + if (rc) + return rc; - hai->addr_family = pfx.family; - if (pfx.family == AF_INET) - hai->addr.v4 = pfx.u.prefix4; - else - hai->addr.v6 = pfx.u.prefix6; + hai->addr_family = pfx.family; + if (pfx.family == AF_INET) + hai->addr.v4 = pfx.u.prefix4; + else + hai->addr.v6 = pfx.u.prefix6; - return 0; + return 0; } /* @@ -1995,137 +1791,126 @@ rfapiCliGetRfapiIpAddr ( * with a stream pointing to a vty, the user will have to type something * before the callback output shows up */ -void -rfapiPrintNhl (void *stream, struct rfapi_next_hop_entry *next_hops) +void rfapiPrintNhl(void *stream, struct rfapi_next_hop_entry *next_hops) { - struct rfapi_next_hop_entry *nh; - int count; + struct rfapi_next_hop_entry *nh; + int count; - int (*fp) (void *, const char *, ...); - struct vty *vty; - void *out; - const char *vty_newline; + int (*fp)(void *, const char *, ...); + struct vty *vty; + void *out; + const char *vty_newline; #define REMAIN (BUFSIZ - (p-line)) #define INCP {p += (r > REMAIN)? REMAIN: r;} - - if (rfapiStream2Vty (stream, &fp, &vty, &out, &vty_newline) == 0) - return; - - for (nh = next_hops, count = 1; nh; nh = nh->next, ++count) - { - - char line[BUFSIZ]; - char *p = line; - int r; - - r = snprintf (p, REMAIN, "%3d pfx=", count); - INCP; - - if (rfapiRfapiIpPrefix2Str (&nh->prefix, p, REMAIN)) - { - /* it fit, so count length */ - r = strlen (p); - } - else - { - /* didn't fit */ - goto truncate; - } - INCP; - - r = snprintf (p, REMAIN, ", un="); - INCP; - - if (rfapiRfapiIpAddr2Str (&nh->un_address, p, REMAIN)) - { - /* it fit, so count length */ - r = strlen (p); - } - else - { - /* didn't fit */ - goto truncate; - } - INCP; - - r = snprintf (p, REMAIN, ", vn="); - INCP; - - if (rfapiRfapiIpAddr2Str (&nh->vn_address, p, REMAIN)) - { - /* it fit, so count length */ - r = strlen (p); - } - else - { - /* didn't fit */ - goto truncate; - } - INCP; - - truncate: - line[BUFSIZ - 1] = 0; - fp (out, "%s%s", line, HVTY_NEWLINE); - - /* - * options - */ - if (nh->vn_options) - { - struct rfapi_vn_option *vo; - char offset[] = " "; - - for (vo = nh->vn_options; vo; vo = vo->next) - { - char pbuf[100]; - - switch (vo->type) - { - case RFAPI_VN_OPTION_TYPE_L2ADDR: - rfapiEthAddr2Str (&vo->v.l2addr.macaddr, pbuf, - sizeof (pbuf)); - fp (out, "%sL2 %s LBL=0x%06x NETID=0x%06x NVEID=%d%s", - offset, pbuf, (vo->v.l2addr.label & 0x00ffffff), - (vo->v.l2addr.logical_net_id & 0x00ffffff), - vo->v.l2addr.local_nve_id, HVTY_NEWLINE); - break; - - case RFAPI_VN_OPTION_TYPE_LOCAL_NEXTHOP: - prefix2str (&vo->v.local_nexthop.addr, pbuf, sizeof (pbuf)); - fp (out, "%sLNH %s cost=%d%s", - offset, pbuf, vo->v.local_nexthop.cost, HVTY_NEWLINE); - break; - - default: - fp (out, "%svn option type %d (unknown)%s", - offset, vo->type, HVTY_NEWLINE); - break; - } - } - } - if (nh->un_options) - { - struct rfapi_un_option *uo; - char offset[] = " "; - - for (uo = nh->un_options; uo; uo = uo->next) - { - switch (uo->type) - { - case RFAPI_UN_OPTION_TYPE_TUNNELTYPE: - rfapi_print_tunneltype_option (stream, 8, &uo->v.tunnel); - break; - default: - fp (out, "%sUN Option type %d%s", - offset, uo->type, vty_newline); - break; - } - - } - } - } + if (rfapiStream2Vty(stream, &fp, &vty, &out, &vty_newline) == 0) + return; + + for (nh = next_hops, count = 1; nh; nh = nh->next, ++count) { + + char line[BUFSIZ]; + char *p = line; + int r; + + r = snprintf(p, REMAIN, "%3d pfx=", count); + INCP; + + if (rfapiRfapiIpPrefix2Str(&nh->prefix, p, REMAIN)) { + /* it fit, so count length */ + r = strlen(p); + } else { + /* didn't fit */ + goto truncate; + } + INCP; + + r = snprintf(p, REMAIN, ", un="); + INCP; + + if (rfapiRfapiIpAddr2Str(&nh->un_address, p, REMAIN)) { + /* it fit, so count length */ + r = strlen(p); + } else { + /* didn't fit */ + goto truncate; + } + INCP; + + r = snprintf(p, REMAIN, ", vn="); + INCP; + + if (rfapiRfapiIpAddr2Str(&nh->vn_address, p, REMAIN)) { + /* it fit, so count length */ + r = strlen(p); + } else { + /* didn't fit */ + goto truncate; + } + INCP; + + truncate: + line[BUFSIZ - 1] = 0; + fp(out, "%s%s", line, HVTY_NEWLINE); + + /* + * options + */ + if (nh->vn_options) { + struct rfapi_vn_option *vo; + char offset[] = " "; + + for (vo = nh->vn_options; vo; vo = vo->next) { + char pbuf[100]; + + switch (vo->type) { + case RFAPI_VN_OPTION_TYPE_L2ADDR: + rfapiEthAddr2Str(&vo->v.l2addr.macaddr, + pbuf, sizeof(pbuf)); + fp(out, + "%sL2 %s LBL=0x%06x NETID=0x%06x NVEID=%d%s", + offset, pbuf, + (vo->v.l2addr.label & 0x00ffffff), + (vo->v.l2addr.logical_net_id + & 0x00ffffff), + vo->v.l2addr.local_nve_id, + HVTY_NEWLINE); + break; + + case RFAPI_VN_OPTION_TYPE_LOCAL_NEXTHOP: + prefix2str(&vo->v.local_nexthop.addr, + pbuf, sizeof(pbuf)); + fp(out, "%sLNH %s cost=%d%s", offset, + pbuf, vo->v.local_nexthop.cost, + HVTY_NEWLINE); + break; + + default: + fp(out, + "%svn option type %d (unknown)%s", + offset, vo->type, HVTY_NEWLINE); + break; + } + } + } + if (nh->un_options) { + struct rfapi_un_option *uo; + char offset[] = " "; + + for (uo = nh->un_options; uo; uo = uo->next) { + switch (uo->type) { + case RFAPI_UN_OPTION_TYPE_TUNNELTYPE: + rfapi_print_tunneltype_option( + stream, 8, &uo->v.tunnel); + break; + default: + fp(out, "%sUN Option type %d%s", offset, + uo->type, vty_newline); + break; + } + } + } + } } /*********************************************************************** @@ -2135,409 +1920,362 @@ rfapiPrintNhl (void *stream, struct rfapi_next_hop_entry *next_hops) /* * Add another nexthop to the NHL */ -static void -rfapiAddDeleteLocalRfpPrefix ( - struct rfapi_ip_addr *un_addr, - struct rfapi_ip_addr *vn_addr, - struct rfapi_ip_prefix *rprefix, - int is_add, - uint32_t lifetime, /* add only */ - struct rfapi_vn_option *vn_options, - struct rfapi_next_hop_entry **head, - struct rfapi_next_hop_entry **tail) +static void rfapiAddDeleteLocalRfpPrefix(struct rfapi_ip_addr *un_addr, + struct rfapi_ip_addr *vn_addr, + struct rfapi_ip_prefix *rprefix, + int is_add, + uint32_t lifetime, /* add only */ + struct rfapi_vn_option *vn_options, + struct rfapi_next_hop_entry **head, + struct rfapi_next_hop_entry **tail) { - struct rfapi_next_hop_entry *new; - - /* - * construct NHL - */ - - new = XCALLOC (MTYPE_RFAPI_NEXTHOP, sizeof (struct rfapi_next_hop_entry)); - new->prefix = *rprefix; - new->un_address = *un_addr; - new->vn_address = *vn_addr; - - new->vn_options = vn_options; - if (is_add) - { - new->lifetime = lifetime; - } - else - { - new->lifetime = RFAPI_REMOVE_RESPONSE_LIFETIME; - } - - if (*tail) - (*tail)->next = new; - *tail = new; - if (!*head) - { - *head = new; - } + struct rfapi_next_hop_entry *new; + + /* + * construct NHL + */ + + new = XCALLOC(MTYPE_RFAPI_NEXTHOP, sizeof(struct rfapi_next_hop_entry)); + new->prefix = *rprefix; + new->un_address = *un_addr; + new->vn_address = *vn_addr; + + new->vn_options = vn_options; + if (is_add) { + new->lifetime = lifetime; + } else { + new->lifetime = RFAPI_REMOVE_RESPONSE_LIFETIME; + } + + if (*tail) + (*tail)->next = new; + *tail = new; + if (!*head) { + *head = new; + } } static int -register_add ( - struct vty *vty, - struct cmd_token *carg_prefix, - struct cmd_token *carg_vn, - struct cmd_token *carg_un, - struct cmd_token *carg_cost, /* optional */ - struct cmd_token *carg_lifetime, /* optional */ - struct cmd_token *carg_macaddr, /* optional */ - struct cmd_token *carg_vni, /* mac present=>mandatory Virtual Network ID */ - int argc, - struct cmd_token **argv) +register_add(struct vty *vty, struct cmd_token *carg_prefix, + struct cmd_token *carg_vn, struct cmd_token *carg_un, + struct cmd_token *carg_cost, /* optional */ + struct cmd_token *carg_lifetime, /* optional */ + struct cmd_token *carg_macaddr, /* optional */ + struct cmd_token + *carg_vni, /* mac present=>mandatory Virtual Network ID */ + int argc, struct cmd_token **argv) { - const char *arg_prefix = carg_prefix ? carg_prefix->arg : NULL; - const char *arg_vn = carg_vn ? carg_vn->arg : NULL; - const char *arg_un = carg_un ? carg_un->arg : NULL; - const char *arg_cost = carg_cost ? carg_cost->arg : NULL; - const char *arg_lifetime = carg_lifetime ? carg_lifetime->arg : NULL; - const char *arg_macaddr = carg_macaddr ? carg_macaddr->arg : NULL; - const char *arg_vni = carg_vni ? carg_vni->arg : NULL; - struct rfapi_ip_addr vn_address; - struct rfapi_ip_addr un_address; - struct prefix pfx; - struct rfapi_ip_prefix rpfx; - uint32_t cost; - uint32_t lnh_cost; - uint32_t lifetime; - rfapi_handle rfd; - struct rfapi_vn_option optary[10]; /* XXX must be big enough */ - struct rfapi_vn_option *opt = NULL; - int opt_next = 0; - - int rc = CMD_WARNING; - char *endptr; - struct bgp *bgp; - struct rfapi *h; - struct rfapi_cfg *rfapi_cfg; - - const char *arg_lnh = NULL; - const char *arg_lnh_cost = NULL; - - bgp = bgp_get_default (); /* assume 1 instance for now */ - if (!bgp) - { - if (vty) - vty_out (vty, "BGP not configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - - h = bgp->rfapi; - rfapi_cfg = bgp->rfapi_cfg; - if (!h || !rfapi_cfg) - { - if (vty) - vty_out (vty, "RFAPI not configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - - for (; argc; --argc, ++argv) - { - if (!strcmp (argv[0]->arg, "local-next-hop")) - { - if (arg_lnh) - { - vty_out (vty, "local-next-hop specified more than once%s", - VTY_NEWLINE); - return CMD_WARNING; - } - if (argc <= 1) - { - vty_out (vty, "Missing parameter for local-next-hop%s", - VTY_NEWLINE); - return CMD_WARNING; - } - ++argv, --argc; - arg_lnh = argv[0]->arg; - } - if (!strcmp (argv[0]->arg, "local-cost")) - { - if (arg_lnh_cost) - { - vty_out (vty, "local-cost specified more than once%s", - VTY_NEWLINE); - return CMD_WARNING; - } - if (argc <= 1) - { - vty_out (vty, "Missing parameter for local-cost%s", - VTY_NEWLINE); - return CMD_WARNING; - } - ++argv, --argc; - arg_lnh_cost = argv[0]->arg; - } - } - - if ((rc = rfapiCliGetRfapiIpAddr (vty, arg_vn, &vn_address))) - goto fail; - if ((rc = rfapiCliGetRfapiIpAddr (vty, arg_un, &un_address))) - goto fail; - - /* arg_prefix is optional if mac address is given */ - if (arg_macaddr && !arg_prefix) - { - /* - * fake up a 0/32 or 0/128 prefix - */ - switch (vn_address.addr_family) - { - case AF_INET: - arg_prefix = "0.0.0.0/32"; - break; - case AF_INET6: - arg_prefix = "0::0/128"; - break; - default: - vty_out (vty, "Internal error, unknown VN address family%s", - VTY_NEWLINE); - return CMD_WARNING; - } - - } - - if (!str2prefix (arg_prefix, &pfx)) - { - vty_out (vty, "Malformed prefix \"%s\"%s", arg_prefix, - VTY_NEWLINE); - goto fail; - } - if (pfx.family != AF_INET - && pfx.family != AF_INET6) - { - vty_out (vty, "prefix \"%s\" has invalid address family%s", - arg_prefix, VTY_NEWLINE); - goto fail; - } - - - memset (optary, 0, sizeof (optary)); - - if (arg_cost) - { - endptr = NULL; - cost = strtoul (arg_cost, &endptr, 10); - if (*endptr != '\0' || cost > 255) - { - vty_out (vty, "%% Invalid %s value%s", "cost", VTY_NEWLINE); - goto fail; - } - } - else - { - cost = 255; - } - - if (arg_lifetime) - { - if (!strcmp (arg_lifetime, "infinite")) - { - lifetime = RFAPI_INFINITE_LIFETIME; - } - else - { - endptr = NULL; - lifetime = strtoul (arg_lifetime, &endptr, 10); - if (*endptr != '\0') - { - vty_out (vty, "%% Invalid %s value%s", "lifetime", - VTY_NEWLINE); - goto fail; - } - } - } - else - { - lifetime = RFAPI_INFINITE_LIFETIME; /* default infinite */ - } - - if (arg_lnh_cost) - { - if (!arg_lnh) - { - vty_out (vty, - "%% %s may only be specified with local-next-hop%s", - "local-cost", VTY_NEWLINE); - goto fail; - } - endptr = NULL; - lnh_cost = strtoul (arg_lnh_cost, &endptr, 10); - if (*endptr != '\0' || lnh_cost > 255) - { - vty_out (vty, "%% Invalid %s value%s", "local-cost", - VTY_NEWLINE); - goto fail; - } - } - else - { - lnh_cost = 255; - } - - if (arg_lnh) - { - if (!arg_prefix) - { - vty_out (vty, "%% %s may only be specified with prefix%s", - "local-next-hop", VTY_NEWLINE); - goto fail; - } - if ((rc = rfapiCliGetPrefixAddr (vty, arg_lnh, - &optary[opt_next].v. - local_nexthop.addr))) - { - - goto fail; - } - - optary[opt_next].v.local_nexthop.cost = lnh_cost; - optary[opt_next].type = RFAPI_VN_OPTION_TYPE_LOCAL_NEXTHOP; - - if (opt_next) - { - optary[opt_next - 1].next = optary + opt_next; - } - else - { - opt = optary; - } - ++opt_next; - } - - if (arg_vni && !arg_macaddr) - { - vty_out (vty, "%% %s may only be specified with mac address%s", - "virtual-network-identifier", VTY_NEWLINE); - goto fail; - } - - if (arg_macaddr) - { - if (!arg_vni) - { - vty_out (vty, - "Missing \"vni\" parameter (mandatory with mac)%s", - VTY_NEWLINE); - return CMD_WARNING; - } - VTY_GET_INTEGER ("Logical Network ID", - optary[opt_next].v.l2addr.logical_net_id, - arg_vni); - - if ((rc = rfapiStr2EthAddr (arg_macaddr, - &optary[opt_next].v.l2addr.macaddr))) - { - vty_out (vty, "Invalid %s value%s", "mac address", - VTY_NEWLINE); - goto fail; - } - /* TBD label, NVE ID */ - - optary[opt_next].type = RFAPI_VN_OPTION_TYPE_L2ADDR; - - if (opt_next) - { - optary[opt_next - 1].next = optary + opt_next; - } - else - { - opt = optary; - } - ++opt_next; - } - - vnc_zlog_debug_verbose - ("%s: vn=%s, un=%s, prefix=%s, cost=%s, lifetime=%s, lnh=%s", - __func__, arg_vn, arg_un, arg_prefix, - (arg_cost ? arg_cost : "NULL"), - (arg_lifetime ? arg_lifetime : "NULL"), - (arg_lnh ? arg_lnh : "NULL")); - - rfapiQprefix2Rprefix (&pfx, &rpfx); - - rpfx.cost = cost & 255; - - /* look up rf descriptor, call open if it doesn't exist */ - rc = - rfapi_find_rfd (bgp, &vn_address, &un_address, - (struct rfapi_descriptor **) &rfd); - if (rc) - { - if (ENOENT == rc) - { - struct rfapi_un_option uo; - - /* - * flag descriptor as provisionally opened for static route - * registration so that we can fix up the other parameters - * when the real open comes along - */ - memset (&uo, 0, sizeof (uo)); - uo.type = RFAPI_UN_OPTION_TYPE_PROVISIONAL; - - rc = rfapi_open (rfapi_get_rfp_start_val_by_bgp (bgp), &vn_address, &un_address, &uo, /* flags */ - NULL, NULL, /* no userdata */ - &rfd); - if (rc) - { - vty_out (vty, "Can't open session for this NVE: %s%s", - rfapi_error_str (rc), VTY_NEWLINE); - rc = CMD_WARNING; - goto fail; - } - } - else - { - vty_out (vty, "Can't find session for this NVE: %s%s", - rfapi_error_str (rc), VTY_NEWLINE); - goto fail; - } - } - - rc = - rfapi_register (rfd, &rpfx, lifetime, NULL, opt, RFAPI_REGISTER_ADD); - if (!rc) - { - struct rfapi_next_hop_entry *head = NULL; - struct rfapi_next_hop_entry *tail = NULL; - struct rfapi_vn_option *vn_opt_new; - - vnc_zlog_debug_verbose ("%s: rfapi_register succeeded, returning 0", __func__); - - if (h->rfp_methods.local_cb) - { - struct rfapi_descriptor *r = (struct rfapi_descriptor *) rfd; - vn_opt_new = rfapi_vn_options_dup (opt); - - rfapiAddDeleteLocalRfpPrefix (&r->un_addr, &r->vn_addr, &rpfx, - 1, lifetime, vn_opt_new, &head, - &tail); - if (head) - { - h->flags |= RFAPI_INCALLBACK; - (*h->rfp_methods.local_cb) (head, r->cookie); - h->flags &= ~RFAPI_INCALLBACK; - } - head = tail = NULL; - } - return 0; - } - - vnc_zlog_debug_verbose ("%s: rfapi_register failed", __func__); - vty_out (vty, "%s", VTY_NEWLINE); - vty_out (vty, "Registration failed.%s", VTY_NEWLINE); - vty_out (vty, - "Confirm that either the VN or UN address matches a configured NVE group.%s", - VTY_NEWLINE); - return CMD_WARNING; - - fail: - vnc_zlog_debug_verbose ("%s: fail, rc=%d", __func__, rc); - return rc; + const char *arg_prefix = carg_prefix ? carg_prefix->arg : NULL; + const char *arg_vn = carg_vn ? carg_vn->arg : NULL; + const char *arg_un = carg_un ? carg_un->arg : NULL; + const char *arg_cost = carg_cost ? carg_cost->arg : NULL; + const char *arg_lifetime = carg_lifetime ? carg_lifetime->arg : NULL; + const char *arg_macaddr = carg_macaddr ? carg_macaddr->arg : NULL; + const char *arg_vni = carg_vni ? carg_vni->arg : NULL; + struct rfapi_ip_addr vn_address; + struct rfapi_ip_addr un_address; + struct prefix pfx; + struct rfapi_ip_prefix rpfx; + uint32_t cost; + uint32_t lnh_cost; + uint32_t lifetime; + rfapi_handle rfd; + struct rfapi_vn_option optary[10]; /* XXX must be big enough */ + struct rfapi_vn_option *opt = NULL; + int opt_next = 0; + + int rc = CMD_WARNING; + char *endptr; + struct bgp *bgp; + struct rfapi *h; + struct rfapi_cfg *rfapi_cfg; + + const char *arg_lnh = NULL; + const char *arg_lnh_cost = NULL; + + bgp = bgp_get_default(); /* assume 1 instance for now */ + if (!bgp) { + if (vty) + vty_out(vty, "BGP not configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + + h = bgp->rfapi; + rfapi_cfg = bgp->rfapi_cfg; + if (!h || !rfapi_cfg) { + if (vty) + vty_out(vty, "RFAPI not configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + + for (; argc; --argc, ++argv) { + if (!strcmp(argv[0]->arg, "local-next-hop")) { + if (arg_lnh) { + vty_out(vty, + "local-next-hop specified more than once%s", + VTY_NEWLINE); + return CMD_WARNING; + } + if (argc <= 1) { + vty_out(vty, + "Missing parameter for local-next-hop%s", + VTY_NEWLINE); + return CMD_WARNING; + } + ++argv, --argc; + arg_lnh = argv[0]->arg; + } + if (!strcmp(argv[0]->arg, "local-cost")) { + if (arg_lnh_cost) { + vty_out(vty, + "local-cost specified more than once%s", + VTY_NEWLINE); + return CMD_WARNING; + } + if (argc <= 1) { + vty_out(vty, + "Missing parameter for local-cost%s", + VTY_NEWLINE); + return CMD_WARNING; + } + ++argv, --argc; + arg_lnh_cost = argv[0]->arg; + } + } + + if ((rc = rfapiCliGetRfapiIpAddr(vty, arg_vn, &vn_address))) + goto fail; + if ((rc = rfapiCliGetRfapiIpAddr(vty, arg_un, &un_address))) + goto fail; + + /* arg_prefix is optional if mac address is given */ + if (arg_macaddr && !arg_prefix) { + /* + * fake up a 0/32 or 0/128 prefix + */ + switch (vn_address.addr_family) { + case AF_INET: + arg_prefix = "0.0.0.0/32"; + break; + case AF_INET6: + arg_prefix = "0::0/128"; + break; + default: + vty_out(vty, + "Internal error, unknown VN address family%s", + VTY_NEWLINE); + return CMD_WARNING; + } + } + + if (!str2prefix(arg_prefix, &pfx)) { + vty_out(vty, "Malformed prefix \"%s\"%s", arg_prefix, + VTY_NEWLINE); + goto fail; + } + if (pfx.family != AF_INET && pfx.family != AF_INET6) { + vty_out(vty, "prefix \"%s\" has invalid address family%s", + arg_prefix, VTY_NEWLINE); + goto fail; + } + + + memset(optary, 0, sizeof(optary)); + + if (arg_cost) { + endptr = NULL; + cost = strtoul(arg_cost, &endptr, 10); + if (*endptr != '\0' || cost > 255) { + vty_out(vty, "%% Invalid %s value%s", "cost", + VTY_NEWLINE); + goto fail; + } + } else { + cost = 255; + } + + if (arg_lifetime) { + if (!strcmp(arg_lifetime, "infinite")) { + lifetime = RFAPI_INFINITE_LIFETIME; + } else { + endptr = NULL; + lifetime = strtoul(arg_lifetime, &endptr, 10); + if (*endptr != '\0') { + vty_out(vty, "%% Invalid %s value%s", + "lifetime", VTY_NEWLINE); + goto fail; + } + } + } else { + lifetime = RFAPI_INFINITE_LIFETIME; /* default infinite */ + } + + if (arg_lnh_cost) { + if (!arg_lnh) { + vty_out(vty, + "%% %s may only be specified with local-next-hop%s", + "local-cost", VTY_NEWLINE); + goto fail; + } + endptr = NULL; + lnh_cost = strtoul(arg_lnh_cost, &endptr, 10); + if (*endptr != '\0' || lnh_cost > 255) { + vty_out(vty, "%% Invalid %s value%s", "local-cost", + VTY_NEWLINE); + goto fail; + } + } else { + lnh_cost = 255; + } + + if (arg_lnh) { + if (!arg_prefix) { + vty_out(vty, + "%% %s may only be specified with prefix%s", + "local-next-hop", VTY_NEWLINE); + goto fail; + } + if ((rc = rfapiCliGetPrefixAddr( + vty, arg_lnh, + &optary[opt_next].v.local_nexthop.addr))) { + + goto fail; + } + + optary[opt_next].v.local_nexthop.cost = lnh_cost; + optary[opt_next].type = RFAPI_VN_OPTION_TYPE_LOCAL_NEXTHOP; + + if (opt_next) { + optary[opt_next - 1].next = optary + opt_next; + } else { + opt = optary; + } + ++opt_next; + } + + if (arg_vni && !arg_macaddr) { + vty_out(vty, "%% %s may only be specified with mac address%s", + "virtual-network-identifier", VTY_NEWLINE); + goto fail; + } + + if (arg_macaddr) { + if (!arg_vni) { + vty_out(vty, + "Missing \"vni\" parameter (mandatory with mac)%s", + VTY_NEWLINE); + return CMD_WARNING; + } + VTY_GET_INTEGER("Logical Network ID", + optary[opt_next].v.l2addr.logical_net_id, + arg_vni); + + if ((rc = rfapiStr2EthAddr( + arg_macaddr, + &optary[opt_next].v.l2addr.macaddr))) { + vty_out(vty, "Invalid %s value%s", "mac address", + VTY_NEWLINE); + goto fail; + } + /* TBD label, NVE ID */ + + optary[opt_next].type = RFAPI_VN_OPTION_TYPE_L2ADDR; + + if (opt_next) { + optary[opt_next - 1].next = optary + opt_next; + } else { + opt = optary; + } + ++opt_next; + } + + vnc_zlog_debug_verbose( + "%s: vn=%s, un=%s, prefix=%s, cost=%s, lifetime=%s, lnh=%s", + __func__, arg_vn, arg_un, arg_prefix, + (arg_cost ? arg_cost : "NULL"), + (arg_lifetime ? arg_lifetime : "NULL"), + (arg_lnh ? arg_lnh : "NULL")); + + rfapiQprefix2Rprefix(&pfx, &rpfx); + + rpfx.cost = cost & 255; + + /* look up rf descriptor, call open if it doesn't exist */ + rc = rfapi_find_rfd(bgp, &vn_address, &un_address, + (struct rfapi_descriptor **)&rfd); + if (rc) { + if (ENOENT == rc) { + struct rfapi_un_option uo; + + /* + * flag descriptor as provisionally opened for static + * route + * registration so that we can fix up the other + * parameters + * when the real open comes along + */ + memset(&uo, 0, sizeof(uo)); + uo.type = RFAPI_UN_OPTION_TYPE_PROVISIONAL; + + rc = rfapi_open(rfapi_get_rfp_start_val_by_bgp(bgp), + &vn_address, &un_address, + &uo, /* flags */ + NULL, NULL, /* no userdata */ + &rfd); + if (rc) { + vty_out(vty, + "Can't open session for this NVE: %s%s", + rfapi_error_str(rc), VTY_NEWLINE); + rc = CMD_WARNING; + goto fail; + } + } else { + vty_out(vty, "Can't find session for this NVE: %s%s", + rfapi_error_str(rc), VTY_NEWLINE); + goto fail; + } + } + + rc = rfapi_register(rfd, &rpfx, lifetime, NULL, opt, + RFAPI_REGISTER_ADD); + if (!rc) { + struct rfapi_next_hop_entry *head = NULL; + struct rfapi_next_hop_entry *tail = NULL; + struct rfapi_vn_option *vn_opt_new; + + vnc_zlog_debug_verbose( + "%s: rfapi_register succeeded, returning 0", __func__); + + if (h->rfp_methods.local_cb) { + struct rfapi_descriptor *r = + (struct rfapi_descriptor *)rfd; + vn_opt_new = rfapi_vn_options_dup(opt); + + rfapiAddDeleteLocalRfpPrefix(&r->un_addr, &r->vn_addr, + &rpfx, 1, lifetime, + vn_opt_new, &head, &tail); + if (head) { + h->flags |= RFAPI_INCALLBACK; + (*h->rfp_methods.local_cb)(head, r->cookie); + h->flags &= ~RFAPI_INCALLBACK; + } + head = tail = NULL; + } + return 0; + } + + vnc_zlog_debug_verbose("%s: rfapi_register failed", __func__); + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, "Registration failed.%s", VTY_NEWLINE); + vty_out(vty, + "Confirm that either the VN or UN address matches a configured NVE group.%s", + VTY_NEWLINE); + return CMD_WARNING; + +fail: + vnc_zlog_debug_verbose("%s: fail, rc=%d", __func__, rc); + return rc; } /************************************************************************ @@ -2563,10 +2301,10 @@ DEFUN (add_vnc_prefix_cost_life_lnh, "Lifetime value in seconds\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[9], argv[11], - /* mac vni */ - NULL, NULL, argc - 12, argv + 12); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[9], argv[11], + /* mac vni */ + NULL, NULL, argc - 12, argv + 12); } DEFUN (add_vnc_prefix_life_cost_lnh, @@ -2589,10 +2327,10 @@ DEFUN (add_vnc_prefix_life_cost_lnh, "Administrative cost\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[11], argv[9], - /* mac vni */ - NULL, NULL, argc - 12, argv + 12); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[11], argv[9], + /* mac vni */ + NULL, NULL, argc - 12, argv + 12); } DEFUN (add_vnc_prefix_cost_lnh, @@ -2613,10 +2351,10 @@ DEFUN (add_vnc_prefix_cost_lnh, "Administrative cost\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[9], NULL, - /* mac vni */ - NULL, NULL, argc - 10, argv + 10); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[9], NULL, + /* mac vni */ + NULL, NULL, argc - 10, argv + 10); } DEFUN (add_vnc_prefix_life_lnh, @@ -2637,10 +2375,10 @@ DEFUN (add_vnc_prefix_life_lnh, "Lifetime value in seconds\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], NULL, argv[9], - /* mac vni */ - NULL, NULL, argc - 10, argv + 10); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], NULL, argv[9], + /* mac vni */ + NULL, NULL, argc - 10, argv + 10); } DEFUN (add_vnc_prefix_lnh, @@ -2659,10 +2397,10 @@ DEFUN (add_vnc_prefix_lnh, "UN IPv6 interface address\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], NULL, NULL, - /* mac vni */ - NULL, NULL, argc - 8, argv + 8); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], NULL, NULL, + /* mac vni */ + NULL, NULL, argc - 8, argv + 8); } /************************************************************************ @@ -2688,10 +2426,10 @@ DEFUN (add_vnc_prefix_cost_life, "Lifetime value in seconds\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[9], argv[11], - /* mac vni */ - NULL, NULL, 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[9], argv[11], + /* mac vni */ + NULL, NULL, 0, NULL); } DEFUN (add_vnc_prefix_life_cost, @@ -2714,10 +2452,10 @@ DEFUN (add_vnc_prefix_life_cost, "Administrative cost\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[11], argv[9], - /* mac vni */ - NULL, NULL, 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[11], argv[9], + /* mac vni */ + NULL, NULL, 0, NULL); } DEFUN (add_vnc_prefix_cost, @@ -2738,10 +2476,10 @@ DEFUN (add_vnc_prefix_cost, "Administrative cost\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], argv[9], NULL, - /* mac vni */ - NULL, NULL, 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], argv[9], NULL, + /* mac vni */ + NULL, NULL, 0, NULL); } DEFUN (add_vnc_prefix_life, @@ -2762,10 +2500,10 @@ DEFUN (add_vnc_prefix_life, "Lifetime value in seconds\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], NULL, argv[9], - /* mac vni */ - NULL, NULL, 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], NULL, argv[9], + /* mac vni */ + NULL, NULL, 0, NULL); } DEFUN (add_vnc_prefix, @@ -2784,10 +2522,10 @@ DEFUN (add_vnc_prefix, "UN IPv6 interface address\n" "[local-next-hop (A.B.C.D|X:X::X:X)] [local-cost <0-255>]\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[3], argv[5], argv[7], NULL, NULL, - /* mac vni */ - NULL, NULL, 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[3], argv[5], argv[7], NULL, NULL, + /* mac vni */ + NULL, NULL, 0, NULL); } /************************************************************************ @@ -2816,10 +2554,10 @@ DEFUN (add_vnc_mac_vni_prefix_cost_life, "Registration lifetime [default: infinite]\n" "Lifetime value in seconds\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[11], argv[7], argv[9], argv[13], argv[15], - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[11], argv[7], argv[9], argv[13], argv[15], + /* mac vni */ + argv[3], argv[5], 0, NULL); } @@ -2844,10 +2582,10 @@ DEFUN (add_vnc_mac_vni_prefix_life, "Registration lifetime [default: infinite]\n" "Lifetime value in seconds\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[11], argv[7], argv[9], NULL, argv[13], - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[11], argv[7], argv[9], NULL, argv[13], + /* mac vni */ + argv[3], argv[5], 0, NULL); } DEFUN (add_vnc_mac_vni_prefix_cost, @@ -2870,10 +2608,10 @@ DEFUN (add_vnc_mac_vni_prefix_cost, "IPv6 prefix\n" "Administrative cost [default: 255]\n" "Administrative cost\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[11], argv[7], argv[9], argv[13], NULL, - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[11], argv[7], argv[9], argv[13], NULL, + /* mac vni */ + argv[3], argv[5], 0, NULL); } DEFUN (add_vnc_mac_vni_prefix, @@ -2894,10 +2632,10 @@ DEFUN (add_vnc_mac_vni_prefix, "Add/modify prefix related information\n" "IPv4 prefix\n" "IPv6 prefix\n") { - /* pfx vn un cost life */ - return register_add (vty, argv[11], argv[7], argv[9], NULL, NULL, - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, argv[11], argv[7], argv[9], NULL, NULL, + /* mac vni */ + argv[3], argv[5], 0, NULL); } DEFUN (add_vnc_mac_vni_cost_life, @@ -2920,10 +2658,10 @@ DEFUN (add_vnc_mac_vni_cost_life, "Registration lifetime [default: infinite]\n" "Lifetime value in seconds\n") { - /* pfx vn un cost life */ - return register_add (vty, NULL, argv[7], argv[9], argv[11], argv[13], - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, NULL, argv[7], argv[9], argv[11], argv[13], + /* mac vni */ + argv[3], argv[5], 0, NULL); } @@ -2944,10 +2682,10 @@ DEFUN (add_vnc_mac_vni_cost, "UN IPv6 interface address\n" "Administrative cost [default: 255]\n" "Administrative cost\n") { - /* pfx vn un cost life */ - return register_add (vty, NULL, argv[7], argv[9], argv[11], NULL, - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, NULL, argv[7], argv[9], argv[11], NULL, + /* mac vni */ + argv[3], argv[5], 0, NULL); } @@ -2969,10 +2707,10 @@ DEFUN (add_vnc_mac_vni_life, "Registration lifetime [default: infinite]\n" "Lifetime value in seconds\n") { - /* pfx vn un cost life */ - return register_add (vty, NULL, argv[7], argv[9], NULL, argv[11], - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, NULL, argv[7], argv[9], NULL, argv[11], + /* mac vni */ + argv[3], argv[5], 0, NULL); } @@ -2991,675 +2729,645 @@ DEFUN (add_vnc_mac_vni, "UN address of NVE\n" "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - /* pfx vn un cost life */ - return register_add (vty, NULL, argv[7], argv[9], NULL, NULL, - /* mac vni */ - argv[3], argv[5], 0, NULL); + /* pfx vn un cost life */ + return register_add(vty, NULL, argv[7], argv[9], NULL, NULL, + /* mac vni */ + argv[3], argv[5], 0, NULL); } /************************************************************************ * Delete prefix ************************************************************************/ -struct rfapi_local_reg_delete_arg -{ - /* - * match parameters - */ - struct bgp *bgp; - struct rfapi_ip_addr un_address; /* AF==0: wildcard */ - struct rfapi_ip_addr vn_address; /* AF==0: wildcard */ - struct prefix prefix; /* AF==0: wildcard */ - struct prefix_rd rd; /* plen!=64: wildcard */ - struct rfapi_nve_group_cfg *rfg; /* NULL: wildcard */ - - struct rfapi_l2address_option_match l2o; - - /* - * result parameters - */ - struct vty *vty; - uint32_t reg_count; - uint32_t pfx_count; - uint32_t query_count; - - uint32_t failed_pfx_count; - - uint32_t nve_count; - struct skiplist *nves; - - uint32_t remote_active_nve_count; - uint32_t remote_active_pfx_count; - uint32_t remote_holddown_nve_count; - uint32_t remote_holddown_pfx_count; +struct rfapi_local_reg_delete_arg { + /* + * match parameters + */ + struct bgp *bgp; + struct rfapi_ip_addr un_address; /* AF==0: wildcard */ + struct rfapi_ip_addr vn_address; /* AF==0: wildcard */ + struct prefix prefix; /* AF==0: wildcard */ + struct prefix_rd rd; /* plen!=64: wildcard */ + struct rfapi_nve_group_cfg *rfg; /* NULL: wildcard */ + + struct rfapi_l2address_option_match l2o; + + /* + * result parameters + */ + struct vty *vty; + uint32_t reg_count; + uint32_t pfx_count; + uint32_t query_count; + + uint32_t failed_pfx_count; + + uint32_t nve_count; + struct skiplist *nves; + + uint32_t remote_active_nve_count; + uint32_t remote_active_pfx_count; + uint32_t remote_holddown_nve_count; + uint32_t remote_holddown_pfx_count; }; -struct nve_addr -{ - struct rfapi_ip_addr vn; - struct rfapi_ip_addr un; - struct rfapi_descriptor *rfd; - struct rfapi_local_reg_delete_arg *cda; +struct nve_addr { + struct rfapi_ip_addr vn; + struct rfapi_ip_addr un; + struct rfapi_descriptor *rfd; + struct rfapi_local_reg_delete_arg *cda; }; -static void -nve_addr_free (void *hap) +static void nve_addr_free(void *hap) { - ((struct nve_addr *) hap)->cda->nve_count += 1; - XFREE (MTYPE_RFAPI_NVE_ADDR, hap); + ((struct nve_addr *)hap)->cda->nve_count += 1; + XFREE(MTYPE_RFAPI_NVE_ADDR, hap); } -static int -nve_addr_cmp (void *k1, void *k2) +static int nve_addr_cmp(void *k1, void *k2) { - struct nve_addr *a = (struct nve_addr *) k1; - struct nve_addr *b = (struct nve_addr *) k2; - int ret = 0; - - if (!a || !b) - { - return (a - b); - } - if (a->un.addr_family != b->un.addr_family) - { - return (a->un.addr_family - b->un.addr_family); - } - if (a->vn.addr_family != b->vn.addr_family) - { - return (a->vn.addr_family - b->vn.addr_family); - } - if (a->un.addr_family == AF_INET) - { - ret = IPV4_ADDR_CMP (&a->un.addr.v4, &b->un.addr.v4); - if (ret != 0) - { - return ret; - } - } - else if (a->un.addr_family == AF_INET6) - { - ret = IPV6_ADDR_CMP (&a->un.addr.v6, &b->un.addr.v6); - if (ret != 0) - { - return ret; - } - } - else - { - assert (0); - } - if (a->vn.addr_family == AF_INET) - { - ret = IPV4_ADDR_CMP (&a->vn.addr.v4, &b->vn.addr.v4); - if (ret != 0) - return ret; - } - else if (a->vn.addr_family == AF_INET6) - { - ret = IPV6_ADDR_CMP (&a->vn.addr.v6, &b->vn.addr.v6); - if (ret == 0) - { - return ret; - } - } - else - { - assert (0); - } - return 0; + struct nve_addr *a = (struct nve_addr *)k1; + struct nve_addr *b = (struct nve_addr *)k2; + int ret = 0; + + if (!a || !b) { + return (a - b); + } + if (a->un.addr_family != b->un.addr_family) { + return (a->un.addr_family - b->un.addr_family); + } + if (a->vn.addr_family != b->vn.addr_family) { + return (a->vn.addr_family - b->vn.addr_family); + } + if (a->un.addr_family == AF_INET) { + ret = IPV4_ADDR_CMP(&a->un.addr.v4, &b->un.addr.v4); + if (ret != 0) { + return ret; + } + } else if (a->un.addr_family == AF_INET6) { + ret = IPV6_ADDR_CMP(&a->un.addr.v6, &b->un.addr.v6); + if (ret != 0) { + return ret; + } + } else { + assert(0); + } + if (a->vn.addr_family == AF_INET) { + ret = IPV4_ADDR_CMP(&a->vn.addr.v4, &b->vn.addr.v4); + if (ret != 0) + return ret; + } else if (a->vn.addr_family == AF_INET6) { + ret = IPV6_ADDR_CMP(&a->vn.addr.v6, &b->vn.addr.v6); + if (ret == 0) { + return ret; + } + } else { + assert(0); + } + return 0; } -static int -parse_deleter_args ( - struct vty *vty, - struct bgp *bgp, - const char *arg_prefix, - const char *arg_vn, - const char *arg_un, - const char *arg_l2addr, - const char *arg_vni, - const char *arg_rd, - struct rfapi_nve_group_cfg *arg_rfg, - struct rfapi_local_reg_delete_arg *rcdarg) +static int parse_deleter_args(struct vty *vty, struct bgp *bgp, + const char *arg_prefix, const char *arg_vn, + const char *arg_un, const char *arg_l2addr, + const char *arg_vni, const char *arg_rd, + struct rfapi_nve_group_cfg *arg_rfg, + struct rfapi_local_reg_delete_arg *rcdarg) { - int rc = CMD_WARNING; - - memset (rcdarg, 0, sizeof (struct rfapi_local_reg_delete_arg)); - - rcdarg->vty = vty; - if (bgp == NULL) - bgp = bgp_get_default(); - rcdarg->bgp = bgp; - rcdarg->rfg = arg_rfg; /* may be NULL */ - - if (arg_vn && strcmp (arg_vn, "*")) - { - if ((rc = rfapiCliGetRfapiIpAddr (vty, arg_vn, &rcdarg->vn_address))) - return rc; - } - if (arg_un && strcmp (arg_un, "*")) - { - if ((rc = rfapiCliGetRfapiIpAddr (vty, arg_un, &rcdarg->un_address))) - return rc; - } - if (arg_prefix && strcmp (arg_prefix, "*")) - { - - if (!str2prefix (arg_prefix, &rcdarg->prefix)) - { - vty_out (vty, "Malformed prefix \"%s\"%s", arg_prefix, VTY_NEWLINE); - return rc; - } - } - - if (arg_l2addr) - { - if (!arg_vni) - { - vty_out (vty, "Missing VNI%s", VTY_NEWLINE); - return rc; - } - if (strcmp (arg_l2addr, "*")) - { - if ((rc = rfapiStr2EthAddr (arg_l2addr, &rcdarg->l2o.o.macaddr))) - { - vty_out (vty, "Malformed L2 Address \"%s\"%s", - arg_l2addr, VTY_NEWLINE); - return rc; - } - rcdarg->l2o.flags |= RFAPI_L2O_MACADDR; - } - if (strcmp (arg_vni, "*")) - { - VTY_GET_INTEGER ("Logical Network ID", - rcdarg->l2o.o.logical_net_id, arg_vni); - rcdarg->l2o.flags |= RFAPI_L2O_LNI; - } - } - if (arg_rd) - { - if (!str2prefix_rd (arg_rd, &rcdarg->rd)) - { - vty_out (vty, "Malformed RD \"%s\"%s", - arg_rd, VTY_NEWLINE); - return rc; - } - } - - return CMD_SUCCESS; + int rc = CMD_WARNING; + + memset(rcdarg, 0, sizeof(struct rfapi_local_reg_delete_arg)); + + rcdarg->vty = vty; + if (bgp == NULL) + bgp = bgp_get_default(); + rcdarg->bgp = bgp; + rcdarg->rfg = arg_rfg; /* may be NULL */ + + if (arg_vn && strcmp(arg_vn, "*")) { + if ((rc = rfapiCliGetRfapiIpAddr(vty, arg_vn, + &rcdarg->vn_address))) + return rc; + } + if (arg_un && strcmp(arg_un, "*")) { + if ((rc = rfapiCliGetRfapiIpAddr(vty, arg_un, + &rcdarg->un_address))) + return rc; + } + if (arg_prefix && strcmp(arg_prefix, "*")) { + + if (!str2prefix(arg_prefix, &rcdarg->prefix)) { + vty_out(vty, "Malformed prefix \"%s\"%s", arg_prefix, + VTY_NEWLINE); + return rc; + } + } + + if (arg_l2addr) { + if (!arg_vni) { + vty_out(vty, "Missing VNI%s", VTY_NEWLINE); + return rc; + } + if (strcmp(arg_l2addr, "*")) { + if ((rc = rfapiStr2EthAddr(arg_l2addr, + &rcdarg->l2o.o.macaddr))) { + vty_out(vty, "Malformed L2 Address \"%s\"%s", + arg_l2addr, VTY_NEWLINE); + return rc; + } + rcdarg->l2o.flags |= RFAPI_L2O_MACADDR; + } + if (strcmp(arg_vni, "*")) { + VTY_GET_INTEGER("Logical Network ID", + rcdarg->l2o.o.logical_net_id, arg_vni); + rcdarg->l2o.flags |= RFAPI_L2O_LNI; + } + } + if (arg_rd) { + if (!str2prefix_rd(arg_rd, &rcdarg->rd)) { + vty_out(vty, "Malformed RD \"%s\"%s", arg_rd, + VTY_NEWLINE); + return rc; + } + } + + return CMD_SUCCESS; } static int -parse_deleter_tokens ( - struct vty *vty, - struct bgp *bgp, - struct cmd_token *carg_prefix, - struct cmd_token *carg_vn, - struct cmd_token *carg_un, - struct cmd_token *carg_l2addr, - struct cmd_token *carg_vni, - struct cmd_token *carg_rd, - struct rfapi_nve_group_cfg *arg_rfg, - struct rfapi_local_reg_delete_arg *rcdarg) +parse_deleter_tokens(struct vty *vty, struct bgp *bgp, + struct cmd_token *carg_prefix, struct cmd_token *carg_vn, + struct cmd_token *carg_un, struct cmd_token *carg_l2addr, + struct cmd_token *carg_vni, struct cmd_token *carg_rd, + struct rfapi_nve_group_cfg *arg_rfg, + struct rfapi_local_reg_delete_arg *rcdarg) { - const char *arg_prefix = carg_prefix ? carg_prefix->arg : NULL; - const char *arg_vn = carg_vn ? carg_vn->arg : NULL; - const char *arg_un = carg_un ? carg_un->arg : NULL; - const char *arg_l2addr = carg_l2addr ? carg_l2addr->arg : NULL; - const char *arg_vni = carg_vni ? carg_vni->arg : NULL; - const char *arg_rd = carg_rd ? carg_rd->arg : NULL; - return parse_deleter_args (vty, bgp,arg_prefix, arg_vn, arg_un, - arg_l2addr, arg_vni, arg_rd, - arg_rfg, rcdarg); + const char *arg_prefix = carg_prefix ? carg_prefix->arg : NULL; + const char *arg_vn = carg_vn ? carg_vn->arg : NULL; + const char *arg_un = carg_un ? carg_un->arg : NULL; + const char *arg_l2addr = carg_l2addr ? carg_l2addr->arg : NULL; + const char *arg_vni = carg_vni ? carg_vni->arg : NULL; + const char *arg_rd = carg_rd ? carg_rd->arg : NULL; + return parse_deleter_args(vty, bgp, arg_prefix, arg_vn, arg_un, + arg_l2addr, arg_vni, arg_rd, arg_rfg, rcdarg); } -static void -record_nve_in_cda_list ( - struct rfapi_local_reg_delete_arg *cda, - struct rfapi_ip_addr *un_address, - struct rfapi_ip_addr *vn_address, - struct rfapi_descriptor *rfd) +static void record_nve_in_cda_list(struct rfapi_local_reg_delete_arg *cda, + struct rfapi_ip_addr *un_address, + struct rfapi_ip_addr *vn_address, + struct rfapi_descriptor *rfd) { - struct nve_addr ha; - struct nve_addr *hap; - - memset (&ha, 0, sizeof (ha)); - ha.un = *un_address; - ha.vn = *vn_address; - ha.rfd = rfd; - - if (!cda->nves) - cda->nves = skiplist_new (0, nve_addr_cmp, nve_addr_free); - - if (skiplist_search (cda->nves, &ha, (void *) &hap)) - { - hap = XCALLOC (MTYPE_RFAPI_NVE_ADDR, sizeof (struct nve_addr)); - assert (hap); - ha.cda = cda; - * hap = ha; - skiplist_insert (cda->nves, hap, hap); - } + struct nve_addr ha; + struct nve_addr *hap; + + memset(&ha, 0, sizeof(ha)); + ha.un = *un_address; + ha.vn = *vn_address; + ha.rfd = rfd; + + if (!cda->nves) + cda->nves = skiplist_new(0, nve_addr_cmp, nve_addr_free); + + if (skiplist_search(cda->nves, &ha, (void *)&hap)) { + hap = XCALLOC(MTYPE_RFAPI_NVE_ADDR, sizeof(struct nve_addr)); + assert(hap); + ha.cda = cda; + *hap = ha; + skiplist_insert(cda->nves, hap, hap); + } } -static void -clear_vnc_responses (struct rfapi_local_reg_delete_arg *cda) +static void clear_vnc_responses(struct rfapi_local_reg_delete_arg *cda) { - struct rfapi *h; - struct rfapi_descriptor *rfd; - int query_count = 0; - struct listnode *node; - struct bgp *bgp_default = bgp_get_default (); - - if (cda->vn_address.addr_family && cda->un_address.addr_family) - { - /* - * Single nve case - */ - if (rfapi_find_rfd - (bgp_default, &cda->vn_address, &cda->un_address, &rfd)) - return; - - rfapiRibClear (rfd); - rfapi_query_done_all (rfd, &query_count); - cda->query_count += query_count; - - /* - * Track unique nves seen - */ - record_nve_in_cda_list (cda, &rfd->un_addr, &rfd->vn_addr, rfd); - return; - } - - /* - * wildcard case - */ - - if (!bgp_default) - return; /* ENXIO */ - - h = bgp_default->rfapi; - - if (!h) - return; /* ENXIO */ - - for (ALL_LIST_ELEMENTS_RO (&h->descriptors, node, rfd)) - { - /* - * match un, vn addresses of NVEs - */ - if (cda->un_address.addr_family && - rfapi_ip_addr_cmp (&cda->un_address, &rfd->un_addr)) - { - continue; - } - if (cda->vn_address.addr_family && - rfapi_ip_addr_cmp (&cda->vn_address, &rfd->vn_addr)) - { - continue; - } - - rfapiRibClear (rfd); - - rfapi_query_done_all (rfd, &query_count); - cda->query_count += query_count; - - /* - * Track unique nves seen - */ - record_nve_in_cda_list (cda, &rfd->un_addr, &rfd->vn_addr, rfd); - } + struct rfapi *h; + struct rfapi_descriptor *rfd; + int query_count = 0; + struct listnode *node; + struct bgp *bgp_default = bgp_get_default(); + + if (cda->vn_address.addr_family && cda->un_address.addr_family) { + /* + * Single nve case + */ + if (rfapi_find_rfd(bgp_default, &cda->vn_address, + &cda->un_address, &rfd)) + return; + + rfapiRibClear(rfd); + rfapi_query_done_all(rfd, &query_count); + cda->query_count += query_count; + + /* + * Track unique nves seen + */ + record_nve_in_cda_list(cda, &rfd->un_addr, &rfd->vn_addr, rfd); + return; + } + + /* + * wildcard case + */ + + if (!bgp_default) + return; /* ENXIO */ + + h = bgp_default->rfapi; + + if (!h) + return; /* ENXIO */ + + for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) { + /* + * match un, vn addresses of NVEs + */ + if (cda->un_address.addr_family + && rfapi_ip_addr_cmp(&cda->un_address, &rfd->un_addr)) { + continue; + } + if (cda->vn_address.addr_family + && rfapi_ip_addr_cmp(&cda->vn_address, &rfd->vn_addr)) { + continue; + } + + rfapiRibClear(rfd); + + rfapi_query_done_all(rfd, &query_count); + cda->query_count += query_count; + + /* + * Track unique nves seen + */ + record_nve_in_cda_list(cda, &rfd->un_addr, &rfd->vn_addr, rfd); + } } /* * TBD need to count deleted prefixes and nves? * * ENXIO BGP or VNC not configured - */ -static int -rfapiDeleteLocalPrefixesByRFD (struct rfapi_local_reg_delete_arg *cda, - struct rfapi_descriptor *rfd) + */ +static int rfapiDeleteLocalPrefixesByRFD(struct rfapi_local_reg_delete_arg *cda, + struct rfapi_descriptor *rfd) { - struct rfapi_ip_addr *pUn; /* NULL = wildcard */ - struct rfapi_ip_addr *pVn; /* NULL = wildcard */ - struct prefix *pPrefix; /* NULL = wildcard */ - struct prefix_rd *pPrd; /* NULL = wildcard */ + struct rfapi_ip_addr *pUn; /* NULL = wildcard */ + struct rfapi_ip_addr *pVn; /* NULL = wildcard */ + struct prefix *pPrefix; /* NULL = wildcard */ + struct prefix_rd *pPrd; /* NULL = wildcard */ - struct rfapi_ip_prefix rprefix; - struct rfapi_next_hop_entry *head = NULL; - struct rfapi_next_hop_entry *tail = NULL; + struct rfapi_ip_prefix rprefix; + struct rfapi_next_hop_entry *head = NULL; + struct rfapi_next_hop_entry *tail = NULL; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: entry", __func__); + vnc_zlog_debug_verbose("%s: entry", __func__); #endif - pUn = (cda->un_address.addr_family ? &cda->un_address : NULL); - pVn = (cda->vn_address.addr_family ? &cda->vn_address : NULL); - pPrefix = (cda->prefix.family ? &cda->prefix : NULL); - pPrd = (cda->rd.prefixlen == 64 ? &cda->rd : NULL); - - if (pPrefix) - { - rfapiQprefix2Rprefix (pPrefix, &rprefix); - } - - do /* to preserve old code structure */ - { - struct rfapi *h=cda->bgp->rfapi;; - struct rfapi_adb *adb; - int rc; - int deleted_from_this_nve; - struct nve_addr ha; - struct nve_addr *hap; + pUn = (cda->un_address.addr_family ? &cda->un_address : NULL); + pVn = (cda->vn_address.addr_family ? &cda->vn_address : NULL); + pPrefix = (cda->prefix.family ? &cda->prefix : NULL); + pPrd = (cda->rd.prefixlen == 64 ? &cda->rd : NULL); + + if (pPrefix) { + rfapiQprefix2Rprefix(pPrefix, &rprefix); + } + + do /* to preserve old code structure */ + { + struct rfapi *h = cda->bgp->rfapi; + ; + struct rfapi_adb *adb; + int rc; + int deleted_from_this_nve; + struct nve_addr ha; + struct nve_addr *hap; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: rfd=%p", __func__, rfd); + vnc_zlog_debug_verbose("%s: rfd=%p", __func__, rfd); #endif - /* - * match un, vn addresses of NVEs - */ - if (pUn && (rfapi_ip_addr_cmp (pUn, &rfd->un_addr))) - continue; - if (pVn && (rfapi_ip_addr_cmp (pVn, &rfd->vn_addr))) - continue; + /* + * match un, vn addresses of NVEs + */ + if (pUn && (rfapi_ip_addr_cmp(pUn, &rfd->un_addr))) + continue; + if (pVn && (rfapi_ip_addr_cmp(pVn, &rfd->vn_addr))) + continue; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: un, vn match", __func__); + vnc_zlog_debug_verbose("%s: un, vn match", __func__); #endif - /* - * match prefix - */ - - deleted_from_this_nve = 0; - - { - struct skiplist *sl; - struct rfapi_ip_prefix rp; - void *cursor; - struct list *adb_delete_list; - - /* - * The advertisements are stored in a skiplist. Withdrawing - * the registration deletes the advertisement from the - * skiplist, which we can't do while iterating over that - * same skiplist using the current skiplist API. - * - * Strategy: iterate over the skiplist and build another - * list containing only the matching ADBs. Then delete - * _everything_ in that second list (which can be done - * using either skiplists or quagga linklists). - */ - adb_delete_list = list_new (); - - /* - * Advertised IP prefixes (not 0/32 or 0/128) - */ - sl = rfd->advertised.ipN_by_prefix; - - for (cursor = NULL, - rc = skiplist_next (sl, NULL, (void **) &adb, &cursor); - !rc; rc = skiplist_next (sl, NULL, (void **) &adb, &cursor)) - { - - if (pPrefix) - { - if (!prefix_same (pPrefix, &adb->u.s.prefix_ip)) - { + /* + * match prefix + */ + + deleted_from_this_nve = 0; + + { + struct skiplist *sl; + struct rfapi_ip_prefix rp; + void *cursor; + struct list *adb_delete_list; + + /* + * The advertisements are stored in a skiplist. + * Withdrawing + * the registration deletes the advertisement from the + * skiplist, which we can't do while iterating over that + * same skiplist using the current skiplist API. + * + * Strategy: iterate over the skiplist and build another + * list containing only the matching ADBs. Then delete + * _everything_ in that second list (which can be done + * using either skiplists or quagga linklists). + */ + adb_delete_list = list_new(); + + /* + * Advertised IP prefixes (not 0/32 or 0/128) + */ + sl = rfd->advertised.ipN_by_prefix; + + for (cursor = NULL, + rc = skiplist_next(sl, NULL, (void **)&adb, + &cursor); + !rc; rc = skiplist_next(sl, NULL, (void **)&adb, + &cursor)) { + + if (pPrefix) { + if (!prefix_same(pPrefix, + &adb->u.s.prefix_ip)) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: adb=%p, prefix doesn't match, skipping", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: adb=%p, prefix doesn't match, skipping", + __func__, adb); #endif - continue; - } - } - if (pPrd) - { - if (memcmp(pPrd->val, adb->u.s.prd.val, 8) != 0) - { + continue; + } + } + if (pPrd) { + if (memcmp(pPrd->val, adb->u.s.prd.val, + 8) + != 0) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: adb=%p, RD doesn't match, skipping", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: adb=%p, RD doesn't match, skipping", + __func__, adb); #endif - continue; - } - } - if (CHECK_FLAG (cda->l2o.flags, RFAPI_L2O_MACADDR)) - { - if (memcmp - (cda->l2o.o.macaddr.octet, - adb->u.s.prefix_eth.u.prefix_eth.octet, ETHER_ADDR_LEN)) - { + continue; + } + } + if (CHECK_FLAG(cda->l2o.flags, + RFAPI_L2O_MACADDR)) { + if (memcmp(cda->l2o.o.macaddr.octet, + adb->u.s.prefix_eth.u + .prefix_eth.octet, + ETHER_ADDR_LEN)) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: adb=%p, macaddr doesn't match, skipping", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: adb=%p, macaddr doesn't match, skipping", + __func__, adb); #endif - continue; - } - } - - if (CHECK_FLAG (cda->l2o.flags, RFAPI_L2O_LNI)) - { - if (cda->l2o.o.logical_net_id != adb->l2o.logical_net_id) - { + continue; + } + } + + if (CHECK_FLAG(cda->l2o.flags, RFAPI_L2O_LNI)) { + if (cda->l2o.o.logical_net_id + != adb->l2o.logical_net_id) { #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: adb=%p, LNI doesn't match, skipping", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: adb=%p, LNI doesn't match, skipping", + __func__, adb); #endif - continue; - } - } + continue; + } + } #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: ipN adding adb %p to delete list", __func__, - adb); + vnc_zlog_debug_verbose( + "%s: ipN adding adb %p to delete list", + __func__, adb); #endif - listnode_add (adb_delete_list, adb); - } - - struct listnode *node; - - for (ALL_LIST_ELEMENTS_RO (adb_delete_list, node, adb)) - { - int this_advertisement_prefix_count; - struct rfapi_vn_option optary[3]; - struct rfapi_vn_option *opt = NULL; - int cur_opt = 0; - - this_advertisement_prefix_count = 1; - - rfapiQprefix2Rprefix (&adb->u.s.prefix_ip, &rp); - - memset (optary, 0, sizeof (optary)); - - /* if mac addr present in advert, make l2o vn option */ - if (adb->u.s.prefix_eth.family == AF_ETHERNET) - { - if (opt != NULL) - opt->next = &optary[cur_opt]; - opt = &optary[cur_opt++]; - opt->type = RFAPI_VN_OPTION_TYPE_L2ADDR; - opt->v.l2addr.macaddr = adb->u.s.prefix_eth.u.prefix_eth; - ++this_advertisement_prefix_count; - } - /* - * use saved RD value instead of trying to invert - * complex RD computation in rfapi_register() - */ - if (opt != NULL) - opt->next = &optary[cur_opt]; - opt = &optary[cur_opt++]; - opt->type = RFAPI_VN_OPTION_TYPE_INTERNAL_RD; - opt->v.internal_rd = adb->u.s.prd; + listnode_add(adb_delete_list, adb); + } + + struct listnode *node; + + for (ALL_LIST_ELEMENTS_RO(adb_delete_list, node, adb)) { + int this_advertisement_prefix_count; + struct rfapi_vn_option optary[3]; + struct rfapi_vn_option *opt = NULL; + int cur_opt = 0; + + this_advertisement_prefix_count = 1; + + rfapiQprefix2Rprefix(&adb->u.s.prefix_ip, &rp); + + memset(optary, 0, sizeof(optary)); + + /* if mac addr present in advert, make l2o vn + * option */ + if (adb->u.s.prefix_eth.family == AF_ETHERNET) { + if (opt != NULL) + opt->next = &optary[cur_opt]; + opt = &optary[cur_opt++]; + opt->type = RFAPI_VN_OPTION_TYPE_L2ADDR; + opt->v.l2addr.macaddr = + adb->u.s.prefix_eth.u + .prefix_eth; + ++this_advertisement_prefix_count; + } + /* + * use saved RD value instead of trying to + * invert + * complex RD computation in rfapi_register() + */ + if (opt != NULL) + opt->next = &optary[cur_opt]; + opt = &optary[cur_opt++]; + opt->type = RFAPI_VN_OPTION_TYPE_INTERNAL_RD; + opt->v.internal_rd = adb->u.s.prd; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: ipN killing reg from adb %p ", __func__, adb); + vnc_zlog_debug_verbose( + "%s: ipN killing reg from adb %p ", + __func__, adb); #endif - rc = rfapi_register (rfd, &rp, 0, NULL, - (cur_opt ? optary : NULL), RFAPI_REGISTER_KILL); - if (!rc) - { - cda->pfx_count += this_advertisement_prefix_count; - cda->reg_count += 1; - deleted_from_this_nve = 1; - } - if (h->rfp_methods.local_cb) - { - rfapiAddDeleteLocalRfpPrefix (&rfd->un_addr, &rfd->vn_addr, - &rp, 0, 0, NULL, &head, &tail); - } - } - list_delete_all_node (adb_delete_list); - - if (!(pPrefix && !RFAPI_0_PREFIX (pPrefix))) - { - void *cursor; - - /* - * Caller didn't specify a prefix, or specified (0/32 or 0/128) - */ - - /* - * Advertised 0/32 and 0/128 (indexed by ethernet address) - */ - sl = rfd->advertised.ip0_by_ether; - - for (cursor = NULL, - rc = skiplist_next (sl, NULL, (void **) &adb, &cursor); - !rc; rc = skiplist_next (sl, NULL, (void **) &adb, &cursor)) - { - - if (CHECK_FLAG (cda->l2o.flags, RFAPI_L2O_MACADDR)) - { - if (memcmp (cda->l2o.o.macaddr.octet, - adb->u.s.prefix_eth.u.prefix_eth.octet, - ETHER_ADDR_LEN)) - { - - continue; - } - } - if (CHECK_FLAG (cda->l2o.flags, RFAPI_L2O_LNI)) - { - if (cda->l2o.o.logical_net_id != adb->l2o.logical_net_id) - { - continue; - } - } + rc = rfapi_register(rfd, &rp, 0, NULL, + (cur_opt ? optary : NULL), + RFAPI_REGISTER_KILL); + if (!rc) { + cda->pfx_count += + this_advertisement_prefix_count; + cda->reg_count += 1; + deleted_from_this_nve = 1; + } + if (h->rfp_methods.local_cb) { + rfapiAddDeleteLocalRfpPrefix( + &rfd->un_addr, &rfd->vn_addr, + &rp, 0, 0, NULL, &head, &tail); + } + } + list_delete_all_node(adb_delete_list); + + if (!(pPrefix && !RFAPI_0_PREFIX(pPrefix))) { + void *cursor; + + /* + * Caller didn't specify a prefix, or specified + * (0/32 or 0/128) + */ + + /* + * Advertised 0/32 and 0/128 (indexed by + * ethernet address) + */ + sl = rfd->advertised.ip0_by_ether; + + for (cursor = NULL, + rc = skiplist_next(sl, NULL, (void **)&adb, + &cursor); + !rc; + rc = skiplist_next(sl, NULL, (void **)&adb, + &cursor)) { + + if (CHECK_FLAG(cda->l2o.flags, + RFAPI_L2O_MACADDR)) { + if (memcmp(cda->l2o.o.macaddr + .octet, + adb->u.s.prefix_eth.u + .prefix_eth + .octet, + ETHER_ADDR_LEN)) { + + continue; + } + } + if (CHECK_FLAG(cda->l2o.flags, + RFAPI_L2O_LNI)) { + if (cda->l2o.o.logical_net_id + != adb->l2o.logical_net_id) { + continue; + } + } #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: ip0 adding adb %p to delete list", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: ip0 adding adb %p to delete list", + __func__, adb); #endif - listnode_add (adb_delete_list, adb); - } + listnode_add(adb_delete_list, adb); + } - for (ALL_LIST_ELEMENTS_RO (adb_delete_list, node, adb)) - { + for (ALL_LIST_ELEMENTS_RO(adb_delete_list, node, + adb)) { - struct rfapi_vn_option vn; + struct rfapi_vn_option vn; - rfapiQprefix2Rprefix (&adb->u.s.prefix_ip, &rp); + rfapiQprefix2Rprefix( + &adb->u.s.prefix_ip, &rp); - memset (&vn, 0, sizeof (vn)); - vn.type = RFAPI_VN_OPTION_TYPE_L2ADDR; - vn.v.l2addr = adb->l2o; + memset(&vn, 0, sizeof(vn)); + vn.type = RFAPI_VN_OPTION_TYPE_L2ADDR; + vn.v.l2addr = adb->l2o; #if DEBUG_L2_EXTRA - vnc_zlog_debug_verbose ("%s: ip0 killing reg from adb %p ", - __func__, adb); + vnc_zlog_debug_verbose( + "%s: ip0 killing reg from adb %p ", + __func__, adb); #endif - rc = rfapi_register (rfd, &rp, 0, NULL, &vn, - RFAPI_REGISTER_KILL); - if (!rc) - { - cda->pfx_count += 1; - cda->reg_count += 1; - deleted_from_this_nve = 1; - } - if (h->rfp_methods.local_cb) - { - struct rfapi_vn_option *vn_opt_new; - - vn_opt_new = rfapi_vn_options_dup (&vn); - rfapiAddDeleteLocalRfpPrefix (&rfd->un_addr, - &rfd->vn_addr, &rp, 0, 0, - vn_opt_new, &head, &tail); - } - } - list_delete_all_node (adb_delete_list); - } - list_delete (adb_delete_list); - } - - - if (head) - { /* should not be set if (NULL == rfapi_cfg->local_cb) */ - h->flags |= RFAPI_INCALLBACK; - (*h->rfp_methods.local_cb) (head, rfd->cookie); - h->flags &= ~RFAPI_INCALLBACK; - head = tail = NULL; - } - - if (deleted_from_this_nve) - { - /* - * track unique NVEs seen - */ - memset (&ha, 0, sizeof (ha)); - ha.un = rfd->un_addr; - ha.vn = rfd->vn_addr; - - if (!cda->nves) - cda->nves = skiplist_new (0, nve_addr_cmp, nve_addr_free); - if (skiplist_search (cda->nves, &ha, (void **) &hap)) - { - hap = XCALLOC (MTYPE_RFAPI_NVE_ADDR, sizeof (struct nve_addr)); - assert (hap); - ha.cda = cda; - *hap = ha; - skiplist_insert (cda->nves, hap, hap); - } - } - } while (0); /* to preserve old code structure */ - - return 0; + rc = rfapi_register( + rfd, &rp, 0, NULL, &vn, + RFAPI_REGISTER_KILL); + if (!rc) { + cda->pfx_count += 1; + cda->reg_count += 1; + deleted_from_this_nve = 1; + } + if (h->rfp_methods.local_cb) { + struct rfapi_vn_option + *vn_opt_new; + + vn_opt_new = + rfapi_vn_options_dup( + &vn); + rfapiAddDeleteLocalRfpPrefix( + &rfd->un_addr, + &rfd->vn_addr, &rp, 0, + 0, vn_opt_new, &head, + &tail); + } + } + list_delete_all_node(adb_delete_list); + } + list_delete(adb_delete_list); + } + + + if (head) { /* should not be set if (NULL == + rfapi_cfg->local_cb) */ + h->flags |= RFAPI_INCALLBACK; + (*h->rfp_methods.local_cb)(head, rfd->cookie); + h->flags &= ~RFAPI_INCALLBACK; + head = tail = NULL; + } + + if (deleted_from_this_nve) { + /* + * track unique NVEs seen + */ + memset(&ha, 0, sizeof(ha)); + ha.un = rfd->un_addr; + ha.vn = rfd->vn_addr; + + if (!cda->nves) + cda->nves = skiplist_new(0, nve_addr_cmp, + nve_addr_free); + if (skiplist_search(cda->nves, &ha, (void **)&hap)) { + hap = XCALLOC(MTYPE_RFAPI_NVE_ADDR, + sizeof(struct nve_addr)); + assert(hap); + ha.cda = cda; + *hap = ha; + skiplist_insert(cda->nves, hap, hap); + } + } + } while (0); /* to preserve old code structure */ + + return 0; } -static int -rfapiDeleteLocalPrefixes (struct rfapi_local_reg_delete_arg *cda) +static int rfapiDeleteLocalPrefixes(struct rfapi_local_reg_delete_arg *cda) { - int rc = 0; - - if (cda->rfg) - { - if (cda->rfg->rfd) /* if not open, nothing to delete */ - rc = rfapiDeleteLocalPrefixesByRFD (cda, cda->rfg->rfd); - } - else - { - struct bgp *bgp = cda->bgp; - struct rfapi *h; - struct rfapi_cfg *rfapi_cfg; - - struct listnode *node; - struct rfapi_descriptor *rfd; - if (!bgp) - return ENXIO; - h = bgp->rfapi; - rfapi_cfg = bgp->rfapi_cfg; - if (!h || !rfapi_cfg) - return ENXIO; - vnc_zlog_debug_verbose ("%s: starting descriptor loop", __func__); - for (ALL_LIST_ELEMENTS_RO (&h->descriptors, node, rfd)) - { - rc = rfapiDeleteLocalPrefixesByRFD (cda, rfd); - } - } - return rc; + int rc = 0; + + if (cda->rfg) { + if (cda->rfg->rfd) /* if not open, nothing to delete */ + rc = rfapiDeleteLocalPrefixesByRFD(cda, cda->rfg->rfd); + } else { + struct bgp *bgp = cda->bgp; + struct rfapi *h; + struct rfapi_cfg *rfapi_cfg; + + struct listnode *node; + struct rfapi_descriptor *rfd; + if (!bgp) + return ENXIO; + h = bgp->rfapi; + rfapi_cfg = bgp->rfapi_cfg; + if (!h || !rfapi_cfg) + return ENXIO; + vnc_zlog_debug_verbose("%s: starting descriptor loop", + __func__); + for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) { + rc = rfapiDeleteLocalPrefixesByRFD(cda, rfd); + } + } + return rc; } /* @@ -3667,110 +3375,99 @@ rfapiDeleteLocalPrefixes (struct rfapi_local_reg_delete_arg *cda) * * Deletes local and remote prefixes that match */ -static void -clear_vnc_prefix (struct rfapi_local_reg_delete_arg *cda) +static void clear_vnc_prefix(struct rfapi_local_reg_delete_arg *cda) { - struct prefix pfx_un; - struct prefix pfx_vn; - - struct prefix *pUN = NULL; - struct prefix *pVN = NULL; - struct prefix *pPrefix = NULL; - - struct rfapi_import_table *it = NULL; - - /* - * Delete matching remote prefixes in holddown - */ - if (cda->vn_address.addr_family) - { - if (!rfapiRaddr2Qprefix (&cda->vn_address, &pfx_vn)) - pVN = &pfx_vn; - } - if (cda->un_address.addr_family) - { - if (!rfapiRaddr2Qprefix (&cda->un_address, &pfx_un)) - pUN = &pfx_un; - } - if (cda->prefix.family) - { - pPrefix = &cda->prefix; - } - if (cda->rfg) - { - it = cda->rfg->rfapi_import_table; - } - rfapiDeleteRemotePrefixes (pUN, pVN, pPrefix, it, - 0, 1, &cda->remote_active_pfx_count, - &cda->remote_active_nve_count, - &cda->remote_holddown_pfx_count, - &cda->remote_holddown_nve_count); - - /* - * Now do local prefixes - */ - rfapiDeleteLocalPrefixes (cda); + struct prefix pfx_un; + struct prefix pfx_vn; + + struct prefix *pUN = NULL; + struct prefix *pVN = NULL; + struct prefix *pPrefix = NULL; + + struct rfapi_import_table *it = NULL; + + /* + * Delete matching remote prefixes in holddown + */ + if (cda->vn_address.addr_family) { + if (!rfapiRaddr2Qprefix(&cda->vn_address, &pfx_vn)) + pVN = &pfx_vn; + } + if (cda->un_address.addr_family) { + if (!rfapiRaddr2Qprefix(&cda->un_address, &pfx_un)) + pUN = &pfx_un; + } + if (cda->prefix.family) { + pPrefix = &cda->prefix; + } + if (cda->rfg) { + it = cda->rfg->rfapi_import_table; + } + rfapiDeleteRemotePrefixes( + pUN, pVN, pPrefix, it, 0, 1, &cda->remote_active_pfx_count, + &cda->remote_active_nve_count, &cda->remote_holddown_pfx_count, + &cda->remote_holddown_nve_count); + + /* + * Now do local prefixes + */ + rfapiDeleteLocalPrefixes(cda); } -static void -print_cleared_stats (struct rfapi_local_reg_delete_arg *cda) +static void print_cleared_stats(struct rfapi_local_reg_delete_arg *cda) { - struct vty *vty = cda->vty; /* for benefit of VTY_NEWLINE */ - - /* Our special element-deleting function counts nves */ - if (cda->nves) - { - skiplist_free (cda->nves); - cda->nves = NULL; - } - if (cda->failed_pfx_count) - vty_out (vty, "Failed to delete %d prefixes%s", - cda->failed_pfx_count, VTY_NEWLINE); - - /* left as "prefixes" even in single case for ease of machine parsing */ - vty_out (vty, - "[Local] Cleared %u registrations, %u prefixes, %u responses from %d NVEs%s", - cda->reg_count, cda->pfx_count, cda->query_count, cda->nve_count, - VTY_NEWLINE); - -/* - * We don't currently allow deletion of active remote prefixes from - * the command line - */ - - vty_out (vty, "[Holddown] Cleared %u prefixes from %u NVEs%s", - cda->remote_holddown_pfx_count, cda->remote_holddown_nve_count, - VTY_NEWLINE); + struct vty *vty = cda->vty; /* for benefit of VTY_NEWLINE */ + + /* Our special element-deleting function counts nves */ + if (cda->nves) { + skiplist_free(cda->nves); + cda->nves = NULL; + } + if (cda->failed_pfx_count) + vty_out(vty, "Failed to delete %d prefixes%s", + cda->failed_pfx_count, VTY_NEWLINE); + + /* left as "prefixes" even in single case for ease of machine parsing */ + vty_out(vty, + "[Local] Cleared %u registrations, %u prefixes, %u responses from %d NVEs%s", + cda->reg_count, cda->pfx_count, cda->query_count, + cda->nve_count, VTY_NEWLINE); + + /* + * We don't currently allow deletion of active remote prefixes from + * the command line + */ + + vty_out(vty, "[Holddown] Cleared %u prefixes from %u NVEs%s", + cda->remote_holddown_pfx_count, cda->remote_holddown_nve_count, + VTY_NEWLINE); } -/* +/* * Caller has already deleted registrations and queries for this/these * NVEs. Now we just have to close their descriptors. */ -static void -clear_vnc_nve_closer (struct rfapi_local_reg_delete_arg *cda) +static void clear_vnc_nve_closer(struct rfapi_local_reg_delete_arg *cda) { - struct skiplist *sl = cda->nves; /* contains affected NVEs */ - struct nve_addr *pKey; - struct nve_addr *pValue; - void *cursor = NULL; - int rc; - - if (!sl) - return; - - for (rc = skiplist_next (sl, (void **) &pKey, (void **) &pValue, &cursor); - !rc; - rc = skiplist_next (sl, (void **) &pKey, (void **) &pValue, &cursor)) - { - - if (pValue->rfd) - { - ((struct rfapi_descriptor *) pValue->rfd)->flags |= - RFAPI_HD_FLAG_CLOSING_ADMINISTRATIVELY; - rfapi_close (pValue->rfd); - } - } + struct skiplist *sl = cda->nves; /* contains affected NVEs */ + struct nve_addr *pKey; + struct nve_addr *pValue; + void *cursor = NULL; + int rc; + + if (!sl) + return; + + for (rc = skiplist_next(sl, (void **)&pKey, (void **)&pValue, &cursor); + !rc; rc = skiplist_next(sl, (void **)&pKey, (void **)&pValue, + &cursor)) { + + if (pValue->rfd) { + ((struct rfapi_descriptor *)pValue->rfd)->flags |= + RFAPI_HD_FLAG_CLOSING_ADMINISTRATIVELY; + rfapi_close(pValue->rfd); + } + } } DEFUN (clear_vnc_nve_all, @@ -3782,21 +3479,22 @@ DEFUN (clear_vnc_nve_all, "For all NVEs\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; + struct rfapi_local_reg_delete_arg cda; + int rc; - if ((rc = parse_deleter_args (vty, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &cda))) - return rc; + if ((rc = parse_deleter_args(vty, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, &cda))) + return rc; - cda.vty = vty; + cda.vty = vty; - clear_vnc_responses (&cda); - clear_vnc_prefix (&cda); - clear_vnc_nve_closer (&cda); + clear_vnc_responses(&cda); + clear_vnc_prefix(&cda); + clear_vnc_nve_closer(&cda); - print_cleared_stats (&cda); + print_cleared_stats(&cda); - return 0; + return 0; } DEFUN (clear_vnc_nve_vn_un, @@ -3814,22 +3512,22 @@ DEFUN (clear_vnc_nve_vn_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; + struct rfapi_local_reg_delete_arg cda; + int rc; - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, argv[4], argv[6], NULL, NULL, NULL, NULL, &cda))) - return rc; + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[4], argv[6], NULL, + NULL, NULL, NULL, &cda))) + return rc; - cda.vty = vty; + cda.vty = vty; - clear_vnc_responses (&cda); - clear_vnc_prefix (&cda); - clear_vnc_nve_closer (&cda); + clear_vnc_responses(&cda); + clear_vnc_prefix(&cda); + clear_vnc_nve_closer(&cda); - print_cleared_stats (&cda); + print_cleared_stats(&cda); - return 0; + return 0; } DEFUN (clear_vnc_nve_un_vn, @@ -3847,22 +3545,22 @@ DEFUN (clear_vnc_nve_un_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; + struct rfapi_local_reg_delete_arg cda; + int rc; - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, argv[6], argv[4], NULL, NULL, NULL, NULL, &cda))) - return rc; + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[6], argv[4], NULL, + NULL, NULL, NULL, &cda))) + return rc; - cda.vty = vty; + cda.vty = vty; - clear_vnc_responses (&cda); - clear_vnc_prefix (&cda); - clear_vnc_nve_closer (&cda); + clear_vnc_responses(&cda); + clear_vnc_prefix(&cda); + clear_vnc_nve_closer(&cda); - print_cleared_stats (&cda); + print_cleared_stats(&cda); - return 0; + return 0; } DEFUN (clear_vnc_nve_vn, @@ -3876,20 +3574,21 @@ DEFUN (clear_vnc_nve_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; + struct rfapi_local_reg_delete_arg cda; + int rc; - if ((rc = parse_deleter_tokens (vty, NULL, NULL, argv[4], NULL, NULL, NULL, NULL, NULL, &cda))) - return rc; + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[4], NULL, NULL, + NULL, NULL, NULL, &cda))) + return rc; - cda.vty = vty; + cda.vty = vty; - clear_vnc_responses (&cda); - clear_vnc_prefix (&cda); - clear_vnc_nve_closer (&cda); + clear_vnc_responses(&cda); + clear_vnc_prefix(&cda); + clear_vnc_nve_closer(&cda); - print_cleared_stats (&cda); - return 0; + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_nve_un, @@ -3903,20 +3602,21 @@ DEFUN (clear_vnc_nve_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; + struct rfapi_local_reg_delete_arg cda; + int rc; - if ((rc = parse_deleter_tokens (vty, NULL, NULL, NULL, argv[4], NULL, NULL, NULL, NULL, &cda))) - return rc; + if ((rc = parse_deleter_tokens(vty, NULL, NULL, NULL, argv[4], NULL, + NULL, NULL, NULL, &cda))) + return rc; - cda.vty = vty; + cda.vty = vty; - clear_vnc_responses (&cda); - clear_vnc_prefix (&cda); - clear_vnc_nve_closer (&cda); + clear_vnc_responses(&cda); + clear_vnc_prefix(&cda); + clear_vnc_nve_closer(&cda); - print_cleared_stats (&cda); - return 0; + print_cleared_stats(&cda); + return 0; } /*------------------------------------------------- @@ -3945,16 +3645,16 @@ DEFUN (clear_vnc_prefix_vn_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - if ((rc = - parse_deleter_tokens (vty, NULL, argv[3], argv[5], argv[7], NULL, NULL, NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + if ((rc = parse_deleter_tokens(vty, NULL, argv[3], argv[5], argv[7], + NULL, NULL, NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_prefix_un_vn, @@ -3975,16 +3675,16 @@ DEFUN (clear_vnc_prefix_un_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - if ((rc = - parse_deleter_tokens (vty, NULL, argv[3], argv[7], argv[5], NULL, NULL, NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + if ((rc = parse_deleter_tokens(vty, NULL, argv[3], argv[7], argv[5], + NULL, NULL, NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_prefix_un, @@ -4001,16 +3701,16 @@ DEFUN (clear_vnc_prefix_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - if ((rc = - parse_deleter_tokens (vty, NULL, argv[3], NULL, argv[5], NULL, NULL, NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + if ((rc = parse_deleter_tokens(vty, NULL, argv[3], NULL, argv[5], NULL, + NULL, NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_prefix_vn, @@ -4027,16 +3727,16 @@ DEFUN (clear_vnc_prefix_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - if ((rc = - parse_deleter_tokens (vty, NULL, argv[3], argv[5], NULL, NULL, NULL, NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + if ((rc = parse_deleter_tokens(vty, NULL, argv[3], argv[5], NULL, NULL, + NULL, NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_prefix_all, @@ -4050,15 +3750,16 @@ DEFUN (clear_vnc_prefix_all, "IPv6 prefix\n" "From any NVE\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - if ((rc = parse_deleter_tokens (vty, NULL, argv[3], NULL, NULL, NULL, NULL, NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + if ((rc = parse_deleter_tokens(vty, NULL, argv[3], NULL, NULL, NULL, + NULL, NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } /*------------------------------------------------- @@ -4090,18 +3791,17 @@ DEFUN (clear_vnc_mac_vn_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, argv[7], argv[9], argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[7], argv[9], + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_un_vn, @@ -4124,18 +3824,17 @@ DEFUN (clear_vnc_mac_un_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, argv[9], argv[7], argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[9], argv[7], + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_un, @@ -4154,17 +3853,17 @@ DEFUN (clear_vnc_mac_un, "UN IPv4 interface address\n" "UN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, NULL, argv[7], argv[3], argv[5], NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, NULL, NULL, argv[7], argv[3], + argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_vn, @@ -4183,17 +3882,17 @@ DEFUN (clear_vnc_mac_vn, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, argv[7], NULL, argv[3], argv[5], NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, NULL, argv[7], NULL, argv[3], + argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_all, @@ -4209,17 +3908,17 @@ DEFUN (clear_vnc_mac_all, "Virtual network identifier\n" "From any NVE\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, NULL, NULL, NULL, argv[3], argv[5], NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, NULL, NULL, NULL, argv[3], + argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } /*------------------------------------------------- @@ -4250,18 +3949,17 @@ DEFUN (clear_vnc_mac_vn_un_prefix, "IPv4 prefix\n" "IPv6 prefix\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, argv[11], argv[7], argv[9], argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, argv[11], argv[7], argv[9], + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_un_vn_prefix, @@ -4292,18 +3990,17 @@ DEFUN (clear_vnc_mac_un_vn_prefix, "IPv4 prefix\n" "IPv6 prefix\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, argv[11], argv[9], argv[7], argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, argv[11], argv[9], argv[7], + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_un_prefix, @@ -4326,18 +4023,17 @@ DEFUN (clear_vnc_mac_un_prefix, "IPv4 Prefix\n" "IPv6 Prefix\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, argv[9], NULL, argv[7], argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, argv[9], NULL, argv[7], + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_vn_prefix, @@ -4360,18 +4056,17 @@ DEFUN (clear_vnc_mac_vn_prefix, "IPv4 Prefix\n" "IPv6 Prefix\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, argv[9], argv[7], NULL, argv[3], argv[5], - NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, argv[9], argv[7], NULL, + argv[3], argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } DEFUN (clear_vnc_mac_all_prefix, @@ -4390,17 +4085,17 @@ DEFUN (clear_vnc_mac_all_prefix, "VN IPv4 interface address\n" "VN IPv6 interface address\n") { - struct rfapi_local_reg_delete_arg cda; - int rc; - - /* pfx vn un L2 VNI */ - if ((rc = - parse_deleter_tokens (vty, NULL, argv[7], NULL, NULL, argv[3], argv[5], NULL, NULL, &cda))) - return rc; - cda.vty = vty; - clear_vnc_prefix (&cda); - print_cleared_stats (&cda); - return 0; + struct rfapi_local_reg_delete_arg cda; + int rc; + + /* pfx vn un L2 VNI */ + if ((rc = parse_deleter_tokens(vty, NULL, argv[7], NULL, NULL, argv[3], + argv[5], NULL, NULL, &cda))) + return rc; + cda.vty = vty; + clear_vnc_prefix(&cda); + print_cleared_stats(&cda); + return 0; } /************************************************************************ @@ -4409,223 +4104,219 @@ DEFUN (clear_vnc_mac_all_prefix, /* copied from rfp_vty.c */ -static int -check_and_display_is_vnc_running (struct vty *vty) +static int check_and_display_is_vnc_running(struct vty *vty) { - if (!bgp_rfapi_is_vnc_configured (NULL)) - return 1; /* is running */ - - if (vty) - { - vty_out (vty, - "VNC is not configured. (There are no configured BGP VPN SAFI peers.)%s", - VTY_NEWLINE); - } - return 0; /* not running */ + if (!bgp_rfapi_is_vnc_configured(NULL)) + return 1; /* is running */ + + if (vty) { + vty_out(vty, + "VNC is not configured. (There are no configured BGP VPN SAFI peers.)%s", + VTY_NEWLINE); + } + return 0; /* not running */ } -static int -rfapi_vty_show_nve_summary (struct vty *vty, show_nve_summary_t show_type) +static int rfapi_vty_show_nve_summary(struct vty *vty, + show_nve_summary_t show_type) { - struct bgp *bgp_default = bgp_get_default (); - struct rfapi *h; - int is_vnc_running = !bgp_rfapi_is_vnc_configured (bgp_default); - - int active_local_routes; - int active_remote_routes; - int holddown_remote_routes; - int imported_remote_routes; - - if (!bgp_default) - goto notcfg; - - h = bgp_default->rfapi; - - if (!h) - goto notcfg; - - /* don't show local info if not running RFP */ - if (is_vnc_running || show_type == SHOW_NVE_SUMMARY_REGISTERED) - { - - switch (show_type) - { - - case SHOW_NVE_SUMMARY_ACTIVE_NVES: - vty_out (vty, "%-24s ", "NVEs:"); - vty_out (vty, "%-8s %-8u ", "Active:", h->descriptors.count); - vty_out (vty, "%-8s %-8u ", "Maximum:", h->stat.max_descriptors); - vty_out (vty, "%-8s %-8u", "Unknown:", h->stat.count_unknown_nves); - break; - - case SHOW_NVE_SUMMARY_REGISTERED: - /* - * NB: With the introduction of L2 route support, we no - * longer have a one-to-one correspondence between - * locally-originated route advertisements and routes in - * the import tables that have local origin. This - * discrepancy arises because a single advertisement - * may contain both an IP prefix and a MAC address. - * Such an advertisement results in two import table - * entries: one indexed by IP prefix, the other indexed - * by MAC address. - * - * TBD: update computation and display of registration - * statistics to reflect the underlying semantics. - */ - if (is_vnc_running) - { - vty_out (vty, "%-24s ", "Registrations:"); - vty_out (vty, "%-8s %-8u ", "Active:", - rfapiApCountAll (bgp_default)); - vty_out (vty, "%-8s %-8u ", "Failed:", - h->stat.count_registrations_failed); - vty_out (vty, "%-8s %-8u", "Total:", - h->stat.count_registrations); - vty_out (vty, "%s", VTY_NEWLINE); - } - vty_out (vty, "%-24s ", "Prefixes registered:"); - vty_out (vty, "%s", VTY_NEWLINE); - - rfapiCountAllItRoutes (&active_local_routes, - &active_remote_routes, - &holddown_remote_routes, - &imported_remote_routes); - - /* local */ - if (is_vnc_running) - { - vty_out (vty, " %-20s ", "Locally:"); - vty_out (vty, "%-8s %-8u ", "Active:", active_local_routes); - vty_out (vty, "%s", VTY_NEWLINE); - } - - - vty_out (vty, " %-20s ", "Remotely:"); - vty_out (vty, "%-8s %-8u", "Active:", active_remote_routes); - vty_out (vty, "%s", VTY_NEWLINE); - vty_out (vty, " %-20s ", "In Holddown:"); - vty_out (vty, "%-8s %-8u", "Active:", holddown_remote_routes); - vty_out (vty, "%s", VTY_NEWLINE); - vty_out (vty, " %-20s ", "Imported:"); - vty_out (vty, "%-8s %-8u", "Active:", imported_remote_routes); - break; - - case SHOW_NVE_SUMMARY_QUERIES: - vty_out (vty, "%-24s ", "Queries:"); - vty_out (vty, "%-8s %-8u ", "Active:", rfapi_monitor_count (NULL)); - vty_out (vty, "%-8s %-8u ", "Failed:", - h->stat.count_queries_failed); - vty_out (vty, "%-8s %-8u", "Total:", h->stat.count_queries); - break; - - case SHOW_NVE_SUMMARY_RESPONSES: - rfapiRibShowResponsesSummary (vty); - - default: - break; - } - vty_out (vty, "%s", VTY_NEWLINE); - } - return 0; + struct bgp *bgp_default = bgp_get_default(); + struct rfapi *h; + int is_vnc_running = !bgp_rfapi_is_vnc_configured(bgp_default); + + int active_local_routes; + int active_remote_routes; + int holddown_remote_routes; + int imported_remote_routes; + + if (!bgp_default) + goto notcfg; + + h = bgp_default->rfapi; + + if (!h) + goto notcfg; + + /* don't show local info if not running RFP */ + if (is_vnc_running || show_type == SHOW_NVE_SUMMARY_REGISTERED) { + + switch (show_type) { + + case SHOW_NVE_SUMMARY_ACTIVE_NVES: + vty_out(vty, "%-24s ", "NVEs:"); + vty_out(vty, "%-8s %-8u ", + "Active:", h->descriptors.count); + vty_out(vty, "%-8s %-8u ", + "Maximum:", h->stat.max_descriptors); + vty_out(vty, "%-8s %-8u", + "Unknown:", h->stat.count_unknown_nves); + break; + + case SHOW_NVE_SUMMARY_REGISTERED: + /* + * NB: With the introduction of L2 route support, we no + * longer have a one-to-one correspondence between + * locally-originated route advertisements and routes in + * the import tables that have local origin. This + * discrepancy arises because a single advertisement + * may contain both an IP prefix and a MAC address. + * Such an advertisement results in two import table + * entries: one indexed by IP prefix, the other indexed + * by MAC address. + * + * TBD: update computation and display of registration + * statistics to reflect the underlying semantics. + */ + if (is_vnc_running) { + vty_out(vty, "%-24s ", "Registrations:"); + vty_out(vty, "%-8s %-8u ", "Active:", + rfapiApCountAll(bgp_default)); + vty_out(vty, "%-8s %-8u ", "Failed:", + h->stat.count_registrations_failed); + vty_out(vty, "%-8s %-8u", + "Total:", h->stat.count_registrations); + vty_out(vty, "%s", VTY_NEWLINE); + } + vty_out(vty, "%-24s ", "Prefixes registered:"); + vty_out(vty, "%s", VTY_NEWLINE); + + rfapiCountAllItRoutes(&active_local_routes, + &active_remote_routes, + &holddown_remote_routes, + &imported_remote_routes); + + /* local */ + if (is_vnc_running) { + vty_out(vty, " %-20s ", "Locally:"); + vty_out(vty, "%-8s %-8u ", + "Active:", active_local_routes); + vty_out(vty, "%s", VTY_NEWLINE); + } + + + vty_out(vty, " %-20s ", "Remotely:"); + vty_out(vty, "%-8s %-8u", + "Active:", active_remote_routes); + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, " %-20s ", "In Holddown:"); + vty_out(vty, "%-8s %-8u", + "Active:", holddown_remote_routes); + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, " %-20s ", "Imported:"); + vty_out(vty, "%-8s %-8u", + "Active:", imported_remote_routes); + break; + + case SHOW_NVE_SUMMARY_QUERIES: + vty_out(vty, "%-24s ", "Queries:"); + vty_out(vty, "%-8s %-8u ", + "Active:", rfapi_monitor_count(NULL)); + vty_out(vty, "%-8s %-8u ", + "Failed:", h->stat.count_queries_failed); + vty_out(vty, "%-8s %-8u", + "Total:", h->stat.count_queries); + break; + + case SHOW_NVE_SUMMARY_RESPONSES: + rfapiRibShowResponsesSummary(vty); + + default: + break; + } + vty_out(vty, "%s", VTY_NEWLINE); + } + return 0; notcfg: - vty_out (vty, "VNC is not configured.%s", VTY_NEWLINE); - return CMD_WARNING; + vty_out(vty, "VNC is not configured.%s", VTY_NEWLINE); + return CMD_WARNING; } -static int -rfapi_show_nves ( - struct vty *vty, - struct prefix *vn_prefix, - struct prefix *un_prefix) +static int rfapi_show_nves(struct vty *vty, struct prefix *vn_prefix, + struct prefix *un_prefix) { - //struct hash *rfds; - //struct rfp_rfapi_descriptor_param param; - - struct bgp *bgp_default = bgp_get_default (); - struct rfapi *h; - struct listnode *node; - struct rfapi_descriptor *rfd; - - int total = 0; - int printed = 0; - int rc; - - if (!bgp_default) - goto notcfg; - - h = bgp_default->rfapi; - - if (!h) - goto notcfg; - - rc = rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_ACTIVE_NVES); - if (rc) - return rc; - - for (ALL_LIST_ELEMENTS_RO (&h->descriptors, node, rfd)) - { - struct prefix pfx; - char vn_addr_buf[INET6_ADDRSTRLEN] = - { - 0,}; - char un_addr_buf[INET6_ADDRSTRLEN] = - { - 0,}; - char age[10]; - - ++total; - - if (vn_prefix) - { - assert (!rfapiRaddr2Qprefix (&rfd->vn_addr, &pfx)); - if (!prefix_match (vn_prefix, &pfx)) - continue; - } - - if (un_prefix) - { - assert (!rfapiRaddr2Qprefix (&rfd->un_addr, &pfx)); - if (!prefix_match (un_prefix, &pfx)) - continue; - } - - rfapiRfapiIpAddr2Str (&rfd->vn_addr, vn_addr_buf, INET6_ADDRSTRLEN); - rfapiRfapiIpAddr2Str (&rfd->un_addr, un_addr_buf, INET6_ADDRSTRLEN); - - if (!printed) - { - /* print out a header */ - vty_out (vty, " " - "Active Next Hops%s", VTY_NEWLINE); - vty_out (vty, "%-15s %-15s %-5s %-5s %-6s %-6s %s%s", - "VN Address", - "UN Address", - "Regis", "Resps", "Reach", "Remove", "Age", VTY_NEWLINE); - } - - ++printed; - - vty_out (vty, "%-15s %-15s %-5u %-5u %-6u %-6u %s%s", - vn_addr_buf, - un_addr_buf, - rfapiApCount (rfd), - rfapi_monitor_count (rfd), - rfd->stat_count_nh_reachable, - rfd->stat_count_nh_removal, - rfapiFormatAge (rfd->open_time, age, 10), VTY_NEWLINE); - } - - if (printed > 0 || vn_prefix || un_prefix) - vty_out (vty, "Displayed %d out of %d active NVEs%s", - printed, total, VTY_NEWLINE); - - return 0; + // struct hash *rfds; + // struct rfp_rfapi_descriptor_param param; + + struct bgp *bgp_default = bgp_get_default(); + struct rfapi *h; + struct listnode *node; + struct rfapi_descriptor *rfd; + + int total = 0; + int printed = 0; + int rc; + + if (!bgp_default) + goto notcfg; + + h = bgp_default->rfapi; + + if (!h) + goto notcfg; + + rc = rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_ACTIVE_NVES); + if (rc) + return rc; + + for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) { + struct prefix pfx; + char vn_addr_buf[INET6_ADDRSTRLEN] = { + 0, + }; + char un_addr_buf[INET6_ADDRSTRLEN] = { + 0, + }; + char age[10]; + + ++total; + + if (vn_prefix) { + assert(!rfapiRaddr2Qprefix(&rfd->vn_addr, &pfx)); + if (!prefix_match(vn_prefix, &pfx)) + continue; + } + + if (un_prefix) { + assert(!rfapiRaddr2Qprefix(&rfd->un_addr, &pfx)); + if (!prefix_match(un_prefix, &pfx)) + continue; + } + + rfapiRfapiIpAddr2Str(&rfd->vn_addr, vn_addr_buf, + INET6_ADDRSTRLEN); + rfapiRfapiIpAddr2Str(&rfd->un_addr, un_addr_buf, + INET6_ADDRSTRLEN); + + if (!printed) { + /* print out a header */ + vty_out(vty, + " " + "Active Next Hops%s", + VTY_NEWLINE); + vty_out(vty, "%-15s %-15s %-5s %-5s %-6s %-6s %s%s", + "VN Address", "UN Address", "Regis", "Resps", + "Reach", "Remove", "Age", VTY_NEWLINE); + } + + ++printed; + + vty_out(vty, "%-15s %-15s %-5u %-5u %-6u %-6u %s%s", + vn_addr_buf, un_addr_buf, rfapiApCount(rfd), + rfapi_monitor_count(rfd), rfd->stat_count_nh_reachable, + rfd->stat_count_nh_removal, + rfapiFormatAge(rfd->open_time, age, 10), VTY_NEWLINE); + } + + if (printed > 0 || vn_prefix || un_prefix) + vty_out(vty, "Displayed %d out of %d active NVEs%s", printed, + total, VTY_NEWLINE); + + return 0; notcfg: - vty_out (vty, "VNC is not configured.%s", VTY_NEWLINE); - return CMD_WARNING; + vty_out(vty, "VNC is not configured.%s", VTY_NEWLINE); + return CMD_WARNING; } @@ -4636,15 +4327,15 @@ DEFUN (vnc_show_summary, VNC_SHOW_STR "Display VNC status summary\n") { - if (!check_and_display_is_vnc_running (vty)) - return CMD_SUCCESS; - bgp_rfapi_show_summary (bgp_get_default (), vty); - vty_out (vty, "%s", VTY_NEWLINE); - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_ACTIVE_NVES); - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_QUERIES); - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_RESPONSES); - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_REGISTERED); - return CMD_SUCCESS; + if (!check_and_display_is_vnc_running(vty)) + return CMD_SUCCESS; + bgp_rfapi_show_summary(bgp_get_default(), vty); + vty_out(vty, "%s", VTY_NEWLINE); + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_ACTIVE_NVES); + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_QUERIES); + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_RESPONSES); + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_REGISTERED); + return CMD_SUCCESS; } DEFUN (vnc_show_nves, @@ -4654,8 +4345,8 @@ DEFUN (vnc_show_nves, VNC_SHOW_STR "List known NVEs\n") { - rfapi_show_nves (vty, NULL, NULL); - return CMD_SUCCESS; + rfapi_show_nves(vty, NULL, NULL); + return CMD_SUCCESS; } DEFUN (vnc_show_nves_ptct, @@ -4669,75 +4360,67 @@ DEFUN (vnc_show_nves_ptct, "IPv4 interface address\n" "IPv6 interface address\n") { - struct prefix pfx; - - if (!check_and_display_is_vnc_running (vty)) - return CMD_SUCCESS; - - if (!str2prefix (argv[4]->arg, &pfx)) - { - vty_out (vty, "Malformed address \"%s\"%s", argv[4]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - if (pfx.family != AF_INET && pfx.family != AF_INET6) - { - vty_out (vty, "Invalid address \"%s\"%s", argv[4]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - - if (argv[3]->arg[0] == 'u') - { - rfapi_show_nves (vty, NULL, &pfx); - } - else - { - rfapi_show_nves (vty, &pfx, NULL); - } - - return CMD_SUCCESS; + struct prefix pfx; + + if (!check_and_display_is_vnc_running(vty)) + return CMD_SUCCESS; + + if (!str2prefix(argv[4]->arg, &pfx)) { + vty_out(vty, "Malformed address \"%s\"%s", argv[4]->arg, + VTY_NEWLINE); + return CMD_WARNING; + } + if (pfx.family != AF_INET && pfx.family != AF_INET6) { + vty_out(vty, "Invalid address \"%s\"%s", argv[4]->arg, + VTY_NEWLINE); + return CMD_WARNING; + } + + if (argv[3]->arg[0] == 'u') { + rfapi_show_nves(vty, NULL, &pfx); + } else { + rfapi_show_nves(vty, &pfx, NULL); + } + + return CMD_SUCCESS; } /* adapted from rfp_registration_cache_log() */ -static void -rfapi_show_registrations ( - struct vty *vty, - struct prefix *restrict_to, - int show_local, - int show_remote, - int show_holddown, - int show_imported) +static void rfapi_show_registrations(struct vty *vty, + struct prefix *restrict_to, int show_local, + int show_remote, int show_holddown, + int show_imported) { - int printed = 0; - - if (!vty) - return; - - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_REGISTERED); - - if (show_local) - { - /* non-expiring, local */ - printed += rfapiShowRemoteRegistrations (vty, restrict_to, 0, 1, 0, 0); - } - if (show_remote) - { - /* non-expiring, non-local */ - printed += rfapiShowRemoteRegistrations (vty, restrict_to, 0, 0, 1, 0); - } - if (show_holddown) - { - /* expiring, including local */ - printed += rfapiShowRemoteRegistrations (vty, restrict_to, 1, 1, 1, 0); - } - if (show_imported) - { - /* non-expiring, non-local */ - printed += rfapiShowRemoteRegistrations (vty, restrict_to, 0, 0, 1, 1); - } - if (!printed) - { - vty_out (vty, "%s", VTY_NEWLINE); - } + int printed = 0; + + if (!vty) + return; + + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_REGISTERED); + + if (show_local) { + /* non-expiring, local */ + printed += rfapiShowRemoteRegistrations(vty, restrict_to, 0, 1, + 0, 0); + } + if (show_remote) { + /* non-expiring, non-local */ + printed += rfapiShowRemoteRegistrations(vty, restrict_to, 0, 0, + 1, 0); + } + if (show_holddown) { + /* expiring, including local */ + printed += rfapiShowRemoteRegistrations(vty, restrict_to, 1, 1, + 1, 0); + } + if (show_imported) { + /* non-expiring, non-local */ + printed += rfapiShowRemoteRegistrations(vty, restrict_to, 0, 0, + 1, 1); + } + if (!printed) { + vty_out(vty, "%s", VTY_NEWLINE); + } } DEFUN (vnc_show_registrations_pfx, @@ -4750,24 +4433,21 @@ DEFUN (vnc_show_registrations_pfx, "Limit output to a particular IPv6 prefix\n" "Limit output to a particular IPv6 address\n") { - struct prefix p; - struct prefix *p_addr = NULL; - - if (argc > 3) - { - if (!str2prefix (argv[3]->arg, &p)) - { - vty_out (vty, "Invalid prefix: %s%s", argv[3]->arg, VTY_NEWLINE); - return CMD_SUCCESS; - } - else - { - p_addr = &p; - } - } - - rfapi_show_registrations (vty, p_addr, 1, 1, 1, 1); - return CMD_SUCCESS; + struct prefix p; + struct prefix *p_addr = NULL; + + if (argc > 3) { + if (!str2prefix(argv[3]->arg, &p)) { + vty_out(vty, "Invalid prefix: %s%s", argv[3]->arg, + VTY_NEWLINE); + return CMD_SUCCESS; + } else { + p_addr = &p; + } + } + + rfapi_show_registrations(vty, p_addr, 1, 1, 1, 1); + return CMD_SUCCESS; } DEFUN (vnc_show_registrations_some_pfx, @@ -4785,56 +4465,51 @@ DEFUN (vnc_show_registrations_some_pfx, "Limit output to a particular prefix or address\n" "Limit output to a particular prefix or address\n") { - struct prefix p; - struct prefix *p_addr = NULL; - - int show_local = 0; - int show_remote = 0; - int show_holddown = 0; - int show_imported = 0; - - if (argc > 4) - { - if (!str2prefix (argv[4]->arg, &p)) - { - vty_out (vty, "Invalid prefix: %s%s", argv[4]->arg, VTY_NEWLINE); - return CMD_SUCCESS; - } - else - { - p_addr = &p; - } - } - switch (argv[3]->arg[0]) - { - case 'a': - show_local = 1; - show_remote = 1; - show_holddown = 1; - show_imported = 1; - break; - - case 'h': - show_holddown = 1; - break; - - case 'i': - show_imported = 1; - break; - - case 'l': - show_local = 1; - break; - - case 'r': - show_remote = 1; - break; - } - - rfapi_show_registrations (vty, p_addr, - show_local, show_remote, show_holddown, - show_imported); - return CMD_SUCCESS; + struct prefix p; + struct prefix *p_addr = NULL; + + int show_local = 0; + int show_remote = 0; + int show_holddown = 0; + int show_imported = 0; + + if (argc > 4) { + if (!str2prefix(argv[4]->arg, &p)) { + vty_out(vty, "Invalid prefix: %s%s", argv[4]->arg, + VTY_NEWLINE); + return CMD_SUCCESS; + } else { + p_addr = &p; + } + } + switch (argv[3]->arg[0]) { + case 'a': + show_local = 1; + show_remote = 1; + show_holddown = 1; + show_imported = 1; + break; + + case 'h': + show_holddown = 1; + break; + + case 'i': + show_imported = 1; + break; + + case 'l': + show_local = 1; + break; + + case 'r': + show_remote = 1; + break; + } + + rfapi_show_registrations(vty, p_addr, show_local, show_remote, + show_holddown, show_imported); + return CMD_SUCCESS; } DEFUN (vnc_show_responses_pfx, @@ -4847,29 +4522,26 @@ DEFUN (vnc_show_responses_pfx, "Limit output to a particular IPv6 prefix\n" "Limit output to a particular IPv6 address\n" ) { - struct prefix p; - struct prefix *p_addr = NULL; - - if (argc > 3) - { - if (!str2prefix (argv[3]->arg, &p)) - { - vty_out (vty, "Invalid prefix: %s%s", argv[3]->arg, VTY_NEWLINE); - return CMD_SUCCESS; - } - else - { - p_addr = &p; - } - } - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_QUERIES); - - rfapiRibShowResponsesSummary (vty); - - rfapiRibShowResponses (vty, p_addr, 0); - rfapiRibShowResponses (vty, p_addr, 1); - - return CMD_SUCCESS; + struct prefix p; + struct prefix *p_addr = NULL; + + if (argc > 3) { + if (!str2prefix(argv[3]->arg, &p)) { + vty_out(vty, "Invalid prefix: %s%s", argv[3]->arg, + VTY_NEWLINE); + return CMD_SUCCESS; + } else { + p_addr = &p; + } + } + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_QUERIES); + + rfapiRibShowResponsesSummary(vty); + + rfapiRibShowResponses(vty, p_addr, 0); + rfapiRibShowResponses(vty, p_addr, 1); + + return CMD_SUCCESS; } DEFUN (vnc_show_responses_some_pfx, @@ -4884,49 +4556,45 @@ DEFUN (vnc_show_responses_some_pfx, "Limit output to a particular IPv6 prefix\n" "Limit output to a particular IPV6 address\n") { - struct prefix p; - struct prefix *p_addr = NULL; - - int show_active = 0; - int show_removed = 0; - - if (!check_and_display_is_vnc_running (vty)) - return CMD_SUCCESS; - - if (argc > 4) - { - if (!str2prefix (argv[4]->arg, &p)) - { - vty_out (vty, "Invalid prefix: %s%s", argv[4]->arg, VTY_NEWLINE); - return CMD_SUCCESS; - } - else - { - p_addr = &p; - } - } - - switch (argv[3]->arg[0]) - { - case 'a': - show_active = 1; - break; - - case 'r': - show_removed = 1; - break; - } - - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_QUERIES); - - rfapiRibShowResponsesSummary (vty); - - if (show_active) - rfapiRibShowResponses (vty, p_addr, 0); - if (show_removed) - rfapiRibShowResponses (vty, p_addr, 1); - - return CMD_SUCCESS; + struct prefix p; + struct prefix *p_addr = NULL; + + int show_active = 0; + int show_removed = 0; + + if (!check_and_display_is_vnc_running(vty)) + return CMD_SUCCESS; + + if (argc > 4) { + if (!str2prefix(argv[4]->arg, &p)) { + vty_out(vty, "Invalid prefix: %s%s", argv[4]->arg, + VTY_NEWLINE); + return CMD_SUCCESS; + } else { + p_addr = &p; + } + } + + switch (argv[3]->arg[0]) { + case 'a': + show_active = 1; + break; + + case 'r': + show_removed = 1; + break; + } + + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_QUERIES); + + rfapiRibShowResponsesSummary(vty); + + if (show_active) + rfapiRibShowResponses(vty, p_addr, 0); + if (show_removed) + rfapiRibShowResponses(vty, p_addr, 1); + + return CMD_SUCCESS; } DEFUN (show_vnc_queries_pfx, @@ -4939,22 +4607,21 @@ DEFUN (show_vnc_queries_pfx, "Limit output to a particular IPv6 prefix\n" "Limit output to a particualr IPV6 address\n") { - struct prefix pfx; - struct prefix *p = NULL; - - if (argc > 3) - { - if (!str2prefix (argv[3]->arg, &pfx)) - { - vty_out (vty, "Invalid prefix: %s%s", argv[3]->arg, VTY_NEWLINE); - return CMD_WARNING; - } - p = &pfx; - } - - rfapi_vty_show_nve_summary (vty, SHOW_NVE_SUMMARY_QUERIES); - - return rfapiShowVncQueries (vty, p); + struct prefix pfx; + struct prefix *p = NULL; + + if (argc > 3) { + if (!str2prefix(argv[3]->arg, &pfx)) { + vty_out(vty, "Invalid prefix: %s%s", argv[3]->arg, + VTY_NEWLINE); + return CMD_WARNING; + } + p = &pfx; + } + + rfapi_vty_show_nve_summary(vty, SHOW_NVE_SUMMARY_QUERIES); + + return rfapiShowVncQueries(vty, p); } DEFUN (vnc_clear_counters, @@ -4964,43 +4631,42 @@ DEFUN (vnc_clear_counters, VNC_SHOW_STR "Reset VNC counters\n") { - struct bgp *bgp_default = bgp_get_default (); - struct rfapi *h; - struct listnode *node; - struct rfapi_descriptor *rfd; + struct bgp *bgp_default = bgp_get_default(); + struct rfapi *h; + struct listnode *node; + struct rfapi_descriptor *rfd; - if (!bgp_default) - goto notcfg; + if (!bgp_default) + goto notcfg; - h = bgp_default->rfapi; + h = bgp_default->rfapi; - if (!h) - goto notcfg; + if (!h) + goto notcfg; - /* per-rfd */ - for (ALL_LIST_ELEMENTS_RO (&h->descriptors, node, rfd)) - { - rfd->stat_count_nh_reachable = 0; - rfd->stat_count_nh_removal = 0; - } + /* per-rfd */ + for (ALL_LIST_ELEMENTS_RO(&h->descriptors, node, rfd)) { + rfd->stat_count_nh_reachable = 0; + rfd->stat_count_nh_removal = 0; + } - /* global */ - memset (&h->stat, 0, sizeof (h->stat)); + /* global */ + memset(&h->stat, 0, sizeof(h->stat)); - /* - * 151122 per bug 103, set count_registrations = number active. - * Do same for queries - */ - h->stat.count_registrations = rfapiApCountAll (bgp_default); - h->stat.count_queries = rfapi_monitor_count (NULL); + /* + * 151122 per bug 103, set count_registrations = number active. + * Do same for queries + */ + h->stat.count_registrations = rfapiApCountAll(bgp_default); + h->stat.count_queries = rfapi_monitor_count(NULL); - rfapiRibShowResponsesSummaryClear (); + rfapiRibShowResponsesSummaryClear(); - return CMD_SUCCESS; + return CMD_SUCCESS; notcfg: - vty_out (vty, "VNC is not configured.%s", VTY_NEWLINE); - return CMD_WARNING; + vty_out(vty, "VNC is not configured.%s", VTY_NEWLINE); + return CMD_WARNING; } /************************************************************************ @@ -5009,171 +4675,163 @@ notcfg: * add [vrf <vrf-name>] prefix <prefix> * [rd <value>] [label <value>] [local-preference <0-4294967295>] ************************************************************************/ -static int -vnc_add_vrf_prefix (struct vty *vty, - const char *arg_vrf, - const char *arg_prefix, - const char *arg_rd, /* optional */ - const char *arg_label, /* optional */ - const char *arg_pref) /* optional */ +static int vnc_add_vrf_prefix(struct vty *vty, const char *arg_vrf, + const char *arg_prefix, + const char *arg_rd, /* optional */ + const char *arg_label, /* optional */ + const char *arg_pref) /* optional */ { - struct bgp *bgp; - struct rfapi_nve_group_cfg *rfg; - struct prefix pfx; - struct rfapi_ip_prefix rpfx; - uint32_t pref = 0; - struct rfapi_vn_option optary[3]; - struct rfapi_vn_option *opt = NULL; - int cur_opt = 0; - - bgp = bgp_get_default (); /* assume main instance for now */ - if (!bgp) - { - vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - if (!bgp->rfapi || !bgp->rfapi_cfg) - { - vty_out (vty, "VRF support not configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - - rfg = bgp_rfapi_cfg_match_byname (bgp, arg_vrf, RFAPI_GROUP_CFG_VRF); - /* arg checks */ - if (!rfg) - { - vty_out (vty, "VRF \"%s\" appears not to be configured.%s", - arg_vrf, VTY_NEWLINE); - return CMD_WARNING; - } - if (!rfg->rt_export_list || !rfg->rfapi_import_table) - { - vty_out (vty, "VRF \"%s\" is missing RT import/export RT configuration.%s", - arg_vrf, VTY_NEWLINE); - return CMD_WARNING; - } - if (!rfg->rd.family && !arg_rd) - { - vty_out (vty, "VRF \"%s\" isn't configured with an RD, so RD must be provided.%s", - arg_vrf, VTY_NEWLINE); - return CMD_WARNING; - } - if (rfg->label > MPLS_LABEL_MAX && !arg_label) - { - vty_out (vty, "VRF \"%s\" isn't configured with a default labels, so a label must be provided.%s", - arg_vrf, VTY_NEWLINE); - return CMD_WARNING; - } - if (!str2prefix (arg_prefix, &pfx)) - { - vty_out (vty, "Malformed prefix \"%s\"%s", - arg_prefix, VTY_NEWLINE); - return CMD_WARNING; - } - rfapiQprefix2Rprefix (&pfx, &rpfx); - memset (optary, 0, sizeof (optary)); - if (arg_rd) - { - if (opt != NULL) - opt->next = &optary[cur_opt]; - opt = &optary[cur_opt++]; - opt->type = RFAPI_VN_OPTION_TYPE_INTERNAL_RD; - if (!str2prefix_rd (arg_rd, &opt->v.internal_rd)) - { - vty_out (vty, "Malformed RD \"%s\"%s", - arg_rd, VTY_NEWLINE); - return CMD_WARNING; - } - } - if (rfg->label <= MPLS_LABEL_MAX || arg_label) - { - struct rfapi_l2address_option *l2o; - if (opt != NULL) - opt->next = &optary[cur_opt]; - opt = &optary[cur_opt++]; - opt->type = RFAPI_VN_OPTION_TYPE_L2ADDR; - l2o = &opt->v.l2addr; - if (arg_label) - { - int32_t label; - VTY_GET_INTEGER_RANGE ("Label value", label, arg_label, 0, MPLS_LABEL_MAX); - l2o->label = label; - } - else - l2o->label = rfg->label; - } - if (arg_pref) - { - char *endptr = NULL; - pref = strtoul (arg_pref, &endptr, 10); - if (*endptr != '\0') - { - vty_out (vty, "%% Invalid local-preference value \"%s\"%s", arg_pref, VTY_NEWLINE); - return CMD_WARNING; - } - } - rpfx.cost = 255 - (pref & 255) ; - if (rfg->rfd == NULL) /* need new rfapi_handle */ - { - /* based on rfapi_open */ - struct rfapi_descriptor *rfd; - rfd = XCALLOC (MTYPE_RFAPI_DESC, sizeof (struct rfapi_descriptor)); - rfd->bgp = bgp; - rfg->rfd = rfd; - /* leave most fields empty as will get from (dynamic) config when needed */ - rfd->default_tunneltype_option.type = BGP_ENCAP_TYPE_MPLS; - rfd->cookie = rfg; - if (rfg->vn_prefix.family && - !CHECK_FLAG(rfg->flags, RFAPI_RFG_VPN_NH_SELF)) - { - rfapiQprefix2Raddr(&rfg->vn_prefix, &rfd->vn_addr); - } - else - { - memset(&rfd->vn_addr, 0, sizeof(struct rfapi_ip_addr)); - rfd->vn_addr.addr_family = AF_INET; - rfd->vn_addr.addr.v4 = bgp->router_id; - } - rfd->un_addr = rfd->vn_addr; /* sigh, need something in UN for lookups */ - vnc_zlog_debug_verbose ("%s: Opening RFD for VRF %s", - __func__, rfg->name); - rfapi_init_and_open(bgp, rfd, rfg); - } - - if (!rfapi_register (rfg->rfd, &rpfx, RFAPI_INFINITE_LIFETIME, NULL, - (cur_opt ? optary : NULL), RFAPI_REGISTER_ADD)) - { - struct rfapi_next_hop_entry *head = NULL; - struct rfapi_next_hop_entry *tail = NULL; - struct rfapi_vn_option *vn_opt_new; - - vnc_zlog_debug_verbose ("%s: rfapi_register succeeded", __func__); - - if (bgp->rfapi->rfp_methods.local_cb) - { - struct rfapi_descriptor *r = (struct rfapi_descriptor *) rfg->rfd; - vn_opt_new = rfapi_vn_options_dup (opt); - - rfapiAddDeleteLocalRfpPrefix (&r->un_addr, &r->vn_addr, &rpfx, - 1, RFAPI_INFINITE_LIFETIME, - vn_opt_new, &head, &tail); - if (head) - { - bgp->rfapi->flags |= RFAPI_INCALLBACK; - (*bgp->rfapi->rfp_methods.local_cb) (head, r->cookie); - bgp->rfapi->flags &= ~RFAPI_INCALLBACK; - } - head = tail = NULL; - } - vnc_zlog_debug_verbose ("%s completed, count=%d/%d", __func__, - rfg->rfapi_import_table->local_count[AFI_IP], - rfg->rfapi_import_table->local_count[AFI_IP6]); - return CMD_SUCCESS; - } - - vnc_zlog_debug_verbose ("%s: rfapi_register failed", __func__); - vty_out (vty, "Add failed.%s", VTY_NEWLINE); - return CMD_WARNING; + struct bgp *bgp; + struct rfapi_nve_group_cfg *rfg; + struct prefix pfx; + struct rfapi_ip_prefix rpfx; + uint32_t pref = 0; + struct rfapi_vn_option optary[3]; + struct rfapi_vn_option *opt = NULL; + int cur_opt = 0; + + bgp = bgp_get_default(); /* assume main instance for now */ + if (!bgp) { + vty_out(vty, "No BGP process is configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + if (!bgp->rfapi || !bgp->rfapi_cfg) { + vty_out(vty, "VRF support not configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + + rfg = bgp_rfapi_cfg_match_byname(bgp, arg_vrf, RFAPI_GROUP_CFG_VRF); + /* arg checks */ + if (!rfg) { + vty_out(vty, "VRF \"%s\" appears not to be configured.%s", + arg_vrf, VTY_NEWLINE); + return CMD_WARNING; + } + if (!rfg->rt_export_list || !rfg->rfapi_import_table) { + vty_out(vty, + "VRF \"%s\" is missing RT import/export RT configuration.%s", + arg_vrf, VTY_NEWLINE); + return CMD_WARNING; + } + if (!rfg->rd.family && !arg_rd) { + vty_out(vty, + "VRF \"%s\" isn't configured with an RD, so RD must be provided.%s", + arg_vrf, VTY_NEWLINE); + return CMD_WARNING; + } + if (rfg->label > MPLS_LABEL_MAX && !arg_label) { + vty_out(vty, + "VRF \"%s\" isn't configured with a default labels, so a label must be provided.%s", + arg_vrf, VTY_NEWLINE); + return CMD_WARNING; + } + if (!str2prefix(arg_prefix, &pfx)) { + vty_out(vty, "Malformed prefix \"%s\"%s", arg_prefix, + VTY_NEWLINE); + return CMD_WARNING; + } + rfapiQprefix2Rprefix(&pfx, &rpfx); + memset(optary, 0, sizeof(optary)); + if (arg_rd) { + if (opt != NULL) + opt->next = &optary[cur_opt]; + opt = &optary[cur_opt++]; + opt->type = RFAPI_VN_OPTION_TYPE_INTERNAL_RD; + if (!str2prefix_rd(arg_rd, &opt->v.internal_rd)) { + vty_out(vty, "Malformed RD \"%s\"%s", arg_rd, + VTY_NEWLINE); + return CMD_WARNING; + } + } + if (rfg->label <= MPLS_LABEL_MAX || arg_label) { + struct rfapi_l2address_option *l2o; + if (opt != NULL) + opt->next = &optary[cur_opt]; + opt = &optary[cur_opt++]; + opt->type = RFAPI_VN_OPTION_TYPE_L2ADDR; + l2o = &opt->v.l2addr; + if (arg_label) { + int32_t label; + VTY_GET_INTEGER_RANGE("Label value", label, arg_label, + 0, MPLS_LABEL_MAX); + l2o->label = label; + } else + l2o->label = rfg->label; + } + if (arg_pref) { + char *endptr = NULL; + pref = strtoul(arg_pref, &endptr, 10); + if (*endptr != '\0') { + vty_out(vty, + "%% Invalid local-preference value \"%s\"%s", + arg_pref, VTY_NEWLINE); + return CMD_WARNING; + } + } + rpfx.cost = 255 - (pref & 255); + if (rfg->rfd == NULL) /* need new rfapi_handle */ + { + /* based on rfapi_open */ + struct rfapi_descriptor *rfd; + rfd = XCALLOC(MTYPE_RFAPI_DESC, + sizeof(struct rfapi_descriptor)); + rfd->bgp = bgp; + rfg->rfd = rfd; + /* leave most fields empty as will get from (dynamic) config + * when needed */ + rfd->default_tunneltype_option.type = BGP_ENCAP_TYPE_MPLS; + rfd->cookie = rfg; + if (rfg->vn_prefix.family + && !CHECK_FLAG(rfg->flags, RFAPI_RFG_VPN_NH_SELF)) { + rfapiQprefix2Raddr(&rfg->vn_prefix, &rfd->vn_addr); + } else { + memset(&rfd->vn_addr, 0, sizeof(struct rfapi_ip_addr)); + rfd->vn_addr.addr_family = AF_INET; + rfd->vn_addr.addr.v4 = bgp->router_id; + } + rfd->un_addr = rfd->vn_addr; /* sigh, need something in UN for + lookups */ + vnc_zlog_debug_verbose("%s: Opening RFD for VRF %s", __func__, + rfg->name); + rfapi_init_and_open(bgp, rfd, rfg); + } + + if (!rfapi_register(rfg->rfd, &rpfx, RFAPI_INFINITE_LIFETIME, NULL, + (cur_opt ? optary : NULL), RFAPI_REGISTER_ADD)) { + struct rfapi_next_hop_entry *head = NULL; + struct rfapi_next_hop_entry *tail = NULL; + struct rfapi_vn_option *vn_opt_new; + + vnc_zlog_debug_verbose("%s: rfapi_register succeeded", + __func__); + + if (bgp->rfapi->rfp_methods.local_cb) { + struct rfapi_descriptor *r = + (struct rfapi_descriptor *)rfg->rfd; + vn_opt_new = rfapi_vn_options_dup(opt); + + rfapiAddDeleteLocalRfpPrefix(&r->un_addr, &r->vn_addr, + &rpfx, 1, + RFAPI_INFINITE_LIFETIME, + vn_opt_new, &head, &tail); + if (head) { + bgp->rfapi->flags |= RFAPI_INCALLBACK; + (*bgp->rfapi->rfp_methods.local_cb)(head, + r->cookie); + bgp->rfapi->flags &= ~RFAPI_INCALLBACK; + } + head = tail = NULL; + } + vnc_zlog_debug_verbose( + "%s completed, count=%d/%d", __func__, + rfg->rfapi_import_table->local_count[AFI_IP], + rfg->rfapi_import_table->local_count[AFI_IP6]); + return CMD_SUCCESS; + } + + vnc_zlog_debug_verbose("%s: rfapi_register failed", __func__); + vty_out(vty, "Add failed.%s", VTY_NEWLINE); + return CMD_WARNING; } DEFUN (add_vrf_prefix_rd_label_pref, @@ -5192,33 +4850,32 @@ DEFUN (add_vrf_prefix_rd_label_pref, "Set advertised local preference\n" "local preference (higher=more preferred)\n") { - char *arg_vrf = argv[2]->arg; - char *arg_prefix = argv[4]->arg; - char *arg_rd = NULL; /* optional */ - char *arg_label = NULL; /* optional */ - char *arg_pref = NULL; /* optional */ - int pargc = 5; - argc--; /* don't parse argument */ - while (pargc < argc) - { - switch (argv[pargc++]->arg[0]) - { - case 'r': - arg_rd = argv[pargc]->arg; - break; - case 'l': - arg_label = argv[pargc]->arg; - break; - case 'p': - arg_pref = argv[pargc]->arg; - break; - default: - break; - } - pargc ++; - } - - return vnc_add_vrf_prefix (vty, arg_vrf, arg_prefix, arg_rd, arg_label, arg_pref); + char *arg_vrf = argv[2]->arg; + char *arg_prefix = argv[4]->arg; + char *arg_rd = NULL; /* optional */ + char *arg_label = NULL; /* optional */ + char *arg_pref = NULL; /* optional */ + int pargc = 5; + argc--; /* don't parse argument */ + while (pargc < argc) { + switch (argv[pargc++]->arg[0]) { + case 'r': + arg_rd = argv[pargc]->arg; + break; + case 'l': + arg_label = argv[pargc]->arg; + break; + case 'p': + arg_pref = argv[pargc]->arg; + break; + default: + break; + } + pargc++; + } + + return vnc_add_vrf_prefix(vty, arg_vrf, arg_prefix, arg_rd, arg_label, + arg_pref); } /************************************************************************ @@ -5226,89 +4883,78 @@ DEFUN (add_vrf_prefix_rd_label_pref, * * clear [vrf <vrf-name>] prefix <prefix> [rd <value>] ************************************************************************/ -static int -rfapi_cfg_group_it_count(struct rfapi_nve_group_cfg *rfg) +static int rfapi_cfg_group_it_count(struct rfapi_nve_group_cfg *rfg) { - int count = 0; - afi_t afi = AFI_MAX; - while (afi-- > 0) - { - count += rfg->rfapi_import_table->local_count[afi]; - } - return count; + int count = 0; + afi_t afi = AFI_MAX; + while (afi-- > 0) { + count += rfg->rfapi_import_table->local_count[afi]; + } + return count; } -static void -clear_vnc_vrf_closer (struct rfapi_nve_group_cfg *rfg) +static void clear_vnc_vrf_closer(struct rfapi_nve_group_cfg *rfg) { - struct rfapi_descriptor *rfd = rfg->rfd; - afi_t afi; - - if (rfd == NULL) - return; - /* check if IT is empty */ - for (afi = 0; - afi < AFI_MAX && rfg->rfapi_import_table->local_count[afi] == 0; - afi++); - - if (afi == AFI_MAX) - { - vnc_zlog_debug_verbose ("%s: closing RFD for VRF %s", - __func__, rfg->name); - rfg->rfd = NULL; - rfapi_close(rfd); - } - else - { - vnc_zlog_debug_verbose ("%s: VRF %s afi=%d count=%d", - __func__, rfg->name, afi, - rfg->rfapi_import_table->local_count[afi]); - } + struct rfapi_descriptor *rfd = rfg->rfd; + afi_t afi; + + if (rfd == NULL) + return; + /* check if IT is empty */ + for (afi = 0; + afi < AFI_MAX && rfg->rfapi_import_table->local_count[afi] == 0; + afi++) + ; + + if (afi == AFI_MAX) { + vnc_zlog_debug_verbose("%s: closing RFD for VRF %s", __func__, + rfg->name); + rfg->rfd = NULL; + rfapi_close(rfd); + } else { + vnc_zlog_debug_verbose( + "%s: VRF %s afi=%d count=%d", __func__, rfg->name, afi, + rfg->rfapi_import_table->local_count[afi]); + } } -static int -vnc_clear_vrf (struct vty *vty, - struct bgp *bgp, - const char *arg_vrf, - const char *arg_prefix, /* NULL = all */ - const char *arg_rd) /* optional */ +static int vnc_clear_vrf(struct vty *vty, struct bgp *bgp, const char *arg_vrf, + const char *arg_prefix, /* NULL = all */ + const char *arg_rd) /* optional */ { - struct rfapi_nve_group_cfg *rfg; - struct rfapi_local_reg_delete_arg cda; - int rc; - int start_count; - - if (bgp == NULL) - bgp = bgp_get_default (); /* assume main instance for now */ - if (!bgp) - { - vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - if (!bgp->rfapi || !bgp->rfapi_cfg) - { - vty_out (vty, "VRF support not configured%s", VTY_NEWLINE); - return CMD_WARNING; - } - rfg = bgp_rfapi_cfg_match_byname (bgp, arg_vrf, RFAPI_GROUP_CFG_VRF); - /* arg checks */ - if (!rfg) - { - vty_out (vty, "VRF \"%s\" appears not to be configured.%s", - arg_vrf, VTY_NEWLINE); - return CMD_WARNING; - } - rc = parse_deleter_args (vty, bgp, arg_prefix, NULL, NULL, NULL, NULL, - arg_rd, rfg, &cda); - if (rc != CMD_SUCCESS) /* parse error */ - return rc; - - start_count = rfapi_cfg_group_it_count(rfg); - clear_vnc_prefix (&cda); - clear_vnc_vrf_closer (rfg); - vty_out (vty, "Cleared %u out of %d prefixes.%s", - cda.pfx_count, start_count, VTY_NEWLINE); - return CMD_SUCCESS; + struct rfapi_nve_group_cfg *rfg; + struct rfapi_local_reg_delete_arg cda; + int rc; + int start_count; + + if (bgp == NULL) + bgp = bgp_get_default(); /* assume main instance for now */ + if (!bgp) { + vty_out(vty, "No BGP process is configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + if (!bgp->rfapi || !bgp->rfapi_cfg) { + vty_out(vty, "VRF support not configured%s", VTY_NEWLINE); + return CMD_WARNING; + } + rfg = bgp_rfapi_cfg_match_byname(bgp, arg_vrf, RFAPI_GROUP_CFG_VRF); + /* arg checks */ + if (!rfg) { + vty_out(vty, "VRF \"%s\" appears not to be configured.%s", + arg_vrf, VTY_NEWLINE); + return CMD_WARNING; + } + rc = parse_deleter_args(vty, bgp, arg_prefix, NULL, NULL, NULL, NULL, + arg_rd, rfg, &cda); + if (rc != CMD_SUCCESS) /* parse error */ + return rc; + + start_count = rfapi_cfg_group_it_count(rfg); + clear_vnc_prefix(&cda); + clear_vnc_vrf_closer(rfg); + vty_out(vty, "Cleared %u out of %d prefixes.%s", cda.pfx_count, + start_count, VTY_NEWLINE); + return CMD_SUCCESS; } DEFUN (clear_vrf_prefix_rd, @@ -5323,27 +4969,25 @@ DEFUN (clear_vrf_prefix_rd, "Specific VRF Route Distinguisher\n" "<as-number>:<number> or <ip-address>:<number>\n") { - char *arg_vrf = argv[2]->arg; - char *arg_prefix = NULL; /* optional */ - char *arg_rd = NULL; /* optional */ - int pargc = 3; - argc--; /* don't check parameter */ - while (pargc < argc) - { - switch (argv[pargc++]->arg[0]) - { - case 'r': - arg_rd = argv[pargc]->arg; - break; - case 'p': - arg_prefix = argv[pargc]->arg; - break; - default: - break; - } - pargc ++; - } - return vnc_clear_vrf (vty, NULL, arg_vrf, arg_prefix, arg_rd); + char *arg_vrf = argv[2]->arg; + char *arg_prefix = NULL; /* optional */ + char *arg_rd = NULL; /* optional */ + int pargc = 3; + argc--; /* don't check parameter */ + while (pargc < argc) { + switch (argv[pargc++]->arg[0]) { + case 'r': + arg_rd = argv[pargc]->arg; + break; + case 'p': + arg_prefix = argv[pargc]->arg; + break; + default: + break; + } + pargc++; + } + return vnc_clear_vrf(vty, NULL, arg_vrf, arg_prefix, arg_rd); } DEFUN (clear_vrf_all, @@ -5354,71 +4998,71 @@ DEFUN (clear_vrf_all, "VRF name\n" "All prefixes\n") { - char *arg_vrf = argv[2]->arg; - return vnc_clear_vrf (vty, NULL, arg_vrf, NULL, NULL); + char *arg_vrf = argv[2]->arg; + return vnc_clear_vrf(vty, NULL, arg_vrf, NULL, NULL); } -void rfapi_vty_init () +void rfapi_vty_init() { - install_element (ENABLE_NODE, &add_vnc_prefix_cost_life_lnh_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_life_cost_lnh_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_cost_lnh_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_life_lnh_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_lnh_cmd); - - install_element (ENABLE_NODE, &add_vnc_prefix_cost_life_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_life_cost_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_cost_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_life_cmd); - install_element (ENABLE_NODE, &add_vnc_prefix_cmd); - - install_element (ENABLE_NODE, &add_vnc_mac_vni_prefix_cost_life_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_prefix_life_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_prefix_cost_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_prefix_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_cost_life_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_cost_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_life_cmd); - install_element (ENABLE_NODE, &add_vnc_mac_vni_cmd); - - install_element (ENABLE_NODE, &add_vrf_prefix_rd_label_pref_cmd); - - install_element (ENABLE_NODE, &clear_vnc_nve_all_cmd); - install_element (ENABLE_NODE, &clear_vnc_nve_vn_un_cmd); - install_element (ENABLE_NODE, &clear_vnc_nve_un_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_nve_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_nve_un_cmd); - - install_element (ENABLE_NODE, &clear_vnc_prefix_vn_un_cmd); - install_element (ENABLE_NODE, &clear_vnc_prefix_un_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_prefix_un_cmd); - install_element (ENABLE_NODE, &clear_vnc_prefix_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_prefix_all_cmd); - - install_element (ENABLE_NODE, &clear_vnc_mac_vn_un_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_un_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_un_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_vn_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_all_cmd); - - install_element (ENABLE_NODE, &clear_vnc_mac_vn_un_prefix_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_un_vn_prefix_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_un_prefix_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_vn_prefix_cmd); - install_element (ENABLE_NODE, &clear_vnc_mac_all_prefix_cmd); - - install_element (ENABLE_NODE, &clear_vrf_prefix_rd_cmd); - install_element (ENABLE_NODE, &clear_vrf_all_cmd); - - install_element (ENABLE_NODE, &vnc_clear_counters_cmd); - - install_element (VIEW_NODE, &vnc_show_summary_cmd); - install_element (VIEW_NODE, &vnc_show_nves_cmd); - install_element (VIEW_NODE, &vnc_show_nves_ptct_cmd); - - install_element (VIEW_NODE, &vnc_show_registrations_pfx_cmd); - install_element (VIEW_NODE, &vnc_show_registrations_some_pfx_cmd); - install_element (VIEW_NODE, &vnc_show_responses_pfx_cmd); - install_element (VIEW_NODE, &vnc_show_responses_some_pfx_cmd); - install_element (VIEW_NODE, &show_vnc_queries_pfx_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_cost_life_lnh_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_life_cost_lnh_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_cost_lnh_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_life_lnh_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_lnh_cmd); + + install_element(ENABLE_NODE, &add_vnc_prefix_cost_life_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_life_cost_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_cost_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_life_cmd); + install_element(ENABLE_NODE, &add_vnc_prefix_cmd); + + install_element(ENABLE_NODE, &add_vnc_mac_vni_prefix_cost_life_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_prefix_life_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_prefix_cost_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_prefix_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_cost_life_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_cost_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_life_cmd); + install_element(ENABLE_NODE, &add_vnc_mac_vni_cmd); + + install_element(ENABLE_NODE, &add_vrf_prefix_rd_label_pref_cmd); + + install_element(ENABLE_NODE, &clear_vnc_nve_all_cmd); + install_element(ENABLE_NODE, &clear_vnc_nve_vn_un_cmd); + install_element(ENABLE_NODE, &clear_vnc_nve_un_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_nve_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_nve_un_cmd); + + install_element(ENABLE_NODE, &clear_vnc_prefix_vn_un_cmd); + install_element(ENABLE_NODE, &clear_vnc_prefix_un_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_prefix_un_cmd); + install_element(ENABLE_NODE, &clear_vnc_prefix_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_prefix_all_cmd); + + install_element(ENABLE_NODE, &clear_vnc_mac_vn_un_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_un_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_un_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_vn_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_all_cmd); + + install_element(ENABLE_NODE, &clear_vnc_mac_vn_un_prefix_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_un_vn_prefix_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_un_prefix_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_vn_prefix_cmd); + install_element(ENABLE_NODE, &clear_vnc_mac_all_prefix_cmd); + + install_element(ENABLE_NODE, &clear_vrf_prefix_rd_cmd); + install_element(ENABLE_NODE, &clear_vrf_all_cmd); + + install_element(ENABLE_NODE, &vnc_clear_counters_cmd); + + install_element(VIEW_NODE, &vnc_show_summary_cmd); + install_element(VIEW_NODE, &vnc_show_nves_cmd); + install_element(VIEW_NODE, &vnc_show_nves_ptct_cmd); + + install_element(VIEW_NODE, &vnc_show_registrations_pfx_cmd); + install_element(VIEW_NODE, &vnc_show_registrations_some_pfx_cmd); + install_element(VIEW_NODE, &vnc_show_responses_pfx_cmd); + install_element(VIEW_NODE, &vnc_show_responses_some_pfx_cmd); + install_element(VIEW_NODE, &show_vnc_queries_pfx_cmd); } |
