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