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, has_message) = if flags.contains(SocketMessageFlags::PEEK) {
293 self.receive_buffer.peek_datagram(data)
294 } else {
295 self.receive_buffer.read_datagram(data)
296 }?;
297 if !has_message {
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 bytes = data.peek_all()?;
726 if let Ok((nl_msg, _)) = nlmsghdr::read_from_prefix(&bytes) {
727 security::check_netlink_send_access(current_task, socket, nl_msg.nlmsg_type)?;
728 }
729
730 let mut local_address = self.lock().address.clone();
731
732 let destination = match dest_address {
733 Some(SocketAddress::Netlink(addr)) => addr,
734 _ => match &mut local_address {
735 Some(addr) => addr,
736 _ => return Ok(data.drain()),
737 },
738 };
739
740 if destination.groups != 0 {
741 track_stub!(TODO("https://fxbug.dev/322874956"), "StubbedNetlinkSockets multicasting");
742 return Ok(data.drain());
743 }
744
745 self.lock().write_to_queue(data, Some(NetlinkAddress::default()), ancillary_data)
746 }
747
748 fn wait_async(
749 &self,
750 _socket: &Socket,
751 _current_task: &CurrentTask,
752 waiter: &Waiter,
753 events: FdEvents,
754 handler: EventHandler,
755 ) -> WaitCanceler {
756 self.lock().wait_async(waiter, events, handler)
757 }
758
759 fn query_events(
760 &self,
761 _socket: &Socket,
762 _current_task: &CurrentTask,
763 ) -> Result<FdEvents, Errno> {
764 Ok(self.lock().query_events() & FdEvents::POLLIN)
765 }
766
767 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
768 track_stub!(TODO("https://fxbug.dev/322875507"), "StubbedNetlinkSocket::shutdown");
769 Ok(())
770 }
771
772 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {}
773
774 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
775 self.lock().getsockname()
776 }
777
778 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
779 self.lock().getpeername()
780 }
781
782 fn getsockopt(
783 &self,
784 _socket: &Socket,
785 _current_task: &CurrentTask,
786 level: u32,
787 optname: u32,
788 _optlen: u32,
789 ) -> Result<Vec<u8>, Errno> {
790 self.lock().getsockopt(level, optname)
791 }
792
793 fn setsockopt(
794 &self,
795 _socket: &Socket,
796 current_task: &CurrentTask,
797 level: u32,
798 optname: u32,
799 optval: SockOptValue,
800 ) -> Result<(), Errno> {
801 self.lock().setsockopt(current_task, level, optname, optval)
802 }
803}
804
805struct UEventNetlinkSocket {
807 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
808 device_listener_key:
809 LockDepMutex<Option<DeviceListenerKey>, UEventNetlinkSocketDeviceListenerKeyLock>,
810}
811
812impl Default for UEventNetlinkSocket {
813 #[allow(clippy::let_and_return)]
814 fn default() -> Self {
815 let result = Self {
816 inner: Arc::new(NetlinkSocketInner::new(NetlinkFamily::KobjectUevent).into()),
817 device_listener_key: Default::default(),
818 };
819 #[cfg(any(test, debug_assertions))]
820 {
821 let _l1 = result.device_listener_key.lock();
822 let _l2 = result.lock();
823 }
824 result
825 }
826}
827
828impl UEventNetlinkSocket {
829 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
831 self.inner.lock()
832 }
833
834 fn register_listener(
835 &self,
836 current_task: &CurrentTask,
837 state: LockDepGuard<'_, NetlinkSocketInner>,
838 ) {
839 if state.address.is_none() {
840 return;
841 }
842 std::mem::drop(state);
843 let mut key_state = self.device_listener_key.lock();
844 if key_state.is_none() {
845 *key_state =
846 Some(current_task.kernel().device_registry.register_listener(self.inner.clone()));
847 }
848 }
849}
850
851impl SocketOps for UEventNetlinkSocket {
852 fn connect(
853 &self,
854 _socket: &SocketHandle,
855 current_task: &CurrentTask,
856 peer: SocketPeer,
857 ) -> Result<(), Errno> {
858 let mut state = self.lock();
859 state.connect(current_task, peer)?;
860 self.register_listener(current_task, state);
861 Ok(())
862 }
863
864 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
865 error!(EOPNOTSUPP)
866 }
867
868 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
869 error!(EOPNOTSUPP)
870 }
871
872 fn bind(
873 &self,
874 _socket: &Socket,
875 current_task: &CurrentTask,
876 socket_address: SocketAddress,
877 ) -> Result<(), Errno> {
878 let mut state = self.lock();
879 state.bind(current_task, socket_address)?;
880 self.register_listener(current_task, state);
881 Ok(())
882 }
883
884 fn read(
885 &self,
886 _socket: &Socket,
887 _current_task: &CurrentTask,
888 data: &mut dyn OutputBuffer,
889 flags: SocketMessageFlags,
890 ) -> Result<MessageReadInfo, Errno> {
891 self.lock().read_datagram(data, flags)
892 }
893
894 fn write(
895 &self,
896 _socket: &Socket,
897 _current_task: &CurrentTask,
898 _data: &mut dyn InputBuffer,
899 _dest_address: &mut Option<SocketAddress>,
900 _ancillary_data: &mut Vec<AncillaryData>,
901 ) -> Result<usize, Errno> {
902 error!(EOPNOTSUPP)
903 }
904
905 fn wait_async(
906 &self,
907 _socket: &Socket,
908 _current_task: &CurrentTask,
909 waiter: &Waiter,
910 events: FdEvents,
911 handler: EventHandler,
912 ) -> WaitCanceler {
913 self.lock().wait_async(waiter, events, handler)
914 }
915
916 fn query_events(
917 &self,
918 _socket: &Socket,
919 _current_task: &CurrentTask,
920 ) -> Result<FdEvents, Errno> {
921 Ok(self.lock().query_events() & FdEvents::POLLIN)
922 }
923
924 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
925 track_stub!(TODO("https://fxbug.dev/322875507"), "UEventNetlinkSocket::shutdown");
926 Ok(())
927 }
928
929 fn close(&self, current_task: &CurrentTask, _socket: &Socket) {
930 let id = self.device_listener_key.lock().take();
931 if let Some(id) = id {
932 current_task.kernel().device_registry.unregister_listener(&id);
933 }
934 }
935
936 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
937 self.lock().getsockname()
938 }
939
940 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
941 self.lock().getpeername()
942 }
943
944 fn getsockopt(
945 &self,
946 _socket: &Socket,
947 _current_task: &CurrentTask,
948 level: u32,
949 optname: u32,
950 _optlen: u32,
951 ) -> Result<Vec<u8>, Errno> {
952 self.lock().getsockopt(level, optname)
953 }
954
955 fn setsockopt(
956 &self,
957 _socket: &Socket,
958 current_task: &CurrentTask,
959 level: u32,
960 optname: u32,
961 optval: SockOptValue,
962 ) -> Result<(), Errno> {
963 self.lock().setsockopt(current_task, level, optname, optval)
964 }
965}
966
967impl DeviceListener for Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>> {
968 fn on_device_event(&self, action: UEventAction, device: Device, context: UEventContext) {
969 let path = device.path_from_depth(0);
970
971 let mut props = device.get_uevent_properties_list();
972
973 props.insert(0, (b"ACTION".into(), action.to_string().into()));
975 props.insert(1, (b"SEQNUM".into(), context.seqnum.to_string().into()));
976
977 let flattened = flatten_uevent_properties(props, '\0');
978
979 let mut message = vec![];
980 write!(&mut message, "{action}@/{path}\0", action = action, path = path).unwrap();
981 message.extend_from_slice(flattened.as_ref());
982
983 let ancillary_data = AncillaryData::Unix(UnixControlData::Credentials(Default::default()));
984 let mut ancillary_data = vec![ancillary_data];
985 let _ = self.lock().write_to_queue(
987 &mut VecInputBuffer::new(&message),
988 Some(NetlinkAddress { pid: 0, groups: 1 }),
989 &mut ancillary_data,
990 );
991 }
992}
993
994#[derive(Clone)]
996pub struct NetlinkToClientSender<M> {
997 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
999
1000 _message_type: PhantomData<fn(M) -> M>,
1004}
1005
1006impl<M> NetlinkToClientSender<M> {
1007 fn new(inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>) -> Self {
1008 NetlinkToClientSender { _message_type: Default::default(), inner }
1009 }
1010}
1011
1012impl<M: Clone + NetlinkSerializable + Send> Sender<M> for NetlinkToClientSender<M> {
1013 fn send(&mut self, message: NetlinkMessage<M>, group: Option<ModernGroup>) {
1014 let mut buf = vec![0; message.buffer_len()];
1016 message.emit(&mut buf);
1017 let mut buf: VecInputBuffer = buf.into();
1018 let NetlinkToClientSender { _message_type: _, inner } = self;
1020 let mut guard = inner.lock();
1021
1022 let available = guard.receive_buffer.available_capacity();
1033 let required = buf.available();
1034 if available < required {
1035 let delta = required - available;
1036 let current_capacity = guard.receive_buffer.capacity();
1037 let new_capacity = (current_capacity + delta).min(SOCKET_MAX_SIZE);
1038 match guard.receive_buffer.set_capacity(new_capacity) {
1039 Ok(()) => {}
1040 Err(e) => {
1041 log_error!(
1042 tag = NETLINK_LOG_TAG;
1043 "Failed to increase receive buffer size: {:?}",
1044 e
1045 );
1046 }
1047 }
1048 }
1049
1050 let _bytes_written: usize = guard
1051 .write_to_queue(
1052 &mut buf,
1053 Some(NetlinkAddress {
1054 pid: 0,
1056 groups: group
1059 .map(SingleLegacyGroup::try_from)
1060 .and_then(Result::<_, NoMappingFromModernToLegacyGroupError>::ok)
1061 .map_or(0, |g| g.inner()),
1062 }),
1063 &mut Vec::new(),
1064 )
1065 .unwrap_or_else(|e| {
1066 log_error!(
1067 tag = NETLINK_LOG_TAG;
1068 "Failed to write message into buffer for socket. Errno: {:?}",
1069 e
1070 );
1071 0
1072 });
1073 }
1074}
1075
1076#[derive(Clone)]
1077pub struct NetlinkAccessControl<'a> {
1078 current_task: &'a CurrentTask,
1079}
1080
1081impl<'a> NetlinkAccessControl<'a> {
1082 pub fn new(current_task: &'a CurrentTask) -> Self {
1083 Self { current_task }
1084 }
1085}
1086
1087impl<'a> AccessControl<Arc<Credentials>> for NetlinkAccessControl<'a> {
1088 fn grant_assess(
1089 &self,
1090 creds: &Arc<Credentials>,
1091 permission: Permission,
1092 ) -> Result<(), netlink::Errno> {
1093 let need_cap_net_admin = match permission {
1094 Permission::NetlinkRouteRead => false,
1095 Permission::NetlinkRouteWrite => true,
1096 Permission::NetlinkSockDiagRead => false,
1097 Permission::NetlinkSockDiagDestroy => true,
1098 };
1099 if !need_cap_net_admin {
1100 return Ok(());
1101 }
1102
1103 self.current_task.override_creds(creds.clone(), || {
1104 security::check_task_capable(self.current_task, CAP_NET_ADMIN).map_err(|error| {
1105 netlink::Errno::new(error.code.error_code() as i32)
1106 .expect("Errno::error_code() is expected to be in range [1..max_i32]")
1107 })
1108 })
1109 }
1110}
1111pub struct NetlinkContextImpl;
1112
1113impl NetlinkContext for NetlinkContextImpl {
1114 type Creds = Arc<Credentials>;
1115 type Sender<M: Clone + NetlinkSerializable + Send> = NetlinkToClientSender<M>;
1116 type Receiver<
1117 M: Send + MessageWithPermission + NetlinkDeserializable<Error: Into<DecodeError>>,
1118 > = UnboundedReceiver<NetlinkMessageWithCreds<UnparsedNetlinkMessage<Vec<u8>, M>, Self::Creds>>;
1119 type AccessControl<'a> = NetlinkAccessControl<'a>;
1120}
1121
1122fn new_route_socket(kernel: &Arc<Kernel>) -> Result<NetlinkSocket<NetlinkRouteClient>, Errno> {
1123 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::Route)));
1124 let (message_sender, message_receiver) = mpsc::unbounded();
1125 let client = match kernel
1126 .network_netlink()
1127 .new_route_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1128 {
1129 Ok(client) => client,
1130 Err(NewClientError::Disconnected) => {
1131 log_error!(
1132 tag = NETLINK_LOG_TAG;
1133 "Netlink async worker is unexpectedly disconnected"
1134 );
1135 return error!(EPIPE);
1136 }
1137 };
1138 Ok(NetlinkSocket { inner, client, message_sender })
1139}
1140
1141fn new_sock_diag_socket(
1142 kernel: &Arc<Kernel>,
1143) -> Result<NetlinkSocket<NetlinkSockDiagClient>, Errno> {
1144 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::SockDiag)));
1145 let (message_sender, message_receiver) = mpsc::unbounded();
1146 let client = match kernel
1147 .network_netlink()
1148 .new_sock_diag_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1149 {
1150 Ok(client) => client,
1151 Err(NewClientError::Disconnected) => {
1152 log_error!(
1153 tag = NETLINK_LOG_TAG;
1154 "Netlink async worker is unexpectedly disconnected"
1155 );
1156 return error!(EPIPE);
1157 }
1158 };
1159 Ok(NetlinkSocket { inner, client, message_sender })
1160}
1161
1162struct NetlinkSocket<C: NetlinkClient> {
1164 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
1166 client: C,
1169 message_sender: UnboundedSender<
1173 NetlinkMessageWithCreds<UnparsedNetlinkMessage<Vec<u8>, C::Request>, Arc<Credentials>>,
1174 >,
1175}
1176
1177trait DeserializeOptionsProvider {
1179 type Message: NetlinkDeserializable;
1181 fn options(&self) -> <Self::Message as NetlinkDeserializable>::DeserializeOptions;
1183}
1184
1185impl DeserializeOptionsProvider for NetlinkSocket<NetlinkRouteClient> {
1186 type Message = RouteNetlinkMessage;
1187 fn options(&self) -> RouteNetlinkMessageParseMode {
1188 let strict = self.inner.lock().strict_chk;
1189 if strict {
1190 RouteNetlinkMessageParseMode::Strict
1191 } else {
1192 RouteNetlinkMessageParseMode::Relaxed
1193 }
1194 }
1195}
1196
1197impl DeserializeOptionsProvider for NetlinkSocket<NetlinkSockDiagClient> {
1198 type Message = SockDiagRequest;
1199 fn options(&self) -> EmptyDeserializeSockDiagOptions {
1200 EmptyDeserializeSockDiagOptions
1201 }
1202}
1203
1204impl<C: NetlinkClient + 'static> SocketOps for NetlinkSocket<C>
1205where
1206 Self: DeserializeOptionsProvider<Message = C::Request>,
1207{
1208 fn connect(
1209 &self,
1210 _socket: &SocketHandle,
1211 current_task: &CurrentTask,
1212 peer: SocketPeer,
1213 ) -> Result<(), Errno> {
1214 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1215 inner.lock().connect(current_task, peer)
1216 }
1217
1218 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1219 error!(EOPNOTSUPP)
1220 }
1221
1222 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1223 error!(EOPNOTSUPP)
1224 }
1225
1226 fn bind(
1227 &self,
1228 _socket: &Socket,
1229 current_task: &CurrentTask,
1230 socket_address: SocketAddress,
1231 ) -> Result<(), Errno> {
1232 let NetlinkSocket { inner, client, message_sender: _ } = self;
1233
1234 let multicast_groups = match &socket_address {
1235 SocketAddress::Netlink(NetlinkAddress { pid: _, groups }) => *groups,
1236 _ => return error!(EINVAL),
1237 };
1238 let pid = {
1239 let mut inner = inner.lock();
1240 inner.bind(current_task, socket_address)?;
1241 inner
1242 .address
1243 .as_ref()
1244 .and_then(|NetlinkAddress { pid, groups: _ }| NonZeroU32::new(*pid))
1245 };
1246 if let Some(pid) = pid {
1247 client.set_pid(pid);
1248 }
1249 client
1254 .set_legacy_memberships(LegacyGroups(multicast_groups))
1255 .map_err(|InvalidLegacyGroupsError {}| errno!(EPERM))?
1256 .wait_until_complete();
1257 Ok(())
1258 }
1259
1260 fn read(
1261 &self,
1262 _socket: &Socket,
1263 _current_task: &CurrentTask,
1264 data: &mut dyn OutputBuffer,
1265 flags: SocketMessageFlags,
1266 ) -> Result<MessageReadInfo, Errno> {
1267 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1268 inner.lock().read_datagram(data, flags)
1269 }
1270
1271 fn write(
1272 &self,
1273 socket: &Socket,
1274 current_task: &CurrentTask,
1275 data: &mut dyn InputBuffer,
1276 _dest_address: &mut Option<SocketAddress>,
1277 _ancillary_data: &mut Vec<AncillaryData>,
1278 ) -> Result<usize, Errno> {
1279 let NetlinkSocket { inner: _, client: _, message_sender } = self;
1280
1281 let bytes = data.peek_all()?;
1282 let bytes_len = bytes.len();
1283
1284 match NetlinkBuffer::new(&bytes) {
1286 Ok(buffer) => {
1287 security::check_netlink_send_access(current_task, socket, buffer.message_type())?;
1288 }
1289 Err(e) => {
1290 log_warn!(tag = NETLINK_LOG_TAG;
1296 "Failed to parse netlink header {e:?}"
1297 );
1298 data.drain();
1299 return Ok(bytes_len);
1300 }
1301 }
1302
1303 let msg = NetlinkMessageWithCreds::new(
1304 UnparsedNetlinkMessage::new(bytes, self.options()),
1305 current_task.current_creds().clone(),
1306 );
1307 message_sender.unbounded_send(msg).map_err(|e| {
1308 log_warn!(
1309 tag = NETLINK_LOG_TAG;
1310 "Netlink receiver unexpectedly disconnected for socket: {:?}",
1311 e
1312 );
1313 errno!(EPIPE)
1314 })?;
1315 data.drain();
1316 Ok(bytes_len)
1317 }
1318
1319 fn wait_async(
1320 &self,
1321 _socket: &Socket,
1322 _current_task: &CurrentTask,
1323 waiter: &Waiter,
1324 events: FdEvents,
1325 handler: EventHandler,
1326 ) -> WaitCanceler {
1327 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1328 inner.lock().wait_async(waiter, events, handler)
1329 }
1330
1331 fn query_events(
1332 &self,
1333 _socket: &Socket,
1334 _current_task: &CurrentTask,
1335 ) -> Result<FdEvents, Errno> {
1336 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1337 Ok(inner.lock().query_events() & FdEvents::POLLIN)
1338 }
1339
1340 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1341 error!(EOPNOTSUPP)
1342 }
1343
1344 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {
1345 self.message_sender.close_channel();
1347 }
1348
1349 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1350 let NetlinkSocket { inner, client: _, message_sender: _ } = self;
1351 inner.lock().getsockname()
1352 }
1353
1354 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1355 self.inner.lock().getpeername()
1356 }
1357
1358 fn getsockopt(
1359 &self,
1360 _socket: &Socket,
1361 _current_task: &CurrentTask,
1362 level: u32,
1363 optname: u32,
1364 _optlen: u32,
1365 ) -> Result<Vec<u8>, Errno> {
1366 self.inner.lock().getsockopt(level, optname)
1367 }
1368
1369 fn setsockopt(
1370 &self,
1371 _socket: &Socket,
1372 current_task: &CurrentTask,
1373 level: u32,
1374 optname: u32,
1375 optval: SockOptValue,
1376 ) -> Result<(), Errno> {
1377 match (level, optname) {
1378 (SOL_NETLINK, NETLINK_ADD_MEMBERSHIP) => {
1379 let NetlinkSocket { inner: _, client, message_sender: _ } = self;
1380 let group: u32 = optval.read(current_task)?;
1381 let async_work = client
1382 .add_membership(ModernGroup(group))
1383 .map_err(|InvalidModernGroupError| errno!(EINVAL))?;
1384 async_work.wait_until_complete();
1389 Ok(())
1390 }
1391 (SOL_NETLINK, NETLINK_DROP_MEMBERSHIP) => {
1392 let NetlinkSocket { inner: _, client, message_sender: _ } = self;
1393 let group: u32 = optval.read(current_task)?;
1394 client
1395 .del_membership(ModernGroup(group))
1396 .map_err(|InvalidModernGroupError| errno!(EINVAL))?;
1397 Ok(())
1398 }
1399 _ => self.inner.lock().setsockopt(current_task, level, optname, optval),
1400 }
1401 }
1402}
1403
1404struct GenericNetlinkSocket {
1406 inner: Arc<LockDepMutex<NetlinkSocketInner, NetlinkSocketInnerLock>>,
1407 client: GenericNetlinkClientHandle<NetlinkToClientSender<GenericMessage>>,
1408 message_sender: mpsc::UnboundedSender<NetlinkMessage<GenericMessage>>,
1409}
1410
1411impl GenericNetlinkSocket {
1412 pub fn new(kernel: &Kernel) -> Result<Self, Errno> {
1413 let inner = Arc::new(LockDepMutex::new(NetlinkSocketInner::new(NetlinkFamily::Generic)));
1414 let (message_sender, message_receiver) = mpsc::unbounded();
1415 match kernel
1416 .generic_netlink()
1417 .new_generic_client(NetlinkToClientSender::new(inner.clone()), message_receiver)
1418 {
1419 Ok(client) => Ok(Self { inner, client, message_sender }),
1420 Err(e) => {
1421 log_warn!(
1422 tag = NETLINK_LOG_TAG;
1423 "Failed to connect to generic netlink server. Errno: {:?}",
1424 e
1425 );
1426 error!(EPIPE)
1427 }
1428 }
1429 }
1430
1431 fn lock(&self) -> LockDepGuard<'_, NetlinkSocketInner> {
1433 self.inner.lock()
1434 }
1435}
1436
1437impl SocketOps for GenericNetlinkSocket {
1438 fn connect(
1439 &self,
1440 _socket: &SocketHandle,
1441 current_task: &CurrentTask,
1442 peer: SocketPeer,
1443 ) -> Result<(), Errno> {
1444 let mut state = self.lock();
1445 state.connect(current_task, peer)
1446 }
1447
1448 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1449 error!(EOPNOTSUPP)
1450 }
1451
1452 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1453 error!(EOPNOTSUPP)
1454 }
1455
1456 fn bind(
1457 &self,
1458 _socket: &Socket,
1459 current_task: &CurrentTask,
1460 socket_address: SocketAddress,
1461 ) -> Result<(), Errno> {
1462 let mut state = self.lock();
1463 state.bind(current_task, socket_address)
1464 }
1465
1466 fn read(
1467 &self,
1468 _socket: &Socket,
1469 _current_task: &CurrentTask,
1470 data: &mut dyn OutputBuffer,
1471 flags: SocketMessageFlags,
1472 ) -> Result<MessageReadInfo, Errno> {
1473 self.lock().read_datagram(data, flags)
1474 }
1475
1476 fn write(
1477 &self,
1478 socket: &Socket,
1479 current_task: &CurrentTask,
1480 data: &mut dyn InputBuffer,
1481 _dest_address: &mut Option<SocketAddress>,
1482 _ancillary_data: &mut Vec<AncillaryData>,
1483 ) -> Result<usize, Errno> {
1484 let bytes = data.read_all()?;
1485 match NetlinkMessage::<GenericMessage>::deserialize(&bytes, EmptyDeserializeGenlOptions) {
1486 Err(e) => {
1487 log_warn!("Failed to process write; data could not be deserialized: {:?}", e);
1488 error!(EINVAL)
1489 }
1490 Ok(msg) => {
1491 security::check_netlink_send_access(current_task, socket, msg.header.message_type)?;
1492 match self.message_sender.unbounded_send(msg) {
1493 Ok(()) => Ok(bytes.len()),
1494 Err(e) => {
1495 log_warn!("Netlink receiver unexpectedly disconnected for socket: {:?}", e);
1496 error!(EPIPE)
1497 }
1498 }
1499 }
1500 }
1501 }
1502
1503 fn wait_async(
1504 &self,
1505 _socket: &Socket,
1506 _current_task: &CurrentTask,
1507 waiter: &Waiter,
1508 events: FdEvents,
1509 handler: EventHandler,
1510 ) -> WaitCanceler {
1511 self.lock().wait_async(waiter, events, handler)
1512 }
1513
1514 fn query_events(
1515 &self,
1516 _socket: &Socket,
1517 _current_task: &CurrentTask,
1518 ) -> Result<FdEvents, Errno> {
1519 Ok(self.lock().query_events() & FdEvents::POLLIN)
1520 }
1521
1522 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1523 track_stub!(TODO("https://fxbug.dev/322875507"), "GenericNetlinkSocket::shutdown");
1524 Ok(())
1525 }
1526
1527 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {}
1528
1529 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1530 self.lock().getsockname()
1531 }
1532
1533 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1534 self.lock().getpeername()
1535 }
1536
1537 fn getsockopt(
1538 &self,
1539 _socket: &Socket,
1540 _current_task: &CurrentTask,
1541 level: u32,
1542 optname: u32,
1543 _optlen: u32,
1544 ) -> Result<Vec<u8>, Errno> {
1545 self.lock().getsockopt(level, optname)
1546 }
1547
1548 fn setsockopt(
1549 &self,
1550 _socket: &Socket,
1551 current_task: &CurrentTask,
1552 level: u32,
1553 optname: u32,
1554 optval: SockOptValue,
1555 ) -> Result<(), Errno> {
1556 match (level, optname) {
1557 (SOL_NETLINK, NETLINK_ADD_MEMBERSHIP) => {
1558 let group_id: u32 = optval.read(current_task)?;
1559 self.client.add_membership(ModernGroup(group_id))
1560 }
1561 _ => self.lock().setsockopt(current_task, level, optname, optval),
1562 }
1563 }
1564}
1565
1566pub struct AuditNetlinkClient {
1568 audit_logger: Arc<AuditLogger>,
1570 waiters: WaitQueue,
1572 audit_response:
1574 LockDepMutex<Option<NetlinkMessage<GenericMessage>>, AuditNetlinkClientAuditResponseLock>,
1575}
1576
1577impl AuditNetlinkClient {
1578 fn new(audit_logger: Arc<AuditLogger>) -> Self {
1579 Self { audit_logger, waiters: Default::default(), audit_response: Default::default() }
1580 }
1581
1582 pub fn notify(&self) {
1583 self.waiters.notify_fd_events(FdEvents::POLLIN);
1584 }
1585
1586 fn check_audit_access(
1588 &self,
1589 current_task: &CurrentTask,
1590 request_type: &AuditRequest,
1591 ) -> Result<(), Errno> {
1592 match request_type {
1593 AuditRequest::AuditGet | AuditRequest::AuditSet => {
1594 security::check_task_capable(current_task, CAP_AUDIT_CONTROL)
1595 }
1596 AuditRequest::AuditUser => security::check_task_capable(current_task, CAP_AUDIT_WRITE),
1597 }
1598 }
1599
1600 fn process_request(
1602 self: &Arc<Self>,
1603 current_task: &CurrentTask,
1604 nl_message: NetlinkMessage<GenericMessage>,
1605 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1606 let (nl_header, nl_payload) = nl_message.into_parts();
1607 let audit_request_type = AuditRequest::try_from(nl_header.message_type as u32)?;
1608 self.check_audit_access(current_task, &audit_request_type)?;
1609
1610 let NetlinkPayload::InnerMessage(GenericMessage::Other { payload, .. }) = nl_payload else {
1612 return error!(EINVAL);
1613 };
1614 match audit_request_type {
1615 AuditRequest::AuditGet => self.process_get_status(nl_header.sequence_number),
1616 AuditRequest::AuditSet => self.process_set_status(current_task, nl_header, payload),
1617 AuditRequest::AuditUser => self.process_user_audit(nl_header, payload),
1618 }
1619 }
1620
1621 fn get_nl_response(&self, flags: SocketMessageFlags) -> Option<Vec<u8>> {
1622 if flags.contains(SocketMessageFlags::PEEK) {
1623 if let Some(message) = self.audit_response.lock().as_ref() {
1624 return Some(AuditNetlinkClient::serialize_nlmsg(message.clone()));
1625 }
1626 } else if let Some(message) = self.audit_response.lock().take() {
1627 return Some(AuditNetlinkClient::serialize_nlmsg(message));
1628 }
1629 None
1630 }
1631
1632 fn read_audit_log(self: &Arc<Self>) -> Option<Vec<u8>> {
1634 if let Some(AuditMessage { audit_type, message }) = self.audit_logger.read_audit_log(self) {
1635 return Some(AuditNetlinkClient::serialize_nlmsg(
1636 AuditNetlinkClient::build_audit_nlmsg(0, audit_type, message),
1637 ));
1638 }
1639 None
1640 }
1641
1642 fn read_nlmsg(self: &Arc<Self>, flags: SocketMessageFlags) -> Result<Vec<u8>, Errno> {
1644 self.get_nl_response(flags).or_else(|| self.read_audit_log()).ok_or_else(|| errno!(EAGAIN))
1647 }
1648
1649 fn process_get_status(
1650 &self,
1651 sequence_number: u32,
1652 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1653 Ok(AuditNetlinkClient::build_audit_nlmsg(
1654 sequence_number,
1655 AUDIT_GET as u16,
1656 self.audit_logger.get_status().as_bytes().to_vec(),
1657 ))
1658 }
1659
1660 fn process_set_status(
1661 self: &Arc<Self>,
1662 current_task: &CurrentTask,
1663 nl_hdr: NetlinkHeader,
1664 nl_payload: Vec<u8>,
1665 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1666 let Some(status) = audit_status::read_from_bytes(nl_payload.as_bytes()).ok() else {
1667 return error!(EINVAL);
1668 };
1669 self.audit_logger.set_status(current_task, status, self)?;
1670 Ok(AuditNetlinkClient::build_audit_ack(Ok(()), nl_hdr))
1671 }
1672
1673 fn process_user_audit(
1674 &self,
1675 nl_hdr: NetlinkHeader,
1676 nl_payload: Vec<u8>,
1677 ) -> Result<NetlinkMessage<GenericMessage>, Errno> {
1678 let audit_msg = String::from_utf8_lossy(nl_payload.as_bytes());
1679 self.audit_logger.audit_log(nl_hdr.message_type, move || audit_msg);
1680 Ok(AuditNetlinkClient::build_audit_ack(Ok(()), nl_hdr))
1681 }
1682
1683 fn query_events(self: &Arc<Self>) -> FdEvents {
1684 if self.audit_response.lock().is_some() || self.audit_logger.get_backlog_count(self) != 0 {
1685 return FdEvents::POLLIN;
1686 }
1687 FdEvents::empty()
1688 }
1689
1690 fn detach(self: &Arc<Self>) {
1691 self.audit_logger.detach_client(self);
1692 }
1693
1694 fn build_audit_nlmsg(
1695 seq_number: u32,
1696 msg_type: u16,
1697 payload: Vec<u8>,
1698 ) -> NetlinkMessage<GenericMessage> {
1699 let nl_payload =
1702 NetlinkPayload::InnerMessage(GenericMessage::Other { family: msg_type, payload });
1703 let mut nl_header = NetlinkHeader::default();
1704 nl_header.sequence_number = seq_number;
1705 let mut message = NetlinkMessage::new(nl_header, nl_payload);
1706 message.finalize();
1707 message
1708 }
1709
1710 fn build_audit_ack(
1711 error: Result<(), Errno>,
1712 req_header: NetlinkHeader,
1713 ) -> NetlinkMessage<GenericMessage> {
1714 let error = {
1715 assert_eq!(req_header.buffer_len(), NETLINK_HEADER_LEN);
1716 let mut buffer = vec![0; NETLINK_HEADER_LEN];
1717 req_header.emit(&mut buffer);
1718
1719 let code = match error {
1720 Ok(()) => None,
1721 Err(e) => Some(
1722 NonZeroI32::new(-(e.code.error_code() as i32))
1724 .expect("Errno's code must be non-zero"),
1725 ),
1726 };
1727
1728 let mut error = ErrorMessage::default();
1729 error.code = code;
1730 error.header = buffer;
1731 error
1732 };
1733
1734 let payload = NetlinkPayload::<GenericMessage>::Error(error);
1735 let mut resp_header = NetlinkHeader::default();
1736 resp_header.message_type = NLMSG_ERROR;
1737 resp_header.sequence_number = req_header.sequence_number;
1738 let mut message = NetlinkMessage::new(resp_header, payload);
1739 message.finalize();
1740 message
1741 }
1742
1743 fn serialize_nlmsg(message: NetlinkMessage<GenericMessage>) -> Vec<u8> {
1744 let mut buf = vec![0; message.buffer_len()];
1745 message.serialize(&mut buf);
1746 buf
1747 }
1748}
1749
1750pub struct AuditNetlinkSocket {
1752 audit_client: Arc<AuditNetlinkClient>,
1754}
1755
1756impl AuditNetlinkSocket {
1757 pub fn new(kernel: &Kernel) -> Result<Self, Errno> {
1758 if kernel.audit_logger().is_disabled() {
1759 return error!(EPROTONOSUPPORT);
1760 }
1761 Ok(Self { audit_client: Arc::new(AuditNetlinkClient::new(kernel.audit_logger())) })
1762 }
1763}
1764
1765impl SocketOps for AuditNetlinkSocket {
1766 fn read(
1767 &self,
1768 _socket: &Socket,
1769 _current_task: &CurrentTask,
1770 data: &mut dyn OutputBuffer,
1771 flags: SocketMessageFlags,
1772 ) -> Result<MessageReadInfo, Errno> {
1773 let buf = self.audit_client.read_nlmsg(flags)?;
1774
1775 let size = data.write_all(buf.as_bytes())?;
1776 Ok(MessageReadInfo {
1777 bytes_read: size,
1778 message_length: size,
1779 address: Some(SocketAddress::Netlink(NetlinkAddress::default())),
1780 ancillary_data: vec![],
1781 })
1782 }
1783
1784 fn write(
1785 &self,
1786 socket: &Socket,
1787 current_task: &CurrentTask,
1788 data: &mut dyn InputBuffer,
1789 _dest_address: &mut Option<SocketAddress>,
1790 _ancillary_data: &mut Vec<AncillaryData>,
1791 ) -> Result<usize, Errno> {
1792 match NetlinkMessage::<GenericMessage>::deserialize(
1793 &(data.peek_all()?),
1794 EmptyDeserializeGenlOptions,
1795 ) {
1796 Ok(nl_message) => {
1797 let header = nl_message.header;
1798 security::check_netlink_send_access(current_task, socket, header.message_type)?;
1799
1800 let audit_ack = self
1802 .audit_client
1803 .process_request(current_task, nl_message)
1804 .map_err(|e| AuditNetlinkClient::build_audit_ack(Err(e), header))
1805 .unwrap_or_else(|nlerr| nlerr);
1806 *self.audit_client.audit_response.lock() = Some(audit_ack);
1807 data.drain();
1808 Ok(header.length as usize)
1809 }
1810 Err(e) => {
1811 log_warn!("Failed to process write; data could not be deserialized: {:?}", e);
1812 error!(EINVAL)
1813 }
1814 }
1815 }
1816
1817 fn wait_async(
1818 &self,
1819 _socket: &Socket,
1820 _current_task: &CurrentTask,
1821 waiter: &Waiter,
1822 events: FdEvents,
1823 handler: EventHandler,
1824 ) -> WaitCanceler {
1825 self.audit_client.waiters.wait_async_fd_events(waiter, events, handler)
1826 }
1827
1828 fn query_events(
1829 &self,
1830 _socket: &Socket,
1831 _current_task: &CurrentTask,
1832 ) -> Result<FdEvents, Errno> {
1833 Ok(self.audit_client.query_events() & FdEvents::POLLIN)
1834 }
1835
1836 fn close(&self, _current_task: &CurrentTask, _socket: &Socket) {
1837 self.audit_client.detach();
1839 }
1840
1841 fn shutdown(&self, _socket: &Socket, _how: SocketShutdownFlags) -> Result<(), Errno> {
1842 error!(EOPNOTSUPP)
1843 }
1844
1845 fn connect(
1846 &self,
1847 _socket: &SocketHandle,
1848 _current_task: &CurrentTask,
1849 _peer: SocketPeer,
1850 ) -> Result<(), Errno> {
1851 error!(EOPNOTSUPP)
1852 }
1853
1854 fn listen(&self, _socket: &Socket, _backlog: i32, _credentials: ucred) -> Result<(), Errno> {
1855 error!(EOPNOTSUPP)
1856 }
1857
1858 fn accept(&self, _socket: &Socket, _current_task: &CurrentTask) -> Result<SocketHandle, Errno> {
1859 error!(EOPNOTSUPP)
1860 }
1861
1862 fn bind(
1863 &self,
1864 _socket: &Socket,
1865 _current_task: &CurrentTask,
1866 _socket_address: SocketAddress,
1867 ) -> Result<(), Errno> {
1868 error!(EOPNOTSUPP)
1869 }
1870
1871 fn getsockname(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1872 error!(EOPNOTSUPP)
1873 }
1874
1875 fn getpeername(&self, _socket: &Socket) -> Result<SocketAddress, Errno> {
1876 error!(EOPNOTSUPP)
1877 }
1878
1879 fn getsockopt(
1880 &self,
1881 _socket: &Socket,
1882 _current_task: &CurrentTask,
1883 _level: u32,
1884 _optname: u32,
1885 _optlen: u32,
1886 ) -> Result<Vec<u8>, Errno> {
1887 error!(EOPNOTSUPP)
1888 }
1889
1890 fn setsockopt(
1891 &self,
1892 _socket: &Socket,
1893 _current_task: &CurrentTask,
1894 _level: u32,
1895 _optname: u32,
1896 _optval: SockOptValue,
1897 ) -> Result<(), Errno> {
1898 error!(EOPNOTSUPP)
1899 }
1900}
1901
1902#[cfg(test)]
1903mod tests {
1904 use super::*;
1905
1906 use netlink_packet_route::route::RouteMessage;
1907 use netlink_packet_route::{RouteNetlinkMessage, RouteNetlinkMessageParseMode};
1908 use test_case::test_case;
1909
1910 #[test_case(true; "sufficient_capacity")]
1912 #[test_case(false; "insufficient_capacity")]
1915 fn test_netlink_to_client_sender(sufficient_capacity: bool) {
1916 const MODERN_GROUP: u32 = 5;
1917
1918 let mut message: NetlinkMessage<RouteNetlinkMessage> =
1919 RouteNetlinkMessage::NewRoute(RouteMessage::default()).into();
1920 message.finalize();
1921
1922 let (initial_queue_size, final_queue_size) = if sufficient_capacity {
1923 (SOCKET_DEFAULT_SIZE, SOCKET_DEFAULT_SIZE)
1924 } else {
1925 (0, message.buffer_len())
1926 };
1927
1928 let socket_inner = Arc::new(LockDepMutex::new(NetlinkSocketInner {
1929 receive_buffer: MessageQueue::new(initial_queue_size),
1930 ..NetlinkSocketInner::new(NetlinkFamily::Route)
1931 }));
1932
1933 let mut sender = NetlinkToClientSender::<RouteNetlinkMessage>::new(socket_inner.clone());
1934 sender.send(message.clone(), Some(ModernGroup(MODERN_GROUP)));
1935 let Message { data, address, ancillary_data: _ } =
1936 socket_inner.lock().read_message().expect("should read message");
1937
1938 assert_eq!(
1939 address,
1940 Some(SocketAddress::Netlink(NetlinkAddress { pid: 0, groups: 1 << MODERN_GROUP }))
1941 );
1942 let actual_message = NetlinkMessage::<RouteNetlinkMessage>::deserialize(
1943 &data,
1944 RouteNetlinkMessageParseMode::Strict,
1945 )
1946 .expect("message should deserialize into RtnlMessage");
1947 assert_eq!(actual_message, message);
1948 assert_eq!(socket_inner.lock().receive_buffer.capacity(), final_queue_size);
1949 }
1950
1951 fn getsockopt_u32(socket: &NetlinkSocketInner, level: u32, optname: u32) -> u32 {
1952 let byte_vec = socket.getsockopt(level, optname).expect("getsockopt should succeed");
1953 let bytes: [u8; 4] = byte_vec.as_slice().try_into().expect("expected 4 bytes");
1954 u32::from_ne_bytes(bytes)
1955 }
1956
1957 fn sock_opt_value(val: u32) -> SockOptValue {
1958 SockOptValue::Value(val.to_ne_bytes().to_vec())
1959 }
1960
1961 #[::fuchsia::test]
1962 async fn test_set_get_snd_rcv_buf() {
1963 crate::testing::spawn_kernel_and_run_sync(|current_task| {
1964 let mut socket = NetlinkSocketInner::new(NetlinkFamily::Route);
1965
1966 let expected_default = u32::try_from(SOCKET_DEFAULT_SIZE).unwrap();
1968 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), expected_default);
1969 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), expected_default);
1970
1971 const SNDBUF_SIZE: u32 = 12345;
1974 const RCVBUF_SIZE: u32 = 54321;
1975 socket
1976 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUF, sock_opt_value(SNDBUF_SIZE))
1977 .expect("setsockopt should succeed");
1978 socket
1979 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUF, sock_opt_value(RCVBUF_SIZE))
1980 .expect("setsockopt should succeed");
1981 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), SNDBUF_SIZE * 2);
1982 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), RCVBUF_SIZE * 2);
1983 })
1984 .await;
1985 }
1986
1987 #[::fuchsia::test]
1988 async fn test_snd_rcv_buf_limits() {
1989 crate::testing::spawn_kernel_and_run_sync(|current_task| {
1990 let mut socket = NetlinkSocketInner::new(NetlinkFamily::Route);
1991 let too_big = u32::try_from(SOCKET_MAX_SIZE).unwrap() + 1;
1992
1993 socket
1995 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUF, sock_opt_value(too_big))
1996 .expect("setsockopt should succeed");
1997 socket
1998 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUF, sock_opt_value(too_big))
1999 .expect("setsockopt should succeed");
2000 let expected_max = u32::try_from(SOCKET_MAX_SIZE).unwrap();
2001 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), expected_max);
2002 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), expected_max);
2003
2004 socket
2007 .setsockopt(current_task, SOL_SOCKET, SO_SNDBUFFORCE, sock_opt_value(too_big))
2008 .expect("setsockopt should succeed");
2009 socket
2010 .setsockopt(current_task, SOL_SOCKET, SO_RCVBUFFORCE, sock_opt_value(too_big))
2011 .expect("setsockopt should succeed");
2012 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_SNDBUF), too_big * 2);
2013 assert_eq!(getsockopt_u32(&socket, SOL_SOCKET, SO_RCVBUF), too_big * 2);
2014 })
2015 .await;
2016 }
2017}