[ovs-dev] [PATCH] datapath-windows: Support for OVS_KEY_ATTR_SCTP attribute

Sairam Venugopal vsairam at vmware.com
Wed Nov 18 21:18:21 UTC 2015


Thanks for the patch.

Acked-by: Sairam Venugopal <vsairam at vmware.com>


On 11/11/15, 12:11 PM, "Sorin Vinturis" <svinturis at cloudbasesolutions.com>
wrote:

>This patch adds OVS_KEY_ATTR_SCTP to the OVS flow mechanism.
>
>Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
>---
> datapath-windows/ovsext/Flow.c         |  6 +++++-
> datapath-windows/ovsext/Flow.h         |  2 +-
> datapath-windows/ovsext/NetProto.h     | 10 ++++++++++
> datapath-windows/ovsext/PacketParser.c | 15 +++++++++++++++
> datapath-windows/ovsext/PacketParser.h | 10 ++++++++++
> 5 files changed, 41 insertions(+), 2 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index b629c93..31ddc66 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -1673,7 +1673,7 @@ DeleteAllFlows(OVS_DATAPATH *datapath)
>  *    - packet->l4 to just past the IPv4 header, if one is present and
>has a
>  *      correct length, and otherwise NULL.
>  *
>- *    - packet->l7 to just past the TCP or UDP or ICMP header, if one is
>+ *    - packet->l7 to just past the TCP, UDP, SCTP or ICMP header, if
>one is
>  *      present and has a correct length, and otherwise NULL.
>  *
>  * Returns NDIS_STATUS_SUCCESS normally.  Fails only if packet data
>cannot be accessed
>@@ -1802,6 +1802,8 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet,
>                     OvsParseTcp(packet, &ipKey->l4, layers);
>                 } else if (ipKey->nwProto == SOCKET_IPPROTO_UDP) {
>                     OvsParseUdp(packet, &ipKey->l4, layers);
>+                } else if (ipKey->nwProto == SOCKET_IPPROTO_SCTP) {
>+                    OvsParseSctp(packet, &ipKey->l4, layers);
>                 } else if (ipKey->nwProto == SOCKET_IPPROTO_ICMP) {
>                     ICMPHdr icmpStorage;
>                     const ICMPHdr *icmp;
>@@ -1835,6 +1837,8 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet,
>             OvsParseTcp(packet, &(flow->ipv6Key.l4), layers);
>         } else if (flow->ipv6Key.nwProto == SOCKET_IPPROTO_UDP) {
>             OvsParseUdp(packet, &(flow->ipv6Key.l4), layers);
>+        } else if (flow->ipv6Key.nwProto == SOCKET_IPPROTO_SCTP) {
>+            OvsParseSctp(packet, &flow->ipv6Key.l4, layers);
>         } else if (flow->ipv6Key.nwProto == SOCKET_IPPROTO_ICMPV6) {
>             OvsParseIcmpV6(packet, flow, layers);
>             flow->l2.keyLen += (OVS_ICMPV6_KEY_SIZE - OVS_IPV6_KEY_SIZE);
>diff --git a/datapath-windows/ovsext/Flow.h
>b/datapath-windows/ovsext/Flow.h
>index e817bcf..74b9dfb 100644
>--- a/datapath-windows/ovsext/Flow.h
>+++ b/datapath-windows/ovsext/Flow.h
>@@ -40,7 +40,7 @@ typedef struct _OvsFlow {
> 
> typedef struct _OvsLayers {
>     UINT32 l3Ofs;             // IPv4, IPv6, ARP, or other L3 header.
>-    UINT32 l4Ofs;             // TCP, UDP, ICMP, ICMPv6, or other L4
>header.
>+    UINT32 l4Ofs;             // TCP, UDP, SCTP, ICMP, ICMPv6, or other
>L4 header.
>     UINT32 l7Ofs;             // L4 protocol's payload.
> } OvsLayers;
> 
>diff --git a/datapath-windows/ovsext/NetProto.h
>b/datapath-windows/ovsext/NetProto.h
>index a364869..4364c5c 100644
>--- a/datapath-windows/ovsext/NetProto.h
>+++ b/datapath-windows/ovsext/NetProto.h
>@@ -82,6 +82,7 @@ typedef UINT64 IP6UnitLength;
> #define IPPROTO_UDP     17
> #define IPPROTO_GRE     47
> #define IPPROTO_TCP     6
>+#define IPPROTO_SCTP    132
> #define IPPROTO_RSVD    0xff
> 
> #define IPPROTO_HOPOPTS         0               /* Hop-by-hop option
>header */
>@@ -202,6 +203,7 @@ typedef union _OVS_PACKET_HDR_INFO {
>         UINT16 isIPv6:1;
>         UINT16 isTcp:1;
>         UINT16 isUdp:1;
>+        UINT16 isSctp:1;
>         UINT16 tcpCsumNeeded:1;
>         UINT16 udpCsumNeeded:1;
>         UINT16 udpCsumZero:1;
>@@ -303,6 +305,13 @@ typedef struct TCPHdr {
>    UINT16    urg_ptr;
> } TCPHdr;
> 
>+typedef struct SCTPHdr {
>+   UINT16    source;
>+   UINT16    dest;
>+   UINT32    vtag;
>+   UINT32    check;
>+} SCTPHdr;
>+
> typedef struct PseudoHdr {
>    UINT32   sourceIPAddr;
>    UINT32   destIPAddr;
>@@ -365,5 +374,6 @@ typedef struct IPOpt {
> #define SOCKET_IPPROTO_TCP   6
> #define SOCKET_IPPROTO_UDP   17
> #define SOCKET_IPPROTO_GRE   47
>+#define SOCKET_IPPROTO_SCTP  132
> 
> #endif /* __NET_PROTO_H_ */
>diff --git a/datapath-windows/ovsext/PacketParser.c
>b/datapath-windows/ovsext/PacketParser.c
>index e01be17..bba2631 100644
>--- a/datapath-windows/ovsext/PacketParser.c
>+++ b/datapath-windows/ovsext/PacketParser.c
>@@ -192,6 +192,21 @@ OvsParseTcp(const NET_BUFFER_LIST *packet,
> }
> 
> VOID
>+OvsParseSctp(const NET_BUFFER_LIST *packet,
>+             L4Key *flow,
>+             POVS_PACKET_HDR_INFO layers)
>+{
>+    SCTPHdr sctpStorage;
>+    const SCTPHdr *sctp = OvsGetSctp(packet, layers->l4Offset,
>&sctpStorage);
>+    if (sctp) {
>+        flow->tpSrc = sctp->source;
>+        flow->tpDst = sctp->dest;
>+        layers->isSctp = 1;
>+        layers->l7Offset = layers->l4Offset + sizeof *sctp;
>+    }
>+}
>+
>+VOID
> OvsParseUdp(const NET_BUFFER_LIST *packet,
>          L4Key *flow,
>          POVS_PACKET_HDR_INFO layers)
>diff --git a/datapath-windows/ovsext/PacketParser.h
>b/datapath-windows/ovsext/PacketParser.h
>index 55d110f..7b8e656 100644
>--- a/datapath-windows/ovsext/PacketParser.h
>+++ b/datapath-windows/ovsext/PacketParser.h
>@@ -28,6 +28,8 @@ VOID OvsParseTcp(const NET_BUFFER_LIST *packet, L4Key
>*flow,
>                  POVS_PACKET_HDR_INFO layers);
> VOID OvsParseUdp(const NET_BUFFER_LIST *packet, L4Key *flow,
>                  POVS_PACKET_HDR_INFO layers);
>+VOID OvsParseSctp(const NET_BUFFER_LIST *packet, L4Key *flow,
>+                  POVS_PACKET_HDR_INFO layers);
> NDIS_STATUS OvsParseIcmpV6(const NET_BUFFER_LIST *packet, OvsFlowKey
>*key,
>                             POVS_PACKET_HDR_INFO layers);
> 
>@@ -133,6 +135,14 @@ OvsGetUdp(const NET_BUFFER_LIST *packet,
>     return OvsGetPacketBytes(packet, sizeof *storage, ofs, storage);
> }
> 
>+static const SCTPHdr *
>+OvsGetSctp(const NET_BUFFER_LIST *packet,
>+           UINT32 ofs,
>+           SCTPHdr *storage)
>+{
>+    return OvsGetPacketBytes(packet, sizeof *storage, ofs, storage);
>+}
>+
> static const ICMPHdr *
> OvsGetIcmp(const NET_BUFFER_LIST *packet,
>            UINT32 ofs,
>-- 
>1.9.0.msysgit.0
>_______________________________________________
>dev mailing list
>dev at openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=-sSXKxcTC_9tTaSbxhQRKP-MueaUSA
>gm_HjWBdO4PYs&s=gImE2ltL6gK9OdSG0oJiQJ43VrCY2dcEBRnOd8438rE&e= 




More information about the dev mailing list