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