mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 22:55:23 +00:00
Rename ifaceGetIndex and ifaceGetVLAN
Rename the ifaceGetIndex method to virNetDevGetIndex and ifaceGetVlanID to virNetDevGetVLanID. Also change the error reporting behaviour to always raise errors and return -1 on failure * util/interface.c, util/interface.h: Rename ifaceGetIndex and ifaceGetVLAN * nwfilter/nwfilter_gentech_driver.c, nwfilter/nwfilter_learnipaddr.c, nwfilter/nwfilter_learnipaddr.c, util/virnetdevvportprofile.c: Update for API renames and error handling changes
This commit is contained in:
parent
255917f516
commit
ebbb6bd11f
@ -576,12 +576,12 @@ virHookPresent;
|
|||||||
|
|
||||||
# interface.h
|
# interface.h
|
||||||
ifaceCheck;
|
ifaceCheck;
|
||||||
ifaceGetIndex;
|
virNetDevGetIndex;
|
||||||
ifaceGetIPAddress;
|
ifaceGetIPAddress;
|
||||||
ifaceGetNthParent;
|
ifaceGetNthParent;
|
||||||
ifaceGetPhysicalFunction;
|
ifaceGetPhysicalFunction;
|
||||||
ifaceGetVirtualFunctionIndex;
|
ifaceGetVirtualFunctionIndex;
|
||||||
ifaceGetVlanID;
|
virNetDevGetVLanID;
|
||||||
ifaceIsVirtualFunction;
|
ifaceIsVirtualFunction;
|
||||||
virNetDevMacVLanCreate;
|
virNetDevMacVLanCreate;
|
||||||
virNetDevMacVLanDelete;
|
virNetDevMacVLanDelete;
|
||||||
|
@ -903,9 +903,11 @@ _virNWFilterInstantiateFilter(virConnectPtr conn,
|
|||||||
/* after grabbing the filter update lock check for the interface; if
|
/* after grabbing the filter update lock check for the interface; if
|
||||||
it's not there anymore its filters will be or are being removed
|
it's not there anymore its filters will be or are being removed
|
||||||
(while holding the lock) and we don't want to build new ones */
|
(while holding the lock) and we don't want to build new ones */
|
||||||
if (ifaceGetIndex(false, net->ifname, &ifindex) < 0) {
|
if (virNetDevExists(net->ifname) != 1 ||
|
||||||
|
virNetDevGetIndex(net->ifname, &ifindex) < 0) {
|
||||||
/* interfaces / VMs can disappear during filter instantiation;
|
/* interfaces / VMs can disappear during filter instantiation;
|
||||||
don't mark it as an error */
|
don't mark it as an error */
|
||||||
|
virResetLastError();
|
||||||
rc = 0;
|
rc = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1021,8 +1023,9 @@ int virNWFilterRollbackUpdateFilter(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* don't tear anything while the address is being learned */
|
/* don't tear anything while the address is being learned */
|
||||||
if (ifaceGetIndex(true, net->ifname, &ifindex) == 0 &&
|
if (virNetDevGetIndex(net->ifname, &ifindex) < 0)
|
||||||
virNWFilterLookupLearnReq(ifindex) != NULL)
|
virResetLastError();
|
||||||
|
else if (virNWFilterLookupLearnReq(ifindex) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return techdriver->tearNewRules(conn, net->ifname);
|
return techdriver->tearNewRules(conn, net->ifname);
|
||||||
@ -1047,8 +1050,9 @@ virNWFilterTearOldFilter(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* don't tear anything while the address is being learned */
|
/* don't tear anything while the address is being learned */
|
||||||
if (ifaceGetIndex(true, net->ifname, &ifindex) == 0 &&
|
if (virNetDevGetIndex(net->ifname, &ifindex) < 0)
|
||||||
virNWFilterLookupLearnReq(ifindex) != NULL)
|
virResetLastError();
|
||||||
|
else if (virNWFilterLookupLearnReq(ifindex) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return techdriver->tearOldRules(conn, net->ifname);
|
return techdriver->tearOldRules(conn, net->ifname);
|
||||||
|
@ -252,21 +252,23 @@ virNWFilterTerminateLearnReq(const char *ifname) {
|
|||||||
int ifindex;
|
int ifindex;
|
||||||
virNWFilterIPAddrLearnReqPtr req;
|
virNWFilterIPAddrLearnReqPtr req;
|
||||||
|
|
||||||
if (ifaceGetIndex(false, ifname, &ifindex) == 0) {
|
if (virNetDevGetIndex(ifname, &ifindex) < 0) {
|
||||||
|
virResetLastError();
|
||||||
IFINDEX2STR(ifindex_str, ifindex);
|
return rc;
|
||||||
|
|
||||||
virMutexLock(&pendingLearnReqLock);
|
|
||||||
|
|
||||||
req = virHashLookup(pendingLearnReq, ifindex_str);
|
|
||||||
if (req) {
|
|
||||||
rc = 0;
|
|
||||||
req->terminate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virMutexUnlock(&pendingLearnReqLock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IFINDEX2STR(ifindex_str, ifindex);
|
||||||
|
|
||||||
|
virMutexLock(&pendingLearnReqLock);
|
||||||
|
|
||||||
|
req = virHashLookup(pendingLearnReq, ifindex_str);
|
||||||
|
if (req) {
|
||||||
|
rc = 0;
|
||||||
|
req->terminate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virMutexUnlock(&pendingLearnReqLock);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,8 +115,9 @@ ifaceCheck(bool reportError, const char *ifname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ifindex != -1) {
|
if (ifindex != -1) {
|
||||||
rc = ifaceGetIndex(reportError, ifname, &idx);
|
if (virNetDevGetIndex(ifname, &idx) < 0)
|
||||||
if (rc == 0 && idx != ifindex)
|
virResetLastError();
|
||||||
|
else if (idx != ifindex)
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,114 +142,112 @@ ifaceCheck(bool reportError ATTRIBUTE_UNUSED,
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ifaceGetIndex
|
* virNetDevGetIndex
|
||||||
*
|
|
||||||
* @reportError: whether to report errors or keep silent
|
|
||||||
* @ifname : Name of the interface whose index is to be found
|
* @ifname : Name of the interface whose index is to be found
|
||||||
* @ifindex: Pointer to int where the index will be written into
|
* @ifindex: Pointer to int where the index will be written into
|
||||||
*
|
*
|
||||||
* Get the index of an interface given its name.
|
* Get the index of an interface given its name.
|
||||||
*
|
*
|
||||||
* Returns 0 on success, -errno on failure.
|
* Returns 0 on success, -1 on failure
|
||||||
* -ENODEV : if interface with given name does not exist
|
|
||||||
* -EINVAL : if interface name is invalid (too long)
|
|
||||||
*/
|
*/
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
int
|
int
|
||||||
ifaceGetIndex(bool reportError, const char *ifname, int *ifindex)
|
virNetDevGetIndex(const char *ifname, int *ifindex)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int ret = -1;
|
||||||
struct ifreq ifreq;
|
struct ifreq ifreq;
|
||||||
int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
|
int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0) {
|
||||||
return -errno;
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Unable to open control socket"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&ifreq, 0, sizeof(ifreq));
|
memset(&ifreq, 0, sizeof(ifreq));
|
||||||
|
|
||||||
if (virStrncpy(ifreq.ifr_name, ifname, strlen(ifname),
|
if (virStrncpy(ifreq.ifr_name, ifname, strlen(ifname),
|
||||||
sizeof(ifreq.ifr_name)) == NULL) {
|
sizeof(ifreq.ifr_name)) == NULL) {
|
||||||
if (reportError)
|
virReportSystemError(ERANGE,
|
||||||
ifaceError(VIR_ERR_INTERNAL_ERROR,
|
_("invalid interface name %s"),
|
||||||
_("invalid interface name %s"),
|
ifname);
|
||||||
ifname);
|
|
||||||
rc = -EINVAL;
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl(fd, SIOCGIFINDEX, &ifreq) >= 0)
|
if (ioctl(fd, SIOCGIFINDEX, &ifreq) < 0) {
|
||||||
*ifindex = ifreq.ifr_ifindex;
|
virReportSystemError(errno,
|
||||||
else {
|
_("Unable to get index for interface %s"), ifname);
|
||||||
if (reportError)
|
goto cleanup;
|
||||||
ifaceError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("interface %s does not exist"),
|
|
||||||
ifname);
|
|
||||||
rc = -ENODEV;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*ifindex = ifreq.ifr_ifindex;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FORCE_CLOSE(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
return ret;
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int
|
int
|
||||||
ifaceGetIndex(bool reportError,
|
virNetDevGetIndex(const char *ifname ATTRIBUTE_UNUSED,
|
||||||
const char *ifname ATTRIBUTE_UNUSED,
|
int *ifindex ATTRIBUTE_UNUSED)
|
||||||
int *ifindex ATTRIBUTE_UNUSED)
|
|
||||||
{
|
{
|
||||||
if (reportError) {
|
virReportSystemError(ENOSYS, "%s",
|
||||||
ifaceError(VIR_ERR_INTERNAL_ERROR, "%s",
|
_("Unable to get interface index on this platform"));
|
||||||
_("ifaceGetIndex is not supported on non-linux platforms"));
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
int
|
int
|
||||||
ifaceGetVlanID(const char *vlanifname, int *vlanid) {
|
virNetDevGetVLanID(const char *ifname, int *vlanid)
|
||||||
|
{
|
||||||
struct vlan_ioctl_args vlanargs = {
|
struct vlan_ioctl_args vlanargs = {
|
||||||
.cmd = GET_VLAN_VID_CMD,
|
.cmd = GET_VLAN_VID_CMD,
|
||||||
};
|
};
|
||||||
int rc = 0;
|
int ret = -1;
|
||||||
int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
|
int fd = socket(PF_PACKET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
if (fd < 0)
|
if (fd < 0) {
|
||||||
return -errno;
|
virReportSystemError(errno, "%s",
|
||||||
|
_("Unable to open control socket"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (virStrcpyStatic(vlanargs.device1, vlanifname) == NULL) {
|
if (virStrcpyStatic(vlanargs.device1, ifname) == NULL) {
|
||||||
rc = -EINVAL;
|
virReportSystemError(ERANGE,
|
||||||
|
_("invalid interface name %s"),
|
||||||
|
ifname);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl(fd, SIOCGIFVLAN, &vlanargs) != 0) {
|
if (ioctl(fd, SIOCGIFVLAN, &vlanargs) != 0) {
|
||||||
rc = -errno;
|
virReportSystemError(errno,
|
||||||
|
_("Unable to get VLAN for interface %s"), ifname);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
*vlanid = vlanargs.u.VID;
|
*vlanid = vlanargs.u.VID;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FORCE_CLOSE(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
|
||||||
return rc;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
int
|
int
|
||||||
ifaceGetVlanID(const char *vlanifname ATTRIBUTE_UNUSED,
|
virNetDevGetVLanID(const char *ifname ATTRIBUTE_UNUSED,
|
||||||
int *vlanid ATTRIBUTE_UNUSED) {
|
int *vlanid ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
ifaceError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportSystemError(ENOSYS, "%s",
|
||||||
_("ifaceGetVlanID is not supported on non-linux platforms"));
|
_("Unable to get VLAN on this platform"));
|
||||||
|
return -1;
|
||||||
return -ENOSYS;
|
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
|
|
||||||
@ -496,7 +495,7 @@ ifaceGetNthParent(int ifindex, const char *ifname, unsigned int nthParent,
|
|||||||
|
|
||||||
*nth = 0;
|
*nth = 0;
|
||||||
|
|
||||||
if (ifindex <= 0 && ifaceGetIndex(true, ifname, &ifindex) < 0)
|
if (ifindex <= 0 && virNetDevGetIndex(ifname, &ifindex) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (!end && i <= nthParent) {
|
while (!end && i <= nthParent) {
|
||||||
|
@ -33,9 +33,11 @@ struct nlattr;
|
|||||||
int ifaceCheck(bool reportError, const char *ifname,
|
int ifaceCheck(bool reportError, const char *ifname,
|
||||||
const unsigned char *macaddr, int ifindex);
|
const unsigned char *macaddr, int ifindex);
|
||||||
|
|
||||||
int ifaceGetIndex(bool reportError, const char *ifname, int *ifindex);
|
int virNetDevGetIndex(const char *ifname, int *ifindex)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
int ifaceGetVlanID(const char *vlanifname, int *vlanid);
|
int virNetDevGetVLanID(const char *ifname, int *vlanid)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
|
||||||
|
|
||||||
int ifaceGetIPAddress(const char *ifname, virSocketAddrPtr addr);
|
int ifaceGetIPAddress(const char *ifname, virSocketAddrPtr addr);
|
||||||
|
|
||||||
|
@ -107,7 +107,7 @@ virNetDevMacVLanCreate(const char *ifname,
|
|||||||
struct nl_msg *nl_msg;
|
struct nl_msg *nl_msg;
|
||||||
struct nlattr *linkinfo, *info_data;
|
struct nlattr *linkinfo, *info_data;
|
||||||
|
|
||||||
if (ifaceGetIndex(true, srcdev, &ifindex) < 0)
|
if (virNetDevGetIndex(srcdev, &ifindex) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
*retry = 0;
|
*retry = 0;
|
||||||
@ -481,7 +481,7 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
|
|||||||
int retries, do_retry = 0;
|
int retries, do_retry = 0;
|
||||||
uint32_t macvtapMode;
|
uint32_t macvtapMode;
|
||||||
const char *cr_ifname;
|
const char *cr_ifname;
|
||||||
int ifindex;
|
int ret;
|
||||||
|
|
||||||
macvtapMode = modeMap[mode];
|
macvtapMode = modeMap[mode];
|
||||||
|
|
||||||
@ -502,13 +502,16 @@ int virNetDevMacVLanCreateWithVPortProfile(const char *tgifname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tgifname) {
|
if (tgifname) {
|
||||||
if(ifaceGetIndex(false, tgifname, &ifindex) == 0) {
|
if ((ret = virNetDevExists(tgifname)) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
if (STRPREFIX(tgifname,
|
if (STRPREFIX(tgifname,
|
||||||
MACVTAP_NAME_PREFIX)) {
|
MACVTAP_NAME_PREFIX)) {
|
||||||
goto create_name;
|
goto create_name;
|
||||||
}
|
}
|
||||||
virReportSystemError(errno,
|
virReportSystemError(EEXIST,
|
||||||
_("Interface %s already exists"), tgifname);
|
_("Unable to create macvlan device %s"), tgifname);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
cr_ifname = tgifname;
|
cr_ifname = tgifname;
|
||||||
@ -521,7 +524,9 @@ create_name:
|
|||||||
retries = 5;
|
retries = 5;
|
||||||
for (c = 0; c < 8192; c++) {
|
for (c = 0; c < 8192; c++) {
|
||||||
snprintf(ifname, sizeof(ifname), MACVTAP_NAME_PATTERN, c);
|
snprintf(ifname, sizeof(ifname), MACVTAP_NAME_PATTERN, c);
|
||||||
if (ifaceGetIndex(false, ifname, &ifindex) == -ENODEV) {
|
if ((ret = virNetDevExists(ifname)) < 0)
|
||||||
|
return -1;
|
||||||
|
if (!ret) {
|
||||||
rc = virNetDevMacVLanCreate(ifname, type, macaddress, linkdev,
|
rc = virNetDevMacVLanCreate(ifname, type, macaddress, linkdev,
|
||||||
macvtapMode, &do_retry);
|
macvtapMode, &do_retry);
|
||||||
if (rc == 0)
|
if (rc == 0)
|
||||||
|
@ -544,8 +544,10 @@ virNetDevVPortProfileGetPhysdevAndVlan(const char *ifname, int *root_ifindex, ch
|
|||||||
if (nth == 0)
|
if (nth == 0)
|
||||||
break;
|
break;
|
||||||
if (*vlanid == -1) {
|
if (*vlanid == -1) {
|
||||||
if (ifaceGetVlanID(root_ifname, vlanid) < 0)
|
if (virNetDevGetVLanID(root_ifname, vlanid) < 0) {
|
||||||
|
virResetLastError();
|
||||||
*vlanid = -1;
|
*vlanid = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ifindex = *root_ifindex;
|
ifindex = *root_ifindex;
|
||||||
@ -676,7 +678,7 @@ virNetDevVPortProfileOp8021Qbh(const char *ifname,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
|
|
||||||
rc = ifaceGetIndex(true, physfndev, &ifindex);
|
rc = virNetDevGetIndex(physfndev, &ifindex);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto err_exit;
|
goto err_exit;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user