Statistics
| Branch: | Revision:

iof-bird / bird-2.0.1 / proto / rip / rip.h @ 6b3f1a54

History | View | Annotate | Download (7.19 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
#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(EAP_RIP, 0)
186
#define EA_RIP_TAG                EA_CODE(EAP_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