Annotation of embedaddon/bird/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: *
! 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>