Annotation of embedaddon/bird2/proto/rip/rip.h, revision 1.1.1.1
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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>