diff options
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_rde.h')
-rw-r--r-- | net/openbgpd/files/patch-bgpd_rde.h | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/net/openbgpd/files/patch-bgpd_rde.h b/net/openbgpd/files/patch-bgpd_rde.h new file mode 100644 index 000000000000..ba7d2d095891 --- /dev/null +++ b/net/openbgpd/files/patch-bgpd_rde.h @@ -0,0 +1,361 @@ +Index: bgpd/rde.h +=================================================================== +RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde.h,v +retrieving revision 1.1.1.8 +retrieving revision 1.1.1.13 +diff -u -p -r1.1.1.8 -r1.1.1.13 +--- bgpd/rde.h 14 Feb 2010 20:19:57 -0000 1.1.1.8 ++++ bgpd/rde.h 8 Dec 2012 10:37:09 -0000 1.1.1.13 +@@ -1,8 +1,8 @@ +-/* $OpenBSD: rde.h,v 1.120 2009/06/06 01:10:29 claudio Exp $ */ ++/* $OpenBSD: rde.h,v 1.144 2012/09/12 05:56:22 claudio Exp $ */ + + /* + * Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and +- * Andre Oppermann <oppermann@pipeline.ch> ++ * Andre Oppermann <oppermann@networx.ch> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above +@@ -56,16 +56,16 @@ 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; ++ time_t staletime[AID_MAX]; + u_int64_t prefix_rcvd_update; + u_int64_t prefix_rcvd_withdraw; ++ u_int64_t prefix_rcvd_eor; + u_int64_t prefix_sent_update; + u_int64_t prefix_sent_withdraw; ++ u_int64_t prefix_sent_eor; + u_int32_t prefix_cnt; /* # of prefixes */ + u_int32_t remote_bgpid; /* host byte order! */ + u_int32_t up_pcnt; +@@ -75,12 +75,16 @@ struct rde_peer { + enum peer_state state; + u_int16_t ribid; + u_int16_t short_as; ++ u_int16_t mrt_idx; + u_int8_t reconf_in; /* in filter changed */ + u_int8_t reconf_out; /* out filter changed */ ++ u_int8_t reconf_rib; /* rib changed */ + }; + + #define AS_SET 1 + #define AS_SEQUENCE 2 ++#define AS_CONFED_SEQUENCE 3 ++#define AS_CONFED_SET 4 + #define ASPATH_HEADER_SIZE (sizeof(struct aspath) - sizeof(u_char)) + + LIST_HEAD(aspath_list, aspath); +@@ -117,6 +121,9 @@ enum attrtypes { + #define ATTR_PARTIAL 0x20 + #define ATTR_TRANSITIVE 0x40 + #define ATTR_OPTIONAL 0x80 ++#define ATTR_RESERVED 0x0f ++/* by default mask the reserved bits and the ext len bit */ ++#define ATTR_DEFMASK (ATTR_RESERVED | ATTR_EXTLEN) + + /* default attribute flags for well known attributes */ + #define ATTR_WELL_KNOWN ATTR_TRANSITIVE +@@ -163,6 +170,8 @@ LIST_HEAD(prefix_head, prefix); + #define F_NEXTHOP_REJECT 0x02000 + #define F_NEXTHOP_BLACKHOLE 0x04000 + #define F_NEXTHOP_NOMODIFY 0x08000 ++#define F_NEXTHOP_MASK 0x0f000 ++#define F_ATTR_PARSE_ERR 0x10000 + #define F_ATTR_LINKED 0x20000 + + +@@ -220,14 +229,14 @@ struct nexthop { + /* generic entry without address specific part */ + struct pt_entry { + RB_ENTRY(pt_entry) pt_e; +- sa_family_t af; ++ u_int8_t aid; + u_int8_t prefixlen; + u_int16_t refcnt; + }; + + struct pt_entry4 { + RB_ENTRY(pt_entry) pt_e; +- sa_family_t af; ++ u_int8_t aid; + u_int8_t prefixlen; + u_int16_t refcnt; + struct in_addr prefix4; +@@ -235,12 +244,25 @@ struct pt_entry4 { + + struct pt_entry6 { + RB_ENTRY(pt_entry) pt_e; +- sa_family_t af; ++ u_int8_t aid; + u_int8_t prefixlen; + u_int16_t refcnt; + struct in6_addr prefix6; + }; + ++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; ++}; ++ + struct rib_context { + LIST_ENTRY(rib_context) entry; + struct rib_entry *ctx_re; +@@ -250,7 +272,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; + }; + + struct rib_entry { +@@ -262,23 +284,15 @@ struct rib_entry { + u_int16_t flags; + }; + +-enum rib_state { +- RIB_NONE, +- RIB_ACTIVE, +- RIB_DELETE +-}; +- + struct rib { + char name[PEER_DESCR_LEN]; + struct rib_tree rib; +- enum rib_state state; ++ u_int rtableid; + u_int16_t flags; + u_int16_t id; ++ enum reconf_action state; + }; + +-#define F_RIB_ENTRYLOCK 0x0001 +-#define F_RIB_NOEVALUATE 0x0002 +-#define F_RIB_NOFIB 0x0004 + #define RIB_FAILED 0xffff + + struct prefix { +@@ -292,8 +306,14 @@ struct prefix { + extern struct rde_memstats rdemem; + + /* prototypes */ ++/* mrt.c */ ++int mrt_dump_v2_hdr(struct mrt *, struct bgpd_config *, ++ struct rde_peer_head *); ++void mrt_dump_upcall(struct rib_entry *, void *); ++void mrt_done(void *); ++ + /* rde.c */ +-void rde_send_kroute(struct prefix *, struct prefix *); ++void rde_send_kroute(struct prefix *, struct prefix *, u_int16_t); + void rde_send_nexthop(struct bgpd_addr *, int); + void rde_send_pftable(u_int16_t, struct bgpd_addr *, + u_int8_t, int); +@@ -309,7 +329,7 @@ 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 *, ++int attr_writebuf(struct ibuf *, u_int8_t, u_int8_t, void *, + u_int16_t); + void attr_init(u_int32_t); + void attr_shutdown(void); +@@ -327,6 +347,7 @@ int aspath_verify(void *, u_int16_t, i + #define AS_ERR_LEN -1 + #define AS_ERR_TYPE -2 + #define AS_ERR_BAD -3 ++#define AS_ERR_SOFT -4 + void aspath_init(u_int32_t); + void aspath_shutdown(void); + struct aspath *aspath_get(void *, u_int16_t); +@@ -341,22 +362,66 @@ u_int32_t aspath_neighbor(struct aspath + int aspath_loopfree(struct aspath *, u_int32_t); + 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 aspath_lenmatch(struct aspath *, enum aslen_spec, u_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_match(struct rde_aspath *, ++ struct filter_extcommunity *, u_int16_t); ++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); ++int community_ext_conv(struct filter_extcommunity *, u_int16_t, ++ u_int64_t *); ++ ++/* rde_decide.c */ ++void prefix_evaluate(struct prefix *, struct rib_entry *); ++ ++/* rde_filter.c */ ++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); ++void rde_apply_set(struct rde_aspath *, struct filter_set_head *, ++ u_int8_t, struct rde_peer *, struct rde_peer *); ++int rde_filter_equal(struct filter_head *, struct filter_head *, ++ struct rde_peer *, enum directions); ++ ++/* rde_prefix.c */ ++#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 *); ++struct pt_entry *pt_lookup(struct bgpd_addr *); ++int pt_prefix_cmp(const struct pt_entry *, const struct pt_entry *); + + /* 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_new(char *, u_int, 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 *, u_int8_t); + void rib_dump_r(struct rib_context *); + void rib_dump_runner(void); + int rib_dump_pending(void); +@@ -368,6 +433,7 @@ int path_update(struct rib *, struct r + 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 *); ++void path_remove_stale(struct rde_aspath *, u_int8_t); + void path_destroy(struct rde_aspath *); + int path_empty(struct rde_aspath *); + struct rde_aspath *path_copy(struct rde_aspath *); +@@ -375,8 +441,6 @@ struct rde_aspath *path_get(void); + 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 rib *, struct rde_peer *, + struct bgpd_addr *, int, u_int32_t); + int prefix_add(struct rib *, struct rde_aspath *, +@@ -385,6 +449,7 @@ void prefix_move(struct rde_aspath *, + 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); ++int prefix_writebuf(struct ibuf *, struct bgpd_addr *, u_int8_t); + struct prefix *prefix_bypeer(struct rib_entry *, struct rde_peer *, + u_int32_t); + void prefix_updateall(struct rde_aspath *, enum nexthop_state, +@@ -395,7 +460,7 @@ void prefix_network_clean(struct rde_p + void nexthop_init(u_int32_t); + void nexthop_shutdown(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 *); +@@ -403,9 +468,6 @@ void nexthop_update(struct kroute_next + struct nexthop *nexthop_get(struct bgpd_addr *); + int nexthop_compare(struct nexthop *, struct nexthop *); + +-/* rde_decide.c */ +-void prefix_evaluate(struct prefix *, struct rib_entry *); +- + /* rde_update.c */ + void up_init(struct rde_peer *); + void up_down(struct rde_peer *); +@@ -415,49 +477,14 @@ 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); ++ 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 *); +- +-/* rde_prefix.c */ +-#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 *); +-struct pt_entry *pt_lookup(struct bgpd_addr *); +-int pt_prefix_cmp(const struct pt_entry *, const struct pt_entry *); +- +- +-/* rde_filter.c */ +-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); +-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); +-int rde_filter_equal(struct filter_head *, struct filter_head *, +- struct rde_peer *, enum directions); +- +-/* util.c */ +-u_int32_t aspath_extract(const void *, int); ++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); + + #endif /* __RDE_H__ */ |