1use lock_order::lock::{DelegatedOrderedLockAccess, LockLevelFor};
9use lock_order::relation::LockBefore;
10use netstack3_device::socket::{
11 AllSockets, AnyDeviceSockets, DeviceSocketAccessor, DeviceSocketContext, DeviceSocketId,
12 DeviceSockets, HeldSockets, SocketStateAccessor, Target,
13};
14use netstack3_device::{DeviceId, WeakDeviceId, for_any_device_id};
15
16use crate::context::WrapLockLevel;
17use crate::context::prelude::*;
18use crate::device::integration;
19use crate::{BindingsContext, BindingsTypes, CoreCtx, StackState};
20
21impl<BC: BindingsContext, L: LockBefore<crate::lock_ordering::AllDeviceSockets>>
22 DeviceSocketContext<BC> for CoreCtx<'_, BC, L>
23{
24 type SocketTablesCoreCtx<'a> =
25 CoreCtx<'a, BC, WrapLockLevel<crate::lock_ordering::AnyDeviceSockets>>;
26
27 fn with_all_device_sockets<
28 F: FnOnce(&AllSockets<Self::WeakDeviceId, BC>, &mut Self::SocketTablesCoreCtx<'_>) -> R,
29 R,
30 >(
31 &mut self,
32 cb: F,
33 ) -> R {
34 let (sockets, mut locked) = self.read_lock_and::<crate::lock_ordering::AllDeviceSockets>();
35 let mut locked = locked.cast_locked::<crate::lock_ordering::AnyDeviceSockets>();
36 cb(&*sockets, &mut locked)
37 }
38
39 fn with_all_device_sockets_mut<F: FnOnce(&mut AllSockets<Self::WeakDeviceId, BC>) -> R, R>(
40 &mut self,
41 cb: F,
42 ) -> R {
43 let mut locked = self.write_lock::<crate::lock_ordering::AllDeviceSockets>();
44 cb(&mut locked)
45 }
46
47 fn with_any_device_sockets<
48 F: FnOnce(&AnyDeviceSockets<Self::WeakDeviceId, BC>, &mut Self::SocketTablesCoreCtx<'_>) -> R,
49 R,
50 >(
51 &mut self,
52 cb: F,
53 ) -> R {
54 let (sockets, mut locked) = self.read_lock_and::<crate::lock_ordering::AnyDeviceSockets>();
55 cb(&*sockets, &mut locked)
56 }
57
58 fn with_any_device_sockets_mut<
59 F: FnOnce(
60 &mut AnyDeviceSockets<Self::WeakDeviceId, BC>,
61 &mut Self::SocketTablesCoreCtx<'_>,
62 ) -> R,
63 R,
64 >(
65 &mut self,
66 cb: F,
67 ) -> R {
68 let (mut sockets, mut locked) =
69 self.write_lock_and::<crate::lock_ordering::AnyDeviceSockets>();
70 cb(&mut *sockets, &mut locked)
71 }
72}
73
74impl<BC: BindingsContext, L: LockBefore<crate::lock_ordering::DeviceSocketState>>
75 SocketStateAccessor<BC> for CoreCtx<'_, BC, L>
76{
77 fn with_socket_state<F: FnOnce(&Target<Self::WeakDeviceId>) -> R, R>(
78 &mut self,
79 id: &DeviceSocketId<Self::WeakDeviceId, BC>,
80 cb: F,
81 ) -> R {
82 let mut locked = self.adopt(id);
83 let guard = locked.lock_with::<crate::lock_ordering::DeviceSocketState, _>(|c| c.right());
84 cb(&*guard)
85 }
86
87 fn with_socket_state_mut<F: FnOnce(&mut Target<Self::WeakDeviceId>) -> R, R>(
88 &mut self,
89 id: &DeviceSocketId<Self::WeakDeviceId, BC>,
90 cb: F,
91 ) -> R {
92 let mut locked = self.adopt(id);
93 let mut guard =
94 locked.lock_with::<crate::lock_ordering::DeviceSocketState, _>(|c| c.right());
95 cb(&mut *guard)
96 }
97}
98
99impl<BC: BindingsContext, L: LockBefore<crate::lock_ordering::DeviceSockets>>
100 DeviceSocketAccessor<BC> for CoreCtx<'_, BC, L>
101{
102 type DeviceSocketCoreCtx<'a> =
103 CoreCtx<'a, BC, WrapLockLevel<crate::lock_ordering::DeviceSockets>>;
104
105 fn with_device_sockets<
106 F: FnOnce(&DeviceSockets<Self::WeakDeviceId, BC>, &mut Self::DeviceSocketCoreCtx<'_>) -> R,
107 R,
108 >(
109 &mut self,
110 device: &Self::DeviceId,
111 cb: F,
112 ) -> R {
113 for_any_device_id!(
114 DeviceId,
115 device,
116 device => {
117 let mut core_ctx_and_resource =
118 integration::device_state_and_core_ctx(self, device);
119 let (device_sockets, mut locked) = core_ctx_and_resource
120 .read_lock_with_and::<crate::lock_ordering::DeviceSockets, _>(
121 |c| c.right(),
122 );
123 cb(&*device_sockets, &mut locked.cast_core_ctx())
124 }
125 )
126 }
127
128 fn with_device_sockets_mut<
129 F: FnOnce(&mut DeviceSockets<Self::WeakDeviceId, BC>, &mut Self::DeviceSocketCoreCtx<'_>) -> R,
130 R,
131 >(
132 &mut self,
133 device: &Self::DeviceId,
134 cb: F,
135 ) -> R {
136 for_any_device_id!(
137 DeviceId,
138 device,
139 device => {
140 let mut core_ctx_and_resource =
141 integration::device_state_and_core_ctx(self, device);
142 let (mut device_sockets, mut locked) = core_ctx_and_resource
143 .write_lock_with_and::<crate::lock_ordering::DeviceSockets, _>(
144 |c| c.right(),
145 );
146 cb(&mut *device_sockets, &mut locked.cast_core_ctx())
147 }
148 )
149 }
150}
151
152impl<BT: BindingsTypes> DelegatedOrderedLockAccess<AnyDeviceSockets<WeakDeviceId<BT>, BT>>
153 for StackState<BT>
154{
155 type Inner = HeldSockets<BT>;
156 fn delegate_ordered_lock_access(&self) -> &Self::Inner {
157 &self.device.shared_sockets
158 }
159}
160
161impl<BT: BindingsTypes> DelegatedOrderedLockAccess<AllSockets<WeakDeviceId<BT>, BT>>
162 for StackState<BT>
163{
164 type Inner = HeldSockets<BT>;
165 fn delegate_ordered_lock_access(&self) -> &Self::Inner {
166 &self.device.shared_sockets
167 }
168}
169
170impl<BT: BindingsTypes> LockLevelFor<StackState<BT>> for crate::lock_ordering::AnyDeviceSockets {
171 type Data = AnyDeviceSockets<WeakDeviceId<BT>, BT>;
172}
173
174impl<BT: BindingsTypes> LockLevelFor<StackState<BT>> for crate::lock_ordering::AllDeviceSockets {
175 type Data = AllSockets<WeakDeviceId<BT>, BT>;
176}
177
178impl<BT: BindingsTypes> LockLevelFor<DeviceSocketId<WeakDeviceId<BT>, BT>>
179 for crate::lock_ordering::DeviceSocketState
180{
181 type Data = Target<WeakDeviceId<BT>>;
182}