netlink_packet_route/link/af_spec/
inet6_devconf.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::{DecodeError, Emitable, Parseable};
4
5// The DEVCONF_MAX will increase when kernel add more DEVCONF
6const DEVCONF_MAX: usize = 59;
7pub(crate) const LINK_INET6_DEV_CONF_LEN: usize = DEVCONF_MAX * 4;
8
9buffer!(Inet6DevConfBuffer(LINK_INET6_DEV_CONF_LEN) {
10    forwarding: (i32, 0..4),
11    hoplimit: (i32, 4..8),
12    mtu6: (i32, 8..12),
13    accept_ra: (i32, 12..16),
14    accept_redirects: (i32, 16..20),
15    autoconf: (i32, 20..24),
16    dad_transmits: (i32, 24..28),
17    rtr_solicits: (i32, 28..32),
18    rtr_solicit_interval: (i32, 32..36),
19    rtr_solicit_delay: (i32, 36..40),
20    use_tempaddr: (i32, 40..44),
21    temp_valid_lft: (i32, 44..48),
22    temp_prefered_lft: (i32, 48..52),
23    regen_max_retry: (i32, 52..56),
24    max_desync_factor: (i32, 56..60),
25    max_addresses: (i32, 60..64),
26    force_mld_version: (i32, 64..68),
27    accept_ra_defrtr: (i32, 68..72),
28    accept_ra_pinfo: (i32, 72..76),
29    accept_ra_rtr_pref: (i32, 76..80),
30    rtr_probe_interval: (i32, 80..84),
31    accept_ra_rt_info_max_plen: (i32, 84..88),
32    proxy_ndp: (i32, 88..92),
33    optimistic_dad: (i32, 92..96),
34    accept_source_route: (i32, 96..100),
35    mc_forwarding: (i32, 100..104),
36    disable_ipv6: (i32, 104..108),
37    accept_dad: (i32, 108..112),
38    force_tllao: (i32, 112..116),
39    ndisc_notify: (i32, 116..120),
40    mldv1_unsolicited_report_interval: (i32, 120..124),
41    mldv2_unsolicited_report_interval: (i32, 124..128),
42    suppress_frag_ndisc: (i32, 128..132),
43    accept_ra_from_local: (i32, 132..136),
44    use_optimistic: (i32, 136..140),
45    accept_ra_mtu: (i32, 140..144),
46    stable_secret: (i32, 144..148),
47    use_oif_addrs_only: (i32, 148..152),
48    accept_ra_min_hop_limit: (i32, 152..156),
49    ignore_routes_with_linkdown: (i32, 156..160),
50    drop_unicast_in_l2_multicast: (i32, 160..164),
51    drop_unsolicited_na: (i32, 164..168),
52    keep_addr_on_down: (i32, 168..172),
53    rtr_solicit_max_interval: (i32, 172..176),
54    seg6_enabled: (i32, 176..180),
55    seg6_require_hmac: (i32, 180..184),
56    enhanced_dad: (i32, 184..188),
57    addr_gen_mode: (i32, 188..192),
58    disable_policy: (i32, 192..196),
59    accept_ra_rt_info_min_plen: (i32, 196..200),
60    ndisc_tclass: (i32, 200..204),
61    rpl_seg_enabled: (i32, 204..208),
62    ra_defrtr_metric: (i32, 208..212),
63    ioam6_enabled: (i32, 212..216),
64    ioam6_id: (i32, 216..220),
65    ioam6_id_wide: (i32, 220..224),
66    ndisc_evict_nocarrier: (i32, 224..228),
67    accept_untracked_na: (i32, 228..232),
68    accept_ra_min_lft: (i32, 232..236),
69});
70
71impl<T: AsRef<[u8]>> Parseable<Inet6DevConfBuffer<T>> for Inet6DevConf {
72    fn parse(buf: &Inet6DevConfBuffer<T>) -> Result<Self, DecodeError> {
73        Ok(Self {
74            forwarding: buf.forwarding(),
75            hoplimit: buf.hoplimit(),
76            mtu6: buf.mtu6(),
77            accept_ra: buf.accept_ra(),
78            accept_redirects: buf.accept_redirects(),
79            autoconf: buf.autoconf(),
80            dad_transmits: buf.dad_transmits(),
81            rtr_solicits: buf.rtr_solicits(),
82            rtr_solicit_interval: buf.rtr_solicit_interval(),
83            rtr_solicit_delay: buf.rtr_solicit_delay(),
84            use_tempaddr: buf.use_tempaddr(),
85            temp_valid_lft: buf.temp_valid_lft(),
86            temp_prefered_lft: buf.temp_prefered_lft(),
87            regen_max_retry: buf.regen_max_retry(),
88            max_desync_factor: buf.max_desync_factor(),
89            max_addresses: buf.max_addresses(),
90            force_mld_version: buf.force_mld_version(),
91            accept_ra_defrtr: buf.accept_ra_defrtr(),
92            accept_ra_pinfo: buf.accept_ra_pinfo(),
93            accept_ra_rtr_pref: buf.accept_ra_rtr_pref(),
94            rtr_probe_interval: buf.rtr_probe_interval(),
95            accept_ra_rt_info_max_plen: buf.accept_ra_rt_info_max_plen(),
96            proxy_ndp: buf.proxy_ndp(),
97            optimistic_dad: buf.optimistic_dad(),
98            accept_source_route: buf.accept_source_route(),
99            mc_forwarding: buf.mc_forwarding(),
100            disable_ipv6: buf.disable_ipv6(),
101            accept_dad: buf.accept_dad(),
102            force_tllao: buf.force_tllao(),
103            ndisc_notify: buf.ndisc_notify(),
104            mldv1_unsolicited_report_interval: buf
105                .mldv1_unsolicited_report_interval(),
106            mldv2_unsolicited_report_interval: buf
107                .mldv2_unsolicited_report_interval(),
108            suppress_frag_ndisc: buf.suppress_frag_ndisc(),
109            accept_ra_from_local: buf.accept_ra_from_local(),
110            use_optimistic: buf.use_optimistic(),
111            accept_ra_mtu: buf.accept_ra_mtu(),
112            stable_secret: buf.stable_secret(),
113            use_oif_addrs_only: buf.use_oif_addrs_only(),
114            accept_ra_min_hop_limit: buf.accept_ra_min_hop_limit(),
115            ignore_routes_with_linkdown: buf.ignore_routes_with_linkdown(),
116            drop_unicast_in_l2_multicast: buf.drop_unicast_in_l2_multicast(),
117            drop_unsolicited_na: buf.drop_unsolicited_na(),
118            keep_addr_on_down: buf.keep_addr_on_down(),
119            rtr_solicit_max_interval: buf.rtr_solicit_max_interval(),
120            seg6_enabled: buf.seg6_enabled(),
121            seg6_require_hmac: buf.seg6_require_hmac(),
122            enhanced_dad: buf.enhanced_dad(),
123            addr_gen_mode: buf.addr_gen_mode(),
124            disable_policy: buf.disable_policy(),
125            accept_ra_rt_info_min_plen: buf.accept_ra_rt_info_min_plen(),
126            ndisc_tclass: buf.ndisc_tclass(),
127            rpl_seg_enabled: buf.rpl_seg_enabled(),
128            ra_defrtr_metric: buf.ra_defrtr_metric(),
129            ioam6_enabled: buf.ioam6_enabled(),
130            ioam6_id: buf.ioam6_id(),
131            ioam6_id_wide: buf.ioam6_id_wide(),
132            ndisc_evict_nocarrier: buf.ndisc_evict_nocarrier(),
133            accept_untracked_na: buf.accept_untracked_na(),
134            accept_ra_min_lft: buf.accept_ra_min_lft(),
135        })
136    }
137}
138
139impl Emitable for Inet6DevConf {
140    fn buffer_len(&self) -> usize {
141        LINK_INET6_DEV_CONF_LEN
142    }
143
144    fn emit(&self, buffer: &mut [u8]) {
145        let mut buffer = Inet6DevConfBuffer::new(buffer);
146        buffer.set_forwarding(self.forwarding);
147        buffer.set_hoplimit(self.hoplimit);
148        buffer.set_mtu6(self.mtu6);
149        buffer.set_accept_ra(self.accept_ra);
150        buffer.set_accept_redirects(self.accept_redirects);
151        buffer.set_autoconf(self.autoconf);
152        buffer.set_dad_transmits(self.dad_transmits);
153        buffer.set_rtr_solicits(self.rtr_solicits);
154        buffer.set_rtr_solicit_interval(self.rtr_solicit_interval);
155        buffer.set_rtr_solicit_delay(self.rtr_solicit_delay);
156        buffer.set_use_tempaddr(self.use_tempaddr);
157        buffer.set_temp_valid_lft(self.temp_valid_lft);
158        buffer.set_temp_prefered_lft(self.temp_prefered_lft);
159        buffer.set_regen_max_retry(self.regen_max_retry);
160        buffer.set_max_desync_factor(self.max_desync_factor);
161        buffer.set_max_addresses(self.max_addresses);
162        buffer.set_force_mld_version(self.force_mld_version);
163        buffer.set_accept_ra_defrtr(self.accept_ra_defrtr);
164        buffer.set_accept_ra_pinfo(self.accept_ra_pinfo);
165        buffer.set_accept_ra_rtr_pref(self.accept_ra_rtr_pref);
166        buffer.set_rtr_probe_interval(self.rtr_probe_interval);
167        buffer.set_accept_ra_rt_info_max_plen(self.accept_ra_rt_info_max_plen);
168        buffer.set_proxy_ndp(self.proxy_ndp);
169        buffer.set_optimistic_dad(self.optimistic_dad);
170        buffer.set_accept_source_route(self.accept_source_route);
171        buffer.set_mc_forwarding(self.mc_forwarding);
172        buffer.set_disable_ipv6(self.disable_ipv6);
173        buffer.set_accept_dad(self.accept_dad);
174        buffer.set_force_tllao(self.force_tllao);
175        buffer.set_ndisc_notify(self.ndisc_notify);
176        buffer.set_mldv1_unsolicited_report_interval(
177            self.mldv1_unsolicited_report_interval,
178        );
179        buffer.set_mldv2_unsolicited_report_interval(
180            self.mldv2_unsolicited_report_interval,
181        );
182        buffer.set_suppress_frag_ndisc(self.suppress_frag_ndisc);
183        buffer.set_accept_ra_from_local(self.accept_ra_from_local);
184        buffer.set_use_optimistic(self.use_optimistic);
185        buffer.set_accept_ra_mtu(self.accept_ra_mtu);
186        buffer.set_stable_secret(self.stable_secret);
187        buffer.set_use_oif_addrs_only(self.use_oif_addrs_only);
188        buffer.set_accept_ra_min_hop_limit(self.accept_ra_min_hop_limit);
189        buffer
190            .set_ignore_routes_with_linkdown(self.ignore_routes_with_linkdown);
191        buffer.set_drop_unicast_in_l2_multicast(
192            self.drop_unicast_in_l2_multicast,
193        );
194        buffer.set_drop_unsolicited_na(self.drop_unsolicited_na);
195        buffer.set_keep_addr_on_down(self.keep_addr_on_down);
196        buffer.set_rtr_solicit_max_interval(self.rtr_solicit_max_interval);
197        buffer.set_seg6_enabled(self.seg6_enabled);
198        buffer.set_seg6_require_hmac(self.seg6_require_hmac);
199        buffer.set_enhanced_dad(self.enhanced_dad);
200        buffer.set_addr_gen_mode(self.addr_gen_mode);
201        buffer.set_disable_policy(self.disable_policy);
202        buffer.set_accept_ra_rt_info_min_plen(self.accept_ra_rt_info_min_plen);
203        buffer.set_ndisc_tclass(self.ndisc_tclass);
204        buffer.set_ndisc_tclass(self.ndisc_tclass);
205        buffer.set_rpl_seg_enabled(self.rpl_seg_enabled);
206        buffer.set_ra_defrtr_metric(self.ra_defrtr_metric);
207        buffer.set_ioam6_enabled(self.ioam6_enabled);
208        buffer.set_ioam6_id(self.ioam6_id);
209        buffer.set_ioam6_id_wide(self.ioam6_id_wide);
210        buffer.set_ndisc_evict_nocarrier(self.ndisc_evict_nocarrier);
211        buffer.set_accept_untracked_na(self.accept_untracked_na);
212        buffer.set_accept_ra_min_lft(self.accept_ra_min_lft);
213    }
214}
215
216#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
217#[non_exhaustive]
218pub struct Inet6DevConf {
219    pub forwarding: i32,
220    pub hoplimit: i32,
221    pub mtu6: i32,
222    pub accept_ra: i32,
223    pub accept_redirects: i32,
224    pub autoconf: i32,
225    pub dad_transmits: i32,
226    pub rtr_solicits: i32,
227    pub rtr_solicit_interval: i32,
228    pub rtr_solicit_delay: i32,
229    pub use_tempaddr: i32,
230    pub temp_valid_lft: i32,
231    pub temp_prefered_lft: i32,
232    pub regen_max_retry: i32,
233    pub max_desync_factor: i32,
234    pub max_addresses: i32,
235    pub force_mld_version: i32,
236    pub accept_ra_defrtr: i32,
237    pub accept_ra_pinfo: i32,
238    pub accept_ra_rtr_pref: i32,
239    pub rtr_probe_interval: i32,
240    pub accept_ra_rt_info_max_plen: i32,
241    pub proxy_ndp: i32,
242    pub optimistic_dad: i32,
243    pub accept_source_route: i32,
244    pub mc_forwarding: i32,
245    pub disable_ipv6: i32,
246    pub accept_dad: i32,
247    pub force_tllao: i32,
248    pub ndisc_notify: i32,
249    pub mldv1_unsolicited_report_interval: i32,
250    pub mldv2_unsolicited_report_interval: i32,
251    pub suppress_frag_ndisc: i32,
252    pub accept_ra_from_local: i32,
253    pub use_optimistic: i32,
254    pub accept_ra_mtu: i32,
255    pub stable_secret: i32,
256    pub use_oif_addrs_only: i32,
257    pub accept_ra_min_hop_limit: i32,
258    pub ignore_routes_with_linkdown: i32,
259    pub drop_unicast_in_l2_multicast: i32,
260    pub drop_unsolicited_na: i32,
261    pub keep_addr_on_down: i32,
262    pub rtr_solicit_max_interval: i32,
263    pub seg6_enabled: i32,
264    pub seg6_require_hmac: i32,
265    pub enhanced_dad: i32,
266    pub addr_gen_mode: i32,
267    pub disable_policy: i32,
268    pub accept_ra_rt_info_min_plen: i32,
269    pub ndisc_tclass: i32,
270    pub rpl_seg_enabled: i32,
271    pub ra_defrtr_metric: i32,
272    pub ioam6_enabled: i32,
273    pub ioam6_id: i32,
274    pub ioam6_id_wide: i32,
275    pub ndisc_evict_nocarrier: i32,
276    pub accept_untracked_na: i32,
277    pub accept_ra_min_lft: i32,
278}