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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
// SPDX-License-Identifier: GPL-2.0-or-later
/* ICMP Router Discovery Messages
* Copyright (C) 1997, 2000 Kunihiro Ishiguro
*/
/*
* This file is modified and completed for the Zebra IRDP implementation
* by Robert Olsson, Swedish University of Agricultural Sciences
*/
#ifndef _IRDP_H
#define _IRDP_H
#include "lib/vty.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ICMP Messages */
#ifndef ICMP_ROUTERADVERT
#define ICMP_ROUTERADVERT 9
#endif /* ICMP_ROUTERADVERT */
#ifndef ICMP_ROUTERSOLICIT
#define ICMP_ROUTERSOLICIT 10
#endif /* ICMP_ROUTERSOLICT */
/* Multicast groups */
#ifndef INADDR_ALLHOSTS_GROUP
#define INADDR_ALLHOSTS_GROUP 0xe0000001U /* 224.0.0.1 */
#endif /* INADDR_ALLHOSTS_GROUP */
#ifndef INADDR_ALLRTRS_GROUP
#define INADDR_ALLRTRS_GROUP 0xe0000002U /* 224.0.0.2 */
#endif /* INADDR_ALLRTRS_GROUP */
/* Default irdp packet interval */
#define IRDP_DEFAULT_INTERVAL 300
/* Router constants from RFC1256 */
#define MAX_INITIAL_ADVERT_INTERVAL 16
#define MAX_INITIAL_ADVERTISEMENTS 3
#define MAX_RESPONSE_DELAY 2
#define IRDP_MAXADVERTINTERVAL 600
#define IRDP_MINADVERTINTERVAL 450 /* 0.75*600 */
#define IRDP_LIFETIME 1350 /* 3*450 */
#define IRDP_PREFERENCE 0
#define ICMP_MINLEN 8
#define IRDP_LAST_ADVERT_MESSAGES 2 /* The last adverts with Holdtime 0 */
#define IRDP_RX_BUF 1500
/*
Comments comes from RFC1256 ICMP Router Discovery Messages.
The IP destination address to be used for multicast Router
Advertisements sent from the interface. The only permissible
values are the all-systems multicast address, 224.0.0.1, or the
limited-broadcast address, 255.255.255.255. (The all-systems
address is preferred wherever possible, i.e., on any link where
all listening hosts support IP multicast.)
Default: 224.0.0.1 if the router supports IP multicast on the
interface, else 255.255.255.255
The maximum time allowed between sending multicast Router
Advertisements from the interface, in seconds. Must be no less
than 4 seconds and no greater than 1800 seconds.
Default: 600 seconds
The minimum time allowed between sending unsolicited multicast
Router Advertisements from the interface, in seconds. Must be no
less than 3 seconds and no greater than MaxAdvertisementInterval.
Default: 0.75 * MaxAdvertisementInterval
The value to be placed in the Lifetime field of Router
Advertisements sent from the interface, in seconds. Must be no
less than MaxAdvertisementInterval and no greater than 9000
seconds.
Default: 3 * MaxAdvertisementInterval
The preferability of the address as a default router address,
relative to other router addresses on the same subnet. A 32-bit,
signed, twos-complement integer, with higher values meaning more
preferable. The minimum value (hex 80000000) is used to indicate
that the address, even though it may be advertised, is not to be
used by neighboring hosts as a default router address.
Default: 0
*/
struct irdp_interface {
bool started;
unsigned long MaxAdvertInterval;
unsigned long MinAdvertInterval;
unsigned long Preference;
uint32_t flags;
#define IF_ACTIVE (1<<0) /* ICMP Active */
#define IF_BROADCAST (1<<1) /* 255.255.255.255 */
#define IF_SOLICIT (1<<2) /* Solicit active */
#define IF_DEBUG_MESSAGES (1<<3)
#define IF_DEBUG_PACKET (1<<4)
#define IF_DEBUG_MISC (1<<5)
#define IF_SHUTDOWN (1<<6)
struct interface *ifp;
struct thread *t_advertise;
unsigned long irdp_sent;
uint16_t Lifetime;
struct list *AdvPrefList;
};
struct Adv {
struct in_addr ip;
int pref;
};
extern void irdp_if_init(void);
extern int irdp_sock_init(void);
extern int irdp_config_write(struct vty *, struct interface *);
extern void irdp_send_thread(struct thread *t_advert);
extern void irdp_advert_off(struct interface *ifp);
extern void process_solicit(struct interface *ifp);
extern void irdp_read_raw(struct thread *r);
extern void send_packet(struct interface *ifp, struct stream *s, uint32_t dst,
struct prefix *p, uint32_t ttl);
#ifdef __cplusplus
}
#endif
#endif /* _IRDP_H */
|