]> git.proxmox.com Git - mirror_ovs.git/blob - datapath-windows/ovsext/Stt.h
datapath-windows: Add ECN support on STT decapsulation
[mirror_ovs.git] / datapath-windows / ovsext / Stt.h
1 /*
2 * Copyright (c) 2015 VMware, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef __OVS_STT_H_
18 #define __OVS_STT_H_ 1
19
20 #define STT_TCP_PORT 7471
21 #define STT_TCP_PORT_NBO 0x2f1d
22
23 #define MAX_IP_TOTAL_LEN 65535
24
25 // STT defines.
26 #define STT_SEQ_LEN_SHIFT 16
27 #define STT_SEQ_OFFSET_MASK ((1 << STT_SEQ_LEN_SHIFT) - 1)
28 #define STT_FRAME_LEN(seq) ((seq) >> STT_SEQ_LEN_SHIFT)
29 #define STT_SEGMENT_OFF(seq) ((seq) & STT_SEQ_OFFSET_MASK)
30
31 #define STT_CSUM_VERIFIED (1 << 0)
32 #define STT_CSUM_PARTIAL (1 << 1)
33 #define STT_PROTO_IPV4 (1 << 2)
34 #define STT_PROTO_TCP (1 << 3)
35 #define STT_PROTO_TYPES (STT_PROTO_IPV4 | STT_PROTO_TCP)
36
37 #define STT_HASH_TABLE_SIZE ((UINT32)1 << 10)
38 #define STT_HASH_TABLE_MASK (STT_HASH_TABLE_SIZE - 1)
39 #define STT_ENTRY_TIMEOUT 300000000 // 30s
40 #define STT_CLEANUP_INTERVAL 300000000 // 30s
41
42 #define STT_ETH_PAD 2
43 typedef struct SttHdr {
44 UINT8 version;
45 UINT8 flags;
46 UINT8 l4Offset;
47 UINT8 reserved;
48 UINT16 mss;
49 UINT16 vlanTCI;
50 UINT64 key;
51 } SttHdr, *PSttHdr;
52
53 #define STT_HDR_LEN (sizeof(SttHdr) + STT_ETH_PAD)
54
55 typedef struct _OVS_STT_VPORT {
56 UINT16 dstPort;
57 UINT64 ackNo;
58 UINT64 ipId;
59 } OVS_STT_VPORT, *POVS_STT_VPORT;
60
61 typedef struct _OVS_STT_PKT_KEY {
62 UINT32 sAddr;
63 UINT32 dAddr;
64 UINT32 ackSeq;
65 } OVS_STT_PKT_KEY, *POVS_STT_PKT_KEY;
66
67 typedef struct _OVS_STT_PKT_ENTRY {
68 OVS_STT_PKT_KEY ovsPktKey;
69 UINT64 timeout;
70 UINT32 recvdLen;
71 UINT32 allocatedLen;
72 UINT8 ecn;
73 SttHdr sttHdr;
74 PCHAR packetBuf;
75 LIST_ENTRY link;
76 } OVS_STT_PKT_ENTRY, *POVS_STT_PKT_ENTRY;
77
78 typedef struct _OVS_STT_THREAD_CTX {
79 KEVENT event;
80 PVOID threadObject;
81 UINT32 exit;
82 } OVS_STT_THREAD_CTX, *POVS_STT_THREAD_CTX;
83
84 NTSTATUS OvsInitSttTunnel(POVS_VPORT_ENTRY vport,
85 UINT16 udpDestPort);
86
87 VOID OvsCleanupSttTunnel(POVS_VPORT_ENTRY vport);
88
89 NDIS_STATUS OvsEncapStt(POVS_VPORT_ENTRY vport,
90 PNET_BUFFER_LIST curNbl,
91 OvsIPv4TunnelKey *tunKey,
92 POVS_SWITCH_CONTEXT switchContext,
93 POVS_PACKET_HDR_INFO layers,
94 PNET_BUFFER_LIST *newNbl);
95
96
97 NDIS_STATUS OvsDecapStt(POVS_SWITCH_CONTEXT switchContext,
98 PNET_BUFFER_LIST curNbl,
99 OvsIPv4TunnelKey *tunKey,
100 PNET_BUFFER_LIST *newNbl);
101
102 NTSTATUS OvsInitSttDefragmentation();
103
104 VOID OvsCleanupSttDefragmentation(VOID);
105
106 static __inline UINT32
107 OvsGetSttTunHdrSize(VOID)
108 {
109 return sizeof (EthHdr) + sizeof(IPHdr) + sizeof(TCPHdr) +
110 STT_HDR_LEN;
111 }
112
113 #endif /*__OVS_STT_H_ */