Skip to content

Commit

Permalink
datapath-windows: Add GRE TEB support for windows datapath
Browse files Browse the repository at this point in the history
This patch introduces the support for GRE TEB (trasparent ethernet bridging)
for the windows datapath.

The GRE support is based on http://tools.ietf.org/html/rfc2890, without
taking into account the GRE sequence, and it supports only the GRE protocol
type 6558 (trasparent ethernet bridging) like its linux counterpart.

Util.h: define the GRE pool tag
Vport.c/h: sort the includes alphabetically
           add the function OvsFindTunnelVportByPortType which searches the
           tunnelVportsArray for a given port type
Actions.c : sort the includes alphabetically
            call the GRE encapsulation / decapsulation functions when needed
Gre.c/h : add GRE type defines
          add initialization/cleanup functions
          add encapsulation / decapsulation functions with software offloads
          (hardware offloads will be added in a separate patch)
          support

Tested using: PSPING
              (https://technet.microsoft.com/en-us/sysinternals/psping.aspx)
              (ICMP, TCP, UDP) with various packet lengths
              IPERF3
              (https://iperf.fr/iperf-download.php)
              (TCP, UDP) with various options

Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Acked-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Signed-off-by: Justin Pettit <jpettit@ovn.org>
  • Loading branch information
Alin Serdean authored and justinpettit committed Dec 11, 2015
1 parent 473ae23 commit b630bdf
Show file tree
Hide file tree
Showing 9 changed files with 657 additions and 45 deletions.
2 changes: 1 addition & 1 deletion FAQ.md
Expand Up @@ -197,7 +197,7 @@ Feature | Linux upstream | Linux OVS tree | Userspace | Hyper-V |
Connection tracking | 4.3 | 3.10 | NO | NO |
Tunnel - LISP | NO | YES | NO | NO |
Tunnel - STT | NO | 3.5 | NO | YES |
Tunnel - GRE | 3.11 | YES | YES | NO |
Tunnel - GRE | 3.11 | YES | YES | YES |
Tunnel - VXLAN | 3.12 | YES | YES | YES |
Tunnel - Geneve | 3.18 | YES | YES | NO |
QoS - Policing | YES | YES | NO | NO |
Expand Down
20 changes: 11 additions & 9 deletions datapath-windows/automake.mk
Expand Up @@ -4,45 +4,49 @@ EXTRA_DIST += \
datapath-windows/Package/package.VcxProj \
datapath-windows/Package/package.VcxProj.user \
datapath-windows/include/OvsDpInterfaceExt.h \
datapath-windows/misc/OVS.psm1 \
datapath-windows/misc/install.cmd \
datapath-windows/misc/uninstall.cmd \
datapath-windows/misc/OVS.psm1 \
datapath-windows/ovsext.sln \
datapath-windows/ovsext/Datapath.c \
datapath-windows/ovsext/Datapath.h \
datapath-windows/ovsext/DpInternal.h\
datapath-windows/ovsext/Actions.c \
datapath-windows/ovsext/Atomic.h \
datapath-windows/ovsext/BufferMgmt.c \
datapath-windows/ovsext/BufferMgmt.h \
datapath-windows/ovsext/Checksum.c \
datapath-windows/ovsext/Checksum.h \
datapath-windows/ovsext/Datapath.c \
datapath-windows/ovsext/Datapath.h \
datapath-windows/ovsext/Debug.c \
datapath-windows/ovsext/Debug.h \
datapath-windows/ovsext/DpInternal.h\
datapath-windows/ovsext/Driver.c \
datapath-windows/ovsext/Ethernet.h \
datapath-windows/ovsext/Event.c \
datapath-windows/ovsext/Event.h \
datapath-windows/ovsext/Flow.c \
datapath-windows/ovsext/Flow.h \
datapath-windows/ovsext/Gre.h \
datapath-windows/ovsext/Gre.c \
datapath-windows/ovsext/IpHelper.c \
datapath-windows/ovsext/IpHelper.h \
datapath-windows/ovsext/Jhash.c \
datapath-windows/ovsext/Jhash.h \
datapath-windows/ovsext/NetProto.h \
datapath-windows/ovsext/Netlink/Netlink.c \
datapath-windows/ovsext/Netlink/Netlink.h \
datapath-windows/ovsext/Netlink/NetlinkBuf.c \
datapath-windows/ovsext/Netlink/NetlinkBuf.h \
datapath-windows/ovsext/Netlink/NetlinkError.h \
datapath-windows/ovsext/Netlink/NetlinkProto.h \
datapath-windows/ovsext/NetProto.h \
datapath-windows/ovsext/Oid.c \
datapath-windows/ovsext/Oid.h \
datapath-windows/ovsext/PacketIO.c \
datapath-windows/ovsext/PacketIO.h \
datapath-windows/ovsext/PacketParser.c \
datapath-windows/ovsext/PacketParser.h \
datapath-windows/ovsext/Switch.c \
datapath-windows/ovsext/Stt.c \
datapath-windows/ovsext/Stt.h \
datapath-windows/ovsext/Switch.c \
datapath-windows/ovsext/Switch.h \
datapath-windows/ovsext/Tunnel.c \
datapath-windows/ovsext/Tunnel.h \
Expand All @@ -51,13 +55,11 @@ EXTRA_DIST += \
datapath-windows/ovsext/Types.h \
datapath-windows/ovsext/User.c \
datapath-windows/ovsext/User.h \
datapath-windows/ovsext/Util.c \
datapath-windows/ovsext/Util.c \
datapath-windows/ovsext/Util.h \
datapath-windows/ovsext/Vport.c \
datapath-windows/ovsext/Vport.h \
datapath-windows/ovsext/Vxlan.c \
datapath-windows/ovsext/Stt.h \
datapath-windows/ovsext/Stt.c \
datapath-windows/ovsext/Vxlan.h \
datapath-windows/ovsext/ovsext.inf \
datapath-windows/ovsext/ovsext.rc \
Expand Down
71 changes: 47 additions & 24 deletions datapath-windows/ovsext/Actions.c
Expand Up @@ -16,16 +16,17 @@

#include "precomp.h"

#include "Switch.h"
#include "Vport.h"
#include "Checksum.h"
#include "Event.h"
#include "User.h"
#include "NetProto.h"
#include "Flow.h"
#include "Vxlan.h"
#include "Stt.h"
#include "Checksum.h"
#include "Gre.h"
#include "NetProto.h"
#include "PacketIO.h"
#include "Stt.h"
#include "Switch.h"
#include "User.h"
#include "Vport.h"
#include "Vxlan.h"

#ifdef OVS_DBG_MOD
#undef OVS_DBG_MOD
Expand All @@ -34,6 +35,8 @@
#include "Debug.h"

typedef struct _OVS_ACTION_STATS {
UINT64 rxGre;
UINT64 txGre;
UINT64 rxVxlan;
UINT64 txVxlan;
UINT64 rxStt;
Expand Down Expand Up @@ -205,27 +208,35 @@ OvsDetectTunnelRxPkt(OvsForwardingContext *ovsFwdCtx,
/* XXX: we should also check for the length of the UDP payload to pick
* packets only if they are at least VXLAN header size.
*/
if (!flowKey->ipKey.nwFrag &&
flowKey->ipKey.nwProto == IPPROTO_UDP) {
UINT16 dstPort = ntohs(flowKey->ipKey.l4.tpDst);
tunnelVport = OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
dstPort,
OVS_VPORT_TYPE_VXLAN);
if (tunnelVport) {
ovsActionStats.rxVxlan++;
}
} else if (!flowKey->ipKey.nwFrag &&
flowKey->ipKey.nwProto == IPPROTO_TCP) {
if (!flowKey->ipKey.nwFrag) {
UINT16 dstPort = htons(flowKey->ipKey.l4.tpDst);
tunnelVport = OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
dstPort,
OVS_VPORT_TYPE_STT);
if (tunnelVport) {
ovsActionStats.rxStt++;
switch (flowKey->ipKey.nwProto) {
case IPPROTO_GRE:
tunnelVport = OvsFindTunnelVportByPortType(ovsFwdCtx->switchContext,
OVS_VPORT_TYPE_GRE);
if (tunnelVport) {
ovsActionStats.rxGre++;
}
break;
case IPPROTO_TCP:
tunnelVport = OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
dstPort,
OVS_VPORT_TYPE_STT);
if (tunnelVport) {
ovsActionStats.rxStt++;
}
break;
case IPPROTO_UDP:
tunnelVport = OvsFindTunnelVportByDstPort(ovsFwdCtx->switchContext,
dstPort,
OVS_VPORT_TYPE_VXLAN);
if (tunnelVport) {
ovsActionStats.rxVxlan++;
}
break;
}
}


// We might get tunnel packets even before the tunnel gets initialized.
if (tunnelVport) {
ASSERT(ovsFwdCtx->tunnelRxNic == NULL);
Expand Down Expand Up @@ -306,6 +317,9 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
/* Tunnel the packet only if tunnel context is set. */
if (ovsFwdCtx->tunKey.dst != 0) {
switch(dstVport->ovsType) {
case OVS_VPORT_TYPE_GRE:
ovsActionStats.txGre++;
break;
case OVS_VPORT_TYPE_VXLAN:
ovsActionStats.txVxlan++;
break;
Expand Down Expand Up @@ -652,6 +666,11 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx)

/* Do the encap. Encap function does not consume the NBL. */
switch(ovsFwdCtx->tunnelTxNic->ovsType) {
case OVS_VPORT_TYPE_GRE:
status = OvsEncapGre(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
&ovsFwdCtx->tunKey, ovsFwdCtx->switchContext,
&ovsFwdCtx->layers, &newNbl);
break;
case OVS_VPORT_TYPE_VXLAN:
status = OvsEncapVxlan(ovsFwdCtx->tunnelTxNic, ovsFwdCtx->curNbl,
&ovsFwdCtx->tunKey, ovsFwdCtx->switchContext,
Expand Down Expand Up @@ -724,6 +743,10 @@ OvsTunnelPortRx(OvsForwardingContext *ovsFwdCtx)
*/

switch(tunnelRxVport->ovsType) {
case OVS_VPORT_TYPE_GRE:
status = OvsDecapGre(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl,
&ovsFwdCtx->tunKey, &newNbl);
break;
case OVS_VPORT_TYPE_VXLAN:
status = OvsDecapVxlan(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl,
&ovsFwdCtx->tunKey, &newNbl);
Expand Down

0 comments on commit b630bdf

Please sign in to comment.