linux add to arp-list

This commit is contained in:
asxalex 2024-10-25 16:47:29 +08:00
parent d1e30370fc
commit 07c6536d5a

View File

@ -2,7 +2,8 @@ use etherparse::ether_type::ARP;
use etherparse::{Ethernet2Header, IpHeaders}; use etherparse::{Ethernet2Header, IpHeaders};
use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL; use sdlan_sn_rs::config::SDLAN_DEFAULT_TTL;
use sdlan_sn_rs::utils::{ use sdlan_sn_rs::utils::{
aes_encrypt, ip_to_string, is_multi_broadcast, net_bit_len_to_mask, SDLanError, BROADCAST_MAC, aes_encrypt, ip_to_string, is_ipv6_multicast, is_multi_broadcast, net_bit_len_to_mask,
SDLanError, BROADCAST_MAC,
}; };
use std::ffi::CStr; use std::ffi::CStr;
use std::ffi::{c_char, c_int}; use std::ffi::{c_char, c_int};
@ -19,8 +20,8 @@ use tracing::{debug, error, info};
use crate::get_edge; use crate::get_edge;
use crate::network::{ use crate::network::{
generate_arp_request, send_arp_request, send_packet_to_net, ArpHdr, ArpRequestInfo, add_to_arp_wait_list, arp_arrived, generate_arp_request, send_arp_request, send_packet_to_net,
ArpResponse, ARP_REPLY, ARP_REQUEST, ArpHdr, ArpRequestInfo, ArpResponse, ARP_REPLY, ARP_REQUEST,
}; };
use crate::pb::{encode_to_udp_message, SdlData}; use crate::pb::{encode_to_udp_message, SdlData};
use crate::tcp::PacketType; use crate::tcp::PacketType;
@ -182,13 +183,13 @@ impl TunTapPacketHandler for Iface {
} }
async fn handle_packet_from_device( async fn handle_packet_from_device(
&self, &self,
data: &[u8], data: Vec<u8>,
encrypt_key: &[u8], encrypt_key: &[u8],
) -> std::io::Result<()> { ) -> std::io::Result<()> {
debug!("in tap mode2"); debug!("in tap mode2");
let edge = get_edge(); let edge = get_edge();
match Ethernet2Header::from_slice(data) { match Ethernet2Header::from_slice(&data) {
Ok((hdr, _)) => { Ok((hdr, _)) => {
let target = hdr.destination; let target = hdr.destination;
if is_ipv6_multicast(&target) { if is_ipv6_multicast(&target) {
@ -196,7 +197,7 @@ impl TunTapPacketHandler for Iface {
} }
let size = data.len(); let size = data.len();
let Ok(encrypted) = aes_encrypt(encrypt_key, data) else { let Ok(encrypted) = aes_encrypt(encrypt_key, &data) else {
error!("failed to encrypt packet request"); error!("failed to encrypt packet request");
return Ok(()); return Ok(());
}; };
@ -275,6 +276,7 @@ impl TunTapPacketHandler for Iface {
mac: arp.shwaddr, mac: arp.shwaddr,
}) })
.await; .await;
// target to us // target to us
arp.opcode = ARP_REPLY; arp.opcode = ARP_REPLY;
arp.dhwaddr = arp.shwaddr; arp.dhwaddr = arp.shwaddr;
@ -324,6 +326,7 @@ impl TunTapPacketHandler for Iface {
mac: arp.shwaddr, mac: arp.shwaddr,
}) })
.await; .await;
arp_arrived(from_ip, arp.shwaddr).await;
} }
} }
_other => { _other => {
@ -373,7 +376,7 @@ impl TunTapPacketHandler for Iface {
async fn handle_packet_from_device( async fn handle_packet_from_device(
&self, &self,
data: &[u8], data: Vec<u8>,
encrypt_key: &[u8], encrypt_key: &[u8],
) -> std::io::Result<()> { ) -> std::io::Result<()> {
let eee = get_edge(); let eee = get_edge();
@ -407,6 +410,7 @@ impl TunTapPacketHandler for Iface {
do_arp_request, do_arp_request,
} => { } => {
if do_arp_request { if do_arp_request {
add_to_arp_wait_list(dstip, data);
println!( println!(
"find ip: {:?} => {:?}", "find ip: {:?} => {:?}",
src.to_be_bytes(), src.to_be_bytes(),