On Sun, Aug 19, 2012 at 8:35 PM, Laine Stump <laine(a)laine.org> wrote:
On 08/18/2012 07:46 AM, Matthias Bolte wrote:
> ---
> src/esx/esx_network_driver.c | 38 +++++++++++++++++++++++++++++++++-----
> 1 files changed, 33 insertions(+), 5 deletions(-)
>
> diff --git a/src/esx/esx_network_driver.c b/src/esx/esx_network_driver.c
> index 09d46d3..2f5f1ab 100644
> --- a/src/esx/esx_network_driver.c
> +++ b/src/esx/esx_network_driver.c
> @@ -489,7 +489,16 @@ esxNetworkDefineXML(virConnectPtr conn, const char *xml)
> goto cleanup;
> }
>
> - hostPortGroupSpec->vlanId->value = 0;
> + if (def->portGroups[i].vlan.trunk) {
> + hostPortGroupSpec->vlanId->value = 4095;
> + } else if (def->portGroups[i].vlan.nTags == 1) {
> + hostPortGroupSpec->vlanId->value =
*def->portGroups[i].vlan.tag;
> + } else if (def->portGroups[i].vlan.nTags > 1) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Can apply one VLAN tag per port group
only"));
> + } else {
> + hostPortGroupSpec->vlanId->value = 0;
> + }
So in vmware you can specify that a port is to be used for trunking,
(and you do that by specifying a tag of 4095), but can't limit the list
of tags to allow - is that correct?
The parser (and the RNG) currently requires at least one <tag> element
in any <vlan> element. It sounds like we need to change that.
Kyle or Ansis - does it make sense for Open vSwitch to have a port
specified with trunk=yes and no list of specific tags?
If port type is not explicitly specified as access port (a.k.a. tagged-port),
then Open vSwitch will assume that this is a trunk port.
Also, if trunk list is empty, then Open vSwitch would interpret that as
"trunk all VLANs".
So, I guess, the answer would be "yes", if you want following
configuration:
...
<vlan trunk='yes'>
</vlan>
...
to become alias for "no vlan configuration specified at all" case?
Aside from this, you are interpreting the <vlan> element in portgroups,
but not the overlying <vlan> for the entire network (in practice this is
what would be used if no portgroup was chosen, and no vlan info came
from the domain's interface definition). If there isn't any practical
way to implement this, you should check for it and log a
CONFIG_UNSUPPORTED error if found.
>
> if (def->portGroups[i].bandwidth != NULL) {
> if (esxBandwidthToShapingPolicy
> @@ -695,6 +704,7 @@ esxNetworkGetXMLDesc(virNetworkPtr network_, unsigned int flags)
> esxVI_String *hostPortGroupKey = NULL;
> esxVI_String *networkName = NULL;
> virNetworkDefPtr def;
> + virPortGroupDefPtr portGroup = NULL;
>
> if (esxVI_EnsureSession(priv->primary) < 0) {
> return NULL;
> @@ -824,9 +834,12 @@ esxNetworkGetXMLDesc(virNetworkPtr network_, unsigned int
flags)
> for (networkName = networkNameList; networkName != NULL;
> networkName = networkName->_next) {
> if (STREQ(networkName->value,
hostPortGroup->spec->name)) {
> - def->portGroups[def->nPortGroups].name =
strdup(networkName->value);
> + portGroup =
&def->portGroups[def->nPortGroups];
> + ++def->nPortGroups;
> +
> + portGroup->name = strdup(networkName->value);
>
> - if (def->portGroups[def->nPortGroups].name ==
NULL) {
> + if (portGroup->name == NULL) {
> virReportOOMError();
> goto cleanup;
> }
> @@ -834,13 +847,28 @@ esxNetworkGetXMLDesc(virNetworkPtr network_, unsigned int
flags)
> if (hostPortGroup->spec->policy != NULL) {
> if (esxShapingPolicyToBandwidth
>
(hostPortGroup->spec->policy->shapingPolicy,
> -
&def->portGroups[def->nPortGroups].bandwidth) < 0) {
> + &portGroup->bandwidth) < 0) {
> ++def->nPortGroups;
> goto cleanup;
> }
> }
>
> - ++def->nPortGroups;
> + if (hostPortGroup->spec->vlanId->value > 0)
{
> + if (hostPortGroup->spec->vlanId->value ==
4095) {
> + portGroup->vlan.trunk = true;
> + }
> +
> + portGroup->vlan.nTags = 1;
> +
> + if (VIR_ALLOC_N(portGroup->vlan.tag, 1) < 0)
{
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> + *portGroup->vlan.tag =
> + hostPortGroup->spec->vlanId->value;
> + }
> +
> break;
> }
> }