mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
net_util: Only try and enable the TAP device if it not already enabled
This allows an existing TAP interface to be used without needing CAP_NET_ADMIN permissions on the Cloud Hypervisor binary as the ioctl to bring up the interface is avoided. Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
committed by
Sebastien Boeuf
parent
eda9bfc7a1
commit
929d70bc7f
@@ -249,9 +249,26 @@ impl Tap {
|
|||||||
|
|
||||||
let mut ifreq = self.get_ifreq();
|
let mut ifreq = self.get_ifreq();
|
||||||
|
|
||||||
|
#[allow(clippy::cast_lossless)]
|
||||||
|
let ret =
|
||||||
|
unsafe { ioctl_with_ref(&sock, net_gen::sockios::SIOCGIFFLAGS as c_ulong, &ifreq) };
|
||||||
|
if ret < 0 {
|
||||||
|
return Err(Error::IoctlError(IoError::last_os_error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// If TAP device is already up don't try and enable it
|
||||||
|
let ifru_flags = unsafe { ifreq.ifr_ifru.ifru_flags.as_ref() };
|
||||||
|
if ifru_flags
|
||||||
|
& (net_gen::net_device_flags_IFF_UP | net_gen::net_device_flags_IFF_RUNNING) as i16
|
||||||
|
== (net_gen::net_device_flags_IFF_UP | net_gen::net_device_flags_IFF_RUNNING) as i16
|
||||||
|
{
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
// We only access one field of the ifru union, hence this is safe.
|
// We only access one field of the ifru union, hence this is safe.
|
||||||
unsafe {
|
unsafe {
|
||||||
let ifru_flags = ifreq.ifr_ifru.ifru_flags.as_mut();
|
let ifru_flags = ifreq.ifr_ifru.ifru_flags.as_mut();
|
||||||
|
|
||||||
*ifru_flags =
|
*ifru_flags =
|
||||||
(net_gen::net_device_flags_IFF_UP | net_gen::net_device_flags_IFF_RUNNING) as i16;
|
(net_gen::net_device_flags_IFF_UP | net_gen::net_device_flags_IFF_RUNNING) as i16;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ const TUNSETVNETHDRSZ: u64 = 0x4004_54d8;
|
|||||||
const TUNGETFEATURES: u64 = 0x8004_54cf;
|
const TUNGETFEATURES: u64 = 0x8004_54cf;
|
||||||
|
|
||||||
// See include/uapi/linux/sockios.h in the kernel code.
|
// See include/uapi/linux/sockios.h in the kernel code.
|
||||||
|
const SIOCGIFFLAGS: u64 = 0x8913;
|
||||||
const SIOCGIFHWADDR: u64 = 0x8927;
|
const SIOCGIFHWADDR: u64 = 0x8927;
|
||||||
const SIOCSIFFLAGS: u64 = 0x8914;
|
const SIOCSIFFLAGS: u64 = 0x8914;
|
||||||
const SIOCSIFADDR: u64 = 0x8916;
|
const SIOCSIFADDR: u64 = 0x8916;
|
||||||
@@ -149,6 +150,7 @@ fn create_vmm_ioctl_seccomp_rule() -> Result<Vec<SeccompRule>, Error> {
|
|||||||
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_USER_MEMORY_REGION,)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_USER_MEMORY_REGION,)?],
|
||||||
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_XSAVE,)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_XSAVE,)?],
|
||||||
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_XCRS,)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, KVM_SET_XCRS,)?],
|
||||||
|
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCGIFFLAGS)?],
|
||||||
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCGIFHWADDR)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCGIFHWADDR)?],
|
||||||
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCSIFADDR)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCSIFADDR)?],
|
||||||
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCSIFFLAGS)?],
|
and![Cond::new(1, ArgLen::DWORD, Eq, SIOCSIFFLAGS)?],
|
||||||
|
|||||||
Reference in New Issue
Block a user