Skip to content

Commit 99177ab

Browse files
committed
do not panic on errors, rather propagate errors
1 parent d922f09 commit 99177ab

File tree

6 files changed

+68
-45
lines changed

6 files changed

+68
-45
lines changed

Cargo.lock

Lines changed: 21 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/async-example/async-example.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ async fn resolve_advanced(mac_addr: MacAddr, ip_addr: Ipv4Addr) {
4949
*/
5050

5151
let arp_request =
52-
ArpMessage::new_arp_request(iface.get_mac().into(), iface.get_ip().unwrap(), ip_addr);
52+
ArpMessage::new_arp_request(iface.get_mac().unwrap().into(), iface.get_ip().unwrap(), ip_addr);
5353
let result = client.send_message(None, arp_request).await.unwrap();
5454
println!(
5555
"Advanced: IP for MAC {} is {}",
5656
mac_addr, result.target_protocol_address
5757
);
5858

59-
let rarp_request = ArpMessage::new_rarp_request(iface.get_mac().into(), mac_addr);
59+
let rarp_request = ArpMessage::new_rarp_request(iface.get_mac().unwrap().into(), mac_addr);
6060
let result = client.send_message(None, rarp_request).await.unwrap();
6161
println!(
6262
"Advanced: MAC for IP {} is {}",

examples/sync-example/sync-example.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,21 @@ fn resolve_advanced(mac_addr: MacAddr, ip_addr: Ipv4Addr) {
3030
The following code may not lead to the same result as the previous code,
3131
as checking if the ARP response is related to us (or if it even is a response) is omitted.
3232
One would have to implement these checks manually, similar to how it is done in the
33-
client's mac_to_ip and ip_to_mac methods.
34-
*/
33+
client's mac_to_ip and ip_to_mac methods.
34+
*/
3535

36-
let arp_request = ArpMessage::new_arp_request(iface.get_mac().into(), iface.get_ip().unwrap(), ip_addr);
36+
let arp_request = ArpMessage::new_arp_request(
37+
iface.get_mac().unwrap().into(),
38+
iface.get_ip().unwrap(),
39+
ip_addr,
40+
);
3741
let result = client.send_message(None, arp_request).unwrap();
3842
println!(
3943
"Advanced: IP for MAC {} is {}",
4044
mac_addr, result.target_protocol_address
4145
);
4246

43-
let rarp_request = ArpMessage::new_rarp_request(iface.get_mac().into(), mac_addr);
47+
let rarp_request = ArpMessage::new_rarp_request(iface.get_mac().unwrap().into(), mac_addr);
4448
let result = client.send_message(None, rarp_request).unwrap();
4549
println!(
4650
"Advanced: MAC for IP {} is {}",

src/arp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl ArpMessage {
136136
let mut eth_packet = MutableEthernetPacket::new(&mut eth_buf).unwrap();
137137

138138
eth_packet.set_destination(MacAddr::new(0xff, 0xff, 0xff, 0xff, 0xff, 0xff).into());
139-
eth_packet.set_source(interface.get_mac().into());
139+
eth_packet.set_source(interface.get_mac()?.into());
140140
eth_packet.set_ethertype(self.ethertype);
141141

142142
let mut arp_buf = vec![0; 28];

src/client.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub struct ArpClient {
2525
impl ArpClient {
2626
/// Create an ARP client on a guessed, "best-suited" interface.
2727
pub fn new() -> Result<Self, Error> {
28-
ArpClient::new_with_iface(&Interface::new())
28+
ArpClient::new_with_iface(&Interface::new()?)
2929
}
3030

3131
/// Create an ARP client on the interface with the name `iface_name`.
@@ -107,8 +107,8 @@ impl ArpClient {
107107
timeout: Option<Duration>,
108108
) -> Result<MacAddr, Error> {
109109
let message = ArpMessage::new_arp_request(
110-
self.interface.get_mac().into(),
111-
self.interface.get_ip().unwrap(),
110+
self.interface.get_mac()?,
111+
self.interface.get_ip()?,
112112
ip_addr,
113113
);
114114

@@ -133,7 +133,7 @@ impl ArpClient {
133133
timeout: Option<Duration>,
134134
) -> Result<Ipv4Addr, Error> {
135135
let message =
136-
ArpMessage::new_rarp_request(self.interface.get_mac().into(), mac_addr.into());
136+
ArpMessage::new_rarp_request(self.interface.get_mac()?.into(), mac_addr.into());
137137

138138
self.send_message_with_check(timeout, message, |arp_message| {
139139
let source_mac: MacAddr = arp_message.source_hardware_address.into();

src/interfaces.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,20 @@ use std::{
1111
/// Wraps pnet's `NetworkInterface` struct for better convenience.
1212
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
1313
pub struct Interface {
14-
network_interface: Option<NetworkInterface>,
14+
network_interface: NetworkInterface,
1515
}
1616

1717
impl Interface {
1818
/// Selects the first "best-suited" interface found.
19-
pub fn new() -> Self {
20-
Interface {
21-
network_interface: Interface::get_interface_by_guess(),
19+
pub fn new() -> Result<Self, Error> {
20+
match Interface::get_interface_by_guess() {
21+
Some(iface) => Ok(Interface {
22+
network_interface: iface,
23+
}),
24+
None => Err(Error::new(
25+
ErrorKind::NotConnected,
26+
"Could not get any network interface.",
27+
)),
2228
}
2329
}
2430

@@ -27,36 +33,49 @@ impl Interface {
2733
let iface = Interface::get_interface_by_name(&interface_name);
2834

2935
match iface {
30-
Some(_) => Some(Interface {
36+
Some(iface) => Some(Interface {
3137
network_interface: iface,
3238
}),
3339
None => None,
3440
}
3541
}
3642

3743
/// Returns the IPv4 address of the interface.
38-
pub fn get_ip(&self) -> Option<Ipv4Addr> {
39-
self.network_interface
40-
.as_ref()
41-
.unwrap()
44+
pub fn get_ip(&self) -> Result<Ipv4Addr, Error> {
45+
let ip = self
46+
.network_interface
4247
.ips
4348
.iter()
4449
.find(|ip| ip.is_ipv4())
4550
.map(|ip| match ip.ip() {
4651
IpAddr::V4(ip) => Some(ip),
4752
_ => None,
4853
})
49-
.unwrap()
54+
.unwrap_or(None);
55+
56+
match ip {
57+
Some(ip) => Ok(ip),
58+
None => Err(Error::new(
59+
ErrorKind::AddrNotAvailable,
60+
"Currently selected interface does not have any IP address assigned.",
61+
)),
62+
}
5063
}
5164

5265
/// Returns the MAC address assigned to the interface.
53-
pub fn get_mac(&self) -> MacAddr {
54-
self.network_interface.as_ref().unwrap().mac.unwrap().into()
66+
pub fn get_mac(&self) -> Result<MacAddr, Error> {
67+
match self.network_interface.mac {
68+
Some(mac) => Ok(mac.into()),
69+
None => Err(Error::new(
70+
ErrorKind::AddrNotAvailable,
71+
"Currently selected interface does not have any MAC address assigned.",
72+
)),
73+
}
5574
}
5675

5776
/// Returns the raw `pnet` interface instance related to the interface.
5877
pub fn get_raw_interface(&self) -> &NetworkInterface {
59-
&self.network_interface.as_ref().unwrap()
78+
&self.network_interface
6079
}
6180

6281
/// Creates and returns a new Ethernet (tx, rx) channel pair on the interface.

0 commit comments

Comments
 (0)