]> git.proxmox.com Git - mirror_frr.git/blob - zebra/rtadv.h
Merge pull request #8967 from anlancs/fix-startup-error-info
[mirror_frr.git] / zebra / rtadv.h
1 /* Router advertisement
2 * Copyright (C) 2005 6WIND <jean-mickael.guerin@6wind.com>
3 * Copyright (C) 1999 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifndef _ZEBRA_RTADV_H
23 #define _ZEBRA_RTADV_H
24
25 #include "zebra.h"
26 #include "vty.h"
27 #include "zebra/interface.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 /* NB: RTADV is defined in zebra/interface.h above */
34 #if defined(HAVE_RTADV)
35
36 /* Router advertisement prefix. */
37 struct rtadv_prefix {
38 /* Prefix to be advertised. */
39 struct prefix_ipv6 prefix;
40
41 /* The prefix was manually/automatically defined. */
42 int AdvPrefixCreate;
43
44 /* The value to be placed in the Valid Lifetime in the Prefix */
45 uint32_t AdvValidLifetime;
46 #define RTADV_VALID_LIFETIME 2592000
47
48 /* The value to be placed in the on-link flag */
49 int AdvOnLinkFlag;
50
51 /* The value to be placed in the Preferred Lifetime in the Prefix
52 Information option, in seconds.*/
53 uint32_t AdvPreferredLifetime;
54 #define RTADV_PREFERRED_LIFETIME 604800
55
56 /* The value to be placed in the Autonomous Flag. */
57 int AdvAutonomousFlag;
58
59 /* The value to be placed in the Router Address Flag [RFC6275 7.2]. */
60 int AdvRouterAddressFlag;
61 #ifndef ND_OPT_PI_FLAG_RADDR
62 #define ND_OPT_PI_FLAG_RADDR 0x20
63 #endif
64 };
65
66 /* RFC4861 minimum delay between RAs */
67 #ifndef MIN_DELAY_BETWEEN_RAS
68 #define MIN_DELAY_BETWEEN_RAS 3000
69 #endif
70
71 /* RFC4584 Extension to Sockets API for Mobile IPv6 */
72
73 #ifndef ND_OPT_ADV_INTERVAL
74 #define ND_OPT_ADV_INTERVAL 7 /* Adv Interval Option */
75 #endif
76 #ifndef ND_OPT_HA_INFORMATION
77 #define ND_OPT_HA_INFORMATION 8 /* HA Information Option */
78 #endif
79
80 #ifndef HAVE_STRUCT_ND_OPT_ADV_INTERVAL
81 struct nd_opt_adv_interval { /* Advertisement interval option */
82 uint8_t nd_opt_ai_type;
83 uint8_t nd_opt_ai_len;
84 uint16_t nd_opt_ai_reserved;
85 uint32_t nd_opt_ai_interval;
86 } __attribute__((__packed__));
87 #else
88 #ifndef HAVE_STRUCT_ND_OPT_ADV_INTERVAL_ND_OPT_AI_TYPE
89 /* fields may have to be renamed */
90 #define nd_opt_ai_type nd_opt_adv_interval_type
91 #define nd_opt_ai_len nd_opt_adv_interval_len
92 #define nd_opt_ai_reserved nd_opt_adv_interval_reserved
93 #define nd_opt_ai_interval nd_opt_adv_interval_ival
94 #endif
95 #endif
96
97 #ifndef HAVE_STRUCT_ND_OPT_HOMEAGENT_INFO
98 struct nd_opt_homeagent_info { /* Home Agent info */
99 uint8_t nd_opt_hai_type;
100 uint8_t nd_opt_hai_len;
101 uint16_t nd_opt_hai_reserved;
102 uint16_t nd_opt_hai_preference;
103 uint16_t nd_opt_hai_lifetime;
104 } __attribute__((__packed__));
105 #endif
106
107 #ifndef ND_OPT_RDNSS
108 #define ND_OPT_RDNSS 25
109 #endif
110 #ifndef ND_OPT_DNSSL
111 #define ND_OPT_DNSSL 31
112 #endif
113
114 #ifndef HAVE_STRUCT_ND_OPT_RDNSS
115 struct nd_opt_rdnss { /* Recursive DNS server option [RFC8106 5.1] */
116 uint8_t nd_opt_rdnss_type;
117 uint8_t nd_opt_rdnss_len;
118 uint16_t nd_opt_rdnss_reserved;
119 uint32_t nd_opt_rdnss_lifetime;
120 /* Followed by one or more IPv6 addresses */
121 } __attribute__((__packed__));
122 #endif
123
124 #ifndef HAVE_STRUCT_ND_OPT_DNSSL
125 struct nd_opt_dnssl { /* DNS search list option [RFC8106 5.2] */
126 uint8_t nd_opt_dnssl_type;
127 uint8_t nd_opt_dnssl_len;
128 uint16_t nd_opt_dnssl_reserved;
129 uint32_t nd_opt_dnssl_lifetime;
130 /*
131 * Followed by one or more domain names encoded as in [RFC1035 3.1].
132 * Multiple domain names are concatenated after encoding. In any case,
133 * the result is zero-padded to a multiple of 8 octets.
134 */
135 } __attribute__((__packed__));
136 #endif
137
138 #endif /* HAVE_RTADV */
139
140 /*
141 * ipv6 nd prefixes can be manually defined, derived from the kernel interface
142 * configs or both. If both, manual flag/timer settings are used.
143 */
144 enum ipv6_nd_prefix_source {
145 PREFIX_SRC_NONE = 0,
146 PREFIX_SRC_MANUAL,
147 PREFIX_SRC_AUTO,
148 PREFIX_SRC_BOTH,
149 };
150
151 enum ipv6_nd_suppress_ra_status {
152 RA_ENABLE = 0,
153 RA_SUPPRESS,
154 };
155
156 extern void rtadv_vrf_init(struct zebra_vrf *zvrf);
157 extern void rtadv_vrf_terminate(struct zebra_vrf *zvrf);
158 extern void rtadv_stop_ra(struct interface *ifp);
159 extern void rtadv_stop_ra_all(void);
160 extern void rtadv_cmd_init(void);
161 extern void zebra_interface_radv_disable(ZAPI_HANDLER_ARGS);
162 extern void zebra_interface_radv_enable(ZAPI_HANDLER_ARGS);
163 extern void rtadv_add_prefix(struct zebra_if *zif, const struct prefix_ipv6 *p);
164 extern void rtadv_delete_prefix(struct zebra_if *zif, const struct prefix *p);
165 extern uint32_t rtadv_get_interfaces_configured_from_bgp(void);
166 extern bool rtadv_compiled_in(void);
167
168 #ifdef __cplusplus
169 }
170 #endif
171
172 #endif /* _ZEBRA_RTADV_H */