diff --git a/Socket/NetdeviceController.cc b/Socket/NetdeviceController.cc index 37c255f68a79edcbf0ffdf8af83607a392ac5b2d..7ce1f953bff4aa0a0582d09098f753442d64fadf 100644 --- a/Socket/NetdeviceController.cc +++ b/Socket/NetdeviceController.cc @@ -30,6 +30,7 @@ // Custom includes #include <sys/socket.h> #include <sys/ioctl.h> +#include <net/if.h> #include "../Utils/Exception.hh" #define prefix_ @@ -59,6 +60,22 @@ prefix_ std::string senf::NetdeviceController::interfaceName() return std::string( ifr.ifr_name); } +prefix_ void senf::NetdeviceController::interfaceName(const std::string & newname) +{ + if (sizeof(newname) <= IFNAMSIZ) { + struct ifreq ifr; + ifrName(ifr); + strncpy(ifr. ifr_newname, newname.c_str(), IFNAMSIZ); + try { + doIoctl(ifr, SIOCSIFNAME); + } catch (senf::SystemException e) { + e << "Could not change the interface name. Is the interface really down?"; + throw ; + } + } + return; +} + prefix_ senf::MACAddress senf::NetdeviceController::hardwareAddress() const { @@ -73,7 +90,12 @@ prefix_ void senf::NetdeviceController::hardwareAddress(const MACAddress &newAdd ifrName( ifr); ifr.ifr_hwaddr.sa_family = 1; // TODO: lookup named constant; PF_LOCAL ??? std::copy(newAddress.begin(), newAddress.end(), ifr.ifr_hwaddr.sa_data); - doIoctl( ifr, SIOCSIFHWADDR); + try { + doIoctl(ifr, SIOCSIFHWADDR); + } catch (senf::SystemException e) { + e << "Could not change the interface MAC address. Is the interface really down?"; + throw ; + } } prefix_ int senf::NetdeviceController::mtu() diff --git a/Socket/NetdeviceController.hh b/Socket/NetdeviceController.hh index babe980fbd38663c664d26095e70ee88b65a629c..5f8096818bbde58c8f74f065a3d7ed3f8d80d0c8 100644 --- a/Socket/NetdeviceController.hh +++ b/Socket/NetdeviceController.hh @@ -61,13 +61,17 @@ namespace senf { ///< return hardware address void hardwareAddress(const MACAddress &newAddress); ///< set hardware address - /**< Note, that setting the hardware address is a privileged operation. */ + /**< Changes the hardware address of the interface. + Note, that setting the hardware address is a privileged operation. It is only allowed when the interface + is not up. If the interface is up, this call will cause an SystemException to be thrown.*/ std::string interfaceName() const; ///< return interface name void interfaceName(const std::string &newName); ///< set interface name - /**< Changes the name of the interface. Note, that this is a - privileged operation. It is only allowed when the interface is not up. */ + /**< Changes the name of the interface. + Note, that setting the name is a privileged operation. It is only allowed when the interface + is not up. If the interface is up, this call will cause an SystemException to be thrown.*/ + int mtu() const; ///< return the Maximum Transmission Unit void mtu(int new_mtu); ///< set the Maximum Transmission Unit /**< Set the MTU (Maximum Transfer Unit) of the device.