virReportErrorHelper(VIR_FROM_NET, code, __FILE__, \
__FUNCTION__, __LINE__, __VA_ARGS__)
-#if __linux__
-static int
-getFlags(int fd, const char *ifname, struct ifreq *ifr) {
-
- memset(ifr, 0, sizeof(*ifr));
-
- if (virStrncpy(ifr->ifr_name,
- ifname, strlen(ifname), sizeof(ifr->ifr_name)) == NULL)
- return -ENODEV;
-
- if (ioctl(fd, SIOCGIFFLAGS, ifr) < 0)
- return -errno;
-
- return 0;
-}
-
-
-/**
- * ifaceGetFlags
- *
- * @ifname : name of the interface
- * @flags : pointer to short holding the flags on success
- *
- * Get the flags of the interface. Returns 0 on success, -errno on failure.
- */
-int
-ifaceGetFlags(const char *ifname, short *flags) {
- struct ifreq ifr;
- int rc;
- int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
-
- if (fd < 0)
- return -errno;
-
- rc = getFlags(fd, ifname, &ifr);
-
- *flags = ifr.ifr_flags;
-
- VIR_FORCE_CLOSE(fd);
-
- return rc;
-}
-
-
-int
-ifaceIsUp(const char *ifname, bool *up) {
- short flags = 0;
- int rc = ifaceGetFlags(ifname, &flags);
-
- if (rc < 0)
- return rc;
-
- *up = ((flags & IFF_UP) == IFF_UP);
-
- return 0;
-}
-#else
-
-/* Note: Showstopper on cygwin is only missing PF_PACKET */
-
-int
-
-ifaceGetFlags(const char *ifname ATTRIBUTE_UNUSED,
- short *flags ATTRIBUTE_UNUSED) {
- ifaceError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("ifaceGetFlags is not supported on non-linux platforms"));
- return -ENOSYS;
-}
-
-int
-ifaceIsUp(const char *ifname ATTRIBUTE_UNUSED,
- bool *up ATTRIBUTE_UNUSED) {
-
- ifaceError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("ifaceIsUp is not supported on non-linux platforms"));
- return -ENOSYS;
-}
-
-#endif /* __linux__ */
-
-/*
- * chgIfaceFlags: Change flags on an interface
- *
- * @ifname : name of the interface
- * @flagclear : the flags to clear
- * @flagset : the flags to set
- *
- * The new flags of the interface will be calculated as
- * flagmask = (~0 ^ flagclear)
- * newflags = (curflags & flagmask) | flagset;
- *
- * Returns 0 on success, -errno on failure.
- */
-#ifdef __linux__
-static int chgIfaceFlags(const char *ifname, short flagclear, short flagset) {
- struct ifreq ifr;
- int rc = 0;
- short flags;
- short flagmask = (~0 ^ flagclear);
- int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
-
- if (fd < 0)
- return -errno;
-
- rc = getFlags(fd, ifname, &ifr);
- if (rc < 0)
- goto cleanup;
-
- flags = (ifr.ifr_flags & flagmask) | flagset;
-
- if (ifr.ifr_flags != flags) {
- ifr.ifr_flags = flags;
-
- if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0)
- rc = -errno;
- }
-
-cleanup:
- VIR_FORCE_CLOSE(fd);
- return rc;
-}
-
-
-/*
- * ifaceCtrl
- * @name: name of the interface
- * @up: true (1) for up, false (0) for down
- *
- * Function to control if an interface is activated (up, 1) or not (down, 0)
- *
- * Returns 0 on success, -errno on failure.
- */
-int
-ifaceCtrl(const char *name, bool up)
-{
- return chgIfaceFlags(name,
- (up) ? 0 : IFF_UP,
- (up) ? IFF_UP : 0);
-}
-
-#else
-
-int
-ifaceCtrl(const char *name ATTRIBUTE_UNUSED, bool up ATTRIBUTE_UNUSED)
-{
- return -ENOSYS;
-}
-
-#endif /* __linux__ */
-
/**
* ifaceCheck
*
# define NET_SYSFS "/sys/class/net/"
-int ifaceGetFlags(const char *name, short *flags);
-int ifaceIsUp(const char *name, bool *up);
-
-int ifaceCtrl(const char *name, bool up);
-
-static inline int ifaceUp(const char *name) {
- return ifaceCtrl(name, true);
-}
-
-static inline int ifaceDown(const char *name) {
- return ifaceCtrl(name, false);
-}
int ifaceCheck(bool reportError, const char *ifname,
const unsigned char *macaddr, int ifindex);
#include "util.h"
#include "macvtap.h"
+#include "virnetdev.h"
VIR_ENUM_IMPL(virMacvtapMode, VIR_MACVTAP_MODE_LAST,
"vepa",
goto link_del_exit;
}
- rc = ifaceUp(cr_ifname);
- if (rc < 0) {
- virReportSystemError(errno,
- _("cannot 'up' interface %s -- another "
- "macvtap device may be 'up' and have the same "
- "MAC address"),
- cr_ifname);
+ if (virNetDevSetOnline(cr_ifname, true) < 0) {
rc = -1;
goto disassociate_exit;
}
(vmOp == VIR_VM_OP_MIGRATE_IN_START)
? VIR_NETDEV_VPORT_PROFILE_LINK_OP_PREASSOCIATE_RR
: VIR_NETDEV_VPORT_PROFILE_LINK_OP_ASSOCIATE);
- if (vmOp != VIR_VM_OP_MIGRATE_IN_START && !rc)
- ifaceUp(linkdev);
+ if (vmOp != VIR_VM_OP_MIGRATE_IN_START && !rc) {
+ /* XXX bogus error handling */
+ ignore_value(virNetDevSetOnline(linkdev, true));
+ }
+
break;
}
/* avoid disassociating twice */
if (vmOp == VIR_VM_OP_MIGRATE_IN_FINISH)
break;
- ifaceDown(linkdev);
+ ignore_value(virNetDevSetOnline(linkdev, false));
rc = doPortProfileOp8021Qbh(linkdev, macvtap_macaddr,
virtPort, NULL,
VIR_NETDEV_VPORT_PROFILE_LINK_OP_DISASSOCIATE);