Skip to content

Commit

Permalink
Support OpenWRT > 15.05
Browse files Browse the repository at this point in the history
  • Loading branch information
luozijun committed Feb 1, 2018
1 parent e97b646 commit 51b6f42
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 203 deletions.
66 changes: 66 additions & 0 deletions README.rst
Expand Up @@ -77,6 +77,72 @@ Debian 9:
cp target/release/vpnd .
OpenWRT 17.01.4:

.. code:: bash
wget "http://downloads.openwrt.org/releases/17.01.4/targets/x86/64/lede-17.01.4-x86-64-combined-ext4.img.gz"
tar -xvjf lede-17.01.4-x86-64-combined-ext4.img.gz
#dd if=lede-17.01.4-x86-64-combined-squashfs.img of=openwrt.img bs=100m conv=sync
#VBoxManage convertfromraw --format VMDK openwrt.img openwrt.vmdk
VBoxManage convertfromraw --format VMDK lede-17.01.4-x86-64-combined-ext4.img openwrt.vmdk
VBoxManage clonehd "openwrt.vmdk" "openwrt.vdi" --format vdi
VBoxManage modifyhd "openwrt.vdi" --resize 5120
opkg update
opkg install wget
opkg install curl
opkg install bash
opkg install vim
opkg install ca-certificates
opkg install openssl-util
touch ~/.bashrc
echo "export SSL_CERT_DIR=/etc/ssl/certs" >> ~/.bashrc
Cross
---------

Host: GNU/Linux

.. code:: bash
brew install qemu
brew install docker
docker pull japaric/x86_64-unknown-linux-gnu
docker pull japaric/x86_64-unknown-linux-musl
docker pull japaric/x86_64-unknown-freebsd
docker pull japaric/x86_64-unknown-netbsd
docker pull japaric/arm-unknown-linux-gnueabi
docker pull japaric/arm-linux-androideabi
docker pull japaric/armv7-unknown-linux-gnueabihf
docker pull japaric/armv7-linux-androideabi
docker pull japaric/aarch64-unknown-linux-gnu
docker pull japaric/aarch64-linux-android
docker pull japaric/mips-unknown-linux-gnu
docker pull japaric/mipsel-unknown-linux-gnu
docker pull japaric/mips64-unknown-linux-gnuabi64
docker pull japaric/mips64el-unknown-linux-gnuabi64
cargo install cross
cross build --bin vpn --release
# For OpenWRT devices:
# mips-unknown-linux-uclibc (15.05 and older)
# mips-unknown-linux-musl (post 15.05)
# x86_64-unknown-linux-musl (post 15.05)
# arm-unknown-linux-musl (post 15.05)
# armv7-unknown-linux-musl (post 15.05)
cross build --bin vpn --target x86_64-unknown-linux-musl --release
Run
-------

Expand Down
93 changes: 21 additions & 72 deletions netif/bin/packetdump.rs
Expand Up @@ -8,7 +8,7 @@ use smoltcp::wire;


use std::env;

use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};

fn handle_ip_packet(packet: &[u8]) {
match wire::IpVersion::of_packet(&packet) {
Expand All @@ -29,7 +29,7 @@ fn handle_ethernet_frame(packet: &[u8]) {
println!("{}", &wire::PrettyPrinter::<wire::EthernetFrame<&[u8]>>::new("", &packet));
}

#[cfg(any(target_os = "macos", target_os = "freebsd"))]
#[cfg(any(target_os = "macos", target_os = "freebsd", target_os = "linux"))]
fn main() {
let mut args = env::args();
if args.len() < 2 {
Expand All @@ -38,7 +38,7 @@ fn main() {
}
let ifname = args.nth(1).unwrap().clone();

let mut raw_socket = netif::RawSocket::open(&ifname)
let mut raw_socket = netif::RawSocket::with_ifname(&ifname)
.expect(format!("can't open raw socket on netif {}", ifname).as_str());
let mut buffer = vec![0u8; raw_socket.blen()];

Expand All @@ -47,81 +47,30 @@ fn main() {
println!("[INFO] Netif: {} Link layer: {:?}\n", ifname, link_layer);

loop {
let ret = raw_socket.read(&mut buffer);
if ret.is_err() {
println!("[ERROR] {:?}", ret);
continue;
}

let pos = ret.unwrap();
if pos.is_none() {
continue;
}

let (start, end) = pos.unwrap();

match link_layer {
LinkLayer::Null => {
// macOS loopback or utun
let packet = &buffer[start+4..end];
handle_ip_packet(&packet);
},
LinkLayer::Eth => {
let packet = &buffer[start..end];
handle_ethernet_frame(&packet);
},
LinkLayer::Ip => {
let packet = &buffer[start..end];
handle_ip_packet(&packet);
}
}
}
}

#[cfg(target_os = "linux")]
fn main(){
let mut args = env::args();
if args.len() < 2 {
println!("Usage:\n $ sudo target/debug/packetdump <interface name>");
return ();
}
let ifname = args.nth(1).unwrap().clone();

let mut raw_socket = netif::RawSocket::open(&ifname)
.expect(format!("can't open raw socket on netif {}", ifname).as_str());

let mut buffer = vec![0u8; raw_socket.blen()];

let link_layer = raw_socket.link_layer();

println!("[INFO] Netif: {} Link layer: {:?}\n", ifname, link_layer);

loop {
raw_socket.await(None).unwrap();
match raw_socket.recv(&mut buffer) {
Ok(size) => {
if size <= 0 {
continue;
}
match link_layer {
LinkLayer::Null => {
// macOS loopback or utun
let packet = &buffer[..size];
handle_ip_packet(&packet);
},
LinkLayer::Eth => {
let packet = &buffer[..size];
handle_ethernet_frame(&packet);
},
LinkLayer::Ip => {
let packet = &buffer[..size];
handle_ip_packet(&packet);
Ok(reader) => {
for (start, end) in reader {
match link_layer {
LinkLayer::Null => {
// macOS loopback or utun
let packet = &buffer[start+4..end];
handle_ip_packet(&packet);
},
LinkLayer::Eth => {
let packet = &buffer[start..end];
handle_ethernet_frame(&packet);
},
LinkLayer::Ip => {
let packet = &buffer[start..end];
handle_ip_packet(&packet);
}
}
}
},
}
Err(e) => {
println!("[ERROR] {:?}", e);
}
}
}
}

3 changes: 2 additions & 1 deletion netif/src/interface.rs
Expand Up @@ -63,14 +63,15 @@ pub struct Interface {
v6_addr: Option<Ipv6Network>,
}


impl Interface {
pub fn with_index(ifindex: u32) -> Result<Interface, io::Error> {
let ifname = {
let ifname_buf: [u8; sys::IF_NAMESIZE] = [0u8; sys::IF_NAMESIZE];
let size = unsafe {
let ifname_cstr = CStr::from_bytes_with_nul_unchecked(&ifname_buf);

let ptr = ifname_cstr.as_ptr() as *mut i8;

sys::if_indextoname(ifindex, ptr);
let mut pos: usize = ifname_buf.len() - 1;
while pos != 0 {
Expand Down

0 comments on commit 51b6f42

Please sign in to comment.