Skip to content

Commit fcc5c8b

Browse files
committed
@v0.3.7
- remove failing example - switch tokio for thread for arp requests - prepared packetdump component - update arpRecieved action
1 parent fd9668b commit fcc5c8b

File tree

6 files changed

+210
-176
lines changed

6 files changed

+210
-176
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "netscanner"
3-
version = "0.3.6"
3+
version = "0.3.7"
44
edition = "2021"
55
description = "Network Scanner"
66
license = "MIT"

examples/ip_up.rs

Lines changed: 0 additions & 97 deletions
This file was deleted.

src/action.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use serde::{
66
Deserialize, Serialize,
77
};
88

9-
use crate::components::wifi_scan::WifiInfo;
9+
use crate::components::{
10+
packetdump::ArpPacketData,
11+
wifi_scan::WifiInfo
12+
};
1013
use crate::mode::Mode;
1114

1215
// #[derive(Debug, Clone, PartialEq, Eq, Serialize)]
@@ -26,8 +29,9 @@ pub enum Action {
2629
GraphToggle,
2730
InterfaceSwitch,
2831
ActiveInterface(NetworkInterface),
29-
ArpSend(Ipv4Addr),
30-
ArpRecieve(Ipv4Addr, MacAddr),
32+
// ArpSend(Ipv4Addr),
33+
// ArpRecieve(Ipv4Addr, MacAddr),
34+
ArpRecieve(ArpPacketData),
3135
Scan(Vec<WifiInfo>),
3236
ModeChange(Mode),
3337
PingIp(String),

src/components/discovery.rs

Lines changed: 113 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ use tokio::{
2121
};
2222

2323
use super::Component;
24-
use crate::{action::Action, mode::Mode, tui::Frame, utils::get_ips4_from_cidr};
24+
use crate::{
25+
action::Action, components::packetdump::ArpPacketData, mode::Mode, tui::Frame,
26+
utils::get_ips4_from_cidr,
27+
};
2528
use crossterm::event::{KeyCode, KeyEvent};
2629
use mac_oui::Oui;
2730
use rand::random;
@@ -95,6 +98,86 @@ impl Discovery {
9598
self.ip_num = 0;
9699
}
97100

101+
fn send_arp(&mut self, target_ip: Ipv4Addr) {
102+
let active_interface = self.active_interface.clone().unwrap();
103+
104+
let ipv4 = active_interface
105+
.clone()
106+
.ips
107+
.iter()
108+
.find(|f| f.is_ipv4())
109+
.unwrap()
110+
.clone();
111+
let source_ip: Ipv4Addr = ipv4.ip().to_string().parse().unwrap();
112+
113+
let (mut sender, _) =
114+
match pnet::datalink::channel(&active_interface, Default::default()) {
115+
Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
116+
Ok(_) => panic!("Unknown channel type"),
117+
Err(e) => panic!("Error happened {}", e),
118+
};
119+
120+
let mut ethernet_buffer = [0u8; 42];
121+
let mut ethernet_packet = MutableEthernetPacket::new(&mut ethernet_buffer).unwrap();
122+
123+
ethernet_packet.set_destination(MacAddr::broadcast());
124+
ethernet_packet.set_source(active_interface.mac.unwrap());
125+
ethernet_packet.set_ethertype(EtherTypes::Arp);
126+
127+
let mut arp_buffer = [0u8; 28];
128+
let mut arp_packet = MutableArpPacket::new(&mut arp_buffer).unwrap();
129+
130+
arp_packet.set_hardware_type(ArpHardwareTypes::Ethernet);
131+
arp_packet.set_protocol_type(EtherTypes::Ipv4);
132+
arp_packet.set_hw_addr_len(6);
133+
arp_packet.set_proto_addr_len(4);
134+
arp_packet.set_operation(ArpOperations::Request);
135+
arp_packet.set_sender_hw_addr(active_interface.mac.unwrap());
136+
arp_packet.set_sender_proto_addr(source_ip);
137+
arp_packet.set_target_hw_addr(MacAddr::zero());
138+
arp_packet.set_target_proto_addr(target_ip);
139+
140+
ethernet_packet.set_payload(arp_packet.packet_mut());
141+
142+
sender
143+
.send_to(ethernet_packet.packet(), None)
144+
.unwrap()
145+
.unwrap();
146+
147+
// let tx = self.action_tx.clone().unwrap();
148+
// let (abort_handle, abort_reg) = AbortHandle::new_pair();
149+
// self.abortables.push(abort_handle.clone());
150+
// let task = tokio::spawn(
151+
// Abortable::new(
152+
// async move {
153+
// loop {
154+
// let buf = receiver.next().unwrap_or_default();
155+
// if buf.len() >= MutableEthernetPacket::minimum_packet_size() {
156+
// let arp = ArpPacket::new(
157+
// &buf[MutableEthernetPacket::minimum_packet_size()..],
158+
// )
159+
// .unwrap();
160+
// if arp.get_sender_proto_addr() == target_ip
161+
// && arp.get_target_hw_addr() == active_interface.mac.unwrap()
162+
// {
163+
// }
164+
// }
165+
// // tokio::task::yield_now().await;
166+
// }
167+
// },
168+
// abort_reg,
169+
// )
170+
// .boxed(),
171+
// );
172+
// // self.arp_tasks.push(task);
173+
// // let abort_handle = abort_handle.clone();
174+
// // let abort_handle = abort_handle.clone();
175+
// let timeout_task = tokio::spawn(async move {
176+
// tokio::time::sleep(Duration::from_secs(2)).await;
177+
// abort_handle.abort();
178+
// });
179+
}
180+
98181
fn scan(&mut self) {
99182
self.reset_scan();
100183

@@ -141,10 +224,33 @@ impl Discovery {
141224
};
142225
}
143226

227+
fn process_mac(&mut self, arp_data: ArpPacketData) {
228+
if let Some(n) = self
229+
.scanned_ips
230+
.iter_mut()
231+
.find(|item| item.ip == arp_data.sender_ip.to_string())
232+
{
233+
n.mac = arp_data.sender_mac.to_string();
234+
235+
if let Some(oui) = &self.oui {
236+
let oui_res = oui.lookup_by_mac(&n.mac);
237+
match oui_res {
238+
Ok(e) => {
239+
if let Some(oui_res) = e {
240+
let cn = oui_res.company_name.clone();
241+
n.vendor = cn;
242+
}
243+
}
244+
Err(_) => {}
245+
}
246+
}
247+
}
248+
}
249+
144250
fn process_ip(&mut self, ip: &str) {
145251
let tx = self.action_tx.clone().unwrap();
146252
let ipv4: Ipv4Addr = ip.parse().unwrap();
147-
// self.send_arp(ipv4);
253+
self.send_arp(ipv4);
148254

149255
if let Some(n) = self
150256
.scanned_ips
@@ -321,6 +427,11 @@ impl Component for Discovery {
321427
if let Action::CidrError = action {
322428
self.cidr_error = true;
323429
}
430+
// -- ARP packet recieved
431+
if let Action::ArpRecieve(ref arp_data) = action {
432+
// if let Action::ArpRecieve(target_ip, mac) = action {
433+
self.process_mac(arp_data.clone());
434+
}
324435
// -- active interface
325436
if let Action::ActiveInterface(ref interface) = action {
326437
let intf = interface.clone();

src/components/discovery.rs.bak

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,6 @@ impl Discovery {
137137
if arp.get_sender_proto_addr() == target_ip
138138
&& arp.get_target_hw_addr() == active_interface.mac.unwrap()
139139
{
140-
tx.send(Action::ArpRecieve(target_ip, arp.get_sender_hw_addr()))
141-
.unwrap();
142140
}
143141
}
144142
// tokio::task::yield_now().await;

0 commit comments

Comments
 (0)