summaryrefslogtreecommitdiff
path: root/net/openbgpd/files/patch-bgpctl_parser.c
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2009-07-19 07:31:04 +0000
committerHiroki Sato <hrs@FreeBSD.org>2009-07-19 07:31:04 +0000
commite06614b276963810c496da273358133c5e287829 (patch)
tree201d0ad02a30386984c12bfaf08311e5430fafd2 /net/openbgpd/files/patch-bgpctl_parser.c
parentThis file is no longer needed in 2.0.1. (diff)
Update to 4.5.20090709 (from snapshot as of 2009/7/9).
Add support for nexthop with an IPv6 link-local address. To enable this, specify "interface" in bgpd.conf (see bgpd.conf(5)).
Diffstat (limited to 'net/openbgpd/files/patch-bgpctl_parser.c')
-rw-r--r--net/openbgpd/files/patch-bgpctl_parser.c135
1 files changed, 132 insertions, 3 deletions
diff --git a/net/openbgpd/files/patch-bgpctl_parser.c b/net/openbgpd/files/patch-bgpctl_parser.c
index da0571bd66ef..bb3e6ef03a57 100644
--- a/net/openbgpd/files/patch-bgpctl_parser.c
+++ b/net/openbgpd/files/patch-bgpctl_parser.c
@@ -2,10 +2,16 @@ Index: bgpctl/parser.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/parser.c,v
retrieving revision 1.1.1.1
-retrieving revision 1.2
-diff -u -p -r1.1.1.1 -r1.2
+retrieving revision 1.3
+diff -u -p -r1.1.1.1 -r1.3
--- bgpctl/parser.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
-+++ bgpctl/parser.c 30 Jun 2009 06:40:06 -0000 1.2
++++ bgpctl/parser.c 9 Jul 2009 17:22:12 -0000 1.3
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: parser.c,v 1.50 2008/06/15 09:58:43 claudio Exp $ */
++/* $OpenBSD: parser.c,v 1.54 2009/06/12 16:44:02 claudio Exp $ */
+
+ /*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -16,6 +16,10 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
@@ -17,3 +23,126 @@ diff -u -p -r1.1.1.1 -r1.2
#include <sys/types.h>
#include <sys/socket.h>
+@@ -42,6 +46,7 @@ enum token_type {
+ ASTYPE,
+ PREFIX,
+ PEERDESC,
++ RIBNAME,
+ COMMUNITY,
+ LOCALPREF,
+ MED,
+@@ -72,6 +77,7 @@ static const struct token t_show_summary
+ static const struct token t_show_fib[];
+ static const struct token t_show_rib[];
+ static const struct token t_show_rib_neigh[];
++static const struct token t_show_rib_rib[];
+ static const struct token t_show_neighbor[];
+ static const struct token t_show_neighbor_modifiers[];
+ static const struct token t_fib[];
+@@ -148,6 +154,7 @@ static const struct token t_show_rib[] =
+ { FLAG, "in", F_CTL_ADJ_IN, t_show_rib},
+ { FLAG, "out", F_CTL_ADJ_OUT, t_show_rib},
+ { KEYWORD, "neighbor", NONE, t_show_rib_neigh},
++ { KEYWORD, "table", NONE, t_show_rib_rib},
+ { KEYWORD, "summary", SHOW_SUMMARY, t_show_summary},
+ { KEYWORD, "memory", SHOW_RIB_MEM, NULL},
+ { FAMILY, "", NONE, t_show_rib},
+@@ -161,6 +168,11 @@ static const struct token t_show_rib_nei
+ { ENDTOKEN, "", NONE, NULL}
+ };
+
++static const struct token t_show_rib_rib[] = {
++ { RIBNAME, "", NONE, t_show_rib},
++ { ENDTOKEN, "", NONE, NULL}
++};
++
+ static const struct token t_show_neighbor[] = {
+ { NOTOKEN, "", NONE, NULL},
+ { PEERADDRESS, "", NONE, t_show_neighbor_modifiers},
+@@ -456,6 +468,15 @@ match_token(int *argc, char **argv[], co
+ t = &table[i];
+ }
+ break;
++ case RIBNAME:
++ if (!match && word != NULL && strlen(word) > 0) {
++ if (strlcpy(res.rib, word, sizeof(res.rib)) >=
++ sizeof(res.rib))
++ errx(1, "rib name too long");
++ match++;
++ t = &table[i];
++ }
++ break;
+ case COMMUNITY:
+ if (word != NULL && strlen(word) > 0 &&
+ parse_community(word, &res)) {
+@@ -547,6 +568,9 @@ show_valid_args(const struct token table
+ case PEERDESC:
+ fprintf(stderr, " <neighbor description>\n");
+ break;
++ case RIBNAME:
++ fprintf(stderr, " <rib name>\n");
++ break;
+ case COMMUNITY:
+ fprintf(stderr, " <community>\n");
+ break;
+@@ -686,7 +710,7 @@ parse_asnum(const char *word, u_int32_t
+ if (errstr)
+ errx(1, "AS number is %s: %s", errstr, word);
+ } else {
+- uval = strtonum(word, 0, USHRT_MAX - 1, &errstr);
++ uval = strtonum(word, 0, ASNUM_MAX - 1, &errstr);
+ if (errstr)
+ errx(1, "AS number is %s: %s", errstr, word);
+ }
+@@ -801,7 +825,7 @@ parse_community(const char *word, struct
+ type = getcommunity(p);
+
+ done:
+- if (as == 0 || as == USHRT_MAX) {
++ if (as == 0) {
+ fprintf(stderr, "Invalid community\n");
+ return (0);
+ }
+@@ -814,7 +838,7 @@ done:
+ break;
+ default:
+ /* unknown */
+- fprintf(stderr, "Invalid well-known community\n");
++ fprintf(stderr, "Unknown well-known community\n");
+ return (0);
+ }
+
+@@ -856,33 +880,6 @@ parse_nexthop(const char *word, struct p
+ return (1);
+ }
+
+-/* XXX local copies from kroute.c, should go to a shared file */
+-in_addr_t
+-prefixlen2mask(u_int8_t prefixlen)
+-{
+- if (prefixlen == 0)
+- return (0);
+-
+- return (0xffffffff << (32 - prefixlen));
+-}
+-
+-void
+-inet6applymask(struct in6_addr *dest, const struct in6_addr *src, int prefixlen)
+-{
+- struct in6_addr mask;
+- int i;
+-
+- bzero(&mask, sizeof(mask));
+- for (i = 0; i < prefixlen / 8; i++)
+- mask.s6_addr[i] = 0xff;
+- i = prefixlen % 8;
+- if (i)
+- mask.s6_addr[prefixlen / 8] = 0xff00 >> i;
+-
+- for (i = 0; i < 16; i++)
+- dest->s6_addr[i] = src->s6_addr[i] & mask.s6_addr[i];
+-}
+-
+ int
+ bgpctl_getopt(int *argc, char **argv[], int type)
+ {