netlink_packet_route/link/af_spec/
inet6_devconf.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::traits::{Emitable, Parseable};
4use netlink_packet_utils::DecodeError;
5
6// The DEVCONF_MAX will increase when kernel add more DEVCONF
7const DEVCONF_MAX: usize = 59;
8pub(crate) const LINK_INET6_DEV_CONF_LEN: usize = DEVCONF_MAX * 4;
9
10buffer!(Inet6DevConfBuffer(LINK_INET6_DEV_CONF_LEN) {
11    forwarding: (i32, 0..4),
12    hoplimit: (i32, 4..8),
13    mtu6: (i32, 8..12),
14    accept_ra: (i32, 12..16),
15    accept_redirects: (i32, 16..20),
16    autoconf: (i32, 20..24),
17    dad_transmits: (i32, 24..28),
18    rtr_solicits: (i32, 28..32),
19    rtr_solicit_interval: (i32, 32..36),
20    rtr_solicit_delay: (i32, 36..40),
21    use_tempaddr: (i32, 40..44),
22    temp_valid_lft: (i32, 44..48),
23    temp_prefered_lft: (i32, 48..52),
24    regen_max_retry: (i32, 52..56),
25    max_desync_factor: (i32, 56..60),
26    max_addresses: (i32, 60..64),
27    force_mld_version: (i32, 64..68),
28    accept_ra_defrtr: (i32, 68..72),
29    accept_ra_pinfo: (i32, 72..76),
30    accept_ra_rtr_pref: (i32, 76..80),
31    rtr_probe_interval: (i32, 80..84),
32    accept_ra_rt_info_max_plen: (i32, 84..88),
33    proxy_ndp: (i32, 88..92),
34    optimistic_dad: (i32, 92..96),
35    accept_source_route: (i32, 96..100),
36    mc_forwarding: (i32, 100..104),
37    disable_ipv6: (i32, 104..108),
38    accept_dad: (i32, 108..112),
39    force_tllao: (i32, 112..116),
40    ndisc_notify: (i32, 116..120),
41    mldv1_unsolicited_report_interval: (i32, 120..124),
42    mldv2_unsolicited_report_interval: (i32, 124..128),
43    suppress_frag_ndisc: (i32, 128..132),
44    accept_ra_from_local: (i32, 132..136),
45    use_optimistic: (i32, 136..140),
46    accept_ra_mtu: (i32, 140..144),
47    stable_secret: (i32, 144..148),
48    use_oif_addrs_only: (i32, 148..152),
49    accept_ra_min_hop_limit: (i32, 152..156),
50    ignore_routes_with_linkdown: (i32, 156..160),
51    drop_unicast_in_l2_multicast: (i32, 160..164),
52    drop_unsolicited_na: (i32, 164..168),
53    keep_addr_on_down: (i32, 168..172),
54    rtr_solicit_max_interval: (i32, 172..176),
55    seg6_enabled: (i32, 176..180),
56    seg6_require_hmac: (i32, 180..184),
57    enhanced_dad: (i32, 184..188),
58    addr_gen_mode: (i32, 188..192),
59    disable_policy: (i32, 192..196),
60    accept_ra_rt_info_min_plen: (i32, 196..200),
61    ndisc_tclass: (i32, 200..204),
62    rpl_seg_enabled: (i32, 204..208),
63    ra_defrtr_metric: (i32, 208..212),
64    ioam6_enabled: (i32, 212..216),
65    ioam6_id: (i32, 216..220),
66    ioam6_id_wide: (i32, 220..224),
67    ndisc_evict_nocarrier: (i32, 224..228),
68    accept_untracked_na: (i32, 228..232),
69    accept_ra_min_lft: (i32, 232..236),
70});
71
72impl<T: AsRef<[u8]>> Parseable<Inet6DevConfBuffer<T>> for Inet6DevConf {
73    type Error = DecodeError;
74    fn parse(buf: &Inet6DevConfBuffer<T>) -> Result<Self, DecodeError> {
75        Ok(Self {
76            forwarding: buf.forwarding(),
77            hoplimit: buf.hoplimit(),
78            mtu6: buf.mtu6(),
79            accept_ra: buf.accept_ra(),
80            accept_redirects: buf.accept_redirects(),
81            autoconf: buf.autoconf(),
82            dad_transmits: buf.dad_transmits(),
83            rtr_solicits: buf.rtr_solicits(),
84            rtr_solicit_interval: buf.rtr_solicit_interval(),
85            rtr_solicit_delay: buf.rtr_solicit_delay(),
86            use_tempaddr: buf.use_tempaddr(),
87            temp_valid_lft: buf.temp_valid_lft(),
88            temp_prefered_lft: buf.temp_prefered_lft(),
89            regen_max_retry: buf.regen_max_retry(),
90            max_desync_factor: buf.max_desync_factor(),
91            max_addresses: buf.max_addresses(),
92            force_mld_version: buf.force_mld_version(),
93            accept_ra_defrtr: buf.accept_ra_defrtr(),
94            accept_ra_pinfo: buf.accept_ra_pinfo(),
95            accept_ra_rtr_pref: buf.accept_ra_rtr_pref(),
96            rtr_probe_interval: buf.rtr_probe_interval(),
97            accept_ra_rt_info_max_plen: buf.accept_ra_rt_info_max_plen(),
98            proxy_ndp: buf.proxy_ndp(),
99            optimistic_dad: buf.optimistic_dad(),
100            accept_source_route: buf.accept_source_route(),
101            mc_forwarding: buf.mc_forwarding(),
102            disable_ipv6: buf.disable_ipv6(),
103            accept_dad: buf.accept_dad(),
104            force_tllao: buf.force_tllao(),
105            ndisc_notify: buf.ndisc_notify(),
106            mldv1_unsolicited_report_interval: buf.mldv1_unsolicited_report_interval(),
107            mldv2_unsolicited_report_interval: buf.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(self.mldv1_unsolicited_report_interval);
177        buffer.set_mldv2_unsolicited_report_interval(self.mldv2_unsolicited_report_interval);
178        buffer.set_suppress_frag_ndisc(self.suppress_frag_ndisc);
179        buffer.set_accept_ra_from_local(self.accept_ra_from_local);
180        buffer.set_use_optimistic(self.use_optimistic);
181        buffer.set_accept_ra_mtu(self.accept_ra_mtu);
182        buffer.set_stable_secret(self.stable_secret);
183        buffer.set_use_oif_addrs_only(self.use_oif_addrs_only);
184        buffer.set_accept_ra_min_hop_limit(self.accept_ra_min_hop_limit);
185        buffer.set_ignore_routes_with_linkdown(self.ignore_routes_with_linkdown);
186        buffer.set_drop_unicast_in_l2_multicast(self.drop_unicast_in_l2_multicast);
187        buffer.set_drop_unsolicited_na(self.drop_unsolicited_na);
188        buffer.set_keep_addr_on_down(self.keep_addr_on_down);
189        buffer.set_rtr_solicit_max_interval(self.rtr_solicit_max_interval);
190        buffer.set_seg6_enabled(self.seg6_enabled);
191        buffer.set_seg6_require_hmac(self.seg6_require_hmac);
192        buffer.set_enhanced_dad(self.enhanced_dad);
193        buffer.set_addr_gen_mode(self.addr_gen_mode);
194        buffer.set_disable_policy(self.disable_policy);
195        buffer.set_accept_ra_rt_info_min_plen(self.accept_ra_rt_info_min_plen);
196        buffer.set_ndisc_tclass(self.ndisc_tclass);
197        buffer.set_ndisc_tclass(self.ndisc_tclass);
198        buffer.set_rpl_seg_enabled(self.rpl_seg_enabled);
199        buffer.set_ra_defrtr_metric(self.ra_defrtr_metric);
200        buffer.set_ioam6_enabled(self.ioam6_enabled);
201        buffer.set_ioam6_id(self.ioam6_id);
202        buffer.set_ioam6_id_wide(self.ioam6_id_wide);
203        buffer.set_ndisc_evict_nocarrier(self.ndisc_evict_nocarrier);
204        buffer.set_accept_untracked_na(self.accept_untracked_na);
205        buffer.set_accept_ra_min_lft(self.accept_ra_min_lft);
206    }
207}
208
209#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
210#[non_exhaustive]
211pub struct Inet6DevConf {
212    pub forwarding: i32,
213    pub hoplimit: i32,
214    pub mtu6: i32,
215    pub accept_ra: i32,
216    pub accept_redirects: i32,
217    pub autoconf: i32,
218    pub dad_transmits: i32,
219    pub rtr_solicits: i32,
220    pub rtr_solicit_interval: i32,
221    pub rtr_solicit_delay: i32,
222    pub use_tempaddr: i32,
223    pub temp_valid_lft: i32,
224    pub temp_prefered_lft: i32,
225    pub regen_max_retry: i32,
226    pub max_desync_factor: i32,
227    pub max_addresses: i32,
228    pub force_mld_version: i32,
229    pub accept_ra_defrtr: i32,
230    pub accept_ra_pinfo: i32,
231    pub accept_ra_rtr_pref: i32,
232    pub rtr_probe_interval: i32,
233    pub accept_ra_rt_info_max_plen: i32,
234    pub proxy_ndp: i32,
235    pub optimistic_dad: i32,
236    pub accept_source_route: i32,
237    pub mc_forwarding: i32,
238    pub disable_ipv6: i32,
239    pub accept_dad: i32,
240    pub force_tllao: i32,
241    pub ndisc_notify: i32,
242    pub mldv1_unsolicited_report_interval: i32,
243    pub mldv2_unsolicited_report_interval: i32,
244    pub suppress_frag_ndisc: i32,
245    pub accept_ra_from_local: i32,
246    pub use_optimistic: i32,
247    pub accept_ra_mtu: i32,
248    pub stable_secret: i32,
249    pub use_oif_addrs_only: i32,
250    pub accept_ra_min_hop_limit: i32,
251    pub ignore_routes_with_linkdown: i32,
252    pub drop_unicast_in_l2_multicast: i32,
253    pub drop_unsolicited_na: i32,
254    pub keep_addr_on_down: i32,
255    pub rtr_solicit_max_interval: i32,
256    pub seg6_enabled: i32,
257    pub seg6_require_hmac: i32,
258    pub enhanced_dad: i32,
259    pub addr_gen_mode: i32,
260    pub disable_policy: i32,
261    pub accept_ra_rt_info_min_plen: i32,
262    pub ndisc_tclass: i32,
263    pub rpl_seg_enabled: i32,
264    pub ra_defrtr_metric: i32,
265    pub ioam6_enabled: i32,
266    pub ioam6_id: i32,
267    pub ioam6_id_wide: i32,
268    pub ndisc_evict_nocarrier: i32,
269    pub accept_untracked_na: i32,
270    pub accept_ra_min_lft: i32,
271}