diff --git a/docs/schemas/Makefile.am b/docs/schemas/Makefile.am
index 5ef77372f9..75a0e7371b 100644
--- a/docs/schemas/Makefile.am
+++ b/docs/schemas/Makefile.am
@@ -8,6 +8,7 @@ schema_DATA = \
domainsnapshot.rng \
interface.rng \
network.rng \
+ networkcommon.rng \
nodedev.rng \
nwfilter.rng \
secret.rng \
diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index 5f8151db92..564ff68420 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -7,6 +7,7 @@
+
@@ -2539,9 +2501,4 @@
[a-zA-Z0-9_\.:]+
-
-
- 39
-
-
diff --git a/docs/schemas/networkcommon.rng b/docs/schemas/networkcommon.rng
new file mode 100644
index 0000000000..025181387f
--- /dev/null
+++ b/docs/schemas/networkcommon.rng
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+ 39
+
+
+
+
+
+
+
+
+ 802.1Qbg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 802.1Qbh
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libvirt.spec.in b/libvirt.spec.in
index 667a1bab6b..6cbd9ac613 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -1077,6 +1077,7 @@ fi
%{_datadir}/libvirt/schemas/storageencryption.rng
%{_datadir}/libvirt/schemas/nwfilter.rng
%{_datadir}/libvirt/schemas/basictypes.rng
+%{_datadir}/libvirt/schemas/networkcommon.rng
%{_datadir}/libvirt/cpu_map.xml
diff --git a/mingw32-libvirt.spec.in b/mingw32-libvirt.spec.in
index a8a39dade8..3958d33221 100644
--- a/mingw32-libvirt.spec.in
+++ b/mingw32-libvirt.spec.in
@@ -109,6 +109,7 @@ rm -rf $RPM_BUILD_ROOT
%{_mingw32_datadir}/libvirt/schemas/secret.rng
%{_mingw32_datadir}/libvirt/schemas/storageencryption.rng
%{_mingw32_datadir}/libvirt/schemas/basictypes.rng
+%{_mingw32_datadir}/libvirt/schemas/networkcommon.rng
%{_mingw32_datadir}/libvirt/cpu_map.xml
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e6944e5263..2373e97f1c 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -467,11 +467,6 @@ VIR_ENUM_IMPL(virDomainSeclabel, VIR_DOMAIN_SECLABEL_LAST,
"dynamic",
"static")
-VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
- "none",
- "802.1Qbg",
- "802.1Qbh")
-
VIR_ENUM_IMPL(virDomainClockOffset, VIR_DOMAIN_CLOCK_OFFSET_LAST,
"utc",
"localtime",
@@ -2591,146 +2586,6 @@ cleanup:
}
-static int
-virVirtualPortProfileParamsParseXML(xmlNodePtr node,
- virVirtualPortProfileParamsPtr virtPort)
-{
- int ret = -1;
- char *virtPortType;
- char *virtPortManagerID = NULL;
- char *virtPortTypeID = NULL;
- char *virtPortTypeIDVersion = NULL;
- char *virtPortInstanceID = NULL;
- char *virtPortProfileID = NULL;
- xmlNodePtr cur = node->children;
- const char *msg = NULL;
-
- virtPortType = virXMLPropString(node, "type");
- if (!virtPortType)
- return -1;
-
- while (cur != NULL) {
- if (xmlStrEqual(cur->name, BAD_CAST "parameters")) {
-
- virtPortManagerID = virXMLPropString(cur, "managerid");
- virtPortTypeID = virXMLPropString(cur, "typeid");
- virtPortTypeIDVersion = virXMLPropString(cur, "typeidversion");
- virtPortInstanceID = virXMLPropString(cur, "instanceid");
- virtPortProfileID = virXMLPropString(cur, "profileid");
-
- break;
- }
-
- cur = cur->next;
- }
-
- virtPort->virtPortType = VIR_VIRTUALPORT_NONE;
-
- switch (virVirtualPortTypeFromString(virtPortType)) {
-
- case VIR_VIRTUALPORT_8021QBG:
- if (virtPortManagerID != NULL && virtPortTypeID != NULL &&
- virtPortTypeIDVersion != NULL) {
- unsigned int val;
-
- if (virStrToLong_ui(virtPortManagerID, NULL, 0, &val)) {
- msg = _("cannot parse value of managerid parameter");
- goto err_exit;
- }
-
- if (val > 0xff) {
- msg = _("value of managerid out of range");
- goto err_exit;
- }
-
- virtPort->u.virtPort8021Qbg.managerID = (uint8_t)val;
-
- if (virStrToLong_ui(virtPortTypeID, NULL, 0, &val)) {
- msg = _("cannot parse value of typeid parameter");
- goto err_exit;
- }
-
- if (val > 0xffffff) {
- msg = _("value for typeid out of range");
- goto err_exit;
- }
-
- virtPort->u.virtPort8021Qbg.typeID = (uint32_t)val;
-
- if (virStrToLong_ui(virtPortTypeIDVersion, NULL, 0, &val)) {
- msg = _("cannot parse value of typeidversion parameter");
- goto err_exit;
- }
-
- if (val > 0xff) {
- msg = _("value of typeidversion out of range");
- goto err_exit;
- }
-
- virtPort->u.virtPort8021Qbg.typeIDVersion = (uint8_t)val;
-
- if (virtPortInstanceID != NULL) {
- if (virUUIDParse(virtPortInstanceID,
- virtPort->u.virtPort8021Qbg.instanceID)) {
- msg = _("cannot parse instanceid parameter as a uuid");
- goto err_exit;
- }
- } else {
- if (virUUIDGenerate(virtPort->u.virtPort8021Qbg.instanceID)) {
- msg = _("cannot generate a random uuid for instanceid");
- goto err_exit;
- }
- }
-
- virtPort->virtPortType = VIR_VIRTUALPORT_8021QBG;
- ret = 0;
- } else {
- msg = _("a parameter is missing for 802.1Qbg description");
- goto err_exit;
- }
- break;
-
- case VIR_VIRTUALPORT_8021QBH:
- if (virtPortProfileID != NULL) {
- if (virStrcpyStatic(virtPort->u.virtPort8021Qbh.profileID,
- virtPortProfileID) != NULL) {
- virtPort->virtPortType = VIR_VIRTUALPORT_8021QBH;
- ret = 0;
- } else {
- msg = _("profileid parameter too long");
- goto err_exit;
- }
- } else {
- msg = _("profileid parameter is missing for 802.1Qbh descripion");
- goto err_exit;
- }
- break;
-
-
- default:
- case VIR_VIRTUALPORT_NONE:
- case VIR_VIRTUALPORT_TYPE_LAST:
- msg = _("unknown virtualport type");
- goto err_exit;
- break;
- }
-
-err_exit:
-
- if (msg)
- virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", msg);
-
- VIR_FREE(virtPortManagerID);
- VIR_FREE(virtPortTypeID);
- VIR_FREE(virtPortTypeIDVersion);
- VIR_FREE(virtPortInstanceID);
- VIR_FREE(virtPortProfileID);
- VIR_FREE(virtPortType);
-
- return ret;
-}
-
-
/* Parse the XML definition for a network interface
* @param node XML nodeset to parse for net definition
* @return 0 on success, -1 on failure
@@ -2812,7 +2667,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
} else if (!virtPortParsed &&
(def->type == VIR_DOMAIN_NET_TYPE_DIRECT) &&
xmlStrEqual(cur->name, BAD_CAST "virtualport")) {
- if (virVirtualPortProfileParamsParseXML(cur, &virtPort))
+ if (virVirtualPortProfileParseXML(cur, &virtPort))
goto error;
virtPortParsed = true;
} else if ((network == NULL) &&
@@ -5319,49 +5174,6 @@ virDomainChrTargetTypeToString(int deviceType,
return type;
}
-static void
-virVirtualPortProfileFormat(virBufferPtr buf,
- virVirtualPortProfileParamsPtr virtPort,
- const char *indent)
-{
- char uuidstr[VIR_UUID_STRING_BUFLEN];
-
- if (virtPort->virtPortType == VIR_VIRTUALPORT_NONE)
- return;
-
- virBufferAsprintf(buf, "%s\n",
- indent,
- virVirtualPortTypeToString(virtPort->virtPortType));
-
- switch (virtPort->virtPortType) {
- case VIR_VIRTUALPORT_NONE:
- case VIR_VIRTUALPORT_TYPE_LAST:
- break;
-
- case VIR_VIRTUALPORT_8021QBG:
- virUUIDFormat(virtPort->u.virtPort8021Qbg.instanceID,
- uuidstr);
- virBufferAsprintf(buf,
- "%s \n",
- indent,
- virtPort->u.virtPort8021Qbg.managerID,
- virtPort->u.virtPort8021Qbg.typeID,
- virtPort->u.virtPort8021Qbg.typeIDVersion,
- uuidstr);
- break;
-
- case VIR_VIRTUALPORT_8021QBH:
- virBufferAsprintf(buf,
- "%s \n",
- indent,
- virtPort->u.virtPort8021Qbh.profileID);
- break;
- }
-
- virBufferAsprintf(buf, "%s\n", indent);
-}
-
int virDomainDiskIndexByName(virDomainDefPtr def, const char *name)
{
virDomainDiskDefPtr vdisk;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 938bb87e53..f96fbb9ffd 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -714,6 +714,8 @@ virSocketParseAddr;
virSocketParseIpv4Addr;
virSocketParseIpv6Addr;
virSocketSetPort;
+virVirtualPortProfileFormat;
+virVirtualPortProfileParseXML;
# network_conf.h
diff --git a/src/util/macvtap.c b/src/util/macvtap.c
index 8386f3b814..7b97c6af04 100644
--- a/src/util/macvtap.c
+++ b/src/util/macvtap.c
@@ -50,6 +50,7 @@
#include "util.h"
#include "macvtap.h"
+#include "network.h"
VIR_ENUM_IMPL(virMacvtapMode, VIR_MACVTAP_MODE_LAST,
"vepa",
@@ -1089,7 +1090,7 @@ vpAssociatePortProfileId(const char *macvtap_ifname,
VIR_DEBUG("%s: VM OPERATION: %s", __FUNCTION__, virVMOperationTypeToString(vmOp));
- if (vmOp == VIR_VM_OP_NO_OP)
+ if (!virtPort || vmOp == VIR_VM_OP_NO_OP)
return 0;
switch (virtPort->virtPortType) {
@@ -1145,6 +1146,9 @@ vpDisassociatePortProfileId(const char *macvtap_ifname,
VIR_DEBUG("%s: VM OPERATION: %s", __FUNCTION__, virVMOperationTypeToString(vmOp));
+ if (!virtPort)
+ return 0;
+
switch (virtPort->virtPortType) {
case VIR_VIRTUALPORT_NONE:
case VIR_VIRTUALPORT_TYPE_LAST:
diff --git a/src/util/macvtap.h b/src/util/macvtap.h
index 1b85989521..8e8613d619 100644
--- a/src/util/macvtap.h
+++ b/src/util/macvtap.h
@@ -25,15 +25,6 @@
# include
-
-enum virVirtualPortType {
- VIR_VIRTUALPORT_NONE,
- VIR_VIRTUALPORT_8021QBG,
- VIR_VIRTUALPORT_8021QBH,
-
- VIR_VIRTUALPORT_TYPE_LAST,
-};
-
/* the mode type for macvtap devices */
enum virMacvtapMode {
VIR_MACVTAP_MODE_VEPA,
@@ -44,31 +35,6 @@ enum virMacvtapMode {
VIR_MACVTAP_MODE_LAST,
};
-
-# ifdef IFLA_VF_PORT_PROFILE_MAX
-# define LIBVIRT_IFLA_VF_PORT_PROFILE_MAX IFLA_VF_PORT_PROFILE_MAX
-# else
-# define LIBVIRT_IFLA_VF_PORT_PROFILE_MAX 40
-# endif
-
-/* profile data for macvtap (VEPA) */
-typedef struct _virVirtualPortProfileParams virVirtualPortProfileParams;
-typedef virVirtualPortProfileParams *virVirtualPortProfileParamsPtr;
-struct _virVirtualPortProfileParams {
- enum virVirtualPortType virtPortType;
- union {
- struct {
- uint8_t managerID;
- uint32_t typeID; /* 24 bit valid */
- uint8_t typeIDVersion;
- unsigned char instanceID[VIR_UUID_BUFLEN];
- } virtPort8021Qbg;
- struct {
- char profileID[LIBVIRT_IFLA_VF_PORT_PROFILE_MAX];
- } virtPort8021Qbh;
- } u;
-};
-
enum virVMOperationType {
VIR_VM_OP_CREATE,
VIR_VM_OP_SAVE,
@@ -85,6 +51,7 @@ enum virVMOperationType {
# if WITH_MACVTAP
# include "internal.h"
+# include "network.h"
int openMacvtapTap(const char *ifname,
const unsigned char *macaddress,
@@ -119,7 +86,6 @@ int vpDisassociatePortProfileId(const char *macvtap_ifname,
# endif /* WITH_MACVTAP */
-VIR_ENUM_DECL(virVirtualPort)
VIR_ENUM_DECL(virVMOperation)
VIR_ENUM_DECL(virMacvtapMode)
diff --git a/src/util/network.c b/src/util/network.c
index eb16e0c254..c7b8fb3c36 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -12,6 +12,7 @@
#include
#include "memory.h"
+#include "uuid.h"
#include "network.h"
#include "util.h"
#include "virterror_internal.h"
@@ -674,3 +675,202 @@ virSocketAddrPrefixToNetmask(unsigned int prefix,
error:
return result;
}
+
+/* virtualPortProfile utilities */
+
+VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
+ "none",
+ "802.1Qbg",
+ "802.1Qbh")
+
+int
+virVirtualPortProfileParseXML(xmlNodePtr node,
+ virVirtualPortProfileParamsPtr virtPort)
+{
+ int ret = -1;
+ char *virtPortType;
+ char *virtPortManagerID = NULL;
+ char *virtPortTypeID = NULL;
+ char *virtPortTypeIDVersion = NULL;
+ char *virtPortInstanceID = NULL;
+ char *virtPortProfileID = NULL;
+ xmlNodePtr cur = node->children;
+
+ virtPortType = virXMLPropString(node, "type");
+ if (!virtPortType) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("missing virtualportprofile type"));
+ goto error;
+ }
+
+ while (cur != NULL) {
+ if (xmlStrEqual(cur->name, BAD_CAST "parameters")) {
+
+ virtPortManagerID = virXMLPropString(cur, "managerid");
+ virtPortTypeID = virXMLPropString(cur, "typeid");
+ virtPortTypeIDVersion = virXMLPropString(cur, "typeidversion");
+ virtPortInstanceID = virXMLPropString(cur, "instanceid");
+ virtPortProfileID = virXMLPropString(cur, "profileid");
+
+ break;
+ }
+
+ cur = cur->next;
+ }
+
+ virtPort->virtPortType = VIR_VIRTUALPORT_NONE;
+
+ switch (virVirtualPortTypeFromString(virtPortType)) {
+
+ case VIR_VIRTUALPORT_8021QBG:
+ if (virtPortManagerID != NULL && virtPortTypeID != NULL &&
+ virtPortTypeIDVersion != NULL) {
+ unsigned int val;
+
+ if (virStrToLong_ui(virtPortManagerID, NULL, 0, &val)) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot parse value of managerid parameter"));
+ goto error;
+ }
+
+ if (val > 0xff) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("value of managerid out of range"));
+ goto error;
+ }
+
+ virtPort->u.virtPort8021Qbg.managerID = (uint8_t)val;
+
+ if (virStrToLong_ui(virtPortTypeID, NULL, 0, &val)) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot parse value of typeid parameter"));
+ goto error;
+ }
+
+ if (val > 0xffffff) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("value for typeid out of range"));
+ goto error;
+ }
+
+ virtPort->u.virtPort8021Qbg.typeID = (uint32_t)val;
+
+ if (virStrToLong_ui(virtPortTypeIDVersion, NULL, 0, &val)) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot parse value of typeidversion parameter"));
+ goto error;
+ }
+
+ if (val > 0xff) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("value of typeidversion out of range"));
+ goto error;
+ }
+
+ virtPort->u.virtPort8021Qbg.typeIDVersion = (uint8_t)val;
+
+ if (virtPortInstanceID != NULL) {
+ if (virUUIDParse(virtPortInstanceID,
+ virtPort->u.virtPort8021Qbg.instanceID)) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot parse instanceid parameter as a uuid"));
+ goto error;
+ }
+ } else {
+ if (virUUIDGenerate(virtPort->u.virtPort8021Qbg.instanceID)) {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("cannot generate a random uuid for instanceid"));
+ goto error;
+ }
+ }
+
+ virtPort->virtPortType = VIR_VIRTUALPORT_8021QBG;
+ ret = 0;
+ } else {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("a parameter is missing for 802.1Qbg description"));
+ goto error;
+ }
+ break;
+
+ case VIR_VIRTUALPORT_8021QBH:
+ if (virtPortProfileID != NULL) {
+ if (virStrcpyStatic(virtPort->u.virtPort8021Qbh.profileID,
+ virtPortProfileID) != NULL) {
+ virtPort->virtPortType = VIR_VIRTUALPORT_8021QBH;
+ ret = 0;
+ } else {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("profileid parameter too long"));
+ goto error;
+ }
+ } else {
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("profileid parameter is missing for 802.1Qbh descripion"));
+ goto error;
+ }
+ break;
+
+
+ default:
+ case VIR_VIRTUALPORT_NONE:
+ case VIR_VIRTUALPORT_TYPE_LAST:
+ virSocketError(VIR_ERR_XML_ERROR, "%s",
+ _("unknown virtualport type"));
+ goto error;
+ break;
+ }
+
+error:
+ VIR_FREE(virtPortManagerID);
+ VIR_FREE(virtPortTypeID);
+ VIR_FREE(virtPortTypeIDVersion);
+ VIR_FREE(virtPortInstanceID);
+ VIR_FREE(virtPortProfileID);
+ VIR_FREE(virtPortType);
+
+ return ret;
+}
+
+void
+virVirtualPortProfileFormat(virBufferPtr buf,
+ virVirtualPortProfileParamsPtr virtPort,
+ const char *indent)
+{
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ if (!virtPort || virtPort->virtPortType == VIR_VIRTUALPORT_NONE)
+ return;
+
+ virBufferAsprintf(buf, "%s\n",
+ indent,
+ virVirtualPortTypeToString(virtPort->virtPortType));
+
+ switch (virtPort->virtPortType) {
+ case VIR_VIRTUALPORT_NONE:
+ case VIR_VIRTUALPORT_TYPE_LAST:
+ break;
+
+ case VIR_VIRTUALPORT_8021QBG:
+ virUUIDFormat(virtPort->u.virtPort8021Qbg.instanceID,
+ uuidstr);
+ virBufferAsprintf(buf,
+ "%s \n",
+ indent,
+ virtPort->u.virtPort8021Qbg.managerID,
+ virtPort->u.virtPort8021Qbg.typeID,
+ virtPort->u.virtPort8021Qbg.typeIDVersion,
+ uuidstr);
+ break;
+
+ case VIR_VIRTUALPORT_8021QBH:
+ virBufferAsprintf(buf,
+ "%s \n",
+ indent,
+ virtPort->u.virtPort8021Qbh.profileID);
+ break;
+ }
+
+ virBufferAsprintf(buf, "%s\n", indent);
+}
diff --git a/src/util/network.h b/src/util/network.h
index ed0b78c3b6..0fda3c1fa1 100644
--- a/src/util/network.h
+++ b/src/util/network.h
@@ -12,6 +12,8 @@
# define __VIR_NETWORK_H__
# include "internal.h"
+# include "buf.h"
+# include "util.h"
# include
# include
@@ -20,6 +22,7 @@
# endif
# include
# include
+# include
typedef struct {
union {
@@ -90,4 +93,47 @@ int virSocketAddrPrefixToNetmask(unsigned int prefix,
virSocketAddrPtr netmask,
int family);
+/* virtualPortProfile utilities */
+# ifdef IFLA_VF_PORT_PROFILE_MAX
+# define LIBVIRT_IFLA_VF_PORT_PROFILE_MAX IFLA_VF_PORT_PROFILE_MAX
+# else
+# define LIBVIRT_IFLA_VF_PORT_PROFILE_MAX 40
+# endif
+
+enum virVirtualPortType {
+ VIR_VIRTUALPORT_NONE,
+ VIR_VIRTUALPORT_8021QBG,
+ VIR_VIRTUALPORT_8021QBH,
+
+ VIR_VIRTUALPORT_TYPE_LAST,
+};
+
+VIR_ENUM_DECL(virVirtualPort)
+
+/* profile data for macvtap (VEPA) */
+typedef struct _virVirtualPortProfileParams virVirtualPortProfileParams;
+typedef virVirtualPortProfileParams *virVirtualPortProfileParamsPtr;
+struct _virVirtualPortProfileParams {
+ enum virVirtualPortType virtPortType;
+ union {
+ struct {
+ uint8_t managerID;
+ uint32_t typeID; /* 24 bit valid */
+ uint8_t typeIDVersion;
+ unsigned char instanceID[VIR_UUID_BUFLEN];
+ } virtPort8021Qbg;
+ struct {
+ char profileID[LIBVIRT_IFLA_VF_PORT_PROFILE_MAX];
+ } virtPort8021Qbh;
+ } u;
+};
+
+int
+virVirtualPortProfileParseXML(xmlNodePtr node,
+ virVirtualPortProfileParamsPtr virtPort);
+void
+virVirtualPortProfileFormat(virBufferPtr buf,
+ virVirtualPortProfileParamsPtr virtPort,
+ const char *indent);
+
#endif /* __VIR_NETWORK_H__ */