4ab0019fec7697bcb33fd1f98181f31f824252df
[cascardo/ovs.git] / datapath-windows / ovsext / OvsVport.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 __OVS_VPORT_H_
18 #define __OVS_VPORT_H_ 1
19
20 #include "OvsSwitch.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 rxBytes;
43     UINT64 rxPackets;
44     UINT64 txBytes;
45     UINT64 txPackets;
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  * Each internal, external adapter or vritual adapter has
56  * one vport entry. In addition, we have one vport for each
57  * tunnel type, such as vxlan, gre, gre64
58  */
59 typedef struct _OVS_VPORT_ENTRY {
60     LIST_ENTRY             nameLink;
61     LIST_ENTRY             portLink;
62
63     OVS_VPORT_STATE        ovsState;
64     OVS_VPORT_TYPE         ovsType;
65     OVS_VPORT_STATS        stats;
66     OVS_VPORT_ERR_STATS    errStats;
67     UINT32                 portNo;
68     UINT32                 mtu;
69     CHAR                   ovsName[OVS_MAX_PORT_NAME_LENGTH];
70     UINT32                 ovsNameLen;
71
72     PVOID                  priv;
73     NDIS_SWITCH_PORT_ID    portId;
74     NDIS_SWITCH_NIC_INDEX  nicIndex;
75     UINT16                 numaNodeId;
76     NDIS_SWITCH_PORT_STATE portState;
77     NDIS_SWITCH_NIC_STATE  nicState;
78     NDIS_SWITCH_PORT_TYPE  portType;
79     BOOLEAN                isValidationPort;
80
81     UINT8                  permMacAddress[MAC_ADDRESS_LEN];
82     UINT8                  currMacAddress[MAC_ADDRESS_LEN];
83     UINT8                  vmMacAddress[MAC_ADDRESS_LEN];
84
85     NDIS_SWITCH_PORT_NAME  portName;
86     NDIS_SWITCH_NIC_NAME   nicName;
87     NDIS_VM_NAME           vmName;
88     GUID                   netCfgInstanceId;
89 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
90
91 struct _OVS_SWITCH_CONTEXT;
92
93 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
94    ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
95
96 POVS_VPORT_ENTRY
97 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
98                      UINT32 portNo);
99 POVS_VPORT_ENTRY
100 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
101                       CHAR *name, UINT32 length);
102 POVS_VPORT_ENTRY
103 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
104                                 NDIS_SWITCH_PORT_ID portId,
105                                 NDIS_SWITCH_NIC_INDEX index);
106
107 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
108 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
109
110 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
111
112 NTSTATUS OvsDumpVportIoctl(PVOID inputBuffer, UINT32 inputLength,
113                            PVOID outputBuffer, UINT32 outputLength,
114                            UINT32 *replyLen);
115 NTSTATUS OvsGetVportIoctl(PVOID inputBuffer, UINT32 inputLength,
116                           PVOID outputBuffer, UINT32 outputLength,
117                           UINT32 *replyLen);
118 NTSTATUS OvsAddVportIoctl(PVOID inputBuffer, UINT32 inputLength,
119                           PVOID outputBuffer, UINT32 outputLength,
120                           UINT32 *replyLen);
121 NTSTATUS OvsDelVportIoctl(PVOID inputBuffer, UINT32 inputLength,
122                           UINT32 *replyLen);
123 NTSTATUS OvsGetExtInfoIoctl(PVOID inputBuffer, UINT32 inputLength,
124                             PVOID outputBuffer, UINT32 outputLength,
125                             UINT32 *replyLen);
126 NDIS_STATUS OvsCreateNic(POVS_SWITCH_CONTEXT switchContext,
127                          PNDIS_SWITCH_NIC_PARAMETERS nicParam);
128 NDIS_STATUS OvsCreatePort(POVS_SWITCH_CONTEXT switchContext,
129                           PNDIS_SWITCH_PORT_PARAMETERS portParam);
130 VOID OvsTeardownPort(POVS_SWITCH_CONTEXT switchContext,
131                      PNDIS_SWITCH_PORT_PARAMETERS portParam);
132 VOID OvsDeletePort(POVS_SWITCH_CONTEXT switchContext,
133                    PNDIS_SWITCH_PORT_PARAMETERS portParam);
134 VOID OvsConnectNic(POVS_SWITCH_CONTEXT switchContext,
135                    PNDIS_SWITCH_NIC_PARAMETERS nicParam);
136 VOID OvsUpdateNic(POVS_SWITCH_CONTEXT switchContext,
137                   PNDIS_SWITCH_NIC_PARAMETERS nicParam);
138 VOID OvsDeleteNic(POVS_SWITCH_CONTEXT switchContext,
139                   PNDIS_SWITCH_NIC_PARAMETERS nicParam);
140 VOID OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
141                       PNDIS_SWITCH_NIC_PARAMETERS nicParam);
142
143 static __inline BOOLEAN
144 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
145 {
146     return ovsType == OVSWIN_VPORT_TYPE_VXLAN ||
147            ovsType == OVSWIN_VPORT_TYPE_GRE ||
148            ovsType == OVSWIN_VPORT_TYPE_GRE64;
149 }
150
151 static __inline BOOLEAN
152 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
153 {
154     return ovsType == OVSWIN_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 OVSWIN_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 /* __OVS_VPORT_H_ */