From: Alin Serdean Date: Thu, 17 Sep 2015 14:54:07 +0000 (+0000) Subject: datapath-windows: Output to multiple VXLAN ports X-Git-Tag: v2.5.0~558 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=ba4724916d37ffbbc04686cee8892a7dfed2d829 datapath-windows: Output to multiple VXLAN ports If we have a flow rule of the following form: actions=strip_vlan,set_tunnel:0x3e9,15,16,17 (Where port 15, 16 and 17 are VXLAN OF ports with different tunnelling information) Current implementation is that if a packet will hit that specific flow, only one packet will be sent out with the first tunnelling information. This patch saves the initial packet source port for further use of the currently implemented pipeline and ignores the latter if it is the last tunnelling port. Signed-off-by: Alin Gabriel Serdean Acked-by: Nithin Raju Acked-by: Sairam Venugopal Acked-by: Sorin Vinturis Signed-off-by: Ben Pfaff --- diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index c8de7c5f6..bfe5d7fb1 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -947,7 +947,6 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx) { PNET_BUFFER_LIST newNbl; NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PNET_BUFFER nb; /* * Create a copy and work on the copy after this point. The original NBL is @@ -967,14 +966,14 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx) * XXX Head room needs to include the additional encap. * XXX copySize check is not considering multiple NBs. */ - nb = NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl); newNbl = OvsPartialCopyNBL(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl, 0, 0, TRUE /*copy NBL info*/); ASSERT(ovsFwdCtx->destPortsSizeOut > 0 || ovsFwdCtx->tunnelTxNic != NULL || ovsFwdCtx->tunnelRxNic != NULL); - /* Send the original packet out */ + /* Send the original packet out and save the original source port number */ + UINT32 tempVportNo = ovsFwdCtx->srcVportNo; status = OvsOutputForwardingCtx(ovsFwdCtx); ASSERT(ovsFwdCtx->curNbl == NULL); ASSERT(ovsFwdCtx->destPortsSizeOut == 0); @@ -992,7 +991,7 @@ OvsOutputBeforeSetAction(OvsForwardingContext *ovsFwdCtx) OvsCompleteNBL(ovsFwdCtx->switchContext, newNbl, TRUE); } else { status = OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext, - newNbl, ovsFwdCtx->srcVportNo, 0, + newNbl, tempVportNo, 0, NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl), ovsFwdCtx->completionList, &ovsFwdCtx->layers, FALSE);