[ovs-dev] [PATCH v5 5/5] datapath-windows: Fragment NBL based on MRU size

Anand Kumar kumaranand at vmware.com
Thu Feb 2 18:55:38 UTC 2017


This patch adds support for Fragmenting NBL based on the MRU value.
MRU value is updated only for Ipv4 fragments, if it is non zero, then
fragment the NBL and send out the new NBL to the vnic.

Signed-off-by: Anand Kumar <kumaranand at vmware.com>
---
v4->v5:
	- Use MRU information in the _OVS_BUFFER_CONTEXT to fragment NBL.
v3->v4: No Change
v2->v3:
	- Updated log message
v1->v2: No change
---
 datapath-windows/ovsext/Actions.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 3dea9a9..1a67d2b 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -34,6 +34,7 @@
 #include "Vport.h"
 #include "Vxlan.h"
 #include "Geneve.h"
+#include "IpFragment.h"
 
 #ifdef OVS_DBG_MOD
 #undef OVS_DBG_MOD
@@ -864,6 +865,8 @@ OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx)
     NDIS_STATUS status = STATUS_SUCCESS;
     POVS_SWITCH_CONTEXT switchContext = ovsFwdCtx->switchContext;
     PCWSTR dropReason;
+    PNET_BUFFER_LIST fragNbl = NULL;
+    POVS_BUFFER_CONTEXT ctx;
 
     /*
      * Handle the case where the some of the destination ports are tunneled
@@ -909,6 +912,30 @@ OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx)
             goto dropit;
         }
 
+        ctx = (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(ovsFwdCtx->curNbl);
+        if (ctx->mru != 0) {
+            /* Fragment nbl based on mru. If it returns NULL then the original
+             * reassembled NBL is sent out to the VIF which will be dropped if
+             * the packet size is more than VIF MTU.
+             */
+            fragNbl = OvsFragmentNBL(ovsFwdCtx->switchContext,
+                                     ovsFwdCtx->curNbl,
+                                     &(ovsFwdCtx->layers),
+                                     ctx->mru, 0, TRUE);
+            if (fragNbl != NULL) {
+                OvsCompleteNBLForwardingCtx(ovsFwdCtx,
+                                            L"Dropped since fragmenting NBL");
+                status = OvsInitForwardingCtx(ovsFwdCtx,
+                                              ovsFwdCtx->switchContext,
+                                              fragNbl,
+                                              ovsFwdCtx->srcVportNo,
+                                              ovsFwdCtx->sendFlags,
+                                              NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(fragNbl),
+                                              ovsFwdCtx->completionList,
+                                              &ovsFwdCtx->layers, FALSE);
+            }
+        }
+
         OvsSendNBLIngress(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl,
                           ovsFwdCtx->sendFlags);
         /* End this pipeline by resetting the corresponding context. */
-- 
2.9.3.windows.1



More information about the dev mailing list