]> git.proxmox.com Git - rustc.git/blame - vendor/rustix-0.36.5/src/net/sockopt.rs
Merge 1.70 into proxmox/bookworm
[rustc.git] / vendor / rustix-0.36.5 / src / net / sockopt.rs
CommitLineData
353b0b11
FG
1//! `getsockopt` and `setsockopt` functions.
2//!
3//! In the rustix API, there is a separate function for each option, so that
4//! it can be given an option-specific type signature.
5
6#![doc(alias = "getsockopt")]
7#![doc(alias = "setsockopt")]
8
9use crate::net::{Ipv4Addr, Ipv6Addr, SocketType};
10use crate::{backend, io};
11use backend::fd::AsFd;
12use core::time::Duration;
13
14pub use backend::net::types::Timeout;
15
16/// `getsockopt(fd, SOL_SOCKET, SO_TYPE)`—Returns the type of a socket.
17///
18/// # References
19/// - [POSIX `getsockopt`]
20/// - [POSIX `sys/socket.h`]
21/// - [Linux `getsockopt`]
22/// - [Linux `socket`]
23/// - [Winsock2 `getsockopt`]
24/// - [Winsock2 `SOL_SOCKET` options]
25///
26/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
27/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
28/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
29/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
30/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
31/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
32#[inline]
33#[doc(alias = "SO_TYPE")]
34pub fn get_socket_type<Fd: AsFd>(fd: Fd) -> io::Result<SocketType> {
35 backend::net::syscalls::sockopt::get_socket_type(fd.as_fd())
36}
37
38/// `setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, value)`
39///
40/// # References
41/// - [POSIX `setsockopt`]
42/// - [POSIX `sys/socket.h`]
43/// - [Linux `setsockopt`]
44/// - [Linux `socket`]
45/// - [Winsock2 `setsockopt`]
46/// - [Winsock2 `SOL_SOCKET` options]
47///
48/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
49/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
50/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
51/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
52/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
53/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
54#[inline]
55#[doc(alias = "SO_REUSEADDR")]
56pub fn set_socket_reuseaddr<Fd: AsFd>(fd: Fd, value: bool) -> io::Result<()> {
57 backend::net::syscalls::sockopt::set_socket_reuseaddr(fd.as_fd(), value)
58}
59
60/// `setsockopt(fd, SOL_SOCKET, SO_BROADCAST, broadcast)`
61///
62/// # References
63/// - [POSIX `setsockopt`]
64/// - [POSIX `sys/socket.h`]
65/// - [Linux `setsockopt`]
66/// - [Linux `socket`]
67/// - [Winsock2 `setsockopt`]
68/// - [Winsock2 `SOL_SOCKET` options]
69///
70/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
71/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
72/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
73/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
74/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
75/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
76#[inline]
77#[doc(alias = "SO_BROADCAST")]
78pub fn set_socket_broadcast<Fd: AsFd>(fd: Fd, broadcast: bool) -> io::Result<()> {
79 backend::net::syscalls::sockopt::set_socket_broadcast(fd.as_fd(), broadcast)
80}
81
82/// `getsockopt(fd, SOL_SOCKET, SO_BROADCAST)`
83///
84/// # References
85/// - [POSIX `getsockopt`]
86/// - [POSIX `sys/socket.h`]
87/// - [Linux `getsockopt`]
88/// - [Linux `socket`]
89/// - [Winsock2 `getsockopt`]
90/// - [Winsock2 `SOL_SOCKET` options]
91///
92/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
93/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
94/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
95/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
96/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
97/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
98#[inline]
99#[doc(alias = "SO_BROADCAST")]
100pub fn get_socket_broadcast<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
101 backend::net::syscalls::sockopt::get_socket_broadcast(fd.as_fd())
102}
103
104/// `setsockopt(fd, SOL_SOCKET, SO_LINGER, linger)`
105///
106/// # References
107/// - [POSIX `setsockopt`]
108/// - [POSIX `sys/socket.h`]
109/// - [Linux `setsockopt`]
110/// - [Linux `socket`]
111/// - [Winsock2 `setsockopt`]
112/// - [Winsock2 `SOL_SOCKET` options]
113///
114/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
115/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
116/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
117/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
118/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
119/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
120#[inline]
121#[doc(alias = "SO_LINGER")]
122pub fn set_socket_linger<Fd: AsFd>(fd: Fd, linger: Option<Duration>) -> io::Result<()> {
123 backend::net::syscalls::sockopt::set_socket_linger(fd.as_fd(), linger)
124}
125
126/// `getsockopt(fd, SOL_SOCKET, SO_LINGER)`
127///
128/// # References
129/// - [POSIX `getsockopt`]
130/// - [POSIX `sys/socket.h`]
131/// - [Linux `getsockopt`]
132/// - [Linux `socket`]
133/// - [Winsock2 `getsockopt`]
134/// - [Winsock2 `SOL_SOCKET` options]
135///
136/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
137/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
138/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
139/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
140/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
141/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
142#[inline]
143#[doc(alias = "SO_LINGER")]
144pub fn get_socket_linger<Fd: AsFd>(fd: Fd) -> io::Result<Option<Duration>> {
145 backend::net::syscalls::sockopt::get_socket_linger(fd.as_fd())
146}
147
148/// `setsockopt(fd, SOL_SOCKET, SO_PASSCRED, passcred)`
149///
150/// # References
151/// - [Linux `setsockopt`]
152/// - [Linux `socket`]
153///
154/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
155/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
156#[cfg(any(target_os = "android", target_os = "linux"))]
157#[inline]
158#[doc(alias = "SO_PASSCRED")]
159pub fn set_socket_passcred<Fd: AsFd>(fd: Fd, passcred: bool) -> io::Result<()> {
160 backend::net::syscalls::sockopt::set_socket_passcred(fd.as_fd(), passcred)
161}
162
163/// `getsockopt(fd, SOL_SOCKET, SO_PASSCRED)`
164///
165/// # References
166/// - [Linux `getsockopt`]
167/// - [Linux `socket`]
168///
169/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
170/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
171#[cfg(any(target_os = "android", target_os = "linux"))]
172#[inline]
173#[doc(alias = "SO_PASSCRED")]
174pub fn get_socket_passcred<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
175 backend::net::syscalls::sockopt::get_socket_passcred(fd.as_fd())
176}
177
178/// `setsockopt(fd, SOL_SOCKET, id, timeout)`—Set the sending
179/// or receiving timeout.
180///
181/// # References
182/// - [POSIX `setsockopt`]
183/// - [POSIX `sys/socket.h`]
184/// - [Linux `setsockopt`]
185/// - [Linux `socket`]
186/// - [Winsock2 `setsockopt`]
187/// - [Winsock2 `SOL_SOCKET` options]
188///
189/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
190/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
191/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
192/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
193/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
194/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
195#[inline]
196#[doc(alias = "SO_RCVTIMEO")]
197#[doc(alias = "SO_SNDTIMEO")]
198pub fn set_socket_timeout<Fd: AsFd>(
199 fd: Fd,
200 id: Timeout,
201 timeout: Option<Duration>,
202) -> io::Result<()> {
203 backend::net::syscalls::sockopt::set_socket_timeout(fd.as_fd(), id, timeout)
204}
205
206/// `getsockopt(fd, SOL_SOCKET, id)`—Get the sending or receiving timeout.
207///
208/// # References
209/// - [POSIX `getsockopt`]
210/// - [POSIX `sys/socket.h`]
211/// - [Linux `getsockopt`]
212/// - [Linux `socket`]
213/// - [Winsock2 `getsockopt`]
214/// - [Winsock2 `SOL_SOCKET` options]
215///
216/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
217/// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html
218/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
219/// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html
220/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
221/// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options
222#[inline]
223#[doc(alias = "SO_RCVTIMEO")]
224#[doc(alias = "SO_SNDTIMEO")]
225pub fn get_socket_timeout<Fd: AsFd>(fd: Fd, id: Timeout) -> io::Result<Option<Duration>> {
226 backend::net::syscalls::sockopt::get_socket_timeout(fd.as_fd(), id)
227}
228
229/// `setsockopt(fd, IPPROTO_IP, IP_TTL, ttl)`
230///
231/// # References
232/// - [POSIX `setsockopt`]
233/// - [POSIX `netinet/in.h`]
234/// - [Linux `setsockopt`]
235/// - [Linux `ip`]
236/// - [Winsock2 `setsockopt`]
237/// - [Winsock2 `IPPROTO_IP` options]
238///
239/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
240/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
241/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
242/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
243/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
244#[inline]
245#[doc(alias = "IP_TTL")]
246pub fn set_ip_ttl<Fd: AsFd>(fd: Fd, ttl: u32) -> io::Result<()> {
247 backend::net::syscalls::sockopt::set_ip_ttl(fd.as_fd(), ttl)
248}
249
250/// `getsockopt(fd, IPPROTO_IP, IP_TTL)`
251///
252/// # References
253/// - [POSIX `getsockopt`]
254/// - [POSIX `netinet/in.h`]
255/// - [Linux `getsockopt`]
256/// - [Linux `ip`]
257/// - [Winsock2 `getsockopt`]
258/// - [Winsock2 `IPPROTO_IPV6` options]
259///
260/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
261/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
262/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
263/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
264/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
265/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
266#[inline]
267#[doc(alias = "IP_TTL")]
268pub fn get_ip_ttl<Fd: AsFd>(fd: Fd) -> io::Result<u32> {
269 backend::net::syscalls::sockopt::get_ip_ttl(fd.as_fd())
270}
271
272/// `setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, only_v6)`
273///
274/// # References
275/// - [POSIX `setsockopt`]
276/// - [POSIX `netinet/in.h`]
277/// - [Linux `setsockopt`]
278/// - [Linux `ipv6`]
279/// - [Winsock2 `setsockopt`]
280/// - [Winsock2 `IPPROTO_IPV6` options]
281///
282/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
283/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
284/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
285/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
286/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
287/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
288#[inline]
289#[doc(alias = "IPV6_V6ONLY")]
290pub fn set_ipv6_v6only<Fd: AsFd>(fd: Fd, only_v6: bool) -> io::Result<()> {
291 backend::net::syscalls::sockopt::set_ipv6_v6only(fd.as_fd(), only_v6)
292}
293
294/// `getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY)`
295///
296/// # References
297/// - [POSIX `getsockopt`]
298/// - [POSIX `netinet/in.h`]
299/// - [Linux `getsockopt`]
300/// - [Linux `ipv6`]
301/// - [Winsock2 `getsockopt`]
302/// - [Winsock2 `IPPROTO_IPV6` options]
303///
304/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
305/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
306/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
307/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
308/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
309/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
310#[inline]
311#[doc(alias = "IPV6_V6ONLY")]
312pub fn get_ipv6_v6only<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
313 backend::net::syscalls::sockopt::get_ipv6_v6only(fd.as_fd())
314}
315
316/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, multicast_loop)`
317///
318/// # References
319/// - [POSIX `setsockopt`]
320/// - [POSIX `netinet/in.h`]
321/// - [Linux `setsockopt`]
322/// - [Linux `ip`]
323/// - [Winsock2 `setsockopt`]
324/// - [Winsock2 `IPPROTO_IP` options]
325///
326/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
327/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
328/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
329/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
330/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
331/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
332#[inline]
333#[doc(alias = "IP_MULTICAST_LOOP")]
334pub fn set_ip_multicast_loop<Fd: AsFd>(fd: Fd, multicast_loop: bool) -> io::Result<()> {
335 backend::net::syscalls::sockopt::set_ip_multicast_loop(fd.as_fd(), multicast_loop)
336}
337
338/// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP)`
339///
340/// # References
341/// - [POSIX `getsockopt`]
342/// - [POSIX `netinet/in.h`]
343/// - [Linux `getsockopt`]
344/// - [Linux `ip`]
345/// - [Winsock2 `getsockopt`]
346/// - [Winsock2 `IPPROTO_IP` options]
347///
348/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
349/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
350/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
351/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
352/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
353/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
354#[inline]
355#[doc(alias = "IP_MULTICAST_LOOP")]
356pub fn get_ip_multicast_loop<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
357 backend::net::syscalls::sockopt::get_ip_multicast_loop(fd.as_fd())
358}
359
360/// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, multicast_ttl)`
361///
362/// # References
363/// - [POSIX `setsockopt`]
364/// - [POSIX `netinet/in.h`]
365/// - [Linux `setsockopt`]
366/// - [Linux `ip`]
367/// - [Winsock2 `setsockopt`]
368/// - [Winsock2 `IPPROTO_IP` options]
369///
370/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
371/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
372/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
373/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
374/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
375/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
376#[inline]
377#[doc(alias = "IP_MULTICAST_TTL")]
378pub fn set_ip_multicast_ttl<Fd: AsFd>(fd: Fd, multicast_ttl: u32) -> io::Result<()> {
379 backend::net::syscalls::sockopt::set_ip_multicast_ttl(fd.as_fd(), multicast_ttl)
380}
381
382/// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL)`
383///
384/// # References
385/// - [POSIX `getsockopt`]
386/// - [POSIX `netinet/in.h`]
387/// - [Linux `getsockopt`]
388/// - [Linux `ip`]
389/// - [Winsock2 `getsockopt`]
390/// - [Winsock2 `IPPROTO_IP` options]
391///
392/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
393/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
394/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
395/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
396/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
397/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
398#[inline]
399#[doc(alias = "IP_MULTICAST_TTL")]
400pub fn get_ip_multicast_ttl<Fd: AsFd>(fd: Fd) -> io::Result<u32> {
401 backend::net::syscalls::sockopt::get_ip_multicast_ttl(fd.as_fd())
402}
403
404/// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, multicast_loop)`
405///
406/// # References
407/// - [POSIX `setsockopt`]
408/// - [POSIX `netinet/in.h`]
409/// - [Linux `setsockopt`]
410/// - [Linux `ipv6`]
411/// - [Winsock2 `setsockopt`]
412/// - [Winsock2 `IPPROTO_IPV6` options]
413///
414/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
415/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
416/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
417/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
418/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
419/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
420#[inline]
421#[doc(alias = "IPV6_MULTICAST_LOOP")]
422pub fn set_ipv6_multicast_loop<Fd: AsFd>(fd: Fd, multicast_loop: bool) -> io::Result<()> {
423 backend::net::syscalls::sockopt::set_ipv6_multicast_loop(fd.as_fd(), multicast_loop)
424}
425
426/// `getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP)`
427///
428/// # References
429/// - [POSIX `getsockopt`]
430/// - [POSIX `netinet/in.h`]
431/// - [Linux `getsockopt`]
432/// - [Linux `ipv6`]
433/// - [Winsock2 `getsockopt`]
434/// - [Winsock2 `IPPROTO_IPV6` options]
435///
436/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
437/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
438/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
439/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
440/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
441/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
442#[inline]
443#[doc(alias = "IPV6_MULTICAST_LOOP")]
444pub fn get_ipv6_multicast_loop<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
445 backend::net::syscalls::sockopt::get_ipv6_multicast_loop(fd.as_fd())
446}
447
448/// `setsockopt(fd, IPPROTO_IP, IPV6_MULTICAST_HOPS, multicast_hops)`
449///
450/// # References
451/// - [POSIX `setsockopt`]
452/// - [POSIX `netinet/in.h`]
453/// - [Linux `setsockopt`]
454/// - [Linux `ipv6`]
455/// - [Winsock2 `setsockopt`]
456/// - [Winsock2 `IPPROTO_IPV6` options]
457///
458/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
459/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
460/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
461/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
462/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
463/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
464#[inline]
465#[doc(alias = "IP_MULTICAST_TTL")]
466pub fn set_ipv6_multicast_hops<Fd: AsFd>(fd: Fd, multicast_hops: u32) -> io::Result<()> {
467 backend::net::syscalls::sockopt::set_ipv6_multicast_hops(fd.as_fd(), multicast_hops)
468}
469
470/// `getsockopt(fd, IPPROTO_IP, IPV6_MULTICAST_HOPS)`
471///
472/// # References
473/// - [POSIX `getsockopt`]
474/// - [POSIX `netinet/in.h`]
475/// - [Linux `getsockopt`]
476/// - [Linux `ipv6`]
477/// - [Winsock2 `getsockopt`]
478/// - [Winsock2 `IPPROTO_IPV6` options]
479///
480/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
481/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
482/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
483/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
484/// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt
485/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
486#[inline]
487#[doc(alias = "IP_MULTICAST_TTL")]
488pub fn get_ipv6_multicast_hops<Fd: AsFd>(fd: Fd) -> io::Result<u32> {
489 backend::net::syscalls::sockopt::get_ipv6_multicast_hops(fd.as_fd())
490}
491
492/// `setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, multiaddr, interface)`
493///
494/// # References
495/// - [POSIX `setsockopt`]
496/// - [POSIX `netinet/in.h`]
497/// - [Linux `setsockopt`]
498/// - [Linux `ip`]
499/// - [Winsock2 `setsockopt`]
500/// - [Winsock2 `IPPROTO_IP` options]
501///
502/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
503/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
504/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
505/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
506/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
507/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
508#[inline]
509#[doc(alias = "IP_ADD_MEMBERSHIP")]
510pub fn set_ip_add_membership<Fd: AsFd>(
511 fd: Fd,
512 multiaddr: &Ipv4Addr,
513 interface: &Ipv4Addr,
514) -> io::Result<()> {
515 backend::net::syscalls::sockopt::set_ip_add_membership(fd.as_fd(), multiaddr, interface)
516}
517
518/// `setsockopt(fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, multiaddr, interface)`
519///
520/// `IPV6_ADD_MEMBERSHIP` is the same as `IPV6_JOIN_GROUP` in POSIX.
521///
522/// # References
523/// - [POSIX `setsockopt`]
524/// - [POSIX `netinet/in.h`]
525/// - [Linux `setsockopt`]
526/// - [Linux `ipv6]
527/// - [Winsock2 `setsockopt`]
528/// - [Winsock2 `IPPROTO_IPV6` options]
529///
530/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
531/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
532/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
533/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
534/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
535/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
536#[inline]
537#[doc(alias = "IPV6_JOIN_GROUP")]
538#[doc(alias = "IPV6_ADD_MEMBERSHIP")]
539pub fn set_ipv6_add_membership<Fd: AsFd>(
540 fd: Fd,
541 multiaddr: &Ipv6Addr,
542 interface: u32,
543) -> io::Result<()> {
544 backend::net::syscalls::sockopt::set_ipv6_add_membership(fd.as_fd(), multiaddr, interface)
545}
546
547/// `setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, multiaddr, interface)`
548///
549/// # References
550/// - [POSIX `setsockopt`]
551/// - [POSIX `netinet/in.h`]
552/// - [Linux `setsockopt`]
553/// - [Linux `ip`]
554/// - [Winsock2 `setsockopt`]
555/// - [Winsock2 `IPPROTO_IP` options]
556///
557/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
558/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
559/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
560/// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html
561/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
562/// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options
563#[inline]
564#[doc(alias = "IP_DROP_MEMBERSHIP")]
565pub fn set_ip_drop_membership<Fd: AsFd>(
566 fd: Fd,
567 multiaddr: &Ipv4Addr,
568 interface: &Ipv4Addr,
569) -> io::Result<()> {
570 backend::net::syscalls::sockopt::set_ip_drop_membership(fd.as_fd(), multiaddr, interface)
571}
572
573/// `setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, multiaddr, interface)`
574///
575/// `IPV6_DROP_MEMBERSHIP` is the same as `IPV6_LEAVE_GROUP` in POSIX.
576///
577/// # References
578/// - [POSIX `setsockopt`]
579/// - [POSIX `netinet/in.h`]
580/// - [Linux `setsockopt`]
581/// - [Linux `ipv6`]
582/// - [Winsock2 `setsockopt`]
583/// - [Winsock2 `IPPROTO_IPV6` options]
584///
585/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
586/// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html
587/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
588/// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html
589/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
590/// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options
591#[inline]
592#[doc(alias = "IPV6_LEAVE_GROUP")]
593#[doc(alias = "IPV6_DROP_MEMBERSHIP")]
594pub fn set_ipv6_drop_membership<Fd: AsFd>(
595 fd: Fd,
596 multiaddr: &Ipv6Addr,
597 interface: u32,
598) -> io::Result<()> {
599 backend::net::syscalls::sockopt::set_ipv6_drop_membership(fd.as_fd(), multiaddr, interface)
600}
601
602/// `setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, nodelay)`
603///
604/// # References
605/// - [POSIX `setsockopt`]
606/// - [POSIX `netinet/tcp.h`]
607/// - [Linux `setsockopt`]
608/// - [Linux `tcp`]
609/// - [Winsock2 `setsockopt`]
610/// - [Winsock2 `IPPROTO_TCP` options]
611///
612/// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html
613/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html
614/// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html
615/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html
616/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
617/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options
618#[inline]
619#[doc(alias = "TCP_NODELAY")]
620pub fn set_tcp_nodelay<Fd: AsFd>(fd: Fd, nodelay: bool) -> io::Result<()> {
621 backend::net::syscalls::sockopt::set_tcp_nodelay(fd.as_fd(), nodelay)
622}
623
624/// `getsockopt(fd, IPPROTO_TCP, TCP_NODELAY)`
625///
626/// # References
627/// - [POSIX `getsockopt`]
628/// - [POSIX `netinet/tcp.h`]
629/// - [Linux `getsockopt`]
630/// - [Linux `tcp`]
631/// - [Winsock2 `getsockopt`]
632/// - [Winsock2 `IPPROTO_TCP` options]
633///
634/// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html
635/// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html
636/// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html
637/// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html
638/// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
639/// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options
640#[inline]
641#[doc(alias = "TCP_NODELAY")]
642pub fn get_tcp_nodelay<Fd: AsFd>(fd: Fd) -> io::Result<bool> {
643 backend::net::syscalls::sockopt::get_tcp_nodelay(fd.as_fd())
644}