diff mbox series

[ovs-dev] datapath-windows: Add support for handling DEI bit of VLAN header

Message ID 20180515233800.2800-1-kumaranand@vmware.com
State Accepted
Headers show
Series [ovs-dev] datapath-windows: Add support for handling DEI bit of VLAN header | expand

Commit Message

Anand Kumar May 15, 2018, 11:38 p.m. UTC
The Drop eligible indicator(DEI) is 1 bit wide and it is part of
Tag control information (TCI) in VLAN header, which indicates that
the frame can be dropped during congestion.

Signed-off-by: Anand Kumar <kumaranand@vmware.com>
---
 datapath-windows/ovsext/Actions.c |  1 +
 datapath-windows/ovsext/User.c    | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 6 deletions(-)

Comments

Alin-Gabriel Serdean June 6, 2018, 5:32 p.m. UTC | #1
> On 16 May 2018, at 02:38, Anand Kumar <kumaranand@vmware.com> wrote:
> 
> The Drop eligible indicator(DEI) is 1 bit wide and it is part of
> Tag control information (TCI) in VLAN header, which indicates that
> the frame can be dropped during congestion.
> 
> Signed-off-by: Anand Kumar <kumaranand@vmware.com>
> ---
> datapath-windows/ovsext/Actions.c |  1 +
> datapath-windows/ovsext/User.c    | 19 +++++++++++++------
> 2 files changed, 14 insertions(+), 6 deletions(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
> index 9bbc787..6922f05 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -2023,6 +2023,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
>                  vlan = (struct ovs_action_push_vlan *)NlAttrGet((const PNL_ATTR)a);
>                  vlanTag->TagHeader.VlanId = ntohs(vlan->vlan_tci) & 0xfff;
>                  vlanTag->TagHeader.UserPriority = ntohs(vlan->vlan_tci) >> 13;
> +                 vlanTag->TagHeader.CanonicalFormatId = (ntohs(vlan->vlan_tci) >> 12) & 0x1;
> 
>                  NET_BUFFER_LIST_INFO(ovsFwdCtx.curNbl,
>                                       Ieee8021QNetBufferListInfo) = vlanTagValue;
> diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
> index 4693a8b..509472f 100644
> --- a/datapath-windows/ovsext/User.c
> +++ b/datapath-windows/ovsext/User.c
> @@ -1000,11 +1000,12 @@ OvsCreateQueueNlPacket(PVOID userData,
>                        POVS_PACKET_HDR_INFO hdrInfo)
> {
> #define VLAN_TAG_SIZE 4
> -    UINT32 allocLen, dataLen, extraLen;
> +    UINT32 allocLen, dataLen, extraLen = 0;
>     POVS_PACKET_QUEUE_ELEM elem;
>     UINT8 *src, *dst;
>     NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> -    NDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo;
> +    PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo = NULL;
> +    PVOID vlanTag;
>     OvsIPv4TunnelKey *tunnelKey = (OvsIPv4TunnelKey *)&key->tunKey;
>     UINT32 pid;
>     UINT32 nlMsgSize;
> @@ -1037,8 +1038,13 @@ OvsCreateQueueNlPacket(PVOID userData,
>         return NULL;
>     }
> 
> -    vlanInfo.Value = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
> -    extraLen = vlanInfo.TagHeader.VlanId ? VLAN_TAG_SIZE : 0;
> +    vlanTag = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
> +    if (vlanTag) {
> +        vlanInfo = (PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTag;
> +        if (vlanInfo->Value) {
> +            extraLen = VLAN_TAG_SIZE;
> +        }
> +    }
> 
>     dataLen = NET_BUFFER_DATA_LENGTH(nb);
> 
> @@ -1148,8 +1154,9 @@ OvsCreateQueueNlPacket(PVOID userData,
>         ((UINT32 *)dst)[2] = ((UINT32 *)src)[2];
>         dst += 12;
>         ((UINT16 *)dst)[0] = htons(0x8100);
> -        ((UINT16 *)dst)[1] = htons(vlanInfo.TagHeader.VlanId |
> -            (vlanInfo.TagHeader.UserPriority << 13));
> +        ((UINT16 *)dst)[1] = htons(vlanInfo->TagHeader.VlanId |
> +            (vlanInfo->TagHeader.CanonicalFormatId << 12) |
> +            (vlanInfo->TagHeader.UserPriority << 13));
>         elem->hdrInfo.l3Offset += VLAN_TAG_SIZE;
>         elem->hdrInfo.l4Offset += VLAN_TAG_SIZE;
>         ovsUserStats.vlanInsert++;
> -- 
> 2.9.3.windows.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Acked-by: Alin Gabriel Serdean <aserdean@ovn.org>
Alin Serdean June 11, 2018, 1:19 p.m. UTC | #2
> > On 16 May 2018, at 02:38, Anand Kumar <kumaranand@vmware.com>
> wrote:
> >
> > The Drop eligible indicator(DEI) is 1 bit wide and it is part of Tag
> > control information (TCI) in VLAN header, which indicates that the
> > frame can be dropped during congestion.
> >
> > Signed-off-by: Anand Kumar <kumaranand@vmware.com>
> > ---
> > datapath-windows/ovsext/Actions.c |  1 +
> > datapath-windows/ovsext/User.c    | 19 +++++++++++++------
> > 2 files changed, 14 insertions(+), 6 deletions(-)
> >
> > diff --git a/datapath-windows/ovsext/Actions.c
> > b/datapath-windows/ovsext/Actions.c
> > index 9bbc787..6922f05 100644
> > --- a/datapath-windows/ovsext/Actions.c
> > +++ b/datapath-windows/ovsext/Actions.c
> > @@ -2023,6 +2023,7 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT
> switchContext,
> >                  vlan = (struct ovs_action_push_vlan *)NlAttrGet((const
> PNL_ATTR)a);
> >                  vlanTag->TagHeader.VlanId = ntohs(vlan->vlan_tci) & 0xfff;
> >                  vlanTag->TagHeader.UserPriority =
> > ntohs(vlan->vlan_tci) >> 13;
> > +                 vlanTag->TagHeader.CanonicalFormatId =
> > + (ntohs(vlan->vlan_tci) >> 12) & 0x1;
> >
> >                  NET_BUFFER_LIST_INFO(ovsFwdCtx.curNbl,
> >                                       Ieee8021QNetBufferListInfo) =
> > vlanTagValue; diff --git a/datapath-windows/ovsext/User.c
> > b/datapath-windows/ovsext/User.c index 4693a8b..509472f 100644
> > --- a/datapath-windows/ovsext/User.c
> > +++ b/datapath-windows/ovsext/User.c
> > @@ -1000,11 +1000,12 @@ OvsCreateQueueNlPacket(PVOID userData,
> >                        POVS_PACKET_HDR_INFO hdrInfo) { #define
> > VLAN_TAG_SIZE 4
> > -    UINT32 allocLen, dataLen, extraLen;
> > +    UINT32 allocLen, dataLen, extraLen = 0;
> >     POVS_PACKET_QUEUE_ELEM elem;
> >     UINT8 *src, *dst;
> >     NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> > -    NDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo;
> > +    PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo = NULL;
> > +    PVOID vlanTag;
> >     OvsIPv4TunnelKey *tunnelKey = (OvsIPv4TunnelKey *)&key->tunKey;
> >     UINT32 pid;
> >     UINT32 nlMsgSize;
> > @@ -1037,8 +1038,13 @@ OvsCreateQueueNlPacket(PVOID userData,
> >         return NULL;
> >     }
> >
> > -    vlanInfo.Value = NET_BUFFER_LIST_INFO(nbl,
> Ieee8021QNetBufferListInfo);
> > -    extraLen = vlanInfo.TagHeader.VlanId ? VLAN_TAG_SIZE : 0;
> > +    vlanTag = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
> > +    if (vlanTag) {
> > +        vlanInfo = (PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID
> *)&vlanTag;
> > +        if (vlanInfo->Value) {
> > +            extraLen = VLAN_TAG_SIZE;
> > +        }
> > +    }
> >
> >     dataLen = NET_BUFFER_DATA_LENGTH(nb);
> >
> > @@ -1148,8 +1154,9 @@ OvsCreateQueueNlPacket(PVOID userData,
> >         ((UINT32 *)dst)[2] = ((UINT32 *)src)[2];
> >         dst += 12;
> >         ((UINT16 *)dst)[0] = htons(0x8100);
> > -        ((UINT16 *)dst)[1] = htons(vlanInfo.TagHeader.VlanId |
> > -            (vlanInfo.TagHeader.UserPriority << 13));
> > +        ((UINT16 *)dst)[1] = htons(vlanInfo->TagHeader.VlanId |
> > +            (vlanInfo->TagHeader.CanonicalFormatId << 12) |
> > +            (vlanInfo->TagHeader.UserPriority << 13));
> >         elem->hdrInfo.l3Offset += VLAN_TAG_SIZE;
> >         elem->hdrInfo.l4Offset += VLAN_TAG_SIZE;
> >         ovsUserStats.vlanInsert++;
> > --
> > 2.9.3.windows.1
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> 
> Acked-by: Alin Gabriel Serdean <aserdean@ovn.org>
> 
Thanks Anand, I applied this on master!
diff mbox series

Patch

diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 9bbc787..6922f05 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -2023,6 +2023,7 @@  OvsDoExecuteActions(POVS_SWITCH_CONTEXT switchContext,
                  vlan = (struct ovs_action_push_vlan *)NlAttrGet((const PNL_ATTR)a);
                  vlanTag->TagHeader.VlanId = ntohs(vlan->vlan_tci) & 0xfff;
                  vlanTag->TagHeader.UserPriority = ntohs(vlan->vlan_tci) >> 13;
+                 vlanTag->TagHeader.CanonicalFormatId = (ntohs(vlan->vlan_tci) >> 12) & 0x1;
 
                  NET_BUFFER_LIST_INFO(ovsFwdCtx.curNbl,
                                       Ieee8021QNetBufferListInfo) = vlanTagValue;
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 4693a8b..509472f 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -1000,11 +1000,12 @@  OvsCreateQueueNlPacket(PVOID userData,
                        POVS_PACKET_HDR_INFO hdrInfo)
 {
 #define VLAN_TAG_SIZE 4
-    UINT32 allocLen, dataLen, extraLen;
+    UINT32 allocLen, dataLen, extraLen = 0;
     POVS_PACKET_QUEUE_ELEM elem;
     UINT8 *src, *dst;
     NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
-    NDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo;
+    PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanInfo = NULL;
+    PVOID vlanTag;
     OvsIPv4TunnelKey *tunnelKey = (OvsIPv4TunnelKey *)&key->tunKey;
     UINT32 pid;
     UINT32 nlMsgSize;
@@ -1037,8 +1038,13 @@  OvsCreateQueueNlPacket(PVOID userData,
         return NULL;
     }
 
-    vlanInfo.Value = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
-    extraLen = vlanInfo.TagHeader.VlanId ? VLAN_TAG_SIZE : 0;
+    vlanTag = NET_BUFFER_LIST_INFO(nbl, Ieee8021QNetBufferListInfo);
+    if (vlanTag) {
+        vlanInfo = (PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTag;
+        if (vlanInfo->Value) {
+            extraLen = VLAN_TAG_SIZE;
+        }
+    }
 
     dataLen = NET_BUFFER_DATA_LENGTH(nb);
 
@@ -1148,8 +1154,9 @@  OvsCreateQueueNlPacket(PVOID userData,
         ((UINT32 *)dst)[2] = ((UINT32 *)src)[2];
         dst += 12;
         ((UINT16 *)dst)[0] = htons(0x8100);
-        ((UINT16 *)dst)[1] = htons(vlanInfo.TagHeader.VlanId |
-            (vlanInfo.TagHeader.UserPriority << 13));
+        ((UINT16 *)dst)[1] = htons(vlanInfo->TagHeader.VlanId |
+            (vlanInfo->TagHeader.CanonicalFormatId << 12) |
+            (vlanInfo->TagHeader.UserPriority << 13));
         elem->hdrInfo.l3Offset += VLAN_TAG_SIZE;
         elem->hdrInfo.l4Offset += VLAN_TAG_SIZE;
         ovsUserStats.vlanInsert++;