datapath-windows: Remove the old IOCTL vport functions.
[cascardo/ovs.git] / datapath-windows / ovsext / Vport.h
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
17 #ifndef __VPORT_H_
18 #define __VPORT_H_ 1
19
20 #include "Switch.h"
21
22 /*
23  * A Vport, or Virtual Port, is a port on the OVS. It can be one of the
24  * following types. Some of the Vports are "real" ports on the hyper-v switch,
25  * and some are not:
26  * - VIF port (VM's NIC)
27  * - External Adapters (physical NIC)
28  * - Internal Adapter (Virtual adapter exposed on the host).
29  * - Tunnel ports created by OVS userspace.
30  */
31
32 typedef enum {
33     OVS_STATE_UNKNOWN,
34     OVS_STATE_PORT_CREATED,
35     OVS_STATE_NIC_CREATED,
36     OVS_STATE_CONNECTED,
37     OVS_STATE_PORT_TEAR_DOWN,
38     OVS_STATE_PORT_DELETED,
39 } OVS_VPORT_STATE;
40
41 typedef struct _OVS_VPORT_STATS {
42     UINT64 rxPackets;
43     UINT64 txPackets;
44     UINT64 rxBytes;
45     UINT64 txBytes;
46 } OVS_VPORT_STATS;
47
48 typedef struct _OVS_VPORT_ERR_STATS {
49     UINT64  rxErrors;
50     UINT64  txErrors;
51     UINT64  rxDropped;
52     UINT64  txDropped;
53 } OVS_VPORT_ERR_STATS;
54
55 /* used for vport netlink commands. */
56 typedef struct _OVS_VPORT_FULL_STATS {
57     OVS_VPORT_STATS;
58     OVS_VPORT_ERR_STATS;
59 }OVS_VPORT_FULL_STATS;
60 /*
61  * Each internal, external adapter or vritual adapter has
62  * one vport entry. In addition, we have one vport for each
63  * tunnel type, such as vxlan, gre, gre64
64  */
65 typedef struct _OVS_VPORT_ENTRY {
66     LIST_ENTRY             nameLink;
67     LIST_ENTRY             portLink;
68
69     OVS_VPORT_STATE        ovsState;
70     OVS_VPORT_TYPE         ovsType;
71     OVS_VPORT_STATS        stats;
72     OVS_VPORT_ERR_STATS    errStats;
73     UINT32                 portNo;
74     UINT32                 mtu;
75     CHAR                   ovsName[OVS_MAX_PORT_NAME_LENGTH];
76     UINT32                 ovsNameLen;
77
78     PVOID                  priv;
79     NDIS_SWITCH_PORT_ID    portId;
80     NDIS_SWITCH_NIC_INDEX  nicIndex;
81     UINT16                 numaNodeId;
82     NDIS_SWITCH_PORT_STATE portState;
83     NDIS_SWITCH_NIC_STATE  nicState;
84     NDIS_SWITCH_PORT_TYPE  portType;
85     BOOLEAN                isValidationPort;
86
87     UINT8                  permMacAddress[MAC_ADDRESS_LEN];
88     UINT8                  currMacAddress[MAC_ADDRESS_LEN];
89     UINT8                  vmMacAddress[MAC_ADDRESS_LEN];
90
91     NDIS_SWITCH_PORT_NAME  portName;
92     NDIS_SWITCH_NIC_NAME   nicName;
93     NDIS_VM_NAME           vmName;
94     GUID                   netCfgInstanceId;
95     BOOLEAN                isExternal;
96     UINT32                 upcallPid; /* netlink upcall port id */
97 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
98
99 struct _OVS_SWITCH_CONTEXT;
100
101 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
102    ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
103
104 POVS_VPORT_ENTRY
105 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
106                      UINT32 portNo);
107 POVS_VPORT_ENTRY
108 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
109                       CHAR *name, UINT32 length);
110 POVS_VPORT_ENTRY
111 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
112                                 NDIS_SWITCH_PORT_ID portId,
113                                 NDIS_SWITCH_NIC_INDEX index);
114
115 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
116 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
117
118 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
119
120 NDIS_STATUS OvsCreateNic(POVS_SWITCH_CONTEXT switchContext,
121                          PNDIS_SWITCH_NIC_PARAMETERS nicParam);
122 NDIS_STATUS OvsCreatePort(POVS_SWITCH_CONTEXT switchContext,
123                           PNDIS_SWITCH_PORT_PARAMETERS portParam);
124 VOID OvsTeardownPort(POVS_SWITCH_CONTEXT switchContext,
125                      PNDIS_SWITCH_PORT_PARAMETERS portParam);
126 VOID OvsDeletePort(POVS_SWITCH_CONTEXT switchContext,
127                    PNDIS_SWITCH_PORT_PARAMETERS portParam);
128 VOID OvsConnectNic(POVS_SWITCH_CONTEXT switchContext,
129                    PNDIS_SWITCH_NIC_PARAMETERS nicParam);
130 VOID OvsUpdateNic(POVS_SWITCH_CONTEXT switchContext,
131                   PNDIS_SWITCH_NIC_PARAMETERS nicParam);
132 VOID OvsDeleteNic(POVS_SWITCH_CONTEXT switchContext,
133                   PNDIS_SWITCH_NIC_PARAMETERS nicParam);
134 VOID OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
135                       PNDIS_SWITCH_NIC_PARAMETERS nicParam);
136
137 static __inline BOOLEAN
138 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
139 {
140     return ovsType == OVS_VPORT_TYPE_VXLAN ||
141            ovsType == OVS_VPORT_TYPE_GRE ||
142            ovsType == OVS_VPORT_TYPE_GRE64;
143 }
144
145 static __inline BOOLEAN
146 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
147 {
148     return ovsType == OVS_VPORT_TYPE_INTERNAL;
149 }
150
151 static __inline BOOLEAN
152 OvsIsTunnelVportNo(UINT32 portNo)
153 {
154     UINT32 idx = OVS_VPORT_INDEX(portNo);
155     return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END);
156 }
157
158 static __inline BOOLEAN
159 OvsIsVifVportNo(UINT32 portNo)
160 {
161     UINT32 idx = OVS_VPORT_INDEX(portNo);
162     return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX);
163 }
164
165 static __inline POVS_VPORT_ENTRY
166 OvsGetTunnelVport(OVS_VPORT_TYPE type)
167 {
168     ASSERT(OvsIsTunnelVportType(type));
169     switch(type) {
170     case OVS_VPORT_TYPE_VXLAN:
171         return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX);
172     default:
173         ASSERT(! "OvsGetTunnelVport not implemented for this tunnel.");
174     }
175
176     return NULL;
177 }
178
179 static __inline PVOID
180 OvsGetVportPriv(OVS_VPORT_TYPE type)
181 {
182     return OvsGetTunnelVport(type)->priv;
183 }
184
185 static __inline UINT32
186 OvsGetExternalMtu()
187 {
188     return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
189 }
190
191 #endif /* __VPORT_H_ */