Annotation of embedaddon/bird2/proto/babel/babel.h, revision 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>