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

1.1       misho       1: /*
                      2:  *     BIRD -- The Babel protocol
                      3:  *
                      4:  *     Copyright (c) 2015--2016 Toke Hoiland-Jorgensen
                      5:  *     (c) 2016--2017 Ondrej Zajicek <santiago@crfreenet.org>
                      6:  *     (c) 2016--2017 CZ.NIC z.s.p.o.
                      7:  *
                      8:  *     Can be freely distributed and used under the terms of the GNU GPL.
                      9:  *
                     10:  *     This file contains the data structures used by Babel.
                     11:  */
                     12: 
                     13: #ifndef _BIRD_BABEL_H_
                     14: #define _BIRD_BABEL_H_
                     15: 
                     16: #include "nest/bird.h"
                     17: #include "nest/cli.h"
                     18: #include "nest/iface.h"
                     19: #include "nest/route.h"
                     20: #include "nest/protocol.h"
                     21: #include "nest/locks.h"
                     22: #include "lib/resource.h"
                     23: #include "lib/lists.h"
                     24: #include "lib/socket.h"
                     25: #include "lib/string.h"
                     26: #include "lib/timer.h"
                     27: 
                     28: #define EA_BABEL_METRIC                EA_CODE(PROTOCOL_BABEL, 0)
                     29: #define EA_BABEL_ROUTER_ID     EA_CODE(PROTOCOL_BABEL, 1)
                     30: 
                     31: #define BABEL_MAGIC            42
                     32: #define BABEL_VERSION          2
                     33: #define BABEL_PORT             6696
                     34: #define BABEL_INFINITY         0xFFFF
                     35: 
                     36: 
                     37: #define BABEL_HELLO_INTERVAL_WIRED     (4 S_)  /* Default hello intervals in seconds */
                     38: #define BABEL_HELLO_INTERVAL_WIRELESS  (4 S_)
                     39: #define BABEL_HELLO_LIMIT              12
                     40: #define BABEL_UPDATE_INTERVAL_FACTOR   4
                     41: #define BABEL_IHU_INTERVAL_FACTOR      3
                     42: #define BABEL_HOLD_TIME_FACTOR         4       /* How long we keep unreachable route relative to update interval */
                     43: #define BABEL_IHU_EXPIRY_FACTOR(X)     ((btime)(X)*7/2)        /* 3.5 */
                     44: #define BABEL_HELLO_EXPIRY_FACTOR(X)   ((btime)(X)*3/2)        /* 1.5 */
                     45: #define BABEL_ROUTE_EXPIRY_FACTOR(X)   ((btime)(X)*7/2)        /* 3.5 */
                     46: #define BABEL_ROUTE_REFRESH_FACTOR(X)  ((btime)(X)*5/2)        /* 2.5 */
                     47: #define BABEL_SEQNO_REQUEST_RETRY      4
                     48: #define BABEL_SEQNO_REQUEST_EXPIRY     (2 S_)
                     49: #define BABEL_GARBAGE_INTERVAL         (300 S_)
                     50: #define BABEL_RXCOST_WIRED             96
                     51: #define BABEL_RXCOST_WIRELESS          256
                     52: #define BABEL_INITIAL_HOP_COUNT                255
                     53: #define BABEL_MAX_SEND_INTERVAL                5       /* Unused ? */
                     54: 
                     55: /* Max interval that will not overflow when carried as 16-bit centiseconds */
                     56: #define BABEL_TIME_UNITS               10000   /* On-wire times are counted in centiseconds */
                     57: #define BABEL_MIN_INTERVAL             (0x0001 * BABEL_TIME_UNITS)
                     58: #define BABEL_MAX_INTERVAL             (0xFFFF * BABEL_TIME_UNITS)
                     59: 
                     60: #define BABEL_OVERHEAD         (IP6_HEADER_LENGTH+UDP_HEADER_LENGTH)
                     61: #define BABEL_MIN_MTU          (512 + BABEL_OVERHEAD)
                     62: 
                     63: 
                     64: enum babel_tlv_type {
                     65:   BABEL_TLV_PAD1               = 0,
                     66:   BABEL_TLV_PADN               = 1,
                     67:   BABEL_TLV_ACK_REQ            = 2,
                     68:   BABEL_TLV_ACK                        = 3,
                     69:   BABEL_TLV_HELLO              = 4,
                     70:   BABEL_TLV_IHU                = 5,
                     71:   BABEL_TLV_ROUTER_ID          = 6,
                     72:   BABEL_TLV_NEXT_HOP           = 7,
                     73:   BABEL_TLV_UPDATE             = 8,
                     74:   BABEL_TLV_ROUTE_REQUEST      = 9,
                     75:   BABEL_TLV_SEQNO_REQUEST      = 10,
                     76:   /* extensions - not implemented
                     77:   BABEL_TLV_TS_PC              = 11,
                     78:   BABEL_TLV_HMAC               = 12,
                     79:   BABEL_TLV_SS_UPDATE          = 13,
                     80:   BABEL_TLV_SS_REQUEST         = 14,
                     81:   BABEL_TLV_SS_SEQNO_REQUEST   = 15,
                     82:   */
                     83:   BABEL_TLV_MAX
                     84: };
                     85: 
                     86: enum babel_subtlv_type {
                     87:   BABEL_SUBTLV_PAD1            = 0,
                     88:   BABEL_SUBTLV_PADN            = 1,
                     89: 
                     90:   /* Mandatory subtlvs */
                     91:   BABEL_SUBTLV_SOURCE_PREFIX    = 128,
                     92: };
                     93: 
                     94: enum babel_iface_type {
                     95:   /* In practice, UNDEF and WIRED give equivalent behaviour */
                     96:   BABEL_IFACE_TYPE_UNDEF       = 0,
                     97:   BABEL_IFACE_TYPE_WIRED       = 1,
                     98:   BABEL_IFACE_TYPE_WIRELESS    = 2,
                     99:   BABEL_IFACE_TYPE_MAX
                    100: };
                    101: 
                    102: enum babel_ae_type {
                    103:   BABEL_AE_WILDCARD            = 0,
                    104:   BABEL_AE_IP4                 = 1,
                    105:   BABEL_AE_IP6                 = 2,
                    106:   BABEL_AE_IP6_LL              = 3,
                    107:   BABEL_AE_MAX
                    108: };
                    109: 
                    110: 
                    111: struct babel_config {
                    112:   struct proto_config c;
                    113:   list iface_list;                     /* List of iface configs (struct babel_iface_config) */
                    114:   uint hold_time;                      /* Time to hold stale entries and unreachable routes */
                    115:   u8 randomize_router_id;
                    116: 
                    117:   struct channel_config *ip4_channel;
                    118:   struct channel_config *ip6_channel;
                    119: };
                    120: 
                    121: struct babel_iface_config {
                    122:   struct iface_patt i;
                    123: 
                    124:   u16 rxcost;
                    125:   u8 type;
                    126:   u8 limit;                            /* Minimum number of Hellos to keep link up */
                    127:   u8 check_link;
                    128:   uint port;
                    129:   uint hello_interval;                 /* Hello interval, in us */
                    130:   uint ihu_interval;                   /* IHU interval, in us */
                    131:   uint update_interval;                        /* Update interval, in us */
                    132: 
                    133:   u16 rx_buffer;                       /* RX buffer size, 0 for MTU */
                    134:   u16 tx_length;                       /* TX packet length limit (including headers), 0 for MTU */
                    135:   int tx_tos;
                    136:   int tx_priority;
                    137: 
                    138:   ip_addr next_hop_ip4;
                    139:   ip_addr next_hop_ip6;
                    140: };
                    141: 
                    142: struct babel_proto {
                    143:   struct proto p;
                    144:   timer *timer;
                    145:   struct fib ip4_rtable;
                    146:   struct fib ip6_rtable;
                    147: 
                    148:   struct channel *ip4_channel;
                    149:   struct channel *ip6_channel;
                    150: 
                    151:   list interfaces;                     /* Interfaces we really know about (struct babel_iface) */
                    152:   u64 router_id;
                    153:   u16 update_seqno;                    /* To be increased on request */
                    154:   u8 update_seqno_inc;                 /* Request for update_seqno increase */
                    155:   u8 triggered;                                /* For triggering global updates */
                    156: 
                    157:   slab *route_slab;
                    158:   slab *source_slab;
                    159:   slab *msg_slab;
                    160:   slab *seqno_slab;
                    161: 
                    162:   struct tbf log_pkt_tbf;              /* TBF for packet messages */
                    163: };
                    164: 
                    165: struct babel_iface {
                    166:   node n;
                    167: 
                    168:   struct babel_proto *proto;
                    169:   struct iface *iface;
                    170: 
                    171:   struct babel_iface_config *cf;
                    172: 
                    173:   u8 up;
                    174: 
                    175:   pool *pool;
                    176:   char *ifname;
                    177:   sock *sk;
                    178:   ip_addr addr;
                    179:   ip_addr next_hop_ip4;
                    180:   ip_addr next_hop_ip6;
                    181:   int tx_length;
                    182:   list neigh_list;                     /* List of neighbors seen on this iface (struct babel_neighbor) */
                    183:   list msg_queue;
                    184: 
                    185:   u16 hello_seqno;                     /* To be increased on each hello */
                    186: 
                    187:   btime next_hello;
                    188:   btime next_regular;
                    189:   btime next_triggered;
                    190:   btime want_triggered;
                    191: 
                    192:   timer *timer;
                    193:   event *send_event;
                    194: };
                    195: 
                    196: struct babel_neighbor {
                    197:   node n;
                    198:   struct babel_iface *ifa;
                    199: 
                    200:   ip_addr addr;
                    201:   uint uc;                             /* Reference counter for seqno requests */
                    202:   u16 rxcost;                          /* Sent in last IHU */
                    203:   u16 txcost;                          /* Received in last IHU */
                    204:   u16 cost;                            /* Computed neighbor cost */
                    205:   s8 ihu_cnt;                          /* IHU countdown, 0 to send it */
                    206:   u8 hello_cnt;
                    207:   u16 hello_map;
                    208:   u16 next_hello_seqno;
                    209:   uint last_hello_int;
                    210:   /* expiry timers */
                    211:   btime hello_expiry;
                    212:   btime ihu_expiry;
                    213: 
                    214:   list routes;                         /* Routes this neighbour has sent us (struct babel_route) */
                    215: };
                    216: 
                    217: struct babel_source {
                    218:   node n;
                    219: 
                    220:   u64 router_id;
                    221:   u16 seqno;
                    222:   u16 metric;
                    223:   btime expires;
                    224: };
                    225: 
                    226: struct babel_route {
                    227:   node n;
                    228:   node neigh_route;
                    229:   struct babel_entry    *e;
                    230:   struct babel_neighbor *neigh;
                    231: 
                    232:   u8 feasible;
                    233:   u16 seqno;
                    234:   u16 metric;
                    235:   u16 advert_metric;
                    236:   u64 router_id;
                    237:   ip_addr next_hop;
                    238:   btime refresh_time;
                    239:   btime expires;
                    240: };
                    241: 
                    242: struct babel_seqno_request {
                    243:   node n;
                    244:   u64 router_id;
                    245:   u16 seqno;
                    246:   u8 hop_count;
                    247:   u8 count;
                    248:   btime expires;
                    249:   struct babel_neighbor *nbr;
                    250: };
                    251: 
                    252: struct babel_entry {
                    253:   struct babel_route *selected;
                    254: 
                    255:   list routes;                         /* Routes for this prefix (struct babel_route) */
                    256:   list sources;                                /* Source entries for this prefix (struct babel_source). */
                    257:   list requests;
                    258: 
                    259:   u8 valid;                            /* Entry validity state (BABEL_ENTRY_*) */
                    260:   u8 unreachable;                      /* Unreachable route is announced */
                    261:   u16 seqno;                           /* Outgoing seqno */
                    262:   u16 metric;                          /* Outgoing metric */
                    263:   u64 router_id;                       /* Outgoing router ID */
                    264:   btime updated;                       /* Last change of outgoing rte, for triggered updates */
                    265: 
                    266:   struct fib_node n;
                    267: };
                    268: 
                    269: #define BABEL_ENTRY_DUMMY      0       /* No outgoing route */
                    270: #define BABEL_ENTRY_VALID      1       /* Valid outgoing route */
                    271: #define BABEL_ENTRY_STALE      2       /* Stale outgoing route, waiting for GC */
                    272: 
                    273: 
                    274: /*
                    275:  *     Internal TLV messages
                    276:  */
                    277: 
                    278: struct babel_msg_ack_req {
                    279:   u8 type;
                    280:   u16 nonce;
                    281:   uint interval;
                    282:   ip_addr sender;
                    283: };
                    284: 
                    285: struct babel_msg_ack {
                    286:   u8 type;
                    287:   u16 nonce;
                    288: };
                    289: 
                    290: struct babel_msg_hello {
                    291:   u8 type;
                    292:   u16 seqno;
                    293:   uint interval;
                    294:   ip_addr sender;
                    295: };
                    296: 
                    297: struct babel_msg_ihu {
                    298:   u8 type;
                    299:   u8 ae;
                    300:   u16 rxcost;
                    301:   uint interval;
                    302:   ip_addr addr;
                    303:   ip_addr sender;
                    304: };
                    305: 
                    306: struct babel_msg_update {
                    307:   u8 type;
                    308:   u8 wildcard;
                    309:   uint interval;
                    310:   u16 seqno;
                    311:   u16 metric;
                    312:   u64 router_id;
                    313:   union {
                    314:     net_addr net;
                    315:     net_addr_ip6_sadr net_sadr;
                    316:   };
                    317:   ip_addr next_hop;
                    318:   ip_addr sender;
                    319: };
                    320: 
                    321: struct babel_msg_route_request {
                    322:   u8 type;
                    323:   u8 full;
                    324:   union {
                    325:     net_addr net;
                    326:     net_addr_ip6_sadr net_sadr;
                    327:   };
                    328: };
                    329: 
                    330: struct babel_msg_seqno_request {
                    331:   u8 type;
                    332:   u8 hop_count;
                    333:   u16 seqno;
                    334:   u64 router_id;
                    335:   union {
                    336:     net_addr net;
                    337:     net_addr_ip6_sadr net_sadr;
                    338:   };
                    339:   ip_addr sender;
                    340: };
                    341: 
                    342: union babel_msg {
                    343:   u8 type;
                    344:   struct babel_msg_ack_req ack_req;
                    345:   struct babel_msg_ack ack;
                    346:   struct babel_msg_hello hello;
                    347:   struct babel_msg_ihu ihu;
                    348:   struct babel_msg_update update;
                    349:   struct babel_msg_route_request route_request;
                    350:   struct babel_msg_seqno_request seqno_request;
                    351: };
                    352: 
                    353: struct babel_msg_node {
                    354:   node n;
                    355:   union babel_msg msg;
                    356: };
                    357: 
                    358: static inline int babel_sadr_enabled(struct babel_proto *p)
                    359: { return p->ip6_rtable.addr_type == NET_IP6_SADR; }
                    360: 
                    361: /* babel.c */
                    362: void babel_handle_ack_req(union babel_msg *msg, struct babel_iface *ifa);
                    363: void babel_handle_ack(union babel_msg *msg, struct babel_iface *ifa);
                    364: void babel_handle_hello(union babel_msg *msg, struct babel_iface *ifa);
                    365: void babel_handle_ihu(union babel_msg *msg, struct babel_iface *ifa);
                    366: void babel_handle_router_id(union babel_msg *msg, struct babel_iface *ifa);
                    367: void babel_handle_update(union babel_msg *msg, struct babel_iface *ifa);
                    368: void babel_handle_route_request(union babel_msg *msg, struct babel_iface *ifa);
                    369: void babel_handle_seqno_request(union babel_msg *msg, struct babel_iface *ifa);
                    370: 
                    371: void babel_show_interfaces(struct proto *P, char *iff);
                    372: void babel_show_neighbors(struct proto *P, char *iff);
                    373: void babel_show_entries(struct proto *P);
                    374: void babel_show_routes(struct proto *P);
                    375: 
                    376: /* packets.c */
                    377: void babel_enqueue(union babel_msg *msg, struct babel_iface *ifa);
                    378: void babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest);
                    379: int babel_open_socket(struct babel_iface *ifa);
                    380: void babel_send_queue(void *arg);
                    381: 
                    382: 
                    383: #endif

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