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__ */