2 * Copyright (c) 2015, 2016 VMware, Inc.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __OVS_CONNTRACK_H_
18 #define __OVS_CONNTRACK_H_ 1
29 #define OVS_DBG_MOD OVS_DBG_CONTRK
35 uint32_t ipv4_aligned
;
36 struct in6_addr ipv6_aligned
;
55 typedef enum CT_UPDATE_RES
{
61 /* Metadata mark for masked write to conntrack mark */
62 typedef struct MD_MARK
{
67 /* Metadata label for masked write to conntrack label. */
68 typedef struct MD_LABELS
{
69 struct ovs_key_ct_labels value
;
70 struct ovs_key_ct_labels mask
;
73 typedef enum _NAT_ACTION
{
75 NAT_ACTION_REVERSE
= 1 << 0,
76 NAT_ACTION_SRC
= 1 << 1,
77 NAT_ACTION_SRC_PORT
= 1 << 2,
78 NAT_ACTION_DST
= 1 << 3,
79 NAT_ACTION_DST_PORT
= 1 << 4,
82 typedef struct _OVS_CT_KEY
{
83 struct ct_endpoint src
;
84 struct ct_endpoint dst
;
90 } OVS_CT_KEY
, *POVS_CT_KEY
;
92 typedef struct _NAT_ACTION_INFO
{
93 struct ct_addr minAddr
;
94 struct ct_addr maxAddr
;
98 } NAT_ACTION_INFO
, *PNAT_ACTION_INFO
;
100 typedef struct OVS_CT_ENTRY
{
101 NDIS_SPIN_LOCK lock
; /* Protects OVS_CT_ENTRY. */
107 UINT64 timestampStart
;
108 struct ovs_key_ct_labels labels
;
109 NAT_ACTION_INFO natInfo
;
110 PVOID parent
; /* Points to main connection */
111 } OVS_CT_ENTRY
, *POVS_CT_ENTRY
;
113 typedef struct OVS_CT_REL_ENTRY
{
115 POVS_CT_ENTRY parent
;
118 } OVS_CT_REL_ENTRY
, *POVS_CT_REL_ENTRY
;
120 typedef struct _OVS_CT_THREAD_CTX
{
124 } OVS_CT_THREAD_CTX
, *POVS_CT_THREAD_CTX
;
126 typedef struct OvsConntrackKeyLookupCtx
{
132 } OvsConntrackKeyLookupCtx
;
134 /* Per zone strucuture. */
135 typedef struct _OVS_CT_ZONE_INFO
{
138 } OVS_CT_ZONE_INFO
, *POVS_CT_ZONE_INFO
;
140 typedef struct _OVS_CT_ZONE_LIMIT
{
144 } OVS_CT_ZONE_LIMIT
, *POVS_CT_ZONE_LIMIT
;
146 #define CT_MAX_ENTRIES 1 << 21
147 #define CT_HASH_TABLE_SIZE ((UINT32)1 << 10)
148 #define CT_HASH_TABLE_MASK (CT_HASH_TABLE_SIZE - 1)
149 #define CT_INTERVAL_SEC 10000000LL //1s
150 #define CT_ENTRY_TIMEOUT (2 * 60 * CT_INTERVAL_SEC) // 2m
151 #define CT_CLEANUP_INTERVAL (2 * 60 * CT_INTERVAL_SEC) // 2m
154 /* Given POINTER, the address of the given MEMBER in a STRUCT object, returns
155 the STRUCT object. */
156 #define CONTAINER_OF(POINTER, STRUCT, MEMBER) \
157 ((STRUCT *) (void *) ((char *) (POINTER) - \
158 offsetof (STRUCT, MEMBER)))
161 OvsConntrackUpdateExpiration(OVS_CT_ENTRY
*ctEntry
,
165 ctEntry
->expiration
= now
+ interval
;
169 OvsGetTcpHeader(PNET_BUFFER_LIST nbl
,
170 OVS_PACKET_HDR_INFO
*layers
,
172 UINT32
*tcpPayloadLen
)
176 VOID
*dest
= storage
;
178 ipHdr
= NdisGetDataBuffer(NET_BUFFER_LIST_FIRST_NB(nbl
),
179 layers
->l4Offset
+ sizeof(TCPHdr
),
180 NULL
, 1 /*no align*/, 0);
185 ipHdr
= (IPHdr
*)((PCHAR
)ipHdr
+ layers
->l3Offset
);
186 tcp
= (TCPHdr
*)((PCHAR
)ipHdr
+ ipHdr
->ihl
* 4);
187 if (tcp
->doff
* 4 >= sizeof *tcp
) {
188 NdisMoveMemory(dest
, tcp
, sizeof(TCPHdr
));
189 *tcpPayloadLen
= TCP_DATA_LENGTH(ipHdr
, tcp
);
196 VOID
OvsCleanupConntrack(VOID
);
197 NTSTATUS
OvsInitConntrack(POVS_SWITCH_CONTEXT context
);
199 NDIS_STATUS
OvsExecuteConntrackAction(OvsForwardingContext
*fwdCtx
,
202 BOOLEAN
OvsConntrackValidateTcpPacket(const TCPHdr
*tcp
);
203 BOOLEAN
OvsConntrackValidateIcmpPacket(const ICMPHdr
*icmp
);
204 OVS_CT_ENTRY
* OvsConntrackCreateTcpEntry(const TCPHdr
*tcp
,
206 UINT32 tcpPayloadLen
);
207 NDIS_STATUS
OvsCtMapTcpProtoInfoToNl(PNL_BUFFER nlBuf
,
208 OVS_CT_ENTRY
*conn_
);
209 OVS_CT_ENTRY
* OvsConntrackCreateOtherEntry(UINT64 now
);
210 OVS_CT_ENTRY
* OvsConntrackCreateIcmpEntry(UINT64 now
);
211 enum CT_UPDATE_RES
OvsConntrackUpdateTcpEntry(OVS_CT_ENTRY
* conn_
,
215 UINT32 tcpPayloadLen
);
216 enum CT_UPDATE_RES
OvsConntrackUpdateOtherEntry(OVS_CT_ENTRY
*conn_
,
219 enum CT_UPDATE_RES
OvsConntrackUpdateIcmpEntry(OVS_CT_ENTRY
* conn_
,
222 NTSTATUS
OvsCreateNlMsgFromCtEntry(POVS_CT_ENTRY entry
,
231 /* Tracking related connections */
232 NTSTATUS
OvsInitCtRelated(POVS_SWITCH_CONTEXT context
);
233 VOID
OvsCleanupCtRelated(VOID
);
234 NDIS_STATUS
OvsCtRelatedEntryCreate(UINT8 ipProto
,
241 POVS_CT_ENTRY parent
);
242 POVS_CT_ENTRY
OvsCtRelatedLookup(OVS_CT_KEY key
, UINT64 currentTime
);
244 NDIS_STATUS
OvsCtHandleFtp(PNET_BUFFER_LIST curNbl
,
246 OVS_PACKET_HDR_INFO
*layers
,
250 #endif /* __OVS_CONNTRACK_H_ */