Skip to content

Commit

Permalink
mac address
Browse files Browse the repository at this point in the history
  • Loading branch information
xmh0511 committed Aug 29, 2024
1 parent 28dd2f6 commit 0c7c9ac
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 80 deletions.
4 changes: 2 additions & 2 deletions examples/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ fn main_entry(quit: Receiver<()>) -> Result<(), BoxError> {

#[cfg(target_os = "freebsd")]
{
//use tun2::Layer;
//config.layer(Layer::L2);
use tun2::Layer;
config.layer(Layer::L2);
}
#[cfg(target_os = "macos")]
config.platform_config(|config| {
Expand Down
4 changes: 4 additions & 0 deletions src/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,8 @@ pub trait AbstractDevice {
/// Return whether the underlying tun device on the platform has packet information
#[cfg(any(target_os = "linux", target_os = "macos", target_os = "ios",))]
fn packet_information(&self) -> bool;

/// Set mac address
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "freebsd",))]
fn set_mac_address(&self, eth_addr: [u8; 6]) -> Result<()>;
}
21 changes: 18 additions & 3 deletions src/platform/freebsd/device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@

use crate::{
configuration::{Configuration, Layer},
device::AbstractDevice,
device::{AbstractDevice, ETHER_ADDR_LEN},
error::{Error, Result},
platform::freebsd::sys::*,
platform::posix::{self, sockaddr_union, Fd, Tun},
IntoAddress,
};
use libc::{
self, c_char, c_short, fcntl, ifreq, kinfo_file, AF_INET, F_KINFO, IFF_RUNNING, IFF_UP,
IFNAMSIZ, KINFO_FILE_SIZE, O_RDWR, SOCK_DGRAM,
self, c_char, c_short, fcntl, ifreq, kinfo_file, sockaddr, AF_INET, AF_LINK, F_KINFO,
IFF_RUNNING, IFF_UP, IFNAMSIZ, KINFO_FILE_SIZE, O_RDWR, SOCK_DGRAM,
};
use std::os::fd::FromRawFd;
use std::{
Expand Down Expand Up @@ -440,6 +440,21 @@ impl AbstractDevice for Device {
self.set_alias(addr, dest, netmask)?;
Ok(())
}

fn set_mac_address(&self, eth_addr: [u8; ETHER_ADDR_LEN]) -> Result<()> {
unsafe {
let mut req = self.request()?;
let mut sa_data = [0i8; 14];
req.ifr_ifru.ifru_addr.sa_len = ETHER_ADDR_LEN;
req.ifr_ifru.ifru_addr.sa_family = AF_LINK;
req.ifr_ifru.ifru_addr.sa_data[0..ETHER_ADDR_LEN]
.copy_from_slice(eth_addr.map(|c| c as i8).as_slice());
if let Err(err) = siocsiflladdr(self.ctl.as_raw_fd(), &mut req) {
return Err(io::Error::from(err).into());
}
Ok(())
}
}
}

impl AsRawFd for Device {
Expand Down
152 changes: 77 additions & 75 deletions src/platform/freebsd/sys.rs
Original file line number Diff line number Diff line change
@@ -1,75 +1,77 @@
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// Version 2, March 2024
//
// Copyleft (ↄ) xmh. <970252187@qq.com>
//
// Everyone is permitted to copy and distribute verbatim or modified
// copies of this license document, and changing it is allowed as long
// as the name is changed.
//
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
//
// 0. You just DO WHAT THE FUCK YOU WANT TO.

//! Bindings to internal FreeBSD stuff.

use libc::{c_char, c_int, c_uint, ifreq, sockaddr, IFNAMSIZ};
use nix::{ioctl_readwrite, ioctl_write_ptr};

#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct ctl_info {
pub ctl_id: c_uint,
pub ctl_name: [c_char; 96],
}

#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct ifaliasreq {
pub ifran: [c_char; IFNAMSIZ],
pub addr: sockaddr,
pub dstaddr: sockaddr,
pub mask: sockaddr,
pub ifra_vhid: c_int,
}

// #[allow(non_camel_case_types)]
// #[repr(C)]
// #[derive(Copy, Clone)]
// pub struct in_aliasreq {
// pub ifra_name: [c_char; IFNAMSIZ],
// pub ifra_addr: sockaddr_in,
// pub ifra_dstaddr: sockaddr_in,
// pub ifra_mask: sockaddr_in,
// pub ifra_vhid:c_int
// }

ioctl_write_ptr!(siocsifflags, b'i', 16, ifreq);
ioctl_readwrite!(siocgifflags, b'i', 17, ifreq);

ioctl_write_ptr!(siocsifaddr, b'i', 12, ifreq);
ioctl_readwrite!(siocgifaddr, b'i', 33, ifreq);

ioctl_write_ptr!(siocsifdstaddr, b'i', 14, ifreq);
ioctl_readwrite!(siocgifdstaddr, b'i', 34, ifreq);

ioctl_write_ptr!(siocsifbrdaddr, b'i', 19, ifreq);
ioctl_readwrite!(siocgifbrdaddr, b'i', 35, ifreq);

ioctl_write_ptr!(siocsifnetmask, b'i', 22, ifreq);
ioctl_readwrite!(siocgifnetmask, b'i', 37, ifreq);

ioctl_write_ptr!(siocsifmtu, b'i', 52, ifreq);
ioctl_readwrite!(siocgifmtu, b'i', 51, ifreq);

ioctl_write_ptr!(siocaifaddr, b'i', 43, ifaliasreq);
ioctl_write_ptr!(siocdifaddr, b'i', 25, ifreq);

ioctl_write_ptr!(siocifcreate, b'i', 122, ifreq);

ioctl_write_ptr!(siocsifphyaddr, b'i', 70, ifaliasreq);

ioctl_write_ptr!(siocsifname, b'i', 40, ifreq);
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// Version 2, March 2024
//
// Copyleft (ↄ) xmh. <970252187@qq.com>
//
// Everyone is permitted to copy and distribute verbatim or modified
// copies of this license document, and changing it is allowed as long
// as the name is changed.
//
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
//
// 0. You just DO WHAT THE FUCK YOU WANT TO.

//! Bindings to internal FreeBSD stuff.

use libc::{c_char, c_int, c_uint, ifreq, sockaddr, IFNAMSIZ};
use nix::{ioctl_readwrite, ioctl_write_ptr};

#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct ctl_info {
pub ctl_id: c_uint,
pub ctl_name: [c_char; 96],
}

#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct ifaliasreq {
pub ifran: [c_char; IFNAMSIZ],
pub addr: sockaddr,
pub dstaddr: sockaddr,
pub mask: sockaddr,
pub ifra_vhid: c_int,
}

// #[allow(non_camel_case_types)]
// #[repr(C)]
// #[derive(Copy, Clone)]
// pub struct in_aliasreq {
// pub ifra_name: [c_char; IFNAMSIZ],
// pub ifra_addr: sockaddr_in,
// pub ifra_dstaddr: sockaddr_in,
// pub ifra_mask: sockaddr_in,
// pub ifra_vhid:c_int
// }

ioctl_write_ptr!(siocsifflags, b'i', 16, ifreq);
ioctl_readwrite!(siocgifflags, b'i', 17, ifreq);

ioctl_write_ptr!(siocsifaddr, b'i', 12, ifreq);
ioctl_readwrite!(siocgifaddr, b'i', 33, ifreq);

ioctl_write_ptr!(siocsifdstaddr, b'i', 14, ifreq);
ioctl_readwrite!(siocgifdstaddr, b'i', 34, ifreq);

ioctl_write_ptr!(siocsifbrdaddr, b'i', 19, ifreq);
ioctl_readwrite!(siocgifbrdaddr, b'i', 35, ifreq);

ioctl_write_ptr!(siocsifnetmask, b'i', 22, ifreq);
ioctl_readwrite!(siocgifnetmask, b'i', 37, ifreq);

ioctl_write_ptr!(siocsifmtu, b'i', 52, ifreq);
ioctl_readwrite!(siocgifmtu, b'i', 51, ifreq);

ioctl_write_ptr!(siocaifaddr, b'i', 43, ifaliasreq);
ioctl_write_ptr!(siocdifaddr, b'i', 25, ifreq);

ioctl_write_ptr!(siocifcreate, b'i', 122, ifreq);

ioctl_write_ptr!(siocsifphyaddr, b'i', 70, ifaliasreq);

ioctl_write_ptr!(siocsifname, b'i', 40, ifreq);

ioctl_write_ptr!(siocsiflladdr, b'i', 60, ifreq);

0 comments on commit 0c7c9ac

Please sign in to comment.