Statistics
| Branch: | Revision:

iof-bird-daemon / proto / rip / rip.h @ fe9f1a6d

History | View | Annotate | Download (7.3 KB)

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
#ifdef IPV6
31
#define RIP_IS_V2 0
32
#else
33
#define RIP_IS_V2 1
34
#endif
35

    
36
#define RIP_V1                        1
37
#define RIP_V2                        2
38

    
39
#define RIP_PORT                520        /* RIP for IPv4 */
40
#define RIP_NG_PORT                521        /* RIPng */
41

    
42
#define RIP_MAX_PKT_LENGTH        532        /* 512 + IP4_HEADER_LENGTH */
43
#define RIP_AUTH_TAIL_LENGTH        20        /* 4 + MD5 length */
44

    
45
#define RIP_DEFAULT_ECMP_LIMIT        16
46
#define RIP_DEFAULT_INFINITY        16
47
#define RIP_DEFAULT_UPDATE_TIME        30
48
#define RIP_DEFAULT_TIMEOUT_TIME 180
49
#define RIP_DEFAULT_GARBAGE_TIME 120
50

    
51

    
52
struct rip_config
53
{
54
  struct proto_config c;
55
  list patt_list;                        /* List of iface configs (struct rip_iface_config) */
56

    
57
  u8 rip2;                                /* RIPv2 (IPv4) or RIPng (IPv6) */
58
  u8 ecmp;                                /* Maximum number of nexthops in ECMP route, or 0 */
59
  u8 infinity;                                /* Maximum metric value, representing infinity */
60

    
61
  u32 min_timeout_time;                        /* Minimum of interface timeout_time */
62
  u32 max_garbage_time;                        /* Maximum of interface garbage_time */
63
};
64

    
65
struct rip_iface_config
66
{
67
  struct iface_patt i;
68
  ip_addr address;                        /* Configured dst address */
69
  u16 port;                                /* Src+dst port */
70
  u8 metric;                                /* Incoming metric */
71
  u8 mode;                                /* Interface mode (RIP_IM_*) */
72
  u8 passive;                                /* Passive iface - no packets are sent */
73
  u8 version;                                /* RIP version used for outgoing packets */
74
  u8 version_only;        /* FIXXX */
75
  u8 split_horizon;                        /* Split horizon is used in route updates */
76
  u8 poison_reverse;                        /* Poisoned reverse is used in route updates */
77
  u8 check_zero;                        /* Validation of RIPv1 reserved fields */
78
  u8 ecmp_weight;                        /* Weight for ECMP routes*/
79
  u8 auth_type;                                /* Authentication type (RIP_AUTH_*) */
80
  u8 ttl_security;                        /* bool + 2 for TX only (send, but do not check on RX) */
81
  u8 check_link;                        /* Whether iface link change is used */
82
  u8 bfd;                                /* Use BFD on iface */
83
  u16 rx_buffer;                        /* RX buffer size, 0 for MTU */
84
  u16 tx_length;                        /* TX packet length limit (including headers), 0 for MTU */
85
  int tx_tos;
86
  int tx_priority;
87
  u32 update_time;                        /* Periodic update interval */
88
  u32 timeout_time;                        /* Route expiration timeout */
89
  u32 garbage_time;                        /* Unreachable entry GC timeout */
90
  list *passwords;                        /* Passwords for authentication */
91
};
92

    
93
struct rip_proto
94
{
95
  struct proto p;
96
  struct fib rtable;                        /* Internal routing table */
97
  list iface_list;                        /* List of interfaces (struct rip_iface) */
98
  slab *rte_slab;                        /* Slab for internal routes (struct rip_rte) */
99
  timer *timer;                                /* Main protocol timer */
100

    
101
  u8 ecmp;                                /* Maximum number of nexthops in ECMP route, or 0 */
102
  u8 infinity;                                /* Maximum metric value, representing infinity */
103
  u8 triggered;                                /* Logical AND of interface want_triggered values */
104
  u8 rt_reload;                                /* Route reload is scheduled */
105

    
106
  struct tbf log_pkt_tbf;                /* TBF for packet messages */
107
  struct tbf log_rte_tbf;                /* TBF for RTE messages */
108
};
109

    
110
struct rip_iface
111
{
112
  node n;
113
  struct rip_proto *rip;
114
  struct iface *iface;                        /* Underyling core interface */
115
  struct rip_iface_config *cf;                /* Related config, must be updated in reconfigure */
116
  struct object_lock *lock;                /* Interface lock */
117
  timer *timer;                                /* Interface timer */
118
  sock *sk;                                /* UDP socket */
119

    
120
  u8 up;                                /* Interface is active */
121
  u8 csn_ready;                                /* Nonzero CSN can be used */
122
  u16 tx_plen;                                /* Max TX packet data length */
123
  u32 csn;                                /* Last used crypto sequence number */
124
  ip_addr addr;                                /* Destination multicast/broadcast address */
125
  list neigh_list;                        /* List of iface neighbors (struct rip_neighbor) */
126

    
127
  /* Update scheduling */
128
  bird_clock_t next_regular;                /* Next time when regular update should be called */
129
  bird_clock_t next_triggered;                /* Next time when triggerd update may be called */
130
  bird_clock_t want_triggered;                /* Nonzero if triggered update is scheduled */
131

    
132
  /* Active update */
133
  int tx_active;                        /* Update session is active */
134
  ip_addr tx_addr;                        /* Update session destination address */
135
  bird_clock_t tx_changed;                /* Minimal changed time for triggered update */
136
  struct fib_iterator tx_fit;                /* FIB iterator in RIP routing table (p.rtable) */
137
};
138

    
139
struct rip_neighbor
140
{
141
  node n;
142
  struct rip_iface *ifa;                /* Associated interface, may be NULL if stale */
143
  struct neighbor *nbr;                        /* Associaded core neighbor, may be NULL if stale */
144
  struct bfd_request *bfd_req;                /* BFD request, if BFD is used */
145
  bird_clock_t last_seen;                /* Time of last received and accepted message */
146
  u32 uc;                                /* Use count, number of routes linking the neighbor */
147
  u32 csn;                                /* Last received crypto sequence number */
148
};
149

    
150
struct rip_entry
151
{
152
  struct rip_rte *routes;                /* List of incoming routes */
153

    
154
  u8 valid;                                /* Entry validity state (RIP_ENTRY_*) */
155
  u8 metric;                                /* Outgoing route metric */
156
  u16 tag;                                /* Outgoing route tag */
157
  struct iface *from;                        /* Outgoing route from, NULL if from  proto */
158
  struct iface *iface;                        /* Outgoing route iface (for next hop) */
159
  ip_addr next_hop;                        /* Outgoing route next hop */
160

    
161
  bird_clock_t changed;                        /* Last time when the outgoing route metric changed */
162

    
163
  struct fib_node n;
164
};
165

    
166
struct rip_rte
167
{
168
  struct rip_rte *next;
169

    
170
  struct rip_neighbor *from;                /* Advertising router */
171
  ip_addr next_hop;                        /* Route next hop (iface is from->nbr->iface) */
172
  u16 metric;                                /* Route metric (after increase) */
173
  u16 tag;                                /* Route tag */
174

    
175
  bird_clock_t expires;                        /* Time of route expiration */
176
};
177

    
178

    
179
#define RIP_AUTH_NONE                0
180
#define RIP_AUTH_PLAIN                2
181
#define RIP_AUTH_CRYPTO                3
182

    
183
#define RIP_IM_MULTICAST        1
184
#define RIP_IM_BROADCAST        2
185

    
186
#define RIP_ENTRY_DUMMY                0        /* Only used to store list of incoming routes */
187
#define RIP_ENTRY_VALID                1        /* Valid outgoing route */
188
#define RIP_ENTRY_STALE                2        /* Stale outgoing route, waiting for GC */
189

    
190
#define EA_RIP_METRIC                EA_CODE(EAP_RIP, 0)
191
#define EA_RIP_TAG                EA_CODE(EAP_RIP, 1)
192

    
193
#define rip_is_v2(X) RIP_IS_V2
194
#define rip_is_ng(X) (!RIP_IS_V2)
195

    
196
/*
197
static inline int rip_is_v2(struct rip_proto *p)
198
{ return p->rip2; }
199

200
static inline int rip_is_ng(struct rip_proto *p)
201
{ return ! p->rip2; }
202
*/
203

    
204
static inline void
205
rip_reset_tx_session(struct rip_proto *p, struct rip_iface *ifa)
206
{
207
  if (ifa->tx_active)
208
  {
209
    FIB_ITERATE_UNLINK(&ifa->tx_fit, &p->rtable);
210
    ifa->tx_active = 0;
211
  }
212
}
213

    
214
/* rip.c */
215
void rip_update_rte(struct rip_proto *p, net_addr *n, struct rip_rte *new);
216
void rip_withdraw_rte(struct rip_proto *p, net_addr *n, struct rip_neighbor *from);
217
struct rip_neighbor * rip_get_neighbor(struct rip_proto *p, ip_addr *a, struct rip_iface *ifa);
218
void rip_update_bfd(struct rip_proto *p, struct rip_neighbor *n);
219
void rip_show_interfaces(struct proto *P, char *iff);
220
void rip_show_neighbors(struct proto *P, char *iff);
221

    
222
/* packets.c */
223
void rip_send_request(struct rip_proto *p, struct rip_iface *ifa);
224
void rip_send_table(struct rip_proto *p, struct rip_iface *ifa, ip_addr addr, bird_clock_t changed);
225
int rip_open_socket(struct rip_iface *ifa);
226

    
227

    
228
#endif