File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / rip / rip.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 21 16:03:57 2019 UTC (5 years, 2 months ago) by misho
Branches: bird2, MAIN
CVS tags: v2_0_7p0, HEAD
bird2 ver 2.0.7

    1: /*
    2:  *	BIRD -- Routing Information Protocol (RIP)
    3:  *
    4:  *	(c) 1998--1999 Pavel Machek <pavel@ucw.cz>
    5:  *	(c) 2004--2013 Ondrej Filip <feela@network.cz>
    6:  *	(c) 2009--2015 Ondrej Zajicek <santiago@crfreenet.org>
    7:  *	(c) 2009--2015 CZ.NIC z.s.p.o.
    8:  *
    9:  *	Can be freely distributed and used under the terms of the GNU GPL.
   10:  */
   11: 
   12: #ifndef _BIRD_RIP_H_
   13: #define _BIRD_RIP_H_
   14: 
   15: #include "nest/bird.h"
   16: #include "nest/cli.h"
   17: #include "nest/iface.h"
   18: #include "nest/protocol.h"
   19: #include "nest/route.h"
   20: #include "nest/password.h"
   21: #include "nest/locks.h"
   22: #include "nest/bfd.h"
   23: #include "lib/lists.h"
   24: #include "lib/resource.h"
   25: #include "lib/socket.h"
   26: #include "lib/string.h"
   27: #include "lib/timer.h"
   28: 
   29: 
   30: #define RIP_V1			1
   31: #define RIP_V2			2
   32: 
   33: #define RIP_PORT		520	/* RIP for IPv4 */
   34: #define RIP_NG_PORT		521	/* RIPng */
   35: 
   36: #define RIP_MAX_PKT_LENGTH	532	/* 512 + IP4_HEADER_LENGTH */
   37: #define RIP_AUTH_TAIL_LENGTH	4	/* Without auth_data */
   38: 
   39: #define RIP_DEFAULT_ECMP_LIMIT	16
   40: #define RIP_DEFAULT_INFINITY	16
   41: #define RIP_DEFAULT_UPDATE_TIME	  (30 S_)
   42: #define RIP_DEFAULT_TIMEOUT_TIME (180 S_)
   43: #define RIP_DEFAULT_GARBAGE_TIME (120 S_)
   44: 
   45: 
   46: struct rip_config
   47: {
   48:   struct proto_config c;
   49:   list patt_list;			/* List of iface configs (struct rip_iface_config) */
   50: 
   51:   u8 rip2;				/* RIPv2 (IPv4) or RIPng (IPv6) */
   52:   u8 ecmp;				/* Maximum number of nexthops in ECMP route, or 0 */
   53:   u8 infinity;				/* Maximum metric value, representing infinity */
   54: 
   55:   btime min_timeout_time;		/* Minimum of interface timeout_time */
   56:   btime max_garbage_time;		/* Maximum of interface garbage_time */
   57: };
   58: 
   59: struct rip_iface_config
   60: {
   61:   struct iface_patt i;
   62:   ip_addr address;			/* Configured dst address */
   63:   u16 port;				/* Src+dst port */
   64:   u8 metric;				/* Incoming metric */
   65:   u8 mode;				/* Interface mode (RIP_IM_*) */
   66:   u8 passive;				/* Passive iface - no packets are sent */
   67:   u8 version;				/* RIP version used for outgoing packets */
   68:   u8 version_only;	/* FIXXX */
   69:   u8 split_horizon;			/* Split horizon is used in route updates */
   70:   u8 poison_reverse;			/* Poisoned reverse is used in route updates */
   71:   u8 check_zero;			/* Validation of RIPv1 reserved fields */
   72:   u8 ecmp_weight;			/* Weight for ECMP routes*/
   73:   u8 auth_type;				/* Authentication type (RIP_AUTH_*) */
   74:   u8 ttl_security;			/* bool + 2 for TX only (send, but do not check on RX) */
   75:   u8 check_link;			/* Whether iface link change is used */
   76:   u8 bfd;				/* Use BFD on iface */
   77:   u16 rx_buffer;			/* RX buffer size, 0 for MTU */
   78:   u16 tx_length;			/* TX packet length limit (including headers), 0 for MTU */
   79:   int tx_tos;
   80:   int tx_priority;
   81:   btime update_time;			/* Periodic update interval */
   82:   btime timeout_time;			/* Route expiration timeout */
   83:   btime garbage_time;			/* Unreachable entry GC timeout */
   84:   list *passwords;			/* Passwords for authentication */
   85: };
   86: 
   87: struct rip_proto
   88: {
   89:   struct proto p;
   90:   struct fib rtable;			/* Internal routing table */
   91:   list iface_list;			/* List of interfaces (struct rip_iface) */
   92:   slab *rte_slab;			/* Slab for internal routes (struct rip_rte) */
   93:   timer *timer;				/* Main protocol timer */
   94: 
   95:   u8 rip2;				/* RIPv2 (IPv4) or RIPng (IPv6) */
   96:   u8 ecmp;				/* Maximum number of nexthops in ECMP route, or 0 */
   97:   u8 infinity;				/* Maximum metric value, representing infinity */
   98:   u8 triggered;				/* Logical AND of interface want_triggered values */
   99:   u8 rt_reload;				/* Route reload is scheduled */
  100: 
  101:   struct tbf log_pkt_tbf;		/* TBF for packet messages */
  102:   struct tbf log_rte_tbf;		/* TBF for RTE messages */
  103: };
  104: 
  105: struct rip_iface
  106: {
  107:   node n;
  108:   struct rip_proto *rip;
  109:   struct iface *iface;			/* Underyling core interface */
  110:   struct rip_iface_config *cf;		/* Related config, must be updated in reconfigure */
  111:   struct object_lock *lock;		/* Interface lock */
  112:   timer *timer;				/* Interface timer */
  113:   sock *sk;				/* UDP socket */
  114: 
  115:   u8 up;				/* Interface is active */
  116:   u8 csn_ready;				/* Nonzero CSN can be used */
  117:   u16 tx_plen;				/* Max TX packet data length */
  118:   u32 csn;				/* Last used crypto sequence number */
  119:   ip_addr addr;				/* Destination multicast/broadcast address */
  120:   list neigh_list;			/* List of iface neighbors (struct rip_neighbor) */
  121: 
  122:   /* Update scheduling */
  123:   btime next_regular;			/* Next time when regular update should be called */
  124:   btime next_triggered;			/* Next time when triggerd update may be called */
  125:   btime want_triggered;			/* Nonzero if triggered update is scheduled */
  126: 
  127:   /* Active update */
  128:   int tx_active;			/* Update session is active */
  129:   ip_addr tx_addr;			/* Update session destination address */
  130:   btime tx_changed;			/* Minimal changed time for triggered update */
  131:   struct fib_iterator tx_fit;		/* FIB iterator in RIP routing table (p.rtable) */
  132: };
  133: 
  134: struct rip_neighbor
  135: {
  136:   node n;
  137:   struct rip_iface *ifa;		/* Associated interface, may be NULL if stale */
  138:   struct neighbor *nbr;			/* Associaded core neighbor, may be NULL if stale */
  139:   struct bfd_request *bfd_req;		/* BFD request, if BFD is used */
  140:   btime last_seen;			/* Time of last received and accepted message */
  141:   u32 uc;				/* Use count, number of routes linking the neighbor */
  142:   u32 csn;				/* Last received crypto sequence number */
  143: };
  144: 
  145: struct rip_entry
  146: {
  147:   struct rip_rte *routes;		/* List of incoming routes */
  148: 
  149:   u8 valid;				/* Entry validity state (RIP_ENTRY_*) */
  150:   u8 metric;				/* Outgoing route metric */
  151:   u16 tag;				/* Outgoing route tag */
  152:   struct iface *from;			/* Outgoing route from, NULL if from  proto */
  153:   struct iface *iface;			/* Outgoing route iface (for next hop) */
  154:   ip_addr next_hop;			/* Outgoing route next hop */
  155: 
  156:   btime changed;			/* Last time when the outgoing route metric changed */
  157: 
  158:   struct fib_node n;
  159: };
  160: 
  161: struct rip_rte
  162: {
  163:   struct rip_rte *next;
  164: 
  165:   struct rip_neighbor *from;		/* Advertising router */
  166:   ip_addr next_hop;			/* Route next hop (iface is from->nbr->iface) */
  167:   u16 metric;				/* Route metric (after increase) */
  168:   u16 tag;				/* Route tag */
  169: 
  170:   btime expires;			/* Time of route expiration */
  171: };
  172: 
  173: 
  174: #define RIP_AUTH_NONE		0
  175: #define RIP_AUTH_PLAIN		2
  176: #define RIP_AUTH_CRYPTO		3
  177: 
  178: #define RIP_IM_MULTICAST	1
  179: #define RIP_IM_BROADCAST	2
  180: 
  181: #define RIP_ENTRY_DUMMY		0	/* Only used to store list of incoming routes */
  182: #define RIP_ENTRY_VALID		1	/* Valid outgoing route */
  183: #define RIP_ENTRY_STALE		2	/* Stale outgoing route, waiting for GC */
  184: 
  185: #define EA_RIP_METRIC		EA_CODE(PROTOCOL_RIP, 0)
  186: #define EA_RIP_TAG		EA_CODE(PROTOCOL_RIP, 1)
  187: 
  188: static inline int rip_is_v2(struct rip_proto *p)
  189: { return p->rip2; }
  190: 
  191: static inline int rip_is_ng(struct rip_proto *p)
  192: { return ! p->rip2; }
  193: 
  194: static inline void
  195: rip_reset_tx_session(struct rip_proto *p, struct rip_iface *ifa)
  196: {
  197:   if (ifa->tx_active)
  198:   {
  199:     FIB_ITERATE_UNLINK(&ifa->tx_fit, &p->rtable);
  200:     ifa->tx_active = 0;
  201:   }
  202: }
  203: 
  204: /* rip.c */
  205: void rip_update_rte(struct rip_proto *p, net_addr *n, struct rip_rte *new);
  206: void rip_withdraw_rte(struct rip_proto *p, net_addr *n, struct rip_neighbor *from);
  207: struct rip_neighbor * rip_get_neighbor(struct rip_proto *p, ip_addr *a, struct rip_iface *ifa);
  208: void rip_update_bfd(struct rip_proto *p, struct rip_neighbor *n);
  209: void rip_show_interfaces(struct proto *P, char *iff);
  210: void rip_show_neighbors(struct proto *P, char *iff);
  211: 
  212: /* packets.c */
  213: void rip_send_request(struct rip_proto *p, struct rip_iface *ifa);
  214: void rip_send_table(struct rip_proto *p, struct rip_iface *ifa, ip_addr addr, btime changed);
  215: int rip_open_socket(struct rip_iface *ifa);
  216: 
  217: 
  218: #endif

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