Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6811f02

Browse files
committed
uefi-raw: move types to net module
We have enough network-related types to justify a dedicated module: - IpAddress - Ipv4Address - Ipv6Address - MacAddress
1 parent 577c1db commit 6811f02

File tree

2 files changed

+173
-161
lines changed

2 files changed

+173
-161
lines changed

‎uefi-raw/src/lib.rs

Lines changed: 2 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@ pub mod protocol;
3131
pub mod table;
3232
pub mod time;
3333

34+
mod net;
3435
mod status;
3536

37+
pub use net::*;
3638
pub use status::Status;
3739
pub use uguid::{Guid, guid};
3840

3941
use core::ffi::c_void;
40-
use core::fmt::{self, Debug, Formatter};
4142

4243
/// Handle to an event structure.
4344
pub 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)]
235111
mod 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
}

‎uefi-raw/src/net.rs

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+
//! UEFI network types.
4+
5+
use core::fmt;
6+
use core::fmt::{Debug, Formatter};
7+
8+
/// An IPv4 internet protocol address.
9+
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
10+
#[repr(transparent)]
11+
pub struct Ipv4Address(pub [u8; 4]);
12+
13+
impl From<core::net::Ipv4Addr> for Ipv4Address {
14+
fn from(ip: core::net::Ipv4Addr) -> Self {
15+
Self(ip.octets())
16+
}
17+
}
18+
19+
impl From<Ipv4Address> for core::net::Ipv4Addr {
20+
fn from(ip: Ipv4Address) -> Self {
21+
Self::from(ip.0)
22+
}
23+
}
24+
25+
/// An IPv6 internet protocol address.
26+
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
27+
#[repr(transparent)]
28+
pub struct Ipv6Address(pub [u8; 16]);
29+
30+
impl From<core::net::Ipv6Addr> for Ipv6Address {
31+
fn from(ip: core::net::Ipv6Addr) -> Self {
32+
Self(ip.octets())
33+
}
34+
}
35+
36+
impl From<Ipv6Address> for core::net::Ipv6Addr {
37+
fn from(ip: Ipv6Address) -> Self {
38+
Self::from(ip.0)
39+
}
40+
}
41+
42+
/// An IPv4 or IPv6 internet protocol address.
43+
///
44+
/// Corresponds to the `EFI_IP_ADDRESS` type in the UEFI specification. This
45+
/// type is defined in the same way as edk2 for compatibility with C code. Note
46+
/// that this is an untagged union, so there's no way to tell which type of
47+
/// address an `IpAddress` value contains without additional context.
48+
#[derive(Clone, Copy)]
49+
#[repr(C)]
50+
pub union IpAddress {
51+
/// This member serves to align the whole type to a 4 bytes as required by
52+
/// the spec. Note that this is slightly different from `repr(align(4))`,
53+
/// which would prevent placing this type in a packed structure.
54+
pub addr: [u32; 4],
55+
56+
/// An IPv4 internet protocol address.
57+
pub v4: Ipv4Address,
58+
59+
/// An IPv6 internet protocol address.
60+
pub v6: Ipv6Address,
61+
}
62+
63+
impl IpAddress {
64+
/// Construct a new IPv4 address.
65+
#[must_use]
66+
pub const fn new_v4(ip_addr: [u8; 4]) -> Self {
67+
Self {
68+
v4: Ipv4Address(ip_addr),
69+
}
70+
}
71+
72+
/// Construct a new IPv6 address.
73+
#[must_use]
74+
pub const fn new_v6(ip_addr: [u8; 16]) -> Self {
75+
Self {
76+
v6: Ipv6Address(ip_addr),
77+
}
78+
}
79+
}
80+
81+
impl Debug for IpAddress {
82+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
83+
// The type is an untagged union, so we don't know whether it contains
84+
// an IPv4 or IPv6 address. It's also not safe to just print the whole
85+
// 16 bytes, since they might not all be initialized.
86+
f.debug_struct("IpAddress").finish()
87+
}
88+
}
89+
90+
impl Default for IpAddress {
91+
fn default() -> Self {
92+
Self { addr: [0u32; 4] }
93+
}
94+
}
95+
96+
impl From<core::net::IpAddr> for IpAddress {
97+
fn from(t: core::net::IpAddr) -> Self {
98+
match t {
99+
core::net::IpAddr::V4(ip) => Self {
100+
v4: Ipv4Address::from(ip),
101+
},
102+
core::net::IpAddr::V6(ip) => Self {
103+
v6: Ipv6Address::from(ip),
104+
},
105+
}
106+
}
107+
}
108+
109+
/// A Media Access Control (MAC) address.
110+
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash)]
111+
#[repr(transparent)]
112+
pub struct MacAddress(pub [u8; 32]);
113+
114+
impl From<[u8; 6]> for MacAddress {
115+
fn from(octets: [u8; 6]) -> Self {
116+
let mut buffer = [0; 32];
117+
buffer[0] = octets[0];
118+
buffer[1] = octets[1];
119+
buffer[2] = octets[2];
120+
buffer[3] = octets[3];
121+
buffer[4] = octets[4];
122+
buffer[5] = octets[5];
123+
Self(buffer)
124+
}
125+
}
126+
127+
impl From<MacAddress> for [u8; 6] {
128+
fn from(MacAddress(o): MacAddress) -> Self {
129+
[o[0], o[1], o[2], o[3], o[4], o[5]]
130+
}
131+
}
132+
133+
#[cfg(test)]
134+
mod tests {
135+
use super::*;
136+
137+
const TEST_IPV4: [u8; 4] = [91, 92, 93, 94];
138+
const TEST_IPV6: [u8; 16] = [
139+
101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
140+
];
141+
142+
/// Test round-trip conversion between `Ipv4Address` and `core::net::Ipv4Addr`.
143+
#[test]
144+
fn test_ip_addr4_conversion() {
145+
let uefi_addr = Ipv4Address(TEST_IPV4);
146+
let core_addr = core::net::Ipv4Addr::from(uefi_addr);
147+
assert_eq!(uefi_addr, Ipv4Address::from(core_addr));
148+
}
149+
150+
/// Test round-trip conversion between `Ipv6Address` and `core::net::Ipv6Addr`.
151+
#[test]
152+
fn test_ip_addr6_conversion() {
153+
let uefi_addr = Ipv6Address(TEST_IPV6);
154+
let core_addr = core::net::Ipv6Addr::from(uefi_addr);
155+
assert_eq!(uefi_addr, Ipv6Address::from(core_addr));
156+
}
157+
158+
/// Test conversion from `core::net::IpAddr` to `IpvAddress`.
159+
///
160+
/// Note that conversion in the other direction is not possible.
161+
#[test]
162+
fn test_ip_addr_conversion() {
163+
let core_addr = core::net::IpAddr::V4(core::net::Ipv4Addr::from(TEST_IPV4));
164+
let uefi_addr = IpAddress::from(core_addr);
165+
assert_eq!(unsafe { uefi_addr.v4.0 }, TEST_IPV4);
166+
167+
let core_addr = core::net::IpAddr::V6(core::net::Ipv6Addr::from(TEST_IPV6));
168+
let uefi_addr = IpAddress::from(core_addr);
169+
assert_eq!(unsafe { uefi_addr.v6.0 }, TEST_IPV6);
170+
}
171+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /