@@ -31,13 +31,14 @@ pub mod protocol;
3131pub mod table;
3232pub mod time;
3333
34+ mod net;
3435mod status;
3536
37+ pub use net:: * ;
3638pub use status:: Status ;
3739pub use uguid:: { Guid , guid} ;
3840
3941use core:: ffi:: c_void;
40- use core:: fmt:: { self , Debug , Formatter } ;
4142
4243/// Handle to an event structure.
4344pub type Event = * mut c_void ;
@@ -106,140 +107,10 @@ impl From<Boolean> for bool {
106107 }
107108}
108109
109- /// An IPv4 internet protocol address.
110- #[ derive( Clone , Copy , Debug , Default , Eq , PartialEq , Ord , PartialOrd , Hash ) ]
111- #[ repr( transparent) ]
112- pub struct Ipv4Address ( pub [ u8 ; 4 ] ) ;
113-
114- impl From < core:: net:: Ipv4Addr > for Ipv4Address {
115- fn from ( ip : core:: net:: Ipv4Addr ) -> Self {
116- Self ( ip. octets ( ) )
117- }
118- }
119-
120- impl From < Ipv4Address > for core:: net:: Ipv4Addr {
121- fn from ( ip : Ipv4Address ) -> Self {
122- Self :: from ( ip. 0 )
123- }
124- }
125-
126- /// An IPv6 internet protocol address.
127- #[ derive( Clone , Copy , Debug , Default , Eq , PartialEq , Ord , PartialOrd , Hash ) ]
128- #[ repr( transparent) ]
129- pub struct Ipv6Address ( pub [ u8 ; 16 ] ) ;
130-
131- impl From < core:: net:: Ipv6Addr > for Ipv6Address {
132- fn from ( ip : core:: net:: Ipv6Addr ) -> Self {
133- Self ( ip. octets ( ) )
134- }
135- }
136-
137- impl From < Ipv6Address > for core:: net:: Ipv6Addr {
138- fn from ( ip : Ipv6Address ) -> Self {
139- Self :: from ( ip. 0 )
140- }
141- }
142-
143- /// An IPv4 or IPv6 internet protocol address.
144- ///
145- /// Corresponds to the `EFI_IP_ADDRESS` type in the UEFI specification. This
146- /// type is defined in the same way as edk2 for compatibility with C code. Note
147- /// that this is an untagged union, so there's no way to tell which type of
148- /// address an `IpAddress` value contains without additional context.
149- #[ derive( Clone , Copy ) ]
150- #[ repr( C ) ]
151- pub union IpAddress {
152- /// This member serves to align the whole type to a 4 bytes as required by
153- /// the spec. Note that this is slightly different from `repr(align(4))`,
154- /// which would prevent placing this type in a packed structure.
155- pub addr : [ u32 ; 4 ] ,
156-
157- /// An IPv4 internet protocol address.
158- pub v4 : Ipv4Address ,
159-
160- /// An IPv6 internet protocol address.
161- pub v6 : Ipv6Address ,
162- }
163-
164- impl IpAddress {
165- /// Construct a new IPv4 address.
166- #[ must_use]
167- pub const fn new_v4 ( ip_addr : [ u8 ; 4 ] ) -> Self {
168- Self {
169- v4 : Ipv4Address ( ip_addr) ,
170- }
171- }
172-
173- /// Construct a new IPv6 address.
174- #[ must_use]
175- pub const fn new_v6 ( ip_addr : [ u8 ; 16 ] ) -> Self {
176- Self {
177- v6 : Ipv6Address ( ip_addr) ,
178- }
179- }
180- }
181-
182- impl Debug for IpAddress {
183- fn fmt ( & self , f : & mut Formatter < ' _ > ) -> fmt:: Result {
184- // The type is an untagged union, so we don't know whether it contains
185- // an IPv4 or IPv6 address. It's also not safe to just print the whole
186- // 16 bytes, since they might not all be initialized.
187- f. debug_struct ( "IpAddress" ) . finish ( )
188- }
189- }
190-
191- impl Default for IpAddress {
192- fn default ( ) -> Self {
193- Self { addr : [ 0u32 ; 4 ] }
194- }
195- }
196-
197- impl From < core:: net:: IpAddr > for IpAddress {
198- fn from ( t : core:: net:: IpAddr ) -> Self {
199- match t {
200- core:: net:: IpAddr :: V4 ( ip) => Self {
201- v4 : Ipv4Address :: from ( ip) ,
202- } ,
203- core:: net:: IpAddr :: V6 ( ip) => Self {
204- v6 : Ipv6Address :: from ( ip) ,
205- } ,
206- }
207- }
208- }
209-
210- /// A Media Access Control (MAC) address.
211- #[ derive( Clone , Copy , Debug , Default , Eq , PartialEq , Ord , PartialOrd , Hash ) ]
212- #[ repr( transparent) ]
213- pub struct MacAddress ( pub [ u8 ; 32 ] ) ;
214-
215- impl From < [ u8 ; 6 ] > for MacAddress {
216- fn from ( octets : [ u8 ; 6 ] ) -> Self {
217- let mut buffer = [ 0 ; 32 ] ;
218- buffer[ 0 ] = octets[ 0 ] ;
219- buffer[ 1 ] = octets[ 1 ] ;
220- buffer[ 2 ] = octets[ 2 ] ;
221- buffer[ 3 ] = octets[ 3 ] ;
222- buffer[ 4 ] = octets[ 4 ] ;
223- buffer[ 5 ] = octets[ 5 ] ;
224- Self ( buffer)
225- }
226- }
227-
228- impl From < MacAddress > for [ u8 ; 6 ] {
229- fn from ( MacAddress ( o) : MacAddress ) -> Self {
230- [ o[ 0 ] , o[ 1 ] , o[ 2 ] , o[ 3 ] , o[ 4 ] , o[ 5 ] ]
231- }
232- }
233-
234110#[ cfg( test) ]
235111mod tests {
236112 use super :: * ;
237113
238- const TEST_IPV4 : [ u8 ; 4 ] = [ 91 , 92 , 93 , 94 ] ;
239- const TEST_IPV6 : [ u8 ; 16 ] = [
240- 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 ,
241- ] ;
242-
243114 #[ test]
244115 /// Test the properties promised in [0]. This also applies for the other
245116 /// architectures.
@@ -257,34 +128,4 @@ mod tests {
257128 assert ! ( bool :: from( Boolean ( 0b11111110 ) ) ) ;
258129 assert ! ( bool :: from( Boolean ( 0b11111111 ) ) ) ;
259130 }
260-
261- /// Test round-trip conversion between `Ipv4Address` and `core::net::Ipv4Addr`.
262- #[ test]
263- fn test_ip_addr4_conversion ( ) {
264- let uefi_addr = Ipv4Address ( TEST_IPV4 ) ;
265- let core_addr = core:: net:: Ipv4Addr :: from ( uefi_addr) ;
266- assert_eq ! ( uefi_addr, Ipv4Address :: from( core_addr) ) ;
267- }
268-
269- /// Test round-trip conversion between `Ipv6Address` and `core::net::Ipv6Addr`.
270- #[ test]
271- fn test_ip_addr6_conversion ( ) {
272- let uefi_addr = Ipv6Address ( TEST_IPV6 ) ;
273- let core_addr = core:: net:: Ipv6Addr :: from ( uefi_addr) ;
274- assert_eq ! ( uefi_addr, Ipv6Address :: from( core_addr) ) ;
275- }
276-
277- /// Test conversion from `core::net::IpAddr` to `IpvAddress`.
278- ///
279- /// Note that conversion in the other direction is not possible.
280- #[ test]
281- fn test_ip_addr_conversion ( ) {
282- let core_addr = core:: net:: IpAddr :: V4 ( core:: net:: Ipv4Addr :: from ( TEST_IPV4 ) ) ;
283- let uefi_addr = IpAddress :: from ( core_addr) ;
284- assert_eq ! ( unsafe { uefi_addr. v4. 0 } , TEST_IPV4 ) ;
285-
286- let core_addr = core:: net:: IpAddr :: V6 ( core:: net:: Ipv6Addr :: from ( TEST_IPV6 ) ) ;
287- let uefi_addr = IpAddress :: from ( core_addr) ;
288- assert_eq ! ( unsafe { uefi_addr. v6. 0 } , TEST_IPV6 ) ;
289- }
290131}
0 commit comments