1use crate::security::{self, AuditLogger, AuditMessage, AuditRequest};
6use crate::vfs::socket::{SockOptValue, SocketDomain};
7use futures::channel::mpsc::{
8 UnboundedReceiver, UnboundedSender, {self},
9};
10use linux_uapi::{AUDIT_GET, NETLINK_GET_STRICT_CHK, audit_status};
11use netlink::messaging::{
12 AccessControl, MessageWithPermission, NetlinkContext, NetlinkMessageWithCreds, Permission,
13 Sender, UnparsedNetlinkMessage,
14};
15use netlink::multicast_groups::{
16 InvalidLegacyGroupsError, InvalidModernGroupError, LegacyGroups, ModernGroup,
17 NoMappingFromModernToLegacyGroupError, SingleLegacyGroup,
18};
19use netlink::protocol_family::NetlinkClient;
20use netlink::protocol_family::route::NetlinkRouteClient;
21use netlink::protocol_family::sock_diag::NetlinkSockDiagClient;
22use netlink::{NETLINK_LOG_TAG, NewClientError};
23use netlink_packet_core::{
24 ErrorMessage, NETLINK_HEADER_LEN, NLMSG_ERROR, NetlinkBuffer, NetlinkDeserializable,
25 NetlinkHeader, NetlinkMessage, NetlinkPayload, NetlinkSerializable,
26};
27use netlink_packet_generic::message::EmptyDeserializeOptions as EmptyDeserializeGenlOptions;
28use netlink_packet_route::{RouteNetlinkMessage, RouteNetlinkMessageParseMode};
29use netlink_packet_sock_diag::SockDiagRequest;
30use netlink_packet_sock_diag::message::EmptyDeserializeOptions as EmptyDeserializeSockDiagOptions;
31use netlink_packet_utils::{DecodeError, Emitable as _};
32use starnix_sync::{
33 AuditNetlinkClientAuditResponseLock, LockDepGuard, LockDepMutex, NetlinkSocketInnerLock,
34 UEventNetlinkSocketDeviceListenerKeyLock,
35};
36use std::io::Write;
37use std::marker::PhantomData;
38use std::num::{NonZeroI32, NonZeroU32};
39use std::sync::Arc;
40use zerocopy::{FromBytes, IntoBytes};
41
42use crate::device::kobject::{Device, UEventAction, UEventContext, flatten_uevent_properties};
43use crate::device::{DeviceListener, DeviceListenerKey};
44use crate::task::{CurrentTask, EventHandler, Kernel, WaitCanceler, WaitQueue, Waiter};
45use crate::vfs::buffers::{
46 AncillaryData, InputBuffer, Message, MessageQueue, MessageReadInfo, OutputBuffer,
47 UnixControlData, VecInputBuffer,
48};
49use crate::vfs::socket::{
50 GenericMessage, GenericNetlinkClientHandle, Socket, SocketAddress, SocketHandle,
51 SocketMessageFlags, SocketOps, SocketPeer, SocketShutdownFlags, SocketType,
52};
53use starnix_logging::{log_debug, log_error, log_warn, track_stub};
54use starnix_uapi::auth::{CAP_AUDIT_CONTROL, CAP_AUDIT_WRITE, CAP_NET_ADMIN, Credentials};
55use starnix_uapi::errors::Errno;
56use starnix_uapi::vfs::FdEvents;
57use starnix_uapi::{
58 AF_NETLINK, NETLINK_ADD_MEMBERSHIP, NETLINK_AUDIT, NETLINK_CONNECTOR, NETLINK_CRYPTO,
59 NETLINK_DNRTMSG, NETLINK_DROP_MEMBERSHIP, NETLINK_ECRYPTFS, NETLINK_FIB_LOOKUP,
60 NETLINK_FIREWALL, NETLINK_GENERIC, NETLINK_IP6_FW, NETLINK_ISCSI, NETLINK_KOBJECT_UEVENT,
61 NETLINK_NETFILTER, NETLINK_NFLOG, NETLINK_RDMA, NETLINK_ROUTE, NETLINK_SCSITRANSPORT,
62 NETLINK_SELINUX, NETLINK_SMC, NETLINK_SOCK_DIAG, NETLINK_USERSOCK, NETLINK_XFRM, NLM_F_MULTI,
63 NLMSG_DONE, SO_PASSCRED, SO_PROTOCOL, SO_RCVBUF, SO_RCVBUFFORCE, SO_SNDBUF, SO_SNDBUFFORCE,
64 SO_TIMESTAMP, SOL_SOCKET, errno, error, nlmsghdr, sockaddr_nl, socklen_t, ucred,
65};
66
67pub const SOCKET_MIN_SIZE: usize = 4 << 10;
69pub const SOCKET_DEFAULT_SIZE: usize = 16 * 1024;
70pub const SOCKET_MAX_SIZE: usize = 4 << 20;
71
72const SOL_NETLINK: u32 = 270;
74
75pub fn new_netlink_socket(
76 kernel: &Arc<Kernel>,
77 socket_type: SocketType,
78 family: NetlinkFamily,
79) -> Result<Box<dyn SocketOps>, Errno> {
80 log_debug!(tag = NETLINK_LOG_TAG; "Creating {:?} Netlink Socket", family);
81 if socket_type != SocketType::Datagram && socket_type != SocketType::Raw {
82 return error!(ESOCKTNOSUPPORT);
83 }
84
85 let ops: Box<dyn SocketOps> = match family {
86 NetlinkFamily::KobjectUevent => Box::new(UEventNetlinkSocket::default()),
87 NetlinkFamily::Route => Box::new(new_route_socket(kernel)?),
88 NetlinkFamily::Generic => Box::new(GenericNetlinkSocket::new(kernel)?),
89 NetlinkFamily::SockDiag => Box::new(new_sock_diag_socket(kernel)?),
90 NetlinkFamily::Audit => Box::new(AuditNetlinkSocket::new(kernel)?),
91 NetlinkFamily::Nflog => {
92 let inner = Arc::new(NetlinkSocketInner::new(NetlinkFamily::Nflog).into());
93 Box::new(NflogNetlinkSocket::new(inner))
94 }
95 NetlinkFamily::Usersock
96 | NetlinkFamily::Firewall
97 | NetlinkFamily::Xfrm
98 | NetlinkFamily::Selinux
99 | NetlinkFamily::Iscsi
100 | NetlinkFamily::FibLookup
101 | NetlinkFamily::Connector
102 | NetlinkFamily::Netfilter
103 | NetlinkFamily::Ip6Fw
104 | NetlinkFamily::Dnrtmsg
105 | NetlinkFamily::Scsitransport
106 | NetlinkFamily::Ecryptfs
107 | NetlinkFamily::Rdma
108 | NetlinkFamily::Crypto
109 | NetlinkFamily::Smc => Box::new(StubbedNetlinkSocket::new(family)),
110 NetlinkFamily::Invalid => return error!(EINVAL),
111 };
112 Ok(ops)
113}
114
115#[derive(Default, Debug, Clone, PartialEq, Eq)]
116#[repr(C)]
117pub struct NetlinkAddress {
118 pid: u32,
119 groups: u32,
120}
121
122impl NetlinkAddress {
123 pub fn new(pid: u32, groups: u32) -> Self {
124 NetlinkAddress { pid, groups }
125 }
126
127 pub fn set_pid_if_zero(&mut self, pid: i32) {
128 if self.pid == 0 {
129 self.pid = pid as u32;
130 }
131 }
132
133 pub fn to_bytes(&self) -> Vec<u8> {
134 sockaddr_nl { nl_family: AF_NETLINK, nl_pid: self.pid, nl_pad: 0, nl_groups: self.groups }
135 .as_bytes()
136 .to_vec()
137 }
138}
139
140#[derive(Debug, Hash, Eq, PartialEq, Clone)]
141pub enum NetlinkFamily {
142 Invalid,
143 Route,
144 Usersock,
145 Firewall,
146 SockDiag,
147 Nflog,
148 Xfrm,
149 Selinux,
150 Iscsi,
151 Audit,
152 FibLookup,
153 Connector,
154 Netfilter,
155 Ip6Fw,
156 Dnrtmsg,
157 KobjectUevent,
158 Generic,
159 Scsitransport,
160 Ecryptfs,
161 Rdma,
162 Crypto,
163 Smc,
164}
165
166impl NetlinkFamily {
167 pub fn from_raw(family: u32) -> Self {
168 match family {
169 NETLINK_ROUTE => NetlinkFamily::Route,
170 NETLINK_USERSOCK => NetlinkFamily::Usersock,
171 NETLINK_FIREWALL => NetlinkFamily::Firewall,
172 NETLINK_SOCK_DIAG => NetlinkFamily::SockDiag,
173 NETLINK_NFLOG => NetlinkFamily::Nflog,
174 NETLINK_XFRM => NetlinkFamily::Xfrm,
175 NETLINK_SELINUX => NetlinkFamily::Selinux,
176 NETLINK_ISCSI => NetlinkFamily::Iscsi,
177 NETLINK_AUDIT => NetlinkFamily::Audit,
178 NETLINK_FIB_LOOKUP => NetlinkFamily::FibLookup,
179 NETLINK_CONNECTOR => NetlinkFamily::Connector,
180 NETLINK_NETFILTER => NetlinkFamily::Netfilter,
181 NETLINK_IP6_FW => NetlinkFamily::Ip6Fw,
182 NETLINK_DNRTMSG => NetlinkFamily::Dnrtmsg,
183 NETLINK_KOBJECT_UEVENT => NetlinkFamily::KobjectUevent,
184 NETLINK_GENERIC => NetlinkFamily::Generic,
185 NETLINK_SCSITRANSPORT => NetlinkFamily::Scsitransport,
186 NETLINK_ECRYPTFS => NetlinkFamily::Ecryptfs,
187 NETLINK_RDMA => NetlinkFamily::Rdma,
188 NETLINK_CRYPTO => NetlinkFamily::Crypto,
189 NETLINK_SMC => NetlinkFamily::Smc,
190 _ => NetlinkFamily::Invalid,
191 }
192 }
193
194 pub fn as_raw(&self) -> u32 {
195 match self {
196 NetlinkFamily::Route => NETLINK_ROUTE,
197 NetlinkFamily::KobjectUevent => NETLINK_KOBJECT_UEVENT,
198 NetlinkFamily::Audit => NETLINK_AUDIT,
199 _ => 0,
200 }
201 }
202}
203
204struct NetlinkSocketInner {
205 family: NetlinkFamily,
207
208 receive_buffer: MessageQueue,
210
211 send_buf_size: usize,
216
217 waiters: WaitQueue,
219
220 address: Option<NetlinkAddress>,
222
223 pub passcred: bool,
225
226 pub timestamp: bool,
228
229 pub strict_chk: bool,
231}
232
233impl NetlinkSocketInner {
234 fn new(family: NetlinkFamily) -> Self {
235 Self {
236 family,
237 receive_buffer: MessageQueue::new(SOCKET_DEFAULT_SIZE),
238 send_buf_size: SOCKET_DEFAULT_SIZE,
239 waiters: WaitQueue::default(),
240 address: None,
241 passcred: false,
242 timestamp: false,
243 strict_chk: false,
244 }
245 }
246
247 fn bind(
248 &mut self,
249 current_task: &CurrentTask,
250 socket_address: SocketAddress,
251 ) -> Result<(), Errno> {
252 if self.address.is_some() {
253 return error!(EINVAL);
254 }
255
256 let netlink_address = match socket_address {
257 SocketAddress::Netlink(mut netlink_address) => {
258 netlink_address.set_pid_if_zero(current_task.get_pid());
260 netlink_address
261 }
262 _ => return error!(EINVAL),
263 };
264
265 self.address = Some(netlink_address);
266 Ok(())
267 }
268
269 fn connect(&mut self, current_task: &CurrentTask, peer: SocketPeer) -> Result<(), Errno> {
270 let address = match peer {
271 SocketPeer::Address(address) => address,
272 _ => return error!(EINVAL),
273 };
274 let _ = self.bind(current_task, address);
276 Ok(())
277 }
278
279 fn read_message(&mut self) -> Option<Message> {
280 let message = self.receive_buffer.read_message();
281 if message.is_some() {
282 self.waiters.notify_fd_events(FdEvents::POLLOUT);
283 }
284 message
285 }
286
287 fn read_datagram(
288 &mut self,
289 data: &mut dyn OutputBuffer,
290 flags: SocketMessageFlags,
291 ) -> Result<MessageReadInfo, Errno> {
292 let mut info = if flags.contains(SocketMessageFlags::PEEK) {
293 self.receive_buffer.peek_datagram(data)
294 } else {
295 self.receive_buffer.read_datagram(data)
296 }?;
297 if info.message_length == 0 {
298 return error!(EAGAIN);
299 }
300
301 if self.passcred {
302 track_stub!(TODO("https://fxbug.dev/297373991"), "SCM_CREDENTIALS/SO_PASSCRED");
303 info.ancillary_data.push(AncillaryData::Unix(UnixControlData::unknown_creds()));
304 }
305
306 Ok(info)
307 }
308
309 fn write_to_queue(
310 &mut self,
311 data: &mut dyn InputBuffer,
312 address: Option<NetlinkAddress>,
313 ancillary_data: &mut Vec<AncillaryData>,
314 ) -> Result<usize, Errno> {
315 let socket_address = match address {
316 Some(addr) => Some(SocketAddress::Netlink(addr)),
317 None => self.address.as_ref().map(|addr| SocketAddress::Netlink(addr.clone())),
318 };
319 let bytes_written =
320 self.receive_buffer.write_datagram(data, socket_address, ancillary_data)?;
321 if bytes_written > 0 {
322 self.waiters.notify_fd_events(FdEvents::POLLIN);
323 }
324 Ok(bytes_written)
325 }
326
327 fn wait_async(
328 &mut self,
329 waiter: &Waiter,
330 events: FdEvents,
331 handler: EventHandler,
332 ) -> WaitCanceler {
333 self.waiters.wait_async_fd_events(waiter, events, handler)
334 }
335
336 fn query_events(&self) -> FdEvents {
337 self.receive_buffer.query_events()
338 }
339
340 fn getsockname(&self) -> Result<SocketAddress, Errno> {
341 match &self.address {
342 Some(addr) => Ok(SocketAddress::Netlink(addr.clone())),
343 _ => Ok(SocketAddress::default_for_domain(SocketDomain::Netlink)),
344 }
345 }
346
347 fn getpeername(&self) -> Result<SocketAddress, Errno> {
348 match &self.address {
349 Some(addr) => Ok(SocketAddress::Netlink(addr.clone())),
350 _ => Ok(SocketAddress::default_for_domain(SocketDomain::Netlink)),
351 }
352 }
353
354 fn getsockopt(&self, level: u32, optname: u32) -> Result<Vec<u8>, Errno> {
355 let opt_value = match level {
356 SOL_SOCKET => match optname {
357 SO_PASSCRED => (self.passcred as u32).as_bytes().to_vec(),
358 SO_TIMESTAMP => (self.timestamp as u32).as_bytes().to_vec(),
359 SO_SNDBUF => (self.send_buf_size as socklen_t).to_ne_bytes().to_vec(),
360 SO_RCVBUF => (self.receive_buffer.capacity() as socklen_t).to_ne_bytes().to_vec(),
361 SO_SNDBUFFORCE => (self.send_buf_size as socklen_t).to_ne_bytes().to_vec(),
362 SO_RCVBUFFORCE => {
363 (self.receive_buffer.capacity() as socklen_t).to_ne_bytes().to_vec()
364 }
365 SO_PROTOCOL => self.family.as_raw().as_bytes().to_vec(),
366 _ => return error!(ENOSYS),
367 },
368 SOL_NETLINK => match optname {
369 NETLINK_GET_STRICT_CHK => (self.strict_chk as u32).as_bytes().to_vec(),
370 _ => return error!(ENOSYS),
371 },
372 _ => vec![],
373 };
374
375 Ok(opt_value)
376 }
377
378 fn setsockopt(
379 &mut self,
380 current_task: &CurrentTask,
381 level: u32,
382 optname: u32,
383 optval: SockOptValue,
384 ) -> Result<(), Errno> {
385 match level {
386 SOL_SOCKET => match optname {
387 SO_SNDBUF => {
388 let requested_capacity: socklen_t = optval.read(current_task)?;
389 let capacity = usize::try_from(requested_capacity * 2).unwrap_or(usize::MAX);
392 let capacity = capacity.clamp(SOCKET_MIN_SIZE, SOCKET_MAX_SIZE);
394 self.send_buf_size = capacity;
395 }
396 SO_SNDBUFFORCE => {
397 security::check_task_capable(current_task, CAP_NET_ADMIN)?;
398 let requested_capacity: socklen_t = optval.read(current_task)?;
399 let capacity = usize::try_from(requested_capacity * 2).unwrap_or(usize::MAX);
402 self.send_buf_size = capacity;
403 }
404 SO_RCVBUF => {
405 let requested_capacity: socklen_t = optval.read(current_task)?;
406 let capacity = usize::try_from(requested_capacity * 2).unwrap_or(usize::MAX);
409 let capacity = capacity.clamp(SOCKET_MIN_SIZE, SOCKET_MAX_SIZE);
411 self.receive_buffer.set_capacity(capacity)?;
412 }
413 SO_RCVBUFFORCE => {
414 security::check_task_capable(current_task, CAP_NET_ADMIN)?;
415 let requested_capacity: socklen_t = optval.read(current_task)?;
416 let capacity = usize::try_from(requested_capacity * 2).unwrap_or(usize::MAX);
419 self.receive_buffer.set_capacity(capacity)?;
420 }
421 SO_PASSCRED => {
422 let passcred: u32 = optval.read(current_task)?;
423 self.passcred = passcred != 0;
424 }
425 SO_TIMESTAMP => {
426 let timestamp: u32 = optval.read(current_task)?;
427 self.timestamp = timestamp != 0;
428 }
429 _ => return error!(ENOSYS),
430 },
431 SOL_NETLINK => match optname {
432 NETLINK_GET_STRICT_CHK => {
433 let strict_chk: u32 = optval.read(current_task)?;
434 self.strict_chk = strict_chk != 0;
435 }
436 _ => return error!(ENOSYS),
437 },
438 _ => return error!(ENOSYS),
439 }
440
441 Ok(())
442 }
443}
444
445struct NflogListener {
446 inner: std::sync::Weak<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
447}
448
449static NFLOG_LISTENERS: std::sync::LazyLock<std::sync::Mutex<Vec<NflogListener>>> =
450 std::sync::LazyLock::new(|| std::sync::Mutex::new(Vec::new()));
451
452struct NflogNetlinkSocket {
453 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
454}
455
456impl NflogNetlinkSocket {
457 fn new(inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>) -> Self {
458 NFLOG_LISTENERS.lock().unwrap().push(NflogListener { inner: Arc::downgrade(&inner) });
459 Self { inner }
460 }
461
462 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
463 self.inner.lock()
464 }
465}
466
467impl Drop for NflogNetlinkSocket {
468 fn drop(&mut self) {
469 let mut listeners = NFLOG_LISTENERS.lock().unwrap();
470 listeners.retain(|l| {
471 if let Some(arc) = l.inner.upgrade() { !Arc::ptr_eq(&arc, &self.inner) } else { false }
472 });
473 }
474}
475
476impl SocketOps for NflogNetlinkSocket {
477 fn connect(
478 &self,
479 _socket: &SocketHandle,
480 current_task: &CurrentTask,
481 peer: SocketPeer,
482 ) -> Result<(), Errno> {
483 self.lock().connect(current_task, peer)
484 }
485
486 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
487 error!(EOPNOTSUPP)
488 }
489
490 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
491 error!(EOPNOTSUPP)
492 }
493
494 fn bind(
495 &self,
496 _socket: &Socket,
497 current_task: &CurrentTask,
498 socket_address: SocketAddress,
499 ) -> Result<(), Errno> {
500 self.lock().bind(current_task, socket_address)
501 }
502
503 fn read(
504 &self,
505 _socket: &Socket,
506 _current_task: &CurrentTask,
507 data: &mut dyn OutputBuffer,
508 flags: SocketMessageFlags,
509 ) -> Result<MessageReadInfo, Errno> {
510 self.lock().read_datagram(data, flags)
511 }
512
513 fn write(
514 &self,
515 _socket: &Socket,
516 _current_task: &CurrentTask,
517 _data: &mut dyn InputBuffer,
518 _dest_address: &mut Option<SocketAddress>,
519 _ancillary_data: &mut Vec<AncillaryData>,
520 ) -> Result<usize, Errno> {
521 error!(EOPNOTSUPP)
522 }
523
524 fn wait_async(
525 &self,
526 _socket: &Socket,
527 _current_task: &CurrentTask,
528 waiter: &Waiter,
529 events: FdEvents,
530 handler: EventHandler,
531 ) -> WaitCanceler {
532 self.lock().wait_async(waiter, events, handler)
533 }
534
535 fn query_events(
536 &self,
537 _socket: &Socket,
538 _current_task: &CurrentTask,
539 ) -> Result<FdEvents, Errno> {
540 Ok(self.lock().query_events() & FdEvents::POLLIN)
541 }
542
543 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
544 Ok(())
545 }
546
547 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {}
548
549 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
550 self.lock().getsockname()
551 }
552
553 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
554 self.lock().getpeername()
555 }
556
557 fn getsockopt(
558 &self,
559 _socket: &Socket,
560 _current_task: &CurrentTask,
561 level: u32,
562 optname: u32,
563 _optlen: u32,
564 ) -> Result<Vec<u8>, Errno> {
565 self.lock().getsockopt(level, optname)
566 }
567
568 fn setsockopt(
569 &self,
570 _socket: &Socket,
571 current_task: &CurrentTask,
572 level: u32,
573 optname: u32,
574 optval: SockOptValue,
575 ) -> Result<(), Errno> {
576 self.lock().setsockopt(current_task, level, optname, optval)
577 }
578}
579
580fn write_attr(buf: &mut Vec<u8>, attr_type: u16, data: &[u8]) {
581 let len = 4 + data.len();
582 buf.extend_from_slice(&(len as u16).to_ne_bytes());
583 buf.extend_from_slice(&attr_type.to_ne_bytes());
584 buf.extend_from_slice(data);
585 let pad = (4 - (data.len() % 4)) % 4;
586 for _ in 0..pad {
587 buf.push(0);
588 }
589}
590
591pub fn send_fake_nflog_message(uid: u32) {
592 const NFNL_SUBSYS_ULOG: u16 = 4;
593 const NFULNL_MSG_PACKET: u8 = 0;
594 const LOCAL_NFLOG_PACKET: u16 = (NFNL_SUBSYS_ULOG << 8) | (NFULNL_MSG_PACKET as u16);
595 const NFULA_PAYLOAD: u16 = 9;
596 const NFULA_UID: u16 = 11;
597
598 let mut msg_body = vec![0u8; 4]; let uid_bytes = uid.to_be_bytes();
602 write_attr(&mut msg_body, NFULA_UID, &uid_bytes);
603
604 let mut ip_hdr = vec![0u8; 20];
606 ip_hdr[0] = 0x45; ip_hdr[12..16].copy_from_slice(&[127, 0, 0, 1]);
608 ip_hdr[16..20].copy_from_slice(&[8, 8, 8, 8]);
609 write_attr(&mut msg_body, NFULA_PAYLOAD, &ip_hdr);
610
611 let total_len = 16 + msg_body.len();
613 let mut packet = vec![];
614 packet.extend_from_slice(&(total_len as u32).to_ne_bytes());
615 packet.extend_from_slice(&LOCAL_NFLOG_PACKET.to_ne_bytes());
616 packet.extend_from_slice(&0u16.to_ne_bytes()); packet.extend_from_slice(&0u32.to_ne_bytes()); packet.extend_from_slice(&0u32.to_ne_bytes()); packet.extend_from_slice(&msg_body);
620
621 let listeners = NFLOG_LISTENERS.lock().unwrap();
623 let ancillary_data = AncillaryData::Unix(UnixControlData::Credentials(Default::default()));
624 let mut ancillary_data = vec![ancillary_data];
625
626 for listener in listeners.iter() {
627 if let Some(socket) = listener.inner.upgrade() {
628 let _ = socket.lock().write_to_queue(
629 &mut VecInputBuffer::new(&packet),
630 Some(NetlinkAddress { pid: 0, groups: 1 }),
631 &mut ancillary_data,
632 );
633 }
634 }
635}
636
637struct StubbedNetlinkSocket {
642 inner: LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>,
643}
644
645impl StubbedNetlinkSocket {
646 pub fn new(family: NetlinkFamily) -> Self {
647 track_stub!(
648 TODO("https://fxbug.dev/278565021"),
649 format!("Creating StubbedNetlinkSocket: {:?}", family).as_str()
650 );
651 StubbedNetlinkSocket { inner: NetlinkSocketInner::new(family).into() }
652 }
653
654 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
656 self.inner.lock()
657 }
658}
659
660impl SocketOps for StubbedNetlinkSocket {
661 fn connect(
662 &self,
663 _socket: &SocketHandle,
664 current_task: &CurrentTask,
665 peer: SocketPeer,
666 ) -> Result<(), Errno> {
667 self.lock().connect(current_task, peer)
668 }
669
670 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
671 error!(EOPNOTSUPP)
672 }
673
674 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
675 error!(EOPNOTSUPP)
676 }
677
678 fn bind(
679 &self,
680 _socket: &Socket,
681 current_task: &CurrentTask,
682 socket_address: SocketAddress,
683 ) -> Result<(), Errno> {
684 self.lock().bind(current_task, socket_address)
685 }
686
687 fn read(
688 &self,
689 _socket: &Socket,
690 _current_task: &CurrentTask,
691 data: &mut dyn OutputBuffer,
692 _flags: SocketMessageFlags,
693 ) -> Result<MessageReadInfo, Errno> {
694 let msg = self.lock().read_message();
695 match msg {
696 Some(message) => {
697 let (mut nl_msg, _) =
699 nlmsghdr::read_from_prefix(&message.data).map_err(|_| errno!(EINVAL))?;
700 nl_msg.nlmsg_type = NLMSG_DONE as u16;
701 nl_msg.nlmsg_flags &= NLM_F_MULTI as u16;
702 let msg_bytes = nl_msg.as_bytes();
703 let bytes_read = data.write(msg_bytes)?;
704
705 let info = MessageReadInfo {
706 bytes_read,
707 message_length: msg_bytes.len(),
708 address: Some(SocketAddress::Netlink(NetlinkAddress::default())),
709 ancillary_data: vec![],
710 };
711 Ok(info)
712 }
713 None => Ok(MessageReadInfo::default()),
714 }
715 }
716
717 fn write(
718 &self,
719 _socket: &Socket,
720 _current_task: &CurrentTask,
721 data: &mut dyn InputBuffer,
722 dest_address: &mut Option<SocketAddress>,
723 ancillary_data: &mut Vec<AncillaryData>,
724 ) -> Result<usize, Errno> {
725 let mut local_address = self.lock().address.clone();
726
727 let destination = match dest_address {
728 Some(SocketAddress::Netlink(addr)) => addr,
729 _ => match &mut local_address {
730 Some(addr) => addr,
731 _ => return Ok(data.drain()),
732 },
733 };
734
735 if destination.groups != 0 {
736 track_stub!(TODO("https://fxbug.dev/322874956"), "StubbedNetlinkSockets multicasting");
737 return Ok(data.drain());
738 }
739
740 self.lock().write_to_queue(data, Some(NetlinkAddress::default()), ancillary_data)
741 }
742
743 fn wait_async(
744 &self,
745 _socket: &Socket,
746 _current_task: &CurrentTask,
747 waiter: &Waiter,
748 events: FdEvents,
749 handler: EventHandler,
750 ) -> WaitCanceler {
751 self.lock().wait_async(waiter, events, handler)
752 }
753
754 fn query_events(
755 &self,
756 _socket: &Socket,
757 _current_task: &CurrentTask,
758 ) -> Result<FdEvents, Errno> {
759 Ok(self.lock().query_events() & FdEvents::POLLIN)
760 }
761
762 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
763 track_stub!(TODO("https://fxbug.dev/322875507"), "StubbedNetlinkSocket::shutdown");
764 Ok(())
765 }
766
767 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {}
768
769 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
770 self.lock().getsockname()
771 }
772
773 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
774 self.lock().getpeername()
775 }
776
777 fn getsockopt(
778 &self,
779 _socket: &Socket,
780 _current_task: &CurrentTask,
781 level: u32,
782 optname: u32,
783 _optlen: u32,
784 ) -> Result<Vec<u8>, Errno> {
785 self.lock().getsockopt(level, optname)
786 }
787
788 fn setsockopt(
789 &self,
790 _socket: &Socket,
791 current_task: &CurrentTask,
792 level: u32,
793 optname: u32,
794 optval: SockOptValue,
795 ) -> Result<(), Errno> {
796 self.lock().setsockopt(current_task, level, optname, optval)
797 }
798}
799
800struct UEventNetlinkSocket {
802 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
803 device_listener_key:
804 LockDepMutex<Option<DeviceListenerKey>, UEventNetlinkSocketDeviceListenerKeyLock>,
805}
806
807impl Default for UEventNetlinkSocket {
808 #[allow(clippy::let_and_return)]
809 fn default() -> Self {
810 let result = Self {
811 inner: Arc::new(NetlinkSocketInner::new(NetlinkFamily::KobjectUevent).into()),
812 device_listener_key: Default::default(),
813 };
814 #[cfg(any(test, debug_assertions))]
815 {
816 let _l1 = result.device_listener_key.lock();
817 let _l2 = result.lock();
818 }
819 result
820 }
821}
822
823impl UEventNetlinkSocket {
824 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
826 self.inner.lock()
827 }
828
829 fn register_listener(
830 &self,
831 current_task: &CurrentTask,
832 state: LockDepGuard<'_, NetlinkSocketInner>,
833 ) {
834 if state.address.is_none() {
835 return;
836 }
837 std::mem::drop(state);
838 let mut key_state = self.device_listener_key.lock();
839 if key_state.is_none() {
840 *key_state =
841 Some(current_task.kernel().device_registry.register_listener(self.inner.clone()));
842 }
843 }
844}
845
846impl SocketOps for UEventNetlinkSocket {
847 fn connect(
848 &self,
849 _socket: &SocketHandle,
850 current_task: &CurrentTask,
851 peer: SocketPeer,
852 ) -> Result<(), Errno> {
853 let mut state = self.lock();
854 state.connect(current_task, peer)?;
855 self.register_listener(current_task, state);
856 Ok(())
857 }
858
859 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
860 error!(EOPNOTSUPP)
861 }
862
863 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
864 error!(EOPNOTSUPP)
865 }
866
867 fn bind(
868 &self,
869 _socket: &Socket,
870 current_task: &CurrentTask,
871 socket_address: SocketAddress,
872 ) -> Result<(), Errno> {
873 let mut state = self.lock();
874 state.bind(current_task, socket_address)?;
875 self.register_listener(current_task, state);
876 Ok(())
877 }
878
879 fn read(
880 &self,
881 _socket: &Socket,
882 _current_task: &CurrentTask,
883 data: &mut dyn OutputBuffer,
884 flags: SocketMessageFlags,
885 ) -> Result<MessageReadInfo, Errno> {
886 self.lock().read_datagram(data, flags)
887 }
888
889 fn write(
890 &self,
891 _socket: &Socket,
892 _current_task: &CurrentTask,
893 _data: &mut dyn InputBuffer,
894 _dest_address: &mut Option<SocketAddress>,
895 _ancillary_data: &mut Vec<AncillaryData>,
896 ) -> Result<usize, Errno> {
897 error!(EOPNOTSUPP)
898 }
899
900 fn wait_async(
901 &self,
902 _socket: &Socket,
903 _current_task: &CurrentTask,
904 waiter: &Waiter,
905 events: FdEvents,
906 handler: EventHandler,
907 ) -> WaitCanceler {
908 self.lock().wait_async(waiter, events, handler)
909 }
910
911 fn query_events(
912 &self,
913 _socket: &Socket,
914 _current_task: &CurrentTask,
915 ) -> Result<FdEvents, Errno> {
916 Ok(self.lock().query_events() & FdEvents::POLLIN)
917 }
918
919 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
920 track_stub!(TODO("https://fxbug.dev/322875507"), "UEventNetlinkSocket::shutdown");
921 Ok(())
922 }
923
924 fn close(&self, current_task: &CurrentTask, _socket: &Socket) {
925 let id = self.device_listener_key.lock().take();
926 if let Some(id) = id {
927 current_task.kernel().device_registry.unregister_listener(&id);
928 }
929 }
930
931 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
932 self.lock().getsockname()
933 }
934
935 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
936 self.lock().getpeername()
937 }
938
939 fn getsockopt(
940 &self,
941 _socket: &Socket,
942 _current_task: &CurrentTask,
943 level: u32,
944 optname: u32,
945 _optlen: u32,
946 ) -> Result<Vec<u8>, Errno> {
947 self.lock().getsockopt(level, optname)
948 }
949
950 fn setsockopt(
951 &self,
952 _socket: &Socket,
953 current_task: &CurrentTask,
954 level: u32,
955 optname: u32,
956 optval: SockOptValue,
957 ) -> Result<(), Errno> {
958 self.lock().setsockopt(current_task, level, optname, optval)
959 }
960}
961
962impl DeviceListener for Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>> {
963 fn on_device_event(&self, action: UEventAction, device: Device, context: UEventContext) {
964 let path = device.path_from_depth(0);
965
966 let mut props = device.get_uevent_properties_list();
967
968 props.insert(0, (b"ACTION".into(), action.to_string().into()));
970 props.insert(1, (b"SEQNUM".into(), context.seqnum.to_string().into()));
971
972 let flattened = flatten_uevent_properties(props, '\0');
973
974 let mut message = vec![];
975 write!(&mut message, "{action}@/{path}\0", action = action, path = path).unwrap();
976 message.extend_from_slice(flattened.as_ref());
977
978 let ancillary_data = AncillaryData::Unix(UnixControlData::Credentials(Default::default()));
979 let mut ancillary_data = vec![ancillary_data];
980 let _ = self.lock().write_to_queue(
982 &mut VecInputBuffer::new(&message),
983 Some(NetlinkAddress { pid: 0, groups: 1 }),
984 &mut ancillary_data,
985 );
986 }
987}
988
989#[derive(Clone)]
991pub struct NetlinkToClientSender<M> {
992 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
994
995 _message_type: PhantomData<fn(M) -> M>,
999}
1000
1001impl<M> NetlinkToClientSender<M> {
1002 fn new(inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>) -> Self {
1003 NetlinkToClientSender { _message_type: Default::default(), inner }
1004 }
1005}
1006
1007impl<M: Clone + NetlinkSerializable + Send> Sender<M> for NetlinkToClientSender<M> {
1008 fn send(&mut self, message: NetlinkMessage<M>, group: Option<ModernGroup>) {
1009 let mut buf = vec![0; message.buffer_len()];
1011 message.emit(&mut buf);
1012 let mut buf: VecInputBuffer = buf.into();
1013 let NetlinkToClientSender { _message_type: _, inner } = self;
1015 let mut guard = inner.lock();
1016
1017 let available = guard.receive_buffer.available_capacity();
1028 let required = buf.available();
1029 if available < required {
1030 let delta = required - available;
1031 let current_capacity = guard.receive_buffer.capacity();
1032 let new_capacity = (current_capacity + delta).min(SOCKET_MAX_SIZE);
1033 match guard.receive_buffer.set_capacity(new_capacity) {
1034 Ok(()) => {}
1035 Err(e) => {
1036 log_error!(
1037 tag = NETLINK_LOG_TAG;
1038 "Failed to increase receive buffer size: {:?}",
1039 e
1040 );
1041 }
1042 }
1043 }
1044
1045 let _bytes_written: usize = guard
1046 .write_to_queue(
1047 &mut buf,
1048 Some(NetlinkAddress {
1049 pid: 0,
1051 groups: group
1054 .map(SingleLegacyGroup::try_from)
1055 .and_then(Result::<_, NoMappingFromModernToLegacyGroupError>::ok)
1056 .map_or(0, |g| g.inner()),
1057 }),
1058 &mut Vec::new(),
1059 )
1060 .unwrap_or_else(|e| {
1061 log_error!(
1062 tag = NETLINK_LOG_TAG;
1063 "Failed to write message into buffer for socket. Errno: {:?}",
1064 e
1065 );
1066 0
1067 });
1068 }
1069}
1070
1071#[derive(Clone)]
1072pub struct NetlinkAccessControl<'a> {
1073 current_task: &'a CurrentTask,
1074}
1075
1076impl<'a> NetlinkAccessControl<'a> {
1077 pub fn new(current_task: &'a CurrentTask) -> Self {
1078 Self { current_task }
1079 }
1080}
1081
1082impl<'a> AccessControl<Arc<Credentials>> for NetlinkAccessControl<'a> {
1083 fn grant_assess(
1084 &self,
1085 creds: &Arc<Credentials>,
1086 permission: Permission,
1087 ) -> Result<(), netlink::Errno> {
1088 let need_cap_net_admin = match permission {
1089 Permission::NetlinkRouteRead => false,
1090 Permission::NetlinkRouteWrite => true,
1091 Permission::NetlinkSockDiagRead => false,
1092 Permission::NetlinkSockDiagDestroy => true,
1093 };
1094 if !need_cap_net_admin {
1095 return Ok(());
1096 }
1097
1098 self.current_task.override_creds(creds.clone(), || {
1099 security::check_task_capable(self.current_task, CAP_NET_ADMIN).map_err(|error| {
1100 netlink::Errno::new(error.code.error_code() as i32)
1101 .expect("Errno::error_code() is expected to be in range [1..max_i32]")
1102 })
1103 })
1104 }
1105}
1106pub struct NetlinkContextImpl;
1107
1108impl NetlinkContext for NetlinkContextImpl {
1109 type Creds = Arc<Credentials>;
1110 type Sender<M: Clone + NetlinkSerializable + Send> = NetlinkToClientSender<M>;
1111 type Receiver<
1112 M: Send + MessageWithPermission + NetlinkDeserializable<Error: Into<DecodeError>>,
1113 > = UnboundedReceiver<NetlinkMessageWithCreds<UnparsedNetlinkMessage<Vec<u8>, M>, Self::Creds>>;
1114 type AccessControl<'a> = NetlinkAccessControl<'a>;
1115}
1116
1117fn new_route_socket(kernel: &Arc<Kernel>) -> Result<NetlinkSocket<NetlinkRouteClient>, Errno> {
1118 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::Route)));
1119 let (message_sender, message_receiver) = mpsc::unbounded();
1120 let client = match kernel
1121 .network_netlink()
1122 .new_route_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1123 {
1124 Ok(client) => client,
1125 Err(NewClientError::Disconnected) => {
1126 log_error!(
1127 tag = NETLINK_LOG_TAG;
1128 "Netlink async worker is unexpectedly disconnected"
1129 );
1130 return error!(EPIPE);
1131 }
1132 };
1133 Ok(NetlinkSocket { inner, client, message_sender })
1134}
1135
1136fn new_sock_diag_socket(
1137 kernel: &Arc<Kernel>,
1138) -> Result<NetlinkSocket<NetlinkSockDiagClient>, Errno> {
1139 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::SockDiag)));
1140 let (message_sender, message_receiver) = mpsc::unbounded();
1141 let client = match kernel
1142 .network_netlink()
1143 .new_sock_diag_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1144 {
1145 Ok(client) => client,
1146 Err(NewClientError::Disconnected) => {
1147 log_error!(
1148 tag = NETLINK_LOG_TAG;
1149 "Netlink async worker is unexpectedly disconnected"
1150 );
1151 return error!(EPIPE);
1152 }
1153 };
1154 Ok(NetlinkSocket { inner, client, message_sender })
1155}
1156
1157struct NetlinkSocket<C: NetlinkClient> {
1159 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
1161 client: C,
1164 message_sender: UnboundedSender<
1168 NetlinkMessageWithCreds<UnparsedNetlinkMessage<Vec<u8>, C::Request>, Arc<Credentials>>,
1169 >,
1170}
1171
1172trait DeserializeOptionsProvider {
1174 type Message: NetlinkDeserializable;
1176 fn options(&self) -> <Self::Message as NetlinkDeserializable>::DeserializeOptions;
1178}
1179
1180impl DeserializeOptionsProvider for NetlinkSocket<NetlinkRouteClient> {
1181 type Message = RouteNetlinkMessage;
1182 fn options(&self) -> RouteNetlinkMessageParseMode {
1183 let strict = self.inner.lock().strict_chk;
1184 if strict {
1185 RouteNetlinkMessageParseMode::Strict
1186 } else {
1187 RouteNetlinkMessageParseMode::Relaxed
1188 }
1189 }
1190}
1191
1192impl DeserializeOptionsProvider for NetlinkSocket<NetlinkSockDiagClient> {
1193 type Message = SockDiagRequest;
1194 fn options(&self) -> EmptyDeserializeSockDiagOptions {
1195 EmptyDeserializeSockDiagOptions
1196 }
1197}
1198
1199impl<C: NetlinkClient + 'static> SocketOps for NetlinkSocket<C>
1200where
1201 Self: DeserializeOptionsProvider<Message = C::Request>,
1202{
1203 fn connect(
1204 &self,
1205 _socket: &SocketHandle,
1206 current_task: &CurrentTask,
1207 peer: SocketPeer,
1208 ) -> Result<(), Errno> {
1209 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1210 inner.lock().connect(current_task, peer)
1211 }
1212
1213 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1214 error!(EOPNOTSUPP)
1215 }
1216
1217 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1218 error!(EOPNOTSUPP)
1219 }
1220
1221 fn bind(
1222 &self,
1223 _socket: &Socket,
1224 current_task: &CurrentTask,
1225 socket_address: SocketAddress,
1226 ) -> Result<(), Errno> {
1227 let NetlinkSocket { inner, client, message_sender: _ } = self;
1228
1229 let multicast_groups = match &socket_address {
1230 SocketAddress::Netlink(NetlinkAddress { pid: _, groups }) => *groups,
1231 _ => return error!(EINVAL),
1232 };
1233 let pid = {
1234 let mut inner = inner.lock();
1235 inner.bind(current_task, socket_address)?;
1236 inner
1237 .address
1238 .as_ref()
1239 .and_then(|NetlinkAddress { pid, groups: _ }| NonZeroU32::new(*pid))
1240 };
1241 if let Some(pid) = pid {
1242 client.set_pid(pid);
1243 }
1244 client
1249 .set_legacy_memberships(LegacyGroups(multicast_groups))
1250 .map_err(|InvalidLegacyGroupsError {}| errno!(EPERM))?
1251 .wait_until_complete();
1252 Ok(())
1253 }
1254
1255 fn read(
1256 &self,
1257 _socket: &Socket,
1258 _current_task: &CurrentTask,
1259 data: &mut dyn OutputBuffer,
1260 flags: SocketMessageFlags,
1261 ) -> Result<MessageReadInfo, Errno> {
1262 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1263 inner.lock().read_datagram(data, flags)
1264 }
1265
1266 fn write(
1267 &self,
1268 socket: &Socket,
1269 current_task: &CurrentTask,
1270 data: &mut dyn InputBuffer,
1271 _dest_address: &mut Option<SocketAddress>,
1272 _ancillary_data: &mut Vec<AncillaryData>,
1273 ) -> Result<usize, Errno> {
1274 let NetlinkSocket { inner: _, client: _, message_sender } = self;
1275
1276 let bytes = data.peek_all()?;
1277 let bytes_len = bytes.len();
1278
1279 match NetlinkBuffer::new(&bytes) {
1281 Ok(buffer) => {
1282 security::check_netlink_send_access(current_task, socket, buffer.message_type())?;
1283 }
1284 Err(e) => {
1285 log_warn!(tag = NETLINK_LOG_TAG;
1291 "Failed to parse netlink header {e:?}"
1292 );
1293 data.drain();
1294 return Ok(bytes_len);
1295 }
1296 }
1297
1298 let msg = NetlinkMessageWithCreds::new(
1299 UnparsedNetlinkMessage::new(bytes, self.options()),
1300 current_task.current_creds().clone(),
1301 );
1302 message_sender.unbounded_send(msg).map_err(|e| {
1303 log_warn!(
1304 tag = NETLINK_LOG_TAG;
1305 "Netlink receiver unexpectedly disconnected for socket: {:?}",
1306 e
1307 );
1308 errno!(EPIPE)
1309 })?;
1310 data.drain();
1311 Ok(bytes_len)
1312 }
1313
1314 fn wait_async(
1315 &self,
1316 _socket: &Socket,
1317 _current_task: &CurrentTask,
1318 waiter: &Waiter,
1319 events: FdEvents,
1320 handler: EventHandler,
1321 ) -> WaitCanceler {
1322 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1323 inner.lock().wait_async(waiter, events, handler)
1324 }
1325
1326 fn query_events(
1327 &self,
1328 _socket: &Socket,
1329 _current_task: &CurrentTask,
1330 ) -> Result<FdEvents, Errno> {
1331 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1332 Ok(inner.lock().query_events() & FdEvents::POLLIN)
1333 }
1334
1335 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1336 error!(EOPNOTSUPP)
1337 }
1338
1339 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {
1340 self.message_sender.close_channel();
1342 }
1343
1344 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1345 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1346 inner.lock().getsockname()
1347 }
1348
1349 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1350 self.inner.lock().getpeername()
1351 }
1352
1353 fn getsockopt(
1354 &self,
1355 _socket: &Socket,
1356 _current_task: &CurrentTask,
1357 level: u32,
1358 optname: u32,
1359 _optlen: u32,
1360 ) -> Result<Vec<u8>, Errno> {
1361 self.inner.lock().getsockopt(level, optname)
1362 }
1363
1364 fn setsockopt(
1365 &self,
1366 _socket: &Socket,
1367 current_task: &CurrentTask,
1368 level: u32,
1369 optname: u32,
1370 optval: SockOptValue,
1371 ) -> Result<(), Errno> {
1372 match (level, optname) {
1373 (SOL_NETLINK, NETLINK_ADD_MEMBERSHIP) => {
1374 let NetlinkSocket { inner: _, client, message_sender: _ } = self;
1375 let group: u32 = optval.read(current_task)?;
1376 let async_work = client
1377 .add_membership(ModernGroup(group))
1378 .map_err(|InvalidModernGroupError| errno!(EINVAL))?;
1379 async_work.wait_until_complete();
1384 Ok(())
1385 }
1386 (SOL_NETLINK, NETLINK_DROP_MEMBERSHIP) => {
1387 let NetlinkSocket { inner: _, client, message_sender: _ } = self;
1388 let group: u32 = optval.read(current_task)?;
1389 client
1390 .del_membership(ModernGroup(group))
1391 .map_err(|InvalidModernGroupError| errno!(EINVAL))?;
1392 Ok(())
1393 }
1394 _ => self.inner.lock().setsockopt(current_task, level, optname, optval),
1395 }
1396 }
1397}
1398
1399struct GenericNetlinkSocket {
1401 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
1402 client: GenericNetlinkClientHandle<NetlinkToClientSender<GenericMessage>>,
1403 message_sender: mpsc::UnboundedSender<NetlinkMessage<GenericMessage>>,
1404}
1405
1406impl GenericNetlinkSocket {
1407 pub fn new(kernel: &Kernel) -> Result<Self, Errno> {
1408 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::Generic)));
1409 let (message_sender, message_receiver) = mpsc::unbounded();
1410 match kernel
1411 .generic_netlink()
1412 .new_generic_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1413 {
1414 Ok(client) => Ok(Self { inner, client, message_sender }),
1415 Err(e) => {
1416 log_warn!(
1417 tag = NETLINK_LOG_TAG;
1418 "Failed to connect to generic netlink server. Errno: {:?}",
1419 e
1420 );
1421 error!(EPIPE)
1422 }
1423 }
1424 }
1425
1426 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
1428 self.inner.lock()
1429 }
1430}
1431
1432impl SocketOps for GenericNetlinkSocket {
1433 fn connect(
1434 &self,
1435 _socket: &SocketHandle,
1436 current_task: &CurrentTask,
1437 peer: SocketPeer,
1438 ) -> Result<(), Errno> {
1439 let mut state = self.lock();
1440 state.connect(current_task, peer)
1441 }
1442
1443 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1444 error!(EOPNOTSUPP)
1445 }
1446
1447 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1448 error!(EOPNOTSUPP)
1449 }
1450
1451 fn bind(
1452 &self,
1453 _socket: &Socket,
1454 current_task: &CurrentTask,
1455 socket_address: SocketAddress,
1456 ) -> Result<(), Errno> {
1457 let mut state = self.lock();
1458 state.bind(current_task, socket_address)
1459 }
1460
1461 fn read(
1462 &self,
1463 _socket: &Socket,
1464 _current_task: &CurrentTask,
1465 data: &mut dyn OutputBuffer,
1466 flags: SocketMessageFlags,
1467 ) -> Result<MessageReadInfo, Errno> {
1468 self.lock().read_datagram(data, flags)
1469 }
1470
1471 fn write(
1472 &self,
1473 _socket: &Socket,
1474 _current_task: &CurrentTask,
1475 data: &mut dyn InputBuffer,
1476 _dest_address: &mut Option<SocketAddress>,
1477 _ancillary_data: &mut Vec<AncillaryData>,
1478 ) -> Result<usize, Errno> {
1479 let bytes = data.read_all()?;
1480 match NetlinkMessage::<GenericMessage>::deserialize(&bytes, EmptyDeserializeGenlOptions) {
1481 Err(e) => {
1482 log_warn!("Failed to process write; data could not be deserialized: {:?}", e);
1483 error!(EINVAL)
1484 }
1485 Ok(msg) => match self.message_sender.unbounded_send(msg) {
1486 Ok(()) => Ok(bytes.len()),
1487 Err(e) => {
1488 log_warn!("Netlink receiver unexpectedly disconnected for socket: {:?}", e);
1489 error!(EPIPE)
1490 }
1491 },
1492 }
1493 }
1494
1495 fn wait_async(
1496 &self,
1497 _socket: &Socket,
1498 _current_task: &CurrentTask,
1499 waiter: &Waiter,
1500 events: FdEvents,
1501 handler: EventHandler,
1502 ) -> WaitCanceler {
1503 self.lock().wait_async(waiter, events, handler)
1504 }
1505
1506 fn query_events(
1507 &self,
1508 _socket: &Socket,
1509 _current_task: &CurrentTask,
1510 ) -> Result<FdEvents, Errno> {
1511 Ok(self.lock().query_events() & FdEvents::POLLIN)
1512 }
1513
1514 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1515 track_stub!(TODO("https://fxbug.dev/322875507"), "GenericNetlinkSocket::shutdown");
1516 Ok(())
1517 }
1518
1519 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {}
1520
1521 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1522 self.lock().getsockname()
1523 }
1524
1525 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1526 self.lock().getpeername()
1527 }
1528
1529 fn getsockopt(
1530 &self,
1531 _socket: &Socket,
1532 _current_task: &CurrentTask,
1533 level: u32,
1534 optname: u32,
1535 _optlen: u32,
1536 ) -> Result<Vec<u8>, Errno> {
1537 self.lock().getsockopt(level, optname)
1538 }
1539
1540 fn setsockopt(
1541 &self,
1542 _socket: &Socket,
1543 current_task: &CurrentTask,
1544 level: u32,
1545 optname: u32,
1546 optval: SockOptValue,
1547 ) -> Result<(), Errno> {
1548 match (level, optname) {
1549 (SOL_NETLINK, NETLINK_ADD_MEMBERSHIP) => {
1550 let group_id: u32 = optval.read(current_task)?;
1551 self.client.add_membership(ModernGroup(group_id))
1552 }
1553 _ => self.lock().setsockopt(current_task, level, optname, optval),
1554 }
1555 }
1556}
1557
1558pub struct AuditNetlinkClient {
1560 audit_logger: Arc<AuditLogger>,
1562 waiters: WaitQueue,
1564 audit_response:
1566 LockDepMutex<Option<NetlinkMessage<GenericMessage>>, AuditNetlinkClientAuditResponseLock>,
1567}
1568
1569impl AuditNetlinkClient {
1570 fn new(audit_logger: Arc<AuditLogger>) -> Self {
1571 Self { audit_logger, waiters: Default::default(), audit_response: Default::default() }
1572 }
1573
1574 pub fn notify(&self) {
1575 self.waiters.notify_fd_events(FdEvents::POLLIN);
1576 }
1577
1578 fn check_audit_access(
1580 &self,
1581 current_task: &CurrentTask,
1582 request_type: &AuditRequest,
1583 ) -> Result<(), Errno> {
1584 match request_type {
1585 AuditRequest::AuditGet | AuditRequest::AuditSet => {
1586 security::check_task_capable(current_task, CAP_AUDIT_CONTROL)
1587 }
1588 AuditRequest::AuditUser => security::check_task_capable(current_task, CAP_AUDIT_WRITE),
1589 }
1590 }
1591
1592 fn process_request(
1594 self: &Arc<Self>,
1595 current_task: &CurrentTask,
1596 nl_message: NetlinkMessage<GenericMessage>,
1597 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1598 let (nl_header, nl_payload) = nl_message.into_parts();
1599 let audit_request_type = AuditRequest::try_from(nl_header.message_type as u32)?;
1600 self.check_audit_access(current_task, &audit_request_type)?;
1601
1602 let NetlinkPayload::InnerMessage(GenericMessage::Other { payload, .. }) = nl_payload else {
1604 return error!(EINVAL);
1605 };
1606 match audit_request_type {
1607 AuditRequest::AuditGet => self.process_get_status(nl_header.sequence_number),
1608 AuditRequest::AuditSet => self.process_set_status(current_task, nl_header, payload),
1609 AuditRequest::AuditUser => self.process_user_audit(nl_header, payload),
1610 }
1611 }
1612
1613 fn get_nl_response(&self, flags: SocketMessageFlags) -> Option<Vec<u8>> {
1614 if flags.contains(SocketMessageFlags::PEEK) {
1615 if let Some(message) = self.audit_response.lock().as_ref() {
1616 return Some(AuditNetlinkClient::serialize_nlmsg(message.clone()));
1617 }
1618 } else if let Some(message) = self.audit_response.lock().take() {
1619 return Some(AuditNetlinkClient::serialize_nlmsg(message));
1620 }
1621 None
1622 }
1623
1624 fn read_audit_log(self: &Arc<Self>) -> Option<Vec<u8>> {
1626 if let Some(AuditMessage { audit_type, message }) = self.audit_logger.read_audit_log(self) {
1627 return Some(AuditNetlinkClient::serialize_nlmsg(
1628 AuditNetlinkClient::build_audit_nlmsg(0, audit_type, message),
1629 ));
1630 }
1631 None
1632 }
1633
1634 fn read_nlmsg(self: &Arc<Self>, flags: SocketMessageFlags) -> Result<Vec<u8>, Errno> {
1636 self.get_nl_response(flags).or_else(|| self.read_audit_log()).ok_or_else(|| errno!(EAGAIN))
1639 }
1640
1641 fn process_get_status(
1642 &self,
1643 sequence_number: u32,
1644 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1645 Ok(AuditNetlinkClient::build_audit_nlmsg(
1646 sequence_number,
1647 AUDIT_GET as u16,
1648 self.audit_logger.get_status().as_bytes().to_vec(),
1649 ))
1650 }
1651
1652 fn process_set_status(
1653 self: &Arc<Self>,
1654 current_task: &CurrentTask,
1655 nl_hdr: NetlinkHeader,
1656 nl_payload: Vec<u8>,
1657 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1658 let Some(status) = audit_status::read_from_bytes(nl_payload.as_bytes()).ok() else {
1659 return error!(EINVAL);
1660 };
1661 self.audit_logger.set_status(current_task, status, self)?;
1662 Ok(AuditNetlinkClient::build_audit_ack(Ok(()), nl_hdr))
1663 }
1664
1665 fn process_user_audit(
1666 &self,
1667 nl_hdr: NetlinkHeader,
1668 nl_payload: Vec<u8>,
1669 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1670 let audit_msg = String::from_utf8_lossy(nl_payload.as_bytes());
1671 self.audit_logger.audit_log(nl_hdr.message_type, move || audit_msg);
1672 Ok(AuditNetlinkClient::build_audit_ack(Ok(()), nl_hdr))
1673 }
1674
1675 fn query_events(self: &Arc<Self>) -> FdEvents {
1676 if self.audit_response.lock().is_some() || self.audit_logger.get_backlog_count(self) != 0 {
1677 return FdEvents::POLLIN;
1678 }
1679 FdEvents::empty()
1680 }
1681
1682 fn detach(self: &Arc<Self>) {
1683 self.audit_logger.detach_client(self);
1684 }
1685
1686 fn build_audit_nlmsg(
1687 seq_number: u32,
1688 msg_type: u16,
1689 payload: Vec<u8>,
1690 ) -> NetlinkMessage<GenericMessage> {
1691 let nl_payload =
1694 NetlinkPayload::InnerMessage(GenericMessage::Other { family: msg_type, payload });
1695 let mut nl_header = NetlinkHeader::default();
1696 nl_header.sequence_number = seq_number;
1697 let mut message = NetlinkMessage::new(nl_header, nl_payload);
1698 message.finalize();
1699 message
1700 }
1701
1702 fn build_audit_ack(
1703 error: Result<(), Errno>,
1704 req_header: NetlinkHeader,
1705 ) -> NetlinkMessage<GenericMessage> {
1706 let error = {
1707 assert_eq!(req_header.buffer_len(), NETLINK_HEADER_LEN);
1708 let mut buffer = vec![0; NETLINK_HEADER_LEN];
1709 req_header.emit(&mut buffer);
1710
1711 let code = match error {
1712 Ok(()) => None,
1713 Err(e) => Some(
1714 NonZeroI32::new(-(e.code.error_code() as i32))
1716 .expect("Errno's code must be non-zero"),
1717 ),
1718 };
1719
1720 let mut error = ErrorMessage::default();
1721 error.code = code;
1722 error.header = buffer;
1723 error
1724 };
1725
1726 let payload = NetlinkPayload::<GenericMessage>::Error(error);
1727 let mut resp_header = NetlinkHeader::default();
1728 resp_header.message_type = NLMSG_ERROR;
1729 resp_header.sequence_number = req_header.sequence_number;
1730 let mut message = NetlinkMessage::new(resp_header, payload);
1731 message.finalize();
1732 message
1733 }
1734
1735 fn serialize_nlmsg(message: NetlinkMessage<GenericMessage>) -> Vec<u8> {
1736 let mut buf = vec![0; message.buffer_len()];
1737 message.serialize(&mut buf);
1738 buf
1739 }
1740}
1741
1742pub struct AuditNetlinkSocket {
1744 audit_client: Arc<AuditNetlinkClient>,
1746}
1747
1748impl AuditNetlinkSocket {
1749 pub fn new(kernel: &Kernel) -> Result<Self, Errno> {
1750 if kernel.audit_logger().is_disabled() {
1751 return error!(EPROTONOSUPPORT);
1752 }
1753 Ok(Self { audit_client: Arc::new(AuditNetlinkClient::new(kernel.audit_logger())) })
1754 }
1755}
1756
1757impl SocketOps for AuditNetlinkSocket {
1758 fn read(
1759 &self,
1760 _socket: &Socket,
1761 _current_task: &CurrentTask,
1762 data: &mut dyn OutputBuffer,
1763 flags: SocketMessageFlags,
1764 ) -> Result<MessageReadInfo, Errno> {
1765 let buf = self.audit_client.read_nlmsg(flags)?;
1766
1767 let size = data.write_all(buf.as_bytes())?;
1768 Ok(MessageReadInfo {
1769 bytes_read: size,
1770 message_length: size,
1771 address: Some(SocketAddress::Netlink(NetlinkAddress::default())),
1772 ancillary_data: vec![],
1773 })
1774 }
1775
1776 fn write(
1777 &self,
1778 socket: &Socket,
1779 current_task: &CurrentTask,
1780 data: &mut dyn InputBuffer,
1781 _dest_address: &mut Option<SocketAddress>,
1782 _ancillary_data: &mut Vec<AncillaryData>,
1783 ) -> Result<usize, Errno> {
1784 match NetlinkMessage::<GenericMessage>::deserialize(
1785 &(data.peek_all()?),
1786 EmptyDeserializeGenlOptions,
1787 ) {
1788 Ok(nl_message) => {
1789 let header = nl_message.header;
1790 security::check_netlink_send_access(current_task, socket, header.message_type)?;
1791
1792 let audit_ack = self
1794 .audit_client
1795 .process_request(current_task, nl_message)
1796 .map_err(|e| AuditNetlinkClient::build_audit_ack(Err(e), header))
1797 .unwrap_or_else(|nlerr| nlerr);
1798 *self.audit_client.audit_response.lock() = Some(audit_ack);
1799 data.drain();
1800 Ok(header.length as usize)
1801 }
1802 Err(e) => {
1803 log_warn!("Failed to process write; data could not be deserialized: {:?}", e);
1804 error!(EINVAL)
1805 }
1806 }
1807 }
1808
1809 fn wait_async(
1810 &self,
1811 _socket: &Socket,
1812 _current_task: &CurrentTask,
1813 waiter: &Waiter,
1814 events: FdEvents,
1815 handler: EventHandler,
1816 ) -> WaitCanceler {
1817 self.audit_client.waiters.wait_async_fd_events(waiter, events, handler)
1818 }
1819
1820 fn query_events(
1821 &self,
1822 _socket: &Socket,
1823 _current_task: &CurrentTask,
1824 ) -> Result<FdEvents, Errno> {
1825 Ok(self.audit_client.query_events() & FdEvents::POLLIN)
1826 }
1827
1828 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {
1829 self.audit_client.detach();
1831 }
1832
1833 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1834 error!(EOPNOTSUPP)
1835 }
1836
1837 fn connect(
1838 &self,
1839 _socket: &SocketHandle,
1840 _current_task: &CurrentTask,
1841 _peer: SocketPeer,
1842 ) -> Result<(), Errno> {
1843 error!(EOPNOTSUPP)
1844 }
1845
1846 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1847 error!(EOPNOTSUPP)
1848 }
1849
1850 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1851 error!(EOPNOTSUPP)
1852 }
1853
1854 fn bind(
1855 &self,
1856 _socket: &Socket,
1857 _current_task: &CurrentTask,
1858 _socket_address: SocketAddress,
1859 ) -> Result<(), Errno> {
1860 error!(EOPNOTSUPP)
1861 }
1862
1863 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1864 error!(EOPNOTSUPP)
1865 }
1866
1867 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1868 error!(EOPNOTSUPP)
1869 }
1870
1871 fn getsockopt(
1872 &self,
1873 _socket: &Socket,
1874 _current_task: &CurrentTask,
1875 _level: u32,
1876 _optname: u32,
1877 _optlen: u32,
1878 ) -> Result<Vec<u8>, Errno> {
1879 error!(EOPNOTSUPP)
1880 }
1881
1882 fn setsockopt(
1883 &self,
1884 _socket: &Socket,
1885 _current_task: &CurrentTask,
1886 _level: u32,
1887 _optname: u32,
1888 _optval: SockOptValue,
1889 ) -> Result<(), Errno> {
1890 error!(EOPNOTSUPP)
1891 }
1892}
1893
1894#[cfg(test)]
1895mod tests {
1896 use super::*;
1897
1898 use netlink_packet_route::route::RouteMessage;
1899 use netlink_packet_route::{RouteNetlinkMessage, RouteNetlinkMessageParseMode};
1900 use test_case::test_case;
1901
1902 #[test_case(true; "sufficient_capacity")]
1904 #[test_case(false; "insufficient_capacity")]
1907 fn test_netlink_to_client_sender(sufficient_capacity: bool) {
1908 const MODERN_GROUP: u32 = 5;
1909
1910 let mut message: NetlinkMessage<RouteNetlinkMessage> =
1911 RouteNetlinkMessage::NewRoute(RouteMessage::default()).into();
1912 message.finalize();
1913
1914 let (initial_queue_size, final_queue_size) = if sufficient_capacity {
1915 (SOCKET_DEFAULT_SIZE, SOCKET_DEFAULT_SIZE)
1916 } else {
1917 (0, message.buffer_len())
1918 };
1919
1920 let socket_inner = Arc::new(LockDepMutex::new(NetlinkSocketInner {
1921 receive_buffer: MessageQueue::new(initial_queue_size),
1922 ..NetlinkSocketInner::new(NetlinkFamily::Route)
1923 }));
1924
1925 let mut sender = NetlinkToClientSender::<RouteNetlinkMessage>::new(socket_inner.clone());
1926 sender.send(message.clone(), Some(ModernGroup(MODERN_GROUP)));
1927 let Message { data, address, ancillary_data: _ } =
1928 socket_inner.lock().read_message().expect("should read message");
1929
1930 assert_eq!(
1931 address,
1932 Some(SocketAddress::Netlink(NetlinkAddress { pid: 0, groups: 1 << MODERN_GROUP }))
1933 );
1934 let actual_message = NetlinkMessage::<RouteNetlinkMessage>::deserialize(
1935 &data,
1936 RouteNetlinkMessageParseMode::Strict,
1937 )
1938 .expect("message should deserialize into RtnlMessage");
1939 assert_eq!(actual_message, message);
1940 assert_eq!(socket_inner.lock().receive_buffer.capacity(), final_queue_size);
1941 }
1942
1943 fn getsockopt_u32(socket: &NetlinkSocketInner, level: u32, optname: u32) -> u32 {
1944 let byte_vec = socket.getsockopt(level, optname).expect("getsockopt should succeed");
1945 let bytes: [u8; 4] = byte_vec.as_slice().try_into().expect("expected 4 bytes");
1946 u32::from_ne_bytes(bytes)
1947 }
1948
1949 fn sock_opt_value(val: u32) -> SockOptValue {
1950 SockOptValue::Value(val.to_ne_bytes().to_vec())
1951 }
1952
1953 #[::fuchsia::test]
1954 async fn test_set_get_snd_rcv_buf() {
1955 crate::testing::spawn_kernel_and_run_sync(|current_task| {
1956 let mut socket = NetlinkSocketInner::new(NetlinkFamily::Route);
1957
1958 let expected_default = u32::try_from(SOCKET_DEFAULT_SIZE).unwrap();
1960 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), expected_default);
1961 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), expected_default);
1962
1963 const SNDBUF_SIZE: u32 = 12345;
1966 const RCVBUF_SIZE: u32 = 54321;
1967 socket
1968 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUF, sock_opt_value(SNDBUF_SIZE))
1969 .expect("setsockopt should succeed");
1970 socket
1971 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUF, sock_opt_value(RCVBUF_SIZE))
1972 .expect("setsockopt should succeed");
1973 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), SNDBUF_SIZE * 2);
1974 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), RCVBUF_SIZE * 2);
1975 })
1976 .await;
1977 }
1978
1979 #[::fuchsia::test]
1980 async fn test_snd_rcv_buf_limits() {
1981 crate::testing::spawn_kernel_and_run_sync(|current_task| {
1982 let mut socket = NetlinkSocketInner::new(NetlinkFamily::Route);
1983 let too_big = u32::try_from(SOCKET_MAX_SIZE).unwrap() + 1;
1984
1985 socket
1987 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUF, sock_opt_value(too_big))
1988 .expect("setsockopt should succeed");
1989 socket
1990 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUF, sock_opt_value(too_big))
1991 .expect("setsockopt should succeed");
1992 let expected_max = u32::try_from(SOCKET_MAX_SIZE).unwrap();
1993 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), expected_max);
1994 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), expected_max);
1995
1996 socket
1999 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUFFORCE, sock_opt_value(too_big))
2000 .expect("setsockopt should succeed");
2001 socket
2002 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUFFORCE, sock_opt_value(too_big))
2003 .expect("setsockopt should succeed");
2004 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), too_big * 2);
2005 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), too_big * 2);
2006 })
2007 .await;
2008 }
2009}