diff options
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_rde.h')
-rw-r--r-- | net/openbgpd/files/patch-bgpd_rde.h | 386 |
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); + |