Annotation of embedaddon/bird2/proto/mrt/mrt.h, revision 1.1.1.1

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_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>