diff options
author | Alin Serdean <aserdean@cloudbasesolutions.com> | 2014-10-09 17:46:57 +0000 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2014-10-09 15:47:53 -0700 |
commit | 429d455615b010cebe9cf1fbcb10b5e20c08c21f (patch) | |
tree | 47a17b726d003d7af0ead977c74e4ec4c13d1e16 /datapath-windows/ovsext/Vport.h | |
parent | 91c261cd0efc40f7ed70427441141656cf5a3932 (diff) | |
download | openvswitch-429d455615b010cebe9cf1fbcb10b5e20c08c21f.tar.gz |
datapath-windows: Make VPORT ovs number values smaller than MAXUINT16
For this, the old method of finding vports based on the
ovs port numbers is removed. Now, the lookup of a vport
by ovs port number is done the same way as the lookup by
hyper-v switch port id.
This is done so that the kernel is able to interact with
the userspace correctly when using vport channels.
The problem manifested in lib/dpif-netlink.c, at the function
vport_add_channels.
This patch removes the field vportArray from OVS_SWITCH_CONTEXT.
In its place, portNoHashArray is set. In the OVS_VPORT_ENTRY
struct, we also add portNoLink. This new method will do lookup
and insertions of vports by ovs (datapath) port numbers the same
way it is done for hyper-v switch port ids.
This patch implicitly removes the indexes, which were previously
used in insertions and lookups on ovs port numbers. The removal
of the index also means that the vxlan vport can no longer be
looked up the same way as it was done before: now we hold a pointer
to it, vxlanVport in OVS_SWITCH_CONTEXT. For the moment, we can
have only one vxlan vport. When more will be allowed, this field
will turn into a list of vxlan ports.
The invalid port number value (held in OVS_DPPORT_NUMBER_INVALID)
is now changed from 0 to MAXUINT16, the same as it is on linux.
The function OvsComputeVportNo has also been removed, since the
computation of a vport port number can no longer be done like this.
When vport add will be added, a new, updated OvsComputeVportNo
function will be added.
Also, in OvsInitVportCommon, we no longer need to (and no longer can)
initialize vport->ovsName, nor vport->ovsNameLen, because they will
be initialized by the netlink command vport add. Since the netlink
command vport add will generate numbers for the datapath (ovs) port
numbers and set the port names, we cannot insert the vport into the
hash array of port numbers here, nor into the hash array of port names.
Signed-off-by: Samuel Ghinet <sghinet@cloudbasesolutions.com>
Co-authored-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Acked-by: Ankur Sharma <ankursharma@vmware.com>
Acked-by: Eitan Eliahu <eliahue@vmware.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Tested-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/ovsext/Vport.h')
-rw-r--r-- | datapath-windows/ovsext/Vport.h | 56 |
1 files changed, 13 insertions, 43 deletions
diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h index b6d3776ed..077df7764 100644 --- a/datapath-windows/ovsext/Vport.h +++ b/datapath-windows/ovsext/Vport.h @@ -19,7 +19,18 @@ #include "Switch.h" -#define OVS_DPPORT_NUMBER_INVALID 0 +#define OVS_MAX_DPPORTS MAXUINT16 +#define OVS_DPPORT_NUMBER_INVALID OVS_MAX_DPPORTS +/* + * The local port (0) is a reserved port, that is not allowed to be be + * created by the netlink command vport add. On linux, this port is created + * at netlink command datapath new. However, on windows, we do not need to + * create it, and more, we shouldn't. The userspace attempts to create two + * internal vports, the LOCAL port (0) and the internal port (with any other + * port number). The non-LOCAL internal port is used in the userspace when it + * requests the internal port. + */ +#define OVS_DPPORT_NUMBER_LOCAL 0 /* * A Vport, or Virtual Port, is a port on the OVS. It can be one of the @@ -67,6 +78,7 @@ typedef struct _OVS_VPORT_FULL_STATS { typedef struct _OVS_VPORT_ENTRY { LIST_ENTRY ovsNameLink; LIST_ENTRY portIdLink; + LIST_ENTRY portNoLink; OVS_VPORT_STATE ovsState; OVS_VPORT_TYPE ovsType; @@ -99,9 +111,6 @@ typedef struct _OVS_VPORT_ENTRY { struct _OVS_SWITCH_CONTEXT; -#define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \ - ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff) - POVS_VPORT_ENTRY OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext, UINT32 portNo); @@ -135,11 +144,6 @@ VOID HvDeleteNic(POVS_SWITCH_CONTEXT switchContext, VOID HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, PNDIS_SWITCH_NIC_PARAMETERS nicParam); -UINT32 OvsComputeVportNo(POVS_SWITCH_CONTEXT switchContext, - UINT32 nicIndex, - OVS_VPORT_TYPE ovsType, - BOOLEAN isExternal); - static __inline BOOLEAN OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType) { @@ -154,40 +158,6 @@ OvsIsInternalVportType(OVS_VPORT_TYPE ovsType) return ovsType == OVS_VPORT_TYPE_INTERNAL; } -static __inline BOOLEAN -OvsIsTunnelVportNo(UINT32 portNo) -{ - UINT32 idx = OVS_VPORT_INDEX(portNo); - return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END); -} - -static __inline BOOLEAN -OvsIsVifVportNo(UINT32 portNo) -{ - UINT32 idx = OVS_VPORT_INDEX(portNo); - return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX); -} - -static __inline POVS_VPORT_ENTRY -OvsGetTunnelVport(OVS_VPORT_TYPE type) -{ - ASSERT(OvsIsTunnelVportType(type)); - switch(type) { - case OVS_VPORT_TYPE_VXLAN: - return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX); - default: - ASSERT(! "OvsGetTunnelVport not implemented for this tunnel."); - } - - return NULL; -} - -static __inline PVOID -OvsGetVportPriv(OVS_VPORT_TYPE type) -{ - return OvsGetTunnelVport(type)->priv; -} - static __inline UINT32 OvsGetExternalMtu() { |