]>
Commit | Line | Data |
---|---|---|
c803536e SS |
1 | /* |
2 | * Copyright (c) 2014 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 | ||
fa1324c9 SG |
17 | #ifndef __IP_HELPER_H_ |
18 | #define __IP_HELPER_H_ 1 | |
c803536e SS |
19 | |
20 | #include <ntddk.h> | |
21 | #include <netioapi.h> | |
bfe89c90 | 22 | #include "Vport.h" |
c803536e SS |
23 | |
24 | #define OVS_FWD_HASH_TABLE_SIZE ((UINT32)1 << 10) | |
25 | #define OVS_FWD_HASH_TABLE_MASK (OVS_FWD_HASH_TABLE_SIZE - 1) | |
26 | ||
27 | #define OVS_ROUTE_HASH_TABLE_SIZE ((UINT32)1 << 8) | |
28 | #define OVS_ROUTE_HASH_TABLE_MASK (OVS_ROUTE_HASH_TABLE_SIZE - 1) | |
29 | ||
30 | #define OVS_NEIGH_HASH_TABLE_SIZE ((UINT32)1 << 8) | |
31 | #define OVS_NEIGH_HASH_TABLE_MASK (OVS_NEIGH_HASH_TABLE_SIZE - 1) | |
32 | ||
33 | #define OVS_IPNEIGH_TIMEOUT 100000000 // 10 s | |
34 | ||
13efe420 SV |
35 | /* |
36 | * This structure is used to define each adapter instance. | |
37 | * | |
38 | * Note: | |
39 | * Only when the internal IP is configured and virtual | |
40 | * internal port is connected, the IP helper request can be | |
41 | * queued. | |
42 | * | |
43 | * We only keep internal IP for reference, it will not be used for determining | |
44 | * SRC IP of the Tunnel. | |
45 | * | |
46 | * The lock must not raise the IRQL higher than PASSIVE_LEVEL in order for the | |
47 | * route manipulation functions, i.e. GetBestRoute, to work. | |
48 | */ | |
49 | typedef struct _OVS_IPHELPER_INSTANCE | |
50 | { | |
51 | LIST_ENTRY link; | |
52 | ||
53 | BOOLEAN isIpConfigured; | |
54 | UINT32 portNo; | |
55 | GUID netCfgId; | |
56 | MIB_IF_ROW2 internalRow; | |
57 | MIB_IPINTERFACE_ROW internalIPRow; | |
58 | UINT32 ipAddress; | |
59 | ||
60 | ERESOURCE lock; | |
61 | } OVS_IPHELPER_INSTANCE, *POVS_IPHELPER_INSTANCE; | |
c803536e SS |
62 | |
63 | typedef struct _OVS_IPNEIGH_ENTRY { | |
13efe420 SV |
64 | UINT8 macAddr[ETH_ADDR_LEN]; |
65 | UINT16 refCount; | |
66 | UINT32 ipAddr; | |
67 | UINT32 pad; | |
68 | UINT64 timeout; | |
69 | LIST_ENTRY link; | |
70 | LIST_ENTRY slink; | |
71 | LIST_ENTRY fwdList; | |
72 | POVS_IPHELPER_INSTANCE instance; | |
c803536e SS |
73 | } OVS_IPNEIGH_ENTRY, *POVS_IPNEIGH_ENTRY; |
74 | ||
75 | typedef struct _OVS_IPFORWARD_ENTRY { | |
76 | IP_ADDRESS_PREFIX prefix; | |
77 | UINT32 nextHop; | |
78 | UINT16 refCount; | |
79 | LIST_ENTRY link; | |
80 | LIST_ENTRY fwdList; | |
81 | } OVS_IPFORWARD_ENTRY, *POVS_IPFORWARD_ENTRY; | |
82 | ||
cd30b346 | 83 | typedef union _OVS_FWD_INFO { |
c803536e SS |
84 | struct { |
85 | UINT32 dstIpAddr; | |
86 | UINT32 srcIpAddr; | |
b3123b20 NR |
87 | UINT8 dstMacAddr[ETH_ADDR_LEN]; |
88 | UINT8 srcMacAddr[ETH_ADDR_LEN]; | |
c803536e | 89 | UINT32 srcPortNo; |
cd30b346 | 90 | POVS_VPORT_ENTRY vport; |
c803536e | 91 | }; |
cd30b346 | 92 | UINT64 value[4]; |
c803536e SS |
93 | } OVS_FWD_INFO, *POVS_FWD_INFO; |
94 | ||
95 | typedef struct _OVS_FWD_ENTRY { | |
96 | OVS_FWD_INFO info; | |
97 | POVS_IPFORWARD_ENTRY ipf; | |
98 | POVS_IPNEIGH_ENTRY ipn; | |
99 | LIST_ENTRY link; | |
100 | LIST_ENTRY ipfLink; | |
101 | LIST_ENTRY ipnLink; | |
102 | } OVS_FWD_ENTRY, *POVS_FWD_ENTRY; | |
103 | ||
104 | ||
105 | enum { | |
106 | OVS_IP_HELPER_INTERNAL_ADAPTER_UP, | |
cd30b346 | 107 | OVS_IP_HELPER_INTERNAL_ADAPTER_DOWN, |
c803536e SS |
108 | OVS_IP_HELPER_FWD_REQUEST, |
109 | }; | |
110 | ||
111 | typedef VOID (*OvsIPHelperCallback)(PNET_BUFFER_LIST nbl, | |
112 | UINT32 inPort, | |
113 | PVOID tunnelKey, | |
114 | PVOID cbData1, | |
115 | PVOID cbData2, | |
116 | NTSTATUS status, | |
117 | POVS_FWD_INFO fwdInfo); | |
118 | ||
119 | typedef struct _OVS_FWD_REQUEST_INFO { | |
120 | PNET_BUFFER_LIST nbl; | |
121 | UINT32 inPort; | |
122 | OvsIPv4TunnelKey tunnelKey; | |
123 | OvsIPHelperCallback cb; | |
124 | PVOID cbData1; | |
125 | PVOID cbData2; | |
126 | } OVS_FWD_REQUEST_INFO, *POVS_FWD_REQUEST_INFO; | |
127 | ||
cd30b346 AS |
128 | typedef struct _OVS_INSTANCE_REQUEST_INFO { |
129 | GUID netCfgInstanceId; | |
130 | UINT32 portNo; | |
131 | } OVS_INSTANCE_REQUEST_INFO, *POVS_INSTANCE_REQUEST_INFO; | |
c803536e SS |
132 | |
133 | typedef struct _OVS_IP_HELPER_REQUEST { | |
134 | LIST_ENTRY link; | |
135 | UINT32 command; | |
136 | union { | |
cd30b346 AS |
137 | OVS_FWD_REQUEST_INFO fwdReq; |
138 | OVS_INSTANCE_REQUEST_INFO instanceReq; | |
c803536e SS |
139 | }; |
140 | } OVS_IP_HELPER_REQUEST, *POVS_IP_HELPER_REQUEST; | |
141 | ||
142 | ||
143 | typedef struct _OVS_IP_HELPER_THREAD_CONTEXT { | |
144 | KEVENT event; | |
145 | PVOID threadObject; | |
146 | UINT32 exit; | |
147 | } OVS_IP_HELPER_THREAD_CONTEXT, *POVS_IP_HELPER_THREAD_CONTEXT; | |
148 | ||
149 | NTSTATUS OvsInitIpHelper(NDIS_HANDLE ndisFilterHandle); | |
150 | VOID OvsCleanupIpHelper(VOID); | |
151 | ||
cd30b346 AS |
152 | VOID OvsInternalAdapterUp(UINT32 portNo, GUID *netCfgInstanceId); |
153 | VOID OvsInternalAdapterDown(UINT32 portNo, GUID netCfgInstanceId); | |
c803536e SS |
154 | |
155 | NTSTATUS OvsFwdIPHelperRequest(PNET_BUFFER_LIST nbl, UINT32 inPort, | |
156 | const PVOID tunnelKey, | |
157 | OvsIPHelperCallback cb, | |
158 | PVOID cbData1, | |
159 | PVOID cbData2); | |
cd30b346 | 160 | NTSTATUS OvsLookupIPFwdInfo(UINT32 srcIp, UINT32 dstIp, POVS_FWD_INFO info); |
c803536e SS |
161 | VOID OvsCancelFwdIpHelperRequest(PNET_BUFFER_LIST nbl); |
162 | ||
fa1324c9 | 163 | #endif /* __IP_HELPER_H_ */ |