netstack3_core/
lock_ordering.rs1pub(crate) use lock_order::Unlocked;
106
107use core::convert::Infallible as Never;
108use core::marker::PhantomData;
109
110use lock_order::impl_lock_after;
111use lock_order::relation::LockAfter;
112use net_types::ip::{Ipv4, Ipv6};
113
114pub enum UnlockedState {}
121
122pub struct IcmpAllSocketsSet<I>(PhantomData<I>, Never);
123pub struct IcmpSocketState<I>(PhantomData<I>, Never);
124pub struct IcmpBoundMap<I>(PhantomData<I>, Never);
125
126pub struct IcmpTokenBucket<I>(PhantomData<I>, Never);
127
128pub struct TcpAllSocketsSet<I>(PhantomData<I>, Never);
129pub struct TcpSocketState<I>(PhantomData<I>, Never);
130pub struct TcpDemux<I>(PhantomData<I>, Never);
131pub struct UdpAllSocketsSet<I>(PhantomData<I>, Never);
132pub struct UdpSocketState<I>(PhantomData<I>, Never);
133pub struct UdpBoundMap<I>(PhantomData<I>, Never);
134
135pub struct IpDeviceConfiguration<I>(PhantomData<I>, Never);
136pub struct IpDeviceGmp<I>(PhantomData<I>, Never);
137pub struct IpDeviceAddresses<I>(PhantomData<I>, Never);
138pub struct IpDeviceFlags<I>(PhantomData<I>, Never);
139pub struct IpDeviceDefaultHopLimit<I>(PhantomData<I>, Never);
140pub struct IpDeviceAddressDad<I>(PhantomData<I>, Never);
141pub struct IpDeviceAddressData<I>(PhantomData<I>, Never);
142
143pub enum Ipv6DeviceRouterSolicitations {}
144pub enum Ipv6DeviceRouteDiscovery {}
145pub enum Ipv6DeviceLearnedParams {}
146pub enum Ipv6DeviceSlaac {}
147pub struct NudConfig<I>(PhantomData<I>, Never);
148
149pub struct IpState<I>(PhantomData<I>, Never);
152pub struct IpStatePmtuCache<I>(PhantomData<I>, Never);
153pub struct IpStateFragmentCache<I>(PhantomData<I>, Never);
154pub struct IpStateRulesTable<I>(PhantomData<I>, Never);
155pub struct IpStateRoutingTables<I>(PhantomData<I>, Never);
156pub struct IpStateRoutingTable<I>(PhantomData<I>, Never);
157pub struct RawIpSocketState<I>(PhantomData<I>, Never);
159pub struct AllRawIpSockets<I>(PhantomData<I>, Never);
161
162pub struct IpMulticastForwardingState<I>(PhantomData<I>, Never);
164pub struct IpMulticastRouteTable<I>(PhantomData<I>, Never);
166pub struct IpMulticastForwardingPendingPackets<I>(PhantomData<I>, Never);
168
169pub enum DeviceLayerState {}
170pub enum AllDeviceSockets {}
171pub enum AnyDeviceSockets {}
172pub enum DeviceSocketState {}
173pub enum DeviceSockets {}
174pub struct EthernetDeviceIpState<I>(PhantomData<I>, Never);
175pub enum EthernetDeviceDynamicState {}
176pub enum PureIpDeviceDynamicState {}
177
178pub enum EthernetIpv4Arp {}
179pub enum EthernetIpv6Nud {}
180pub enum EthernetTxQueue {}
181pub enum EthernetTxDequeue {}
182pub enum EthernetRxDequeue {}
190
191pub enum LoopbackRxQueue {}
192pub enum LoopbackRxDequeue {}
193pub enum LoopbackTxQueue {}
194pub enum LoopbackTxDequeue {}
195
196pub enum PureIpDeviceTxQueue {}
197pub enum PureIpDeviceTxDequeue {}
198pub enum PureIpDeviceRxDequeue {}
202
203pub struct FilterState<I>(PhantomData<I>, Never);
204
205impl LockAfter<Unlocked> for LoopbackTxDequeue {}
206impl_lock_after!(LoopbackTxDequeue => EthernetTxDequeue);
207impl_lock_after!(EthernetTxDequeue => PureIpDeviceTxDequeue);
208impl_lock_after!(PureIpDeviceTxDequeue => LoopbackRxDequeue);
209impl_lock_after!(LoopbackRxDequeue => EthernetRxDequeue);
210impl_lock_after!(EthernetRxDequeue => PureIpDeviceRxDequeue);
211impl_lock_after!(PureIpDeviceRxDequeue => IcmpAllSocketsSet<Ipv4>);
212impl_lock_after!(IcmpAllSocketsSet<Ipv4> => IcmpAllSocketsSet<Ipv6>);
213impl_lock_after!(IcmpAllSocketsSet<Ipv6> => IcmpSocketState<Ipv4>);
214impl_lock_after!(IcmpSocketState<Ipv4> => IcmpBoundMap<Ipv4>);
215impl_lock_after!(IcmpBoundMap<Ipv4> => IcmpTokenBucket<Ipv4>);
216impl_lock_after!(IcmpTokenBucket<Ipv4> => IcmpSocketState<Ipv6>);
217impl_lock_after!(IcmpSocketState<Ipv6> => IcmpBoundMap<Ipv6>);
218impl_lock_after!(IcmpBoundMap<Ipv6> => IcmpTokenBucket<Ipv6>);
219impl_lock_after!(IcmpTokenBucket<Ipv6> => AllRawIpSockets<Ipv4>);
220impl_lock_after!(AllRawIpSockets<Ipv4> => AllRawIpSockets<Ipv6>);
221impl_lock_after!(AllRawIpSockets<Ipv6> => RawIpSocketState<Ipv4>);
222impl_lock_after!(RawIpSocketState<Ipv4> => RawIpSocketState<Ipv6>);
223impl_lock_after!(RawIpSocketState<Ipv6> => TcpAllSocketsSet<Ipv4>);
224
225impl_lock_after!(TcpAllSocketsSet<Ipv4> => TcpAllSocketsSet<Ipv6>);
230impl_lock_after!(TcpAllSocketsSet<Ipv6> => TcpSocketState<Ipv4>);
231impl_lock_after!(TcpSocketState<Ipv4> => TcpSocketState<Ipv6>);
232impl_lock_after!(TcpSocketState<Ipv6> => TcpDemux<Ipv4>);
233impl_lock_after!(TcpDemux<Ipv4> => TcpDemux<Ipv6>);
234impl_lock_after!(TcpDemux<Ipv6> => UdpAllSocketsSet<Ipv4>);
235impl_lock_after!(UdpAllSocketsSet<Ipv4> => UdpAllSocketsSet<Ipv6>);
236impl_lock_after!(UdpAllSocketsSet<Ipv6> => UdpSocketState<Ipv4>);
237impl_lock_after!(UdpSocketState<Ipv4> => UdpSocketState<Ipv6>);
238impl_lock_after!(UdpSocketState<Ipv6> => UdpBoundMap<Ipv4>);
239impl_lock_after!(UdpBoundMap<Ipv4> => UdpBoundMap<Ipv6>);
240impl_lock_after!(UdpBoundMap<Ipv6> => IpMulticastForwardingState<Ipv4>);
241impl_lock_after!(IpMulticastForwardingState<Ipv4> => IpMulticastRouteTable<Ipv4>);
242impl_lock_after!(IpMulticastRouteTable<Ipv4> => IpMulticastForwardingPendingPackets<Ipv4>);
243impl_lock_after!(IpMulticastForwardingPendingPackets<Ipv4> => IpMulticastForwardingState<Ipv6>);
244impl_lock_after!(IpMulticastForwardingState<Ipv6> => IpMulticastRouteTable<Ipv6>);
245impl_lock_after!(IpMulticastRouteTable<Ipv6> => IpMulticastForwardingPendingPackets<Ipv6>);
246impl_lock_after!(IpMulticastForwardingPendingPackets<Ipv6> => IpStateRulesTable<Ipv4>);
247impl_lock_after!(IpStateRulesTable<Ipv4> => IpStateRulesTable<Ipv6>);
248impl_lock_after!(IpStateRulesTable<Ipv6> => IpStateRoutingTables<Ipv4>);
249impl_lock_after!(IpStateRoutingTables<Ipv4> => IpStateRoutingTables<Ipv6>);
250impl_lock_after!(IpStateRoutingTables<Ipv6> => IpStateRoutingTable<Ipv4>);
251impl_lock_after!(IpStateRoutingTable<Ipv4> => IpStateRoutingTable<Ipv6>);
252impl_lock_after!(IpStateRoutingTable<Ipv6> => IpDeviceConfiguration<Ipv4>);
253impl_lock_after!(IpDeviceConfiguration<Ipv4> => IpDeviceConfiguration<Ipv6>);
254impl_lock_after!(IpDeviceConfiguration<Ipv6> => DeviceLayerState);
255impl_lock_after!(DeviceLayerState => Ipv6DeviceRouteDiscovery);
256impl_lock_after!(Ipv6DeviceRouteDiscovery => Ipv6DeviceSlaac);
257impl_lock_after!(Ipv6DeviceSlaac => IpDeviceAddressDad<Ipv4>);
258impl_lock_after!(IpDeviceAddressDad<Ipv4> => IpDeviceAddressDad<Ipv6>);
259impl_lock_after!(IpDeviceAddressDad<Ipv6> => IpDeviceGmp<Ipv4>);
260
261impl_lock_after!(IpDeviceGmp<Ipv4> => IpDeviceGmp<Ipv6>);
262impl_lock_after!(IpDeviceGmp<Ipv6> => FilterState<Ipv4>);
263
264impl_lock_after!(FilterState<Ipv4> => FilterState<Ipv6>);
265impl_lock_after!(FilterState<Ipv6> => IpState<Ipv4>);
266impl_lock_after!(IpState<Ipv4> => IpState<Ipv6>);
267
268impl_lock_after!(IpState<Ipv4> => IpStatePmtuCache<Ipv4>);
269impl_lock_after!(IpState<Ipv6> => IpStatePmtuCache<Ipv6>);
270impl_lock_after!(IpState<Ipv4> => IpStateFragmentCache<Ipv4>);
271impl_lock_after!(IpState<Ipv6> => IpStateFragmentCache<Ipv6>);
272
273impl_lock_after!(IpState<Ipv6> => LoopbackTxQueue);
274impl_lock_after!(LoopbackTxQueue => LoopbackRxQueue);
275impl_lock_after!(LoopbackTxQueue => EthernetIpv4Arp);
276impl_lock_after!(EthernetIpv4Arp => EthernetIpv6Nud);
277impl_lock_after!(EthernetIpv6Nud => AllDeviceSockets);
278
279impl_lock_after!(AllDeviceSockets => AnyDeviceSockets);
280impl_lock_after!(AnyDeviceSockets => EthernetDeviceIpState<Ipv4>);
281impl_lock_after!(EthernetDeviceIpState<Ipv4> => IpDeviceAddresses<Ipv4>);
282impl_lock_after!(IpDeviceAddresses<Ipv4> => IpDeviceAddresses<Ipv6>);
283impl_lock_after!(IpDeviceAddresses<Ipv6> => IpDeviceFlags<Ipv4>);
284impl_lock_after!(IpDeviceFlags<Ipv4> => IpDeviceFlags<Ipv6>);
285impl_lock_after!(IpDeviceFlags<Ipv6> => IpDeviceAddressData<Ipv4>);
286impl_lock_after!(IpDeviceAddressData<Ipv4> => IpDeviceAddressData<Ipv6>);
287impl_lock_after!(IpDeviceAddressData<Ipv6> => IpDeviceDefaultHopLimit<Ipv4>);
288impl_lock_after!(IpDeviceDefaultHopLimit<Ipv4> => EthernetDeviceIpState<Ipv6>);
289impl_lock_after!(EthernetDeviceIpState<Ipv6> => IpDeviceDefaultHopLimit<Ipv6>);
290impl_lock_after!(IpDeviceDefaultHopLimit<Ipv6> => Ipv6DeviceRouterSolicitations);
291impl_lock_after!(Ipv6DeviceRouterSolicitations => Ipv6DeviceLearnedParams);
292impl_lock_after!(Ipv6DeviceLearnedParams => NudConfig<Ipv4>);
293impl_lock_after!(NudConfig<Ipv4> => NudConfig<Ipv6>);
294impl_lock_after!(NudConfig<Ipv6> => EthernetDeviceDynamicState);
295impl_lock_after!(EthernetDeviceDynamicState => EthernetTxQueue);
296impl_lock_after!(EthernetTxQueue => PureIpDeviceDynamicState);
297impl_lock_after!(PureIpDeviceDynamicState => PureIpDeviceTxQueue);
298
299impl_lock_after!(AnyDeviceSockets => DeviceSockets);
300impl_lock_after!(DeviceSockets => DeviceSocketState);