Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>

> -----Mesaj original-----
> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Nithin Raju
> Trimis: Tuesday, May 17, 2016 8:15 PM
> Către: dev@openvswitch.org
> Subiect: [ovs-dev] [PATCH 3/4 v2] datapath-windows: Use l2 port and tunkey
> during execute
> 
> 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 <nit...@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@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to