Return to mrt.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / mrt |
1.1 ! misho 1: /* ! 2: * BIRD -- Multi-Threaded Routing Toolkit (MRT) Protocol ! 3: * ! 4: * (c) 2017--2018 Ondrej Zajicek <santiago@crfreenet.org> ! 5: * (c) 2017--2018 CZ.NIC z.s.p.o. ! 6: * ! 7: * Can be freely distributed and used under the terms of the GNU GPL. ! 8: */ ! 9: ! 10: #ifndef _BIRD_MRT_H_ ! 11: #define _BIRD_MRT_H_ ! 12: ! 13: #include "nest/bird.h" ! 14: #include "nest/protocol.h" ! 15: #include "lib/lists.h" ! 16: #include "nest/route.h" ! 17: #include "lib/event.h" ! 18: #include "lib/hash.h" ! 19: ! 20: ! 21: struct mrt_config { ! 22: struct proto_config c; ! 23: ! 24: struct rtable_config *table_cf; ! 25: const char *table_expr; ! 26: const struct filter *filter; ! 27: const char *filename; ! 28: uint period; ! 29: int always_add_path; ! 30: }; ! 31: ! 32: struct mrt_proto { ! 33: struct proto p; ! 34: timer *timer; ! 35: event *event; ! 36: ! 37: struct mrt_target *file; ! 38: struct mrt_table_dump_state *table_dump; ! 39: }; ! 40: ! 41: struct mrt_dump_data { ! 42: const char *table_expr; ! 43: struct rtable *table_ptr; ! 44: const struct filter *filter; ! 45: char *filename; ! 46: }; ! 47: ! 48: struct mrt_peer_entry { ! 49: u32 index; ! 50: u32 peer_id; ! 51: u32 peer_as; ! 52: ip_addr peer_ip; ! 53: struct mrt_peer_entry *next; ! 54: }; ! 55: ! 56: struct mrt_table_dump_state { ! 57: struct mrt_proto *proto; /* Protocol for regular MRT dumps (or NULL) */ ! 58: struct cli *cli; /* CLI for irregular MRT dumps (or NULL) */ ! 59: struct config *config; /* Config valid during start of dump, locked */ ! 60: ! 61: /* Configuration information */ ! 62: const char *table_expr; /* Wildcard for table name (or NULL) */ ! 63: struct rtable *table_ptr; /* Explicit table (or NULL) */ ! 64: const struct filter *filter; /* Optional filter */ ! 65: const char *filename; /* Filename pattern */ ! 66: int always_add_path; /* Always use *_ADDPATH message subtypes */ ! 67: ! 68: /* Allocated by mrt_table_dump_init() */ ! 69: pool *pool; /* Pool for table dump */ ! 70: linpool *linpool; /* Temporary linear pool */ ! 71: linpool *peer_lp; /* Linear pool for peer entries in peer_hash */ ! 72: buffer buf; /* Buffer for MRT messages */ ! 73: ! 74: HASH(struct mrt_peer_entry) peer_hash; /* Hash for peers to find the index */ ! 75: ! 76: struct rtable *table; /* Processed table, NULL initially */ ! 77: struct fib_iterator fit; /* Iterator in processed table */ ! 78: int table_open; /* Whether iterator is linked */ ! 79: ! 80: int ipv4; /* Processed table is IPv4 */ ! 81: int add_path; /* Current message subtype is *_ADDPATH */ ! 82: int want_add_path; /* Want *_ADDPATH message later */ ! 83: int max; /* Decreasing counter of dumped routes */ ! 84: u32 seqnum; /* MRT message sequence number */ ! 85: btime time_offset; /* Time offset between monotonic and real time */ ! 86: struct bgp_write_state *bws; /* */ ! 87: ! 88: u16 peer_count; /* Number of peers */ ! 89: u32 peer_count_offset; /* Buffer offset to store peer_count later */ ! 90: u16 entry_count; /* Number of RIB Entries */ ! 91: u32 entry_count_offset; /* Buffer offset to store entry_count later */ ! 92: ! 93: struct rfile *file; /* tracking for mrt table dump file */ ! 94: int fd; ! 95: }; ! 96: ! 97: struct mrt_bgp_data { ! 98: uint peer_as; ! 99: uint local_as; ! 100: uint index; ! 101: uint af; ! 102: ip_addr peer_ip; ! 103: ip_addr local_ip; ! 104: byte *message; ! 105: uint msg_len; ! 106: uint old_state; ! 107: uint new_state; ! 108: u8 as4; ! 109: u8 add_path; ! 110: }; ! 111: ! 112: ! 113: #define MRT_HDR_LENGTH 12 /* MRT Timestamp + MRT Type + MRT Subtype + MRT Load Length */ ! 114: #define MRT_PEER_TYPE_32BIT_ASN 2 /* MRT Table Dump: Peer Index Table: Peer Type: Use 32bit ASN */ ! 115: #define MRT_PEER_TYPE_IPV6 1 /* MRT Table Dump: Peer Index Table: Peer Type: Use IPv6 IP Address */ ! 116: ! 117: #define MRT_ATTR_BUFFER_SIZE 65536 ! 118: ! 119: /* MRT Types */ ! 120: #define MRT_TABLE_DUMP_V2 13 ! 121: #define MRT_BGP4MP 16 ! 122: ! 123: /* MRT Table Dump v2 Subtypes */ ! 124: #define MRT_PEER_INDEX_TABLE 1 ! 125: #define MRT_RIB_IPV4_UNICAST 2 ! 126: #define MRT_RIB_IPV4_MULTICAST 3 ! 127: #define MRT_RIB_IPV6_UNICAST 4 ! 128: #define MRT_RIB_IPV6_MULTICAST 5 ! 129: #define MRT_RIB_GENERIC 6 ! 130: #define MRT_RIB_IPV4_UNICAST_ADDPATH 8 ! 131: #define MRT_RIB_IPV4_MULTICAST_ADDPATH 9 ! 132: #define MRT_RIB_IPV6_UNICAST_ADDPATH 10 ! 133: #define MRT_RIB_IPV6_MULTICAST_ADDPATH 11 ! 134: #define MRT_RIB_GENERIC_ADDPATH 12 ! 135: ! 136: /* MRT BGP4MP Subtypes */ ! 137: #define MRT_BGP4MP_MESSAGE 1 ! 138: #define MRT_BGP4MP_MESSAGE_AS4 4 ! 139: #define MRT_BGP4MP_STATE_CHANGE_AS4 5 ! 140: #define MRT_BGP4MP_MESSAGE_LOCAL 6 ! 141: #define MRT_BGP4MP_MESSAGE_AS4_LOCAL 7 ! 142: #define MRT_BGP4MP_MESSAGE_ADDPATH 8 ! 143: #define MRT_BGP4MP_MESSAGE_AS4_ADDPATH 9 ! 144: #define MRT_BGP4MP_MESSAGE_LOCAL_ADDPATH 10 ! 145: #define MRT_BGP4MP_MESSAGE_AS4_LOCAL_ADDPATH 11 ! 146: ! 147: ! 148: #ifdef CONFIG_MRT ! 149: void mrt_dump_cmd(struct mrt_dump_data *d); ! 150: void mrt_dump_bgp_message(struct mrt_bgp_data *d); ! 151: void mrt_dump_bgp_state_change(struct mrt_bgp_data *d); ! 152: void mrt_check_config(struct proto_config *C); ! 153: #else ! 154: static inline void mrt_dump_bgp_message(struct mrt_bgp_data *d UNUSED) { } ! 155: static inline void mrt_dump_bgp_state_change(struct mrt_bgp_data *d UNUSED) { } ! 156: #endif ! 157: ! 158: #endif /* _BIRD_MRT_H_ */