[ovs-dev] [PATCH 3/4 v2] datapath-windows: Use l2 port and tunkey during execute
Sairam Venugopal
vsairam at vmware.com
Tue May 17 18:05:10 UTC 2016
Acked-by: Sairam Venugopal <vsairam at vmware.com>
On 5/17/16, 10:15 AM, "Nithin Raju" <nithin at vmware.com> wrote:
>While testing DFW and recirc code it was found that userspace
>was calling into packet execute with the tunnel key and the
>vport added as part of the execute structure. We were not passing
>this along to the code that executes actions. The right thing is
>to contruct the key based on all of the attributes sent down from
>userspace.
>
>Signed-off-by: Nithin Raju <nithin at vmware.com>
>---
> datapath-windows/ovsext/User.c | 32 ++++++++++++++++++++++++++++++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
>diff --git a/datapath-windows/ovsext/User.c
>b/datapath-windows/ovsext/User.c
>index 3b3f662..2312940 100644
>--- a/datapath-windows/ovsext/User.c
>+++ b/datapath-windows/ovsext/User.c
>@@ -51,6 +51,8 @@ static VOID _MapNlAttrToOvsPktExec(PNL_MSG_HDR
>nlMsgHdr, PNL_ATTR *nlAttrs,
> OvsPacketExecute *execute);
> extern NL_POLICY nlFlowKeyPolicy[];
> extern UINT32 nlFlowKeyPolicyLen;
>+extern NL_POLICY nlFlowTunnelKeyPolicy[];
>+extern UINT32 nlFlowTunnelKeyPolicyLen;
>
> static __inline VOID
> OvsAcquirePidHashLock()
>@@ -375,6 +377,7 @@ _MapNlAttrToOvsPktExec(PNL_MSG_HDR nlMsgHdr, PNL_ATTR
>*nlAttrs,
> execute->actions = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
> execute->actionsLen =
>NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
>
>+ ASSERT(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
> execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
> execute->keyAttrs = keyAttrs;
> }
>@@ -391,6 +394,8 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
> OvsFlowKey key = { 0 };
> OVS_PACKET_HDR_INFO layers = { 0 };
> POVS_VPORT_ENTRY vport = NULL;
>+ PNL_ATTR tunnelAttrs[__OVS_TUNNEL_KEY_ATTR_MAX];
>+ OvsFlowKey tempTunKey = {0};
>
> if (execute->packetLen == 0) {
> status = STATUS_INVALID_PARAMETER;
>@@ -428,8 +433,31 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
> goto dropit;
> }
>
>- ndisStatus = OvsExtractFlow(pNbl, fwdDetail->SourcePortId, &key,
>&layers,
>- NULL);
>+ if (execute->keyAttrs[OVS_KEY_ATTR_TUNNEL]) {
>+ UINT32 tunnelKeyAttrOffset;
>+
>+ tunnelKeyAttrOffset = (UINT32)((PCHAR)
>+ (execute->keyAttrs[OVS_KEY_ATTR_TUNNEL])
>+ - (PCHAR)execute->nlMsgHdr);
>+
>+ /* Get tunnel keys attributes */
>+ if ((NlAttrParseNested(execute->nlMsgHdr, tunnelKeyAttrOffset,
>+
>NlAttrLen(execute->keyAttrs[OVS_KEY_ATTR_TUNNEL]),
>+ nlFlowTunnelKeyPolicy,
>nlFlowTunnelKeyPolicyLen,
>+ tunnelAttrs, ARRAY_SIZE(tunnelAttrs)))
>+ != TRUE) {
>+ OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p",
>+ execute->nlMsgHdr);
>+ status = STATUS_INVALID_PARAMETER;
>+ goto dropit;
>+ }
>+
>+ MapTunAttrToFlowPut(execute->keyAttrs, tunnelAttrs, &tempTunKey);
>+ }
>+
>+ ndisStatus = OvsExtractFlow(pNbl, execute->inPort, &key, &layers,
>+ tempTunKey.tunKey.dst == 0 ? NULL :
>&tempTunKey.tunKey);
>+
> if (ndisStatus == NDIS_STATUS_SUCCESS) {
> NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock,
>&lockState, 0);
> ndisStatus = OvsActionsExecute(gOvsSwitchContext, NULL, pNbl,
>--
>2.7.1.windows.1
>
>_______________________________________________
>dev mailing list
>dev at openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=mE4pOA9uAtGpEoievwTcJydab3Jw-7
>6Vpblw52FhsEg&s=fEjTj2Ex5CHB7kiq7yCe0M4z6DRiCQcuYW4IwwStBiw&e=
More information about the dev
mailing list