1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/*
* Copyright (c) 2017 VMware, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __IPFRAGMENT_H_
#define __IPFRAGMENT_H_ 1
#include "PacketIO.h"
typedef struct _OVS_FRAGMENT_LIST {
CHAR *pbuff;
UINT16 len;
UINT16 offset;
struct _OVS_FRAGMENT_LIST *next;
} OVS_FRAGMENT_LIST, *POVS_FRAGMENT_LIST;
typedef struct _OVS_IPFRAG_KEY {
UINT8 protocol;
UINT8 pad_1[3]; /* Align the structure to address boundaries.*/
UINT16 id;
UINT16 pad_2; /* Align the structure to address boundaries.*/
UINT32 sAddr;
UINT32 dAddr;
ovs_be64 tunnelId;
} OVS_IPFRAG_KEY, *POVS_IPFRAG_KEY;
typedef struct _OVS_IPFRAG_ENTRY {
NDIS_SPIN_LOCK lockObj; /* To access the entry. */
BOOLEAN markedForDelete;
UINT8 numFragments;
UINT16 totalLen;
UINT16 recvdLen;
UINT16 mru;
UINT64 expiration;
OVS_IPFRAG_KEY fragKey;
POVS_FRAGMENT_LIST head;
POVS_FRAGMENT_LIST tail;
LIST_ENTRY link;
} OVS_IPFRAG_ENTRY, *POVS_IPFRAG_ENTRY;
typedef struct _OVS_IPFRAG_THREAD_CTX {
KEVENT event;
PVOID threadObject;
UINT32 exit;
} OVS_IPFRAG_THREAD_CTX, *POVS_IPFRAG_THREAD_CTX;
#define IP_FRAG_HASH_TABLE_SIZE ((UINT32)1 << 10)
#define IP_FRAG_HASH_TABLE_MASK (IP_FRAG_HASH_TABLE_SIZE - 1)
/*30s -Sufficient time to receive all fragments.*/
#define IPFRAG_ENTRY_TIMEOUT 300000000LL
#define IPFRAG_CLEANUP_INTERVAL IPFRAG_ENTRY_TIMEOUT * 2 /*1m.*/
PNET_BUFFER_LIST OvsIpv4FragmentNBL(PVOID ovsContext,
PNET_BUFFER_LIST nbl,
UINT16 mru);
NDIS_STATUS OvsProcessIpv4Fragment(POVS_SWITCH_CONTEXT switchContext,
PNET_BUFFER_LIST *curNbl,
OvsCompletionList *completionList,
NDIS_SWITCH_PORT_ID sourcePort,
ovs_be64 tunnelId,
PNET_BUFFER_LIST *newNbl);
NDIS_STATUS OvsInitIpFragment(POVS_SWITCH_CONTEXT context);
VOID OvsCleanupIpFragment(VOID);
#endif /* __IPFRAGMENT_H_ */
|