@@ -21,7 +21,10 @@ use tokio::{
2121} ;
2222
2323use 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+ } ;
2528use crossterm:: event:: { KeyCode , KeyEvent } ;
2629use mac_oui:: Oui ;
2730use 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 ( ) ;
0 commit comments