0061b0fbbbeb8a5a9fc6ab3028daef090568a3f0
[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
86     UINT8                  permMacAddress[MAC_ADDRESS_LEN];
87     UINT8                  currMacAddress[MAC_ADDRESS_LEN];
88     UINT8                  vmMacAddress[MAC_ADDRESS_LEN];
89
90     NDIS_SWITCH_PORT_NAME  portName;
91     NDIS_SWITCH_NIC_NAME   nicName;
92     NDIS_VM_NAME           vmName;
93     GUID                   netCfgInstanceId;
94     BOOLEAN                isExternal;
95     UINT32                 upcallPid; /* netlink upcall port id */
96 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
97
98 struct _OVS_SWITCH_CONTEXT;
99
100 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
101    ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
102
103 POVS_VPORT_ENTRY
104 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
105                      UINT32 portNo);
106 POVS_VPORT_ENTRY
107 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
108                       CHAR *name, UINT32 length);
109 POVS_VPORT_ENTRY
110 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
111                                 NDIS_SWITCH_PORT_ID portId,
112                                 NDIS_SWITCH_NIC_INDEX index);
113
114 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
115 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
116
117 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
118
119 NDIS_STATUS HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
120                         PNDIS_SWITCH_NIC_PARAMETERS nicParam);
121 NDIS_STATUS HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
122                          PNDIS_SWITCH_PORT_PARAMETERS portParam);
123 VOID HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
124                     PNDIS_SWITCH_PORT_PARAMETERS portParam);
125 VOID HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
126                   PNDIS_SWITCH_PORT_PARAMETERS portParam);
127 VOID HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
128                   PNDIS_SWITCH_NIC_PARAMETERS nicParam);
129 VOID HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
130                  PNDIS_SWITCH_NIC_PARAMETERS nicParam);
131 VOID HvDeleteNic(POVS_SWITCH_CONTEXT switchContext,
132                  PNDIS_SWITCH_NIC_PARAMETERS nicParam);
133 VOID HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
134                      PNDIS_SWITCH_NIC_PARAMETERS nicParam);
135
136 static __inline BOOLEAN
137 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
138 {
139     return ovsType == OVS_VPORT_TYPE_VXLAN ||
140            ovsType == OVS_VPORT_TYPE_GRE ||
141            ovsType == OVS_VPORT_TYPE_GRE64;
142 }
143
144 static __inline BOOLEAN
145 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
146 {
147     return ovsType == OVS_VPORT_TYPE_INTERNAL;
148 }
149
150 static __inline BOOLEAN
151 OvsIsTunnelVportNo(UINT32 portNo)
152 {
153     UINT32 idx = OVS_VPORT_INDEX(portNo);
154     return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END);
155 }
156
157 static __inline BOOLEAN
158 OvsIsVifVportNo(UINT32 portNo)
159 {
160     UINT32 idx = OVS_VPORT_INDEX(portNo);
161     return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX);
162 }
163
164 static __inline POVS_VPORT_ENTRY
165 OvsGetTunnelVport(OVS_VPORT_TYPE type)
166 {
167     ASSERT(OvsIsTunnelVportType(type));
168     switch(type) {
169     case OVS_VPORT_TYPE_VXLAN:
170         return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX);
171     default:
172         ASSERT(! "OvsGetTunnelVport not implemented for this tunnel.");
173     }
174
175     return NULL;
176 }
177
178 static __inline PVOID
179 OvsGetVportPriv(OVS_VPORT_TYPE type)
180 {
181     return OvsGetTunnelVport(type)->priv;
182 }
183
184 static __inline UINT32
185 OvsGetExternalMtu()
186 {
187     return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
188 }
189
190 #endif /* __VPORT_H_ */