blob: 4839016d7dc9c5d44903ed5cf05c36fe21e2fbc4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/*
* Structures for RIP protocol
*/
#include "nest/route.h"
struct rip_connection {
node n;
int num;
struct proto *proto;
ip_addr addr;
sock *send;
struct rip_interface *rif;
struct fib_iterator iter;
ip_addr daddr;
int dport;
int done;
};
struct rip_packet_heading {
u8 command;
#define RIPCMD_REQUEST 1 /* want info */
#define RIPCMD_RESPONSE 2 /* responding to request */
#define RIPCMD_TRACEON 3 /* turn tracing on */
#define RIPCMD_TRACEOFF 4 /* turn it off */
#define RIPCMD_MAX 5
u8 version;
#define RIP_V1 1
#define RIP_V2 2
u16 unused;
};
struct rip_block {
u16 family; /* 0xffff on first message means this is authentication */
u16 tag;
ip_addr network;
ip_addr netmask;
ip_addr nexthop;
u32 metric;
};
struct rip_entry {
struct fib_node n;
ip_addr whotoldme;
ip_addr nexthop;
int metric;
u16 tag;
bird_clock_t updated, changed;
int flags;
#define RIP_F_EXTERNAL 1
};
struct rip_packet {
struct rip_packet_heading heading;
struct rip_block block[25];
};
struct rip_interface {
node n;
struct proto *proto;
struct iface *iface;
sock *sock;
struct rip_connection *busy;
struct rip_patt *patt;
int metric; /* User configurable data */
int mode;
#define IM_DEFAULT 0
#define IM_QUIET 1
#define IM_MULTICAST 2
#define IM_BROADCAST 3
};
struct rip_patt {
struct iface_patt i;
int metric;
int mode;
};
struct rip_proto {
struct proto inherited;
timer *timer;
list connections;
struct fib rtable;
list garbage;
list interfaces; /* Interfaces we really know about */
list iface_list; /* Patterns configured */
int magic;
int infinity; /* User configurable data */
int port;
int period;
int garbage_time;
};
#define P ((struct rip_proto *) p)
#define E ((struct rip_entry *) e)
#define RIP_MAGIC 81861253
#define CHK_MAGIC do { if (P->magic != RIP_MAGIC) bug( "Not enough magic\n" ); } while (0)
void rip_init_instance(struct proto *p);
struct rip_interface *new_iface(struct proto *p, struct iface *new, unsigned long flags);
|