]> git.proxmox.com Git - mirror_ovs.git/blame - datapath-windows/ovsext/IpHelper.h
datapath-windows: Move OVS_IPHELPER_INSTANCE to IpHelper.h
[mirror_ovs.git] / datapath-windows / ovsext / IpHelper.h
CommitLineData
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 */
49typedef 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
63typedef 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
75typedef 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 83typedef 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
95typedef 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
105enum {
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
111typedef 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
119typedef 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
128typedef struct _OVS_INSTANCE_REQUEST_INFO {
129 GUID netCfgInstanceId;
130 UINT32 portNo;
131} OVS_INSTANCE_REQUEST_INFO, *POVS_INSTANCE_REQUEST_INFO;
c803536e
SS
132
133typedef 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
143typedef 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
149NTSTATUS OvsInitIpHelper(NDIS_HANDLE ndisFilterHandle);
150VOID OvsCleanupIpHelper(VOID);
151
cd30b346
AS
152VOID OvsInternalAdapterUp(UINT32 portNo, GUID *netCfgInstanceId);
153VOID OvsInternalAdapterDown(UINT32 portNo, GUID netCfgInstanceId);
c803536e
SS
154
155NTSTATUS OvsFwdIPHelperRequest(PNET_BUFFER_LIST nbl, UINT32 inPort,
156 const PVOID tunnelKey,
157 OvsIPHelperCallback cb,
158 PVOID cbData1,
159 PVOID cbData2);
cd30b346 160NTSTATUS OvsLookupIPFwdInfo(UINT32 srcIp, UINT32 dstIp, POVS_FWD_INFO info);
c803536e
SS
161VOID OvsCancelFwdIpHelperRequest(PNET_BUFFER_LIST nbl);
162
fa1324c9 163#endif /* __IP_HELPER_H_ */