Rename ifaceCheck to virNetDevValidateConfig

Rename the ifaceCheck method to virNetDevValidateConfig and change
so that it always raises an error and returns -1 on error.

* src/util/interface.c, src/util/interface.h: Rename ifaceCheck
  to virNetDevValidateConfig
* src/nwfilter/nwfilter_gentech_driver.c,
  src/nwfilter/nwfilter_learnipaddr.c: Update for API rename
This commit is contained in:
Daniel P. Berrange 2011-11-03 12:28:17 +00:00
parent 8e6cd41418
commit 6e0c4dce0b
5 changed files with 55 additions and 47 deletions

View File

@ -575,7 +575,7 @@ virHookPresent;
# interface.h
ifaceCheck;
virNetDevValidateConfig;
virNetDevGetIndex;
virNetDevGetIPv4Address;
ifaceGetNthParent;

View File

@ -715,7 +715,8 @@ virNWFilterInstantiate(virConnectPtr conn,
if (teardownOld && rc == 0)
techdriver->tearOldRules(conn, ifname);
if (rc == 0 && (ifaceCheck(false, ifname, NULL, ifindex) < 0)) {
if (rc == 0 && (virNetDevValidateConfig(ifname, NULL, ifindex) <= 0)) {
virResetLastError();
/* interface changed/disppeared */
techdriver->allTeardown(ifname);
rc = 1;
@ -964,8 +965,9 @@ virNWFilterInstantiateFilterLate(virConnectPtr conn,
&foundNewFilter);
if (rc) {
/* something went wrong... 'DOWN' the interface */
if ((ifaceCheck(false, ifname, NULL, ifindex) < 0) ||
if ((virNetDevValidateConfig(ifname, NULL, ifindex) <= 0) ||
(virNetDevSetOnline(ifname, false) < 0)) {
virResetLastError();
/* assuming interface disappeared... */
_virNWFilterTeardownFilter(ifname);
}

View File

@ -434,7 +434,8 @@ learnIPAddressThread(void *arg)
req->status = 0;
/* anything change to the VM's interface -- check at least once */
if (ifaceCheck(false, req->ifname, NULL, req->ifindex) < 0) {
if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <= 0) {
virResetLastError();
req->status = ENODEV;
goto done;
}
@ -504,7 +505,8 @@ learnIPAddressThread(void *arg)
}
/* check whether VM's dev is still there */
if (ifaceCheck(false, req->ifname, NULL, req->ifindex) < 0) {
if (virNetDevValidateConfig(req->ifname, NULL, req->ifindex) <= 0) {
virResetLastError();
req->status = ENODEV;
showError = false;
break;

View File

@ -56,9 +56,7 @@
__FUNCTION__, __LINE__, __VA_ARGS__)
/**
* ifaceCheck
*
* @reportError: whether to report errors or keep silent
* virNetDevValidateConfig:
* @ifname: Name of the interface
* @macaddr: expected MAC address of the interface; not checked if NULL
* @ifindex: expected index of the interface; not checked if '-1'
@ -67,78 +65,83 @@
* it must have the given MAC address and if an interface index is
* passed, it must also match the interface index.
*
* Returns 0 on success, -errno on failure.
* -ENODEV : if interface with given name does not exist or its interface
* index is different than the one passed
* -EINVAL : if interface name is invalid (too long)
* Returns 1 if the config matches, 0 if the config does not match, or interface does not exist, -1 on error
*/
#ifdef __linux__
int
ifaceCheck(bool reportError, const char *ifname,
const unsigned char *macaddr, int ifindex)
int virNetDevValidateConfig(const char *ifname,
const unsigned char *macaddr, int ifindex)
{
struct ifreq ifr;
int fd = -1;
int rc = 0;
int ret = -1;
struct ifreq ifr;
int idx;
int rc;
if ((rc = virNetDevExists(ifname)) < 0)
return -1;
if (rc == 0) {
ret = 0;
goto cleanup;
}
if (macaddr != NULL) {
fd = socket(PF_PACKET, SOCK_DGRAM, 0);
if (fd < 0)
return -errno;
if (fd < 0) {
virReportSystemError(errno, "%s",
_("Unable to open control socket"));
return -1;
}
memset(&ifr, 0, sizeof(ifr));
if (virStrncpy(ifr.ifr_name,
ifname, strlen(ifname), sizeof(ifr.ifr_name)) == NULL) {
if (reportError)
ifaceError(VIR_ERR_INTERNAL_ERROR,
_("invalid interface name %s"),
ifname);
rc = -EINVAL;
virReportSystemError(ERANGE,
_("invalid interface name %s"),
ifname);
goto cleanup;
}
if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
if (reportError)
ifaceError(VIR_ERR_INTERNAL_ERROR,
_("coud not get MAC address of interface %s"),
ifname);
rc = -errno;
if (errno == ENODEV) {
ret = 0;
goto cleanup;
}
virReportSystemError(errno,
_("coud not get MAC address of interface %s"),
ifname);
goto cleanup;
}
if (memcmp(&ifr.ifr_hwaddr.sa_data, macaddr, VIR_MAC_BUFLEN) != 0) {
rc = -ENODEV;
ret = 0;
goto cleanup;
}
}
if (ifindex != -1) {
if (virNetDevGetIndex(ifname, &idx) < 0)
virResetLastError();
else if (idx != ifindex)
rc = -ENODEV;
goto cleanup;
else if (idx != ifindex) {
ret = 0;
goto cleanup;
}
}
ret = 1;
cleanup:
VIR_FORCE_CLOSE(fd);
return rc;
return ret;
}
#else
int
ifaceCheck(bool reportError ATTRIBUTE_UNUSED,
const char *ifname ATTRIBUTE_UNUSED,
const unsigned char *macaddr ATTRIBUTE_UNUSED,
int ifindex ATTRIBUTE_UNUSED)
#else /* ! __linux__ */
int virNetDevValidateConfig(const char *ifname ATTRIBUTE_UNUSED,
const unsigned char *macaddr ATTRIBUTE_UNUSED,
int ifindex ATTRIBUTE_UNUSED)
{
return -ENOSYS;
}
#endif /* __linux__ */
#endif /* ! __linux__ */

View File

@ -30,8 +30,9 @@ struct nlattr;
# define NET_SYSFS "/sys/class/net/"
int ifaceCheck(bool reportError, const char *ifname,
const unsigned char *macaddr, int ifindex);
int virNetDevValidateConfig(const char *ifname,
const unsigned char *macaddr, int ifindex)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
int ifaceMacvtapLinkDump(bool nltarget_kernel, const char *ifname, int ifindex,
struct nlattr **tb, unsigned char **recvbuf,