File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / proto / babel / babel.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (7 years, 7 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_8p3, v1_6_3p0, v1_6_3, HEAD
bird 1.6.3

    1: /*
    2:  *	BIRD -- The Babel protocol
    3:  *
    4:  *	Copyright (c) 2015--2016 Toke Hoiland-Jorgensen
    5:  *
    6:  *	Can be freely distributed and used under the terms of the GNU GPL.
    7:  *
    8:  *	This file contains the data structures used by Babel.
    9:  */
   10: 
   11: #ifndef _BIRD_BABEL_H_
   12: #define _BIRD_BABEL_H_
   13: 
   14: #include "nest/bird.h"
   15: #include "nest/cli.h"
   16: #include "nest/iface.h"
   17: #include "nest/route.h"
   18: #include "nest/protocol.h"
   19: #include "nest/locks.h"
   20: #include "lib/resource.h"
   21: #include "lib/lists.h"
   22: #include "lib/socket.h"
   23: #include "lib/string.h"
   24: #include "lib/timer.h"
   25: 
   26: #ifndef IPV6
   27: #error "The Babel protocol only speaks IPv6"
   28: #endif
   29: 
   30: #define EA_BABEL_METRIC		EA_CODE(EAP_BABEL, 0)
   31: #define EA_BABEL_ROUTER_ID	EA_CODE(EAP_BABEL, 1)
   32: 
   33: #define BABEL_MAGIC		42
   34: #define BABEL_VERSION		2
   35: #define BABEL_PORT		6696
   36: #define BABEL_INFINITY		0xFFFF
   37: 
   38: 
   39: #define BABEL_HELLO_INTERVAL_WIRED	4	/* Default hello intervals in seconds */
   40: #define BABEL_HELLO_INTERVAL_WIRELESS	4
   41: #define BABEL_UPDATE_INTERVAL_FACTOR	4
   42: #define BABEL_IHU_INTERVAL_FACTOR	3
   43: #define BABEL_IHU_EXPIRY_FACTOR(X)	((X)*3/2)	/* 1.5 */
   44: #define BABEL_HELLO_EXPIRY_FACTOR(X)	((X)*3/2)	/* 1.5 */
   45: #define BABEL_ROUTE_EXPIRY_FACTOR(X)	((X)*7/2)	/* 3.5 */
   46: #define BABEL_ROUTE_REFRESH_INTERVAL	2	/* Seconds before route expiry to send route request */
   47: #define BABEL_HOLD_TIME			10	/* Expiry time for our own routes */
   48: #define BABEL_RXCOST_WIRED		96
   49: #define BABEL_RXCOST_WIRELESS		256
   50: #define BABEL_INITIAL_HOP_COUNT		255
   51: #define BABEL_MAX_SEND_INTERVAL		5
   52: #define BABEL_TIME_UNITS		100	/* On-wire times are counted in centiseconds */
   53: #define BABEL_SEQNO_REQUEST_EXPIRY	60
   54: #define BABEL_GARBAGE_INTERVAL		300
   55: 
   56: /* Max interval that will not overflow when carried as 16-bit centiseconds */
   57: #define BABEL_MAX_INTERVAL		(0xFFFF/BABEL_TIME_UNITS)
   58: 
   59: #define BABEL_OVERHEAD		(SIZE_OF_IP_HEADER+UDP_HEADER_LENGTH)
   60: #define BABEL_MIN_MTU		(512 + BABEL_OVERHEAD)
   61: 
   62: 
   63: enum babel_tlv_type {
   64:   BABEL_TLV_PAD1		= 0,
   65:   BABEL_TLV_PADN		= 1,
   66:   BABEL_TLV_ACK_REQ		= 2,
   67:   BABEL_TLV_ACK			= 3,
   68:   BABEL_TLV_HELLO		= 4,
   69:   BABEL_TLV_IHU 		= 5,
   70:   BABEL_TLV_ROUTER_ID		= 6,
   71:   BABEL_TLV_NEXT_HOP		= 7,
   72:   BABEL_TLV_UPDATE		= 8,
   73:   BABEL_TLV_ROUTE_REQUEST	= 9,
   74:   BABEL_TLV_SEQNO_REQUEST	= 10,
   75:   /* extensions - not implemented
   76:   BABEL_TLV_TS_PC		= 11,
   77:   BABEL_TLV_HMAC		= 12,
   78:   BABEL_TLV_SS_UPDATE		= 13,
   79:   BABEL_TLV_SS_REQUEST		= 14,
   80:   BABEL_TLV_SS_SEQNO_REQUEST	= 15,
   81:   */
   82:   BABEL_TLV_MAX
   83: };
   84: 
   85: enum babel_iface_type {
   86:   /* In practice, UNDEF and WIRED give equivalent behaviour */
   87:   BABEL_IFACE_TYPE_UNDEF	= 0,
   88:   BABEL_IFACE_TYPE_WIRED	= 1,
   89:   BABEL_IFACE_TYPE_WIRELESS	= 2,
   90:   BABEL_IFACE_TYPE_MAX
   91: };
   92: 
   93: enum babel_ae_type {
   94:   BABEL_AE_WILDCARD		= 0,
   95:   BABEL_AE_IP4			= 1,
   96:   BABEL_AE_IP6			= 2,
   97:   BABEL_AE_IP6_LL		= 3,
   98:   BABEL_AE_MAX
   99: };
  100: 
  101: 
  102: struct babel_config {
  103:   struct proto_config c;
  104: 
  105:   list iface_list;              /* Patterns configured -- keep it first; see babel_reconfigure why */
  106: };
  107: 
  108: struct babel_iface_config {
  109:   struct iface_patt i;
  110: 
  111:   u16 rxcost;
  112:   u8 type;
  113:   u8 check_link;
  114:   uint port;
  115:   u16 hello_interval;
  116:   u16 ihu_interval;
  117:   u16 update_interval;
  118: 
  119:   u16 rx_buffer;			/* RX buffer size, 0 for MTU */
  120:   u16 tx_length;			/* TX packet length limit (including headers), 0 for MTU */
  121:   int tx_tos;
  122:   int tx_priority;
  123: };
  124: 
  125: struct babel_proto {
  126:   struct proto p;
  127:   timer *timer;
  128:   struct fib rtable;
  129:   list interfaces;			/* Interfaces we really know about (struct babel_iface) */
  130:   u64 router_id;
  131:   u16 update_seqno;			/* To be increased on request */
  132:   u8 triggered;				/* For triggering global updates */
  133: 
  134:   slab *route_slab;
  135:   slab *source_slab;
  136:   slab *msg_slab;
  137: 
  138:   slab *seqno_slab;
  139:   list seqno_cache;			/* Seqno requests in the cache (struct babel_seqno_request) */
  140: 
  141:   struct tbf log_pkt_tbf;		/* TBF for packet messages */
  142: };
  143: 
  144: struct babel_iface {
  145:   node n;
  146: 
  147:   struct babel_proto *proto;
  148:   struct iface *iface;
  149: 
  150:   struct babel_iface_config *cf;
  151: 
  152:   u8 up;
  153: 
  154:   pool *pool;
  155:   char *ifname;
  156:   sock *sk;
  157:   ip_addr addr;
  158:   int tx_length;
  159:   list neigh_list;			/* List of neighbors seen on this iface (struct babel_neighbor) */
  160:   list msg_queue;
  161: 
  162:   u16 hello_seqno;			/* To be increased on each hello */
  163: 
  164:   bird_clock_t next_hello;
  165:   bird_clock_t next_regular;
  166:   bird_clock_t next_triggered;
  167:   bird_clock_t want_triggered;
  168: 
  169:   timer *timer;
  170:   event *send_event;
  171: };
  172: 
  173: struct babel_neighbor {
  174:   node n;
  175:   struct babel_iface *ifa;
  176: 
  177:   ip_addr addr;
  178:   u16 txcost;
  179:   u8 hello_cnt;
  180:   u16 hello_map;
  181:   u16 next_hello_seqno;
  182:   /* expiry timers */
  183:   bird_clock_t hello_expiry;
  184:   bird_clock_t ihu_expiry;
  185: 
  186:   list routes;				/* Routes this neighbour has sent us (struct babel_route) */
  187: };
  188: 
  189: struct babel_source {
  190:   node n;
  191: 
  192:   u64 router_id;
  193:   u16 seqno;
  194:   u16 metric;
  195:   bird_clock_t expires;
  196: };
  197: 
  198: struct babel_route {
  199:   node n;
  200:   node neigh_route;
  201:   struct babel_entry    *e;
  202:   struct babel_neighbor *neigh;
  203: 
  204:   u16 seqno;
  205:   u16 advert_metric;
  206:   u16 metric;
  207:   u64 router_id;
  208:   ip_addr next_hop;
  209:   bird_clock_t refresh_time;
  210:   bird_clock_t expires;
  211:   u16 expiry_interval;
  212: };
  213: 
  214: struct babel_entry {
  215:   struct fib_node n;
  216:   struct babel_proto *proto;
  217:   struct babel_route *selected_in;
  218:   struct babel_route *selected_out;
  219: 
  220:   bird_clock_t updated;
  221: 
  222:   list sources;				/* Source entries for this prefix (struct babel_source). */
  223:   list routes;				/* Routes for this prefix (struct babel_route) */
  224: };
  225: 
  226: /* Stores forwarded seqno requests for duplicate suppression. */
  227: struct babel_seqno_request {
  228:   node n;
  229:   ip_addr prefix;
  230:   u8  plen;
  231:   u64 router_id;
  232:   u16 seqno;
  233:   bird_clock_t updated;
  234: };
  235: 
  236: 
  237: /*
  238:  *	Internal TLV messages
  239:  */
  240: 
  241: struct babel_msg_ack_req {
  242:   u8 type;
  243:   u16 nonce;
  244:   u16 interval;
  245:   ip_addr sender;
  246: };
  247: 
  248: struct babel_msg_ack {
  249:   u8 type;
  250:   u16 nonce;
  251: };
  252: 
  253: struct babel_msg_hello {
  254:   u8 type;
  255:   u16 seqno;
  256:   u16 interval;
  257:   ip_addr sender;
  258: };
  259: 
  260: struct babel_msg_ihu {
  261:   u8 type;
  262:   u8 ae;
  263:   u16 rxcost;
  264:   u16 interval;
  265:   ip_addr addr;
  266:   ip_addr sender;
  267: };
  268: 
  269: struct babel_msg_update {
  270:   u8 type;
  271:   u8 wildcard;
  272:   u8 plen;
  273:   u16 interval;
  274:   u16 seqno;
  275:   u16 metric;
  276:   ip_addr prefix;
  277:   u64 router_id;
  278:   ip_addr next_hop;
  279:   ip_addr sender;
  280: };
  281: 
  282: struct babel_msg_route_request {
  283:   u8 type;
  284:   u8 full;
  285:   u8 plen;
  286:   ip_addr prefix;
  287: };
  288: 
  289: struct babel_msg_seqno_request {
  290:   u8 type;
  291:   u8 plen;
  292:   u16 seqno;
  293:   u8 hop_count;
  294:   u64 router_id;
  295:   ip_addr prefix;
  296:   ip_addr sender;
  297: };
  298: 
  299: union babel_msg {
  300:   u8 type;
  301:   struct babel_msg_ack_req ack_req;
  302:   struct babel_msg_ack ack;
  303:   struct babel_msg_hello hello;
  304:   struct babel_msg_ihu ihu;
  305:   struct babel_msg_update update;
  306:   struct babel_msg_route_request route_request;
  307:   struct babel_msg_seqno_request seqno_request;
  308: };
  309: 
  310: struct babel_msg_node {
  311:   node n;
  312:   union babel_msg msg;
  313: };
  314: 
  315: 
  316: /* babel.c */
  317: void babel_handle_ack_req(union babel_msg *msg, struct babel_iface *ifa);
  318: void babel_handle_ack(union babel_msg *msg, struct babel_iface *ifa);
  319: void babel_handle_hello(union babel_msg *msg, struct babel_iface *ifa);
  320: void babel_handle_ihu(union babel_msg *msg, struct babel_iface *ifa);
  321: void babel_handle_router_id(union babel_msg *msg, struct babel_iface *ifa);
  322: void babel_handle_update(union babel_msg *msg, struct babel_iface *ifa);
  323: void babel_handle_route_request(union babel_msg *msg, struct babel_iface *ifa);
  324: void babel_handle_seqno_request(union babel_msg *msg, struct babel_iface *ifa);
  325: 
  326: void babel_show_interfaces(struct proto *P, char *iff);
  327: void babel_show_neighbors(struct proto *P, char *iff);
  328: void babel_show_entries(struct proto *P);
  329: 
  330: /* packets.c */
  331: void babel_enqueue(union babel_msg *msg, struct babel_iface *ifa);
  332: void babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest);
  333: int babel_open_socket(struct babel_iface *ifa);
  334: void babel_send_queue(void *arg);
  335: 
  336: 
  337: #endif

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