summaryrefslogtreecommitdiff
path: root/net/openbgpd/files/patch-bgpd_rde.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_rde.h')
-rw-r--r--net/openbgpd/files/patch-bgpd_rde.h386
1 files changed, 118 insertions, 268 deletions
diff --git a/net/openbgpd/files/patch-bgpd_rde.h b/net/openbgpd/files/patch-bgpd_rde.h
index e8fd5aaa7e0a..479725479263 100644
--- a/net/openbgpd/files/patch-bgpd_rde.h
+++ b/net/openbgpd/files/patch-bgpd_rde.h
@@ -1,311 +1,161 @@
Index: bgpd/rde.h
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde.h,v
-retrieving revision 1.1.1.1
-retrieving revision 1.1.1.4
-diff -u -p -r1.1.1.1 -r1.1.1.4
---- bgpd/rde.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
-+++ bgpd/rde.h 22 Oct 2009 14:24:02 -0000 1.1.1.4
+retrieving revision 1.1.1.8
+retrieving revision 1.1.1.9
+diff -u -p -r1.1.1.8 -r1.1.1.9
+--- bgpd/rde.h 14 Feb 2010 20:19:57 -0000 1.1.1.8
++++ bgpd/rde.h 14 Feb 2010 20:27:06 -0000 1.1.1.9
@@ -1,4 +1,4 @@
--/* $OpenBSD: rde.h,v 1.102 2008/01/23 08:11:32 claudio Exp $ */
-+/* $OpenBSD: rde.h,v 1.121 2009/08/06 08:53:11 claudio Exp $ */
+-/* $OpenBSD: rde.h,v 1.120 2009/06/06 01:10:29 claudio Exp $ */
++/* $OpenBSD: rde.h,v 1.129 2010/01/13 06:02:37 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
-@@ -42,6 +42,7 @@ LIST_HEAD(rde_peer_head, rde_peer);
- LIST_HEAD(aspath_head, rde_aspath);
- RB_HEAD(uptree_prefix, update_prefix);
- RB_HEAD(uptree_attr, update_attr);
-+RB_HEAD(rib_tree, rib_entry);
- TAILQ_HEAD(uplist_prefix, update_prefix);
- TAILQ_HEAD(uplist_attr, update_attr);
-
-@@ -66,13 +67,13 @@ struct rde_peer {
+@@ -56,12 +56,9 @@ struct rde_peer {
+ struct bgpd_addr local_v6_addr;
+ struct uptree_prefix up_prefix;
+ struct uptree_attr up_attrs;
+- struct uplist_attr updates;
+- struct uplist_prefix withdraws;
+- struct uplist_attr updates6;
+- struct uplist_prefix withdraws6;
+- struct capabilities capa_announced;
+- struct capabilities capa_received;
++ struct uplist_attr updates[AID_MAX];
++ struct uplist_prefix withdraws[AID_MAX];
++ struct capabilities capa;
+ u_int64_t prefix_rcvd_update;
+ u_int64_t prefix_rcvd_withdraw;
u_int64_t prefix_sent_update;
- u_int64_t prefix_sent_withdraw;
- u_int32_t prefix_cnt; /* # of prefixes */
-- u_int32_t adjrib_cnt; /* # of p. in Adj-RIB-In */
- u_int32_t remote_bgpid; /* host byte order! */
- u_int32_t up_pcnt;
- u_int32_t up_acnt;
- u_int32_t up_nlricnt;
- u_int32_t up_wcnt;
- enum peer_state state;
-+ u_int16_t ribid;
- u_int16_t short_as;
- u_int8_t reconf_in; /* in filter changed */
- u_int8_t reconf_out; /* out filter changed */
-@@ -107,8 +108,8 @@ enum attrtypes {
- ATTR_MP_REACH_NLRI=14,
- ATTR_MP_UNREACH_NLRI=15,
- ATTR_EXT_COMMUNITIES=16,
-- ATTR_NEW_ASPATH=17,
-- ATTR_NEW_AGGREGATOR=18
-+ ATTR_AS4_PATH=17,
-+ ATTR_AS4_AGGREGATOR=18
- };
-
- /* attribute flags. 4 low order bits reserved */
-@@ -154,16 +155,16 @@ LIST_HEAD(prefix_head, prefix);
- #define F_ATTR_MED_ANNOUNCE 0x00020
- #define F_ATTR_MP_REACH 0x00040
- #define F_ATTR_MP_UNREACH 0x00080
--#define F_ATTR_AS4BYTE_NEW 0x00100 /* NEW_ASPATH or NEW_AGGREGATOR */
-+#define F_ATTR_AS4BYTE_NEW 0x00100 /* AS4_PATH or AS4_AGGREGATOR */
- #define F_ATTR_LOOP 0x00200 /* path would cause a route loop */
--#define F_PREFIX_ANNOUNCED 0x01000
-+#define F_PREFIX_ANNOUNCED 0x00400
-+#define F_ANN_DYNAMIC 0x00800
-+#define F_NEXTHOP_SELF 0x01000
+@@ -163,6 +160,7 @@ LIST_HEAD(prefix_head, prefix);
#define F_NEXTHOP_REJECT 0x02000
#define F_NEXTHOP_BLACKHOLE 0x04000
#define F_NEXTHOP_NOMODIFY 0x08000
--#define F_NEXTHOP_SELF 0x10000
+#define F_ATTR_PARSE_ERR 0x10000
#define F_ATTR_LINKED 0x20000
--#define F_LOCAL 0x40000 /* Local-RIB */
--#define F_ORIGINAL 0x80000 /* Adj-RIB-In */
- #define ORIGIN_IGP 0
-@@ -184,7 +185,6 @@ struct rde_aspath {
- u_int32_t weight; /* low prio lpref */
- u_int32_t prefix_cnt; /* # of prefixes */
- u_int32_t active_cnt; /* # of active prefixes */
-- u_int32_t adjrib_cnt; /* # of p. in Adj-RIB-In */
- u_int32_t flags; /* internally used */
- u_int16_t rtlabelid; /* route label id */
- u_int16_t pftableid; /* pf table id */
-@@ -223,53 +223,72 @@ struct pt_entry {
+@@ -220,14 +218,14 @@ struct nexthop {
+ /* generic entry without address specific part */
+ struct pt_entry {
RB_ENTRY(pt_entry) pt_e;
- sa_family_t af;
+- sa_family_t af;
++ u_int8_t aid;
u_int8_t prefixlen;
-- struct prefix_head prefix_h;
-- struct prefix *active; /* for fast access */
-+ u_int16_t refcnt;
+ u_int16_t refcnt;
};
struct pt_entry4 {
RB_ENTRY(pt_entry) pt_e;
- sa_family_t af;
+- sa_family_t af;
++ u_int8_t aid;
u_int8_t prefixlen;
-- struct prefix_head prefix_h;
-- struct prefix *active; /* for fast access */
-+ u_int16_t refcnt;
+ u_int16_t refcnt;
struct in_addr prefix4;
-- /*
-- * Route Flap Damping structures
-- * Currently I think they belong into the prefix but for the moment
-- * we just ignore the dampening at all.
-- */
- };
+@@ -235,12 +233,25 @@ struct pt_entry4 {
struct pt_entry6 {
RB_ENTRY(pt_entry) pt_e;
- sa_family_t af;
+- sa_family_t af;
++ u_int8_t aid;
u_int8_t prefixlen;
-- struct prefix_head prefix_h;
-- struct prefix *active; /* for fast access */
-+ u_int16_t refcnt;
+ u_int16_t refcnt;
struct in6_addr prefix6;
};
--struct pt_context {
-- union {
-- struct pt_entry p;
-- struct pt_entry4 p4;
-- struct pt_entry6 p6;
-- } pu;
--#define ctx_p pu.p
--#define ctx_p4 pu.p4
--#define ctx_p6 pu.p6
-- /* only count and done should be accessed by callers */
-- unsigned int count;
-- int done;
--};
-+struct rib_context {
-+ LIST_ENTRY(rib_context) entry;
-+ struct rib_entry *ctx_re;
-+ struct rib *ctx_rib;
-+ void (*ctx_upcall)(struct rib_entry *, void *);
-+ void (*ctx_done)(void *);
-+ void (*ctx_wait)(void *);
-+ void *ctx_arg;
-+ unsigned int ctx_count;
-+ sa_family_t ctx_af;
-+};
-+
-+struct rib_entry {
-+ RB_ENTRY(rib_entry) rib_e;
-+ struct prefix_head prefix_h;
-+ struct prefix *active; /* for fast access */
-+ struct pt_entry *prefix;
-+ u_int16_t ribid;
-+ u_int16_t flags;
-+};
-+
-+enum rib_state {
-+ RIB_NONE,
-+ RIB_NEW,
-+ RIB_ACTIVE,
-+ RIB_DELETE
-+};
-+
-+struct rib {
-+ char name[PEER_DESCR_LEN];
-+ struct rib_tree rib;
-+ enum rib_state state;
-+ u_int16_t flags;
-+ u_int16_t id;
++struct pt_entry_vpn4 {
++ RB_ENTRY(pt_entry) pt_e;
++ u_int8_t aid;
++ u_int8_t prefixlen;
++ u_int16_t refcnt;
++ struct in_addr prefix4;
++ u_int64_t rd;
++ u_int8_t labelstack[21];
++ u_int8_t labellen;
++ u_int8_t pad1;
++ u_int8_t pad2;
+};
+
-+#define F_RIB_ENTRYLOCK 0x0001
-+#define F_RIB_NOEVALUATE 0x0002
-+#define F_RIB_NOFIB 0x0004
-+#define RIB_FAILED 0xffff
-
- struct prefix {
-- LIST_ENTRY(prefix) prefix_l, path_l;
-+ LIST_ENTRY(prefix) rib_l, path_l;
- struct rde_aspath *aspath;
- struct pt_entry *prefix;
-+ struct rib_entry *rib; /* NULL for Adj-RIB-In */
- time_t lastchange;
-- u_int32_t flags;
+ struct rib_context {
+ LIST_ENTRY(rib_context) entry;
+ struct rib_entry *ctx_re;
+@@ -250,7 +261,7 @@ struct rib_context {
+ void (*ctx_wait)(void *);
+ void *ctx_arg;
+ unsigned int ctx_count;
+- sa_family_t ctx_af;
++ u_int8_t ctx_aid;
};
- extern struct rde_memstats rdemem;
-@@ -282,7 +301,8 @@ void rde_send_pftable(u_int16_t, struc
- u_int8_t, int);
- void rde_send_pftable_commit(void);
+ struct rib_entry {
+@@ -264,6 +275,7 @@ struct rib_entry {
--void rde_generate_updates(struct prefix *, struct prefix *);
-+void rde_generate_updates(u_int16_t, struct prefix *,
-+ struct prefix *);
- u_int32_t rde_local_as(void);
- int rde_noevaluate(void);
- int rde_decisionflags(void);
-@@ -291,6 +311,8 @@ int rde_as4byte(struct rde_peer *);
- /* rde_attr.c */
- int attr_write(void *, u_int16_t, u_int8_t, u_int8_t, void *,
- u_int16_t);
-+int attr_writebuf(struct buf *, u_int8_t, u_int8_t, void *,
-+ u_int16_t);
- void attr_init(u_int32_t);
- void attr_shutdown(void);
- int attr_optadd(struct rde_aspath *, u_int8_t, u_int8_t,
-@@ -327,10 +349,24 @@ int community_set(struct rde_aspath *,
+ enum rib_state {
+ RIB_NONE,
++ RIB_NEW,
+ RIB_ACTIVE,
+ RIB_DELETE
+ };
+@@ -342,9 +354,13 @@ int aspath_loopfree(struct aspath *, u
+ int aspath_compare(struct aspath *, struct aspath *);
+ u_char *aspath_prepend(struct aspath *, u_int32_t, int, u_int16_t *);
+ int aspath_match(struct aspath *, enum as_spec, u_int32_t);
+-int community_match(void *, u_int16_t, int, int);
++int community_match(struct rde_aspath *, int, int);
+ int community_set(struct rde_aspath *, int, int);
void community_delete(struct rde_aspath *, int, int);
++int community_ext_set(struct rde_aspath *,
++ struct filter_extcommunity *, u_int16_t);
++void community_ext_delete(struct rde_aspath *,
++ struct filter_extcommunity *, u_int16_t);
/* rde_rib.c */
-+extern u_int16_t rib_size;
-+extern struct rib *ribs;
-+
-+u_int16_t rib_new(int, char *, u_int16_t);
-+u_int16_t rib_find(char *);
-+void rib_free(struct rib *);
-+struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int);
-+struct rib_entry *rib_lookup(struct rib *, struct bgpd_addr *);
-+void rib_dump(struct rib *, void (*)(struct rib_entry *, void *),
-+ void *, sa_family_t);
-+void rib_dump_r(struct rib_context *);
-+void rib_dump_runner(void);
-+int rib_dump_pending(void);
-+
- void path_init(u_int32_t);
- void path_shutdown(void);
--void path_update(struct rde_peer *, struct rde_aspath *,
-- struct bgpd_addr *, int, u_int32_t);
-+int path_update(struct rib *, struct rde_peer *,
-+ struct rde_aspath *, struct bgpd_addr *, int);
- int path_compare(struct rde_aspath *, struct rde_aspath *);
- struct rde_aspath *path_lookup(struct rde_aspath *, struct rde_peer *);
- void path_remove(struct rde_aspath *);
-@@ -343,18 +379,20 @@ void path_put(struct rde_aspath *);
- #define PREFIX_SIZE(x) (((x) + 7) / 8 + 1)
- int prefix_compare(const struct bgpd_addr *,
- const struct bgpd_addr *, int);
--struct prefix *prefix_get(struct rde_peer *, struct bgpd_addr *, int,
-- u_int32_t);
--struct pt_entry *prefix_add(struct rde_aspath *, struct bgpd_addr *, int,
-- u_int32_t);
--struct pt_entry *prefix_move(struct rde_aspath *, struct prefix *, u_int32_t);
--void prefix_remove(struct rde_peer *, struct bgpd_addr *, int,
-- u_int32_t);
-+struct prefix *prefix_get(struct rib *, struct rde_peer *,
-+ struct bgpd_addr *, int, u_int32_t);
-+int prefix_add(struct rib *, struct rde_aspath *,
-+ struct bgpd_addr *, int);
-+void prefix_move(struct rde_aspath *, struct prefix *);
-+int prefix_remove(struct rib *, struct rde_peer *,
-+ struct bgpd_addr *, int, u_int32_t);
- int prefix_write(u_char *, int, struct bgpd_addr *, u_int8_t);
--struct prefix *prefix_bypeer(struct pt_entry *, struct rde_peer *, u_int32_t);
--void prefix_updateall(struct rde_aspath *, enum nexthop_state);
-+struct prefix *prefix_bypeer(struct rib_entry *, struct rde_peer *,
-+ u_int32_t);
-+void prefix_updateall(struct rde_aspath *, enum nexthop_state,
-+ enum nexthop_state);
- void prefix_destroy(struct prefix *);
--void prefix_network_clean(struct rde_peer *, time_t);
-+void prefix_network_clean(struct rde_peer *, time_t, u_int32_t);
-
+ extern u_int16_t rib_size;
+@@ -356,7 +372,7 @@ void rib_free(struct rib *);
+ struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int);
+ struct rib_entry *rib_lookup(struct rib *, struct bgpd_addr *);
+ void rib_dump(struct rib *, void (*)(struct rib_entry *, void *),
+- void *, sa_family_t);
++ void *, u_int8_t);
+ void rib_dump_r(struct rib_context *);
+ void rib_dump_runner(void);
+ int rib_dump_pending(void);
+@@ -395,7 +411,7 @@ void prefix_network_clean(struct rde_p
void nexthop_init(u_int32_t);
void nexthop_shutdown(void);
-@@ -368,7 +406,7 @@ struct nexthop *nexthop_get(struct bgpd_
- int nexthop_compare(struct nexthop *, struct nexthop *);
-
- /* rde_decide.c */
--void prefix_evaluate(struct prefix *, struct pt_entry *);
-+void prefix_evaluate(struct prefix *, struct rib_entry *);
-
- /* rde_update.c */
- void up_init(struct rde_peer *);
-@@ -387,24 +425,34 @@ u_char *up_dump_mp_unreach(u_char *, u_
- u_char *up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *);
-
- /* rde_prefix.c */
--void pt_init(void);
--void pt_shutdown(void);
--int pt_empty(struct pt_entry *);
--void pt_getaddr(struct pt_entry *, struct bgpd_addr *);
-+#define pt_empty(pt) ((pt)->refcnt == 0)
-+#define pt_ref(pt) do { \
-+ ++(pt)->refcnt; \
-+ if ((pt)->refcnt == 0) \
-+ fatalx("pt_ref: overflow"); \
-+} while(0)
-+#define pt_unref(pt) do { \
-+ if ((pt)->refcnt == 0) \
-+ fatalx("pt_unref: underflow"); \
-+ --(pt)->refcnt; \
-+} while(0)
-+
-+void pt_init(void);
-+void pt_shutdown(void);
-+void pt_getaddr(struct pt_entry *, struct bgpd_addr *);
-+struct pt_entry *pt_fill(struct bgpd_addr *, int);
- struct pt_entry *pt_get(struct bgpd_addr *, int);
- struct pt_entry *pt_add(struct bgpd_addr *, int);
--void pt_remove(struct pt_entry *);
-+void pt_remove(struct pt_entry *);
- struct pt_entry *pt_lookup(struct bgpd_addr *);
--void pt_dump(void (*)(struct pt_entry *, void *), void *,
+ void nexthop_modify(struct rde_aspath *, struct bgpd_addr *,
+- enum action_types, sa_family_t);
++ enum action_types, u_int8_t);
+ void nexthop_link(struct rde_aspath *);
+ void nexthop_unlink(struct rde_aspath *);
+ int nexthop_delete(struct nexthop *);
+@@ -415,12 +431,15 @@ int up_generate(struct rde_peer *, str
+ void up_generate_updates(struct filter_head *, struct rde_peer *,
+ struct prefix *, struct prefix *);
+ void up_generate_default(struct filter_head *, struct rde_peer *,
- sa_family_t);
--void pt_dump_r(void (*)(struct pt_entry *, void *), void *,
-- sa_family_t, struct pt_context *);
-+int pt_prefix_cmp(const struct pt_entry *, const struct pt_entry *);
-+
++ u_int8_t);
++int up_generate_marker(struct rde_peer *, u_int8_t);
+ int up_dump_prefix(u_char *, int, struct uplist_prefix *,
+ struct rde_peer *);
+ int up_dump_attrnlri(u_char *, int, struct rde_peer *);
+-u_char *up_dump_mp_unreach(u_char *, u_int16_t *, struct rde_peer *);
+-u_char *up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *);
++u_char *up_dump_mp_unreach(u_char *, u_int16_t *, struct rde_peer *,
++ u_int8_t);
++int up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *,
++ u_int8_t);
- /* rde_filter.c */
--enum filter_actions rde_filter(struct rde_aspath **, struct filter_head *,
-- struct rde_peer *, struct rde_aspath *,
-- struct bgpd_addr *, u_int8_t, struct rde_peer *,
-- enum directions);
-+enum filter_actions rde_filter(u_int16_t, struct rde_aspath **,
-+ struct filter_head *, struct rde_peer *,
-+ struct rde_aspath *, struct bgpd_addr *, u_int8_t,
-+ struct rde_peer *, enum directions);
+ /* rde_prefix.c */
+ #define pt_empty(pt) ((pt)->refcnt == 0)
+@@ -452,8 +471,7 @@ enum filter_actions rde_filter(u_int16_t
+ struct rde_aspath *, struct bgpd_addr *, u_int8_t,
+ struct rde_peer *, enum directions);
void rde_apply_set(struct rde_aspath *, struct filter_set_head *,
- sa_family_t, struct rde_peer *, struct rde_peer *);
- int rde_filter_community(struct rde_aspath *, int, int);
+- sa_family_t, struct rde_peer *, struct rde_peer *);
+-int rde_filter_community(struct rde_aspath *, int, int);
++ u_int8_t, struct rde_peer *, struct rde_peer *);
+ int rde_filter_equal(struct filter_head *, struct filter_head *,
+ struct rde_peer *, enum directions);
+