Return to rip.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / proto / rip |
1.1 ! misho 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