Acked-by: Alin Gabriel Serdean <[email protected]>

> -----Original Message-----
> From: [email protected] [mailto:ovs-dev-
> [email protected]] On Behalf Of Anand Kumar
> Sent: Friday, May 5, 2017 1:13 AM
> To: [email protected]
> Subject: [ovs-dev] [PATCH v8 2/5] datapath-windows: Added Ipv4 fragments
> support in Conntrack
> 
> This patch adds support for tracking Ipv4 fragments in conntrack module.
> Individual fragments are not tracked and are consumed by the
> fragmentation/reassembly. Only the reassembled Ipv4 datagram is tracked
> and treated as a single ct entry.
> 
> Signed-off-by: Anand Kumar <[email protected]>
> ---
> v7->v8: No change
> v6->v7: Made changes to use FowardingCtx and initialize forwarding ctx
>               for the reassembled packet
> v5->v6: No Change
> v4->v5:
>       - Removed MRU argument from function declarations as MRU is now
> retained
>       in _OVS_BUFFER_CONTEXT.
> v3->v4: No Change
> v2->v3:
>       - Updated log messages and fixed alignment.
> v1->v2: No change
> ---
>  datapath-windows/ovsext/Actions.c   | 21 +++++++++++++++++++--
>  datapath-windows/ovsext/Conntrack.c | 23 ++++++++++++++++-------
>  2 files changed, 35 insertions(+), 9 deletions(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-
> windows/ovsext/Actions.c
> index 3bd00a7..b5c13c7 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -1975,12 +1975,29 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT
> switchContext,
>                  }
>              }
> 
> +            PNET_BUFFER_LIST oldNbl = ovsFwdCtx.curNbl;
>              status = OvsExecuteConntrackAction(&ovsFwdCtx, key,
>                                                 (const PNL_ATTR)a);
>              if (status != NDIS_STATUS_SUCCESS) {
> -                OVS_LOG_ERROR("CT Action failed");
> -                dropReason = L"OVS-conntrack action failed";
> +                /* Pending NBLs are consumed by Defragmentation. */
> +                if (status != NDIS_STATUS_PENDING) {
> +                    OVS_LOG_ERROR("CT Action failed");
> +                    dropReason = L"OVS-conntrack action failed";
> +                }
>                  goto dropit;
> +            } else if (oldNbl != ovsFwdCtx.curNbl) {
> +               /*
> +                * OvsIpv4Reassemble consumes the original NBL and creates a
> +                * new one and assigns it to the curNbl of ovsFwdCtx.
> +                */
> +               OvsInitForwardingCtx(&ovsFwdCtx,
> +                                    ovsFwdCtx.switchContext,
> +                                    ovsFwdCtx.curNbl,
> +                                    ovsFwdCtx.srcVportNo,
> +                                    ovsFwdCtx.sendFlags,
> +
> NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(ovsFwdCtx.curNbl),
> +                                    ovsFwdCtx.completionList,
> +                                    &ovsFwdCtx.layers, FALSE);
>              }
>              break;
>          }
> diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-
> windows/ovsext/Conntrack.c
> index 8658910..dce0c1b 100644
> --- a/datapath-windows/ovsext/Conntrack.c
> +++ b/datapath-windows/ovsext/Conntrack.c
> @@ -15,6 +15,7 @@
>   */
> 
>  #include "Conntrack.h"
> +#include "IpFragment.h"
>  #include "Jhash.h"
>  #include "PacketParser.h"
>  #include "Event.h"
> @@ -317,13 +318,20 @@ OvsCtEntryExpired(POVS_CT_ENTRY entry)  }
> 
>  static __inline NDIS_STATUS
> -OvsDetectCtPacket(OvsFlowKey *key)
> +OvsDetectCtPacket(OvsForwardingContext *fwdCtx,
> +                  OvsFlowKey *key,
> +                  PNET_BUFFER_LIST *newNbl)
>  {
>      /* Currently we support only Unfragmented TCP packets */
>      switch (ntohs(key->l2.dlType)) {
>      case ETH_TYPE_IPV4:
>          if (key->ipKey.nwFrag != OVS_FRAG_TYPE_NONE) {
> -            return NDIS_STATUS_NOT_SUPPORTED;
> +            return OvsProcessIpv4Fragment(fwdCtx->switchContext,
> +                                          &fwdCtx->curNbl,
> +                                          fwdCtx->completionList,
> +                                          fwdCtx->fwdDetail->SourcePortId,
> +                                          key->tunKey.tunnelId,
> +                                          newNbl);
>          }
>          if (key->ipKey.nwProto == IPPROTO_TCP
>              || key->ipKey.nwProto == IPPROTO_UDP @@ -707,6 +715,7 @@
> OvsCtExecute_(PNET_BUFFER_LIST curNbl,
>   *---------------------------------------------------------------------------
>   * OvsExecuteConntrackAction
>   *     Executes Conntrack actions XXX - Add more
> + *     For the Ipv4 fragments, consume the orginal fragment NBL
>   *---------------------------------------------------------------------------
>   */
>  NDIS_STATUS
> @@ -723,10 +732,10 @@
> OvsExecuteConntrackAction(OvsForwardingContext *fwdCtx,
>      PCHAR helper = NULL;
>      PNET_BUFFER_LIST curNbl = fwdCtx->curNbl;
>      OVS_PACKET_HDR_INFO *layers = &fwdCtx->layers;
> -
> +    PNET_BUFFER_LIST newNbl = NULL;
>      NDIS_STATUS status;
> 
> -    status = OvsDetectCtPacket(key);
> +    status = OvsDetectCtPacket(fwdCtx, key, &newNbl);
>      if (status != NDIS_STATUS_SUCCESS) {
>          return status;
>      }
> @@ -765,9 +774,9 @@ OvsExecuteConntrackAction(OvsForwardingContext
> *fwdCtx,
>          /* Force implicitly means commit */
>          commit = TRUE;
>      }
> -
> -    status = OvsCtExecute_(curNbl, key, layers, commit, force,
> -                           zone, mark, labels, helper);
> +    /* If newNbl is not allocated, use the current Nbl*/
> +    status = OvsCtExecute_(newNbl != NULL ? newNbl : curNbl, key, layers,
> +                           commit, force, zone, mark, labels, helper);
>      return status;
>  }
> 
> --
> 2.9.3.windows.1
> 
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to