From a13b2243e6775db77ea1361bd771f1a94ea5b435 Mon Sep 17 00:00:00 2001 From: Cara Salter Date: Sat, 29 Apr 2023 10:39:34 -0400 Subject: [PATCH] tun: Enable setting/getting of MTU Works similarly to getting and setting IP addresses, can pretty much be copy-pasted for the rest of the settings. --- tun/src/unix/linux/mod.rs | 16 ++++++++++++++++ tun/src/unix/linux/sys.rs | 3 +++ 2 files changed, 19 insertions(+) diff --git a/tun/src/unix/linux/mod.rs b/tun/src/unix/linux/mod.rs index cc80f97..db22beb 100644 --- a/tun/src/unix/linux/mod.rs +++ b/tun/src/unix/linux/mod.rs @@ -68,6 +68,13 @@ impl TunInterface { self.perform(|fd| unsafe { sys::if_set_addr(fd, &iff) })?; } + #[throws] + pub fn set_mtu(&self, mtu: i32) { + let mut iff = self.ifreq()?; + iff.ifr_ifru.ifru_mtu = mtu; + self.perform(|fd| unsafe { sys::if_set_mtu(fd, &iff) })?; + } + #[throws] pub fn ipv4_addr(&self) -> Ipv4Addr { let mut iff = self.ifreq()?; @@ -76,6 +83,15 @@ impl TunInterface { Ipv4Addr::from(u32::from_be(addr.sin_addr.s_addr)) } + #[throws] + pub fn mtu(&self) -> i32 { + let mut iff = self.ifreq()?; + self.perform(|fd| unsafe { sys::if_get_mtu(fd, &mut iff) })?; + let mtu = unsafe { iff.ifr_ifru.ifru_mtu }; + + mtu + } + #[throws] fn perform(&self, perform: impl FnOnce(RawFd) -> Result) -> R { let socket = Socket::new(Domain::IPV4, Type::DGRAM, None)?; diff --git a/tun/src/unix/linux/sys.rs b/tun/src/unix/linux/sys.rs index 5df22d9..e8e373f 100644 --- a/tun/src/unix/linux/sys.rs +++ b/tun/src/unix/linux/sys.rs @@ -16,4 +16,7 @@ ioctl_read_bad!( ); ioctl_read_bad!(if_get_index, libc::SIOCGIFINDEX, libc::ifreq); ioctl_read_bad!(if_get_addr, libc::SIOCGIFADDR, libc::ifreq); +ioctl_read_bad!(if_get_mtu, libc::SIOCGIFMTU, libc::ifreq); + ioctl_write_ptr_bad!(if_set_addr, libc::SIOCSIFADDR, libc::ifreq); +ioctl_write_ptr_bad!(if_set_mtu, libc::SIOCSIFMTU, libc::ifreq);