summaryrefslogtreecommitdiff
path: root/datapath-windows/include/OvsDpInterfaceExt.h
blob: 045e4cbd6a9ea9828e61a04fe3ab8e4e38ad170a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*
 * Copyright (c) 2014 VMware, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __OVS_DP_INTERFACE_EXT_H_
#define __OVS_DP_INTERFACE_EXT_H_ 1

/* Windows kernel datapath extensions to the standard datapath interface. */

/* Version number of the datapath interface extensions. */
#define OVS_DATAPATH_EXT_VERSION 1

/* Name of the device. */
#define OVS_DEVICE_NAME_NT     L"\\Device\\OpenvSwitchDevice"
#define OVS_DEVICE_NAME_DOS    L"\\DosDevices\\OpenvSwitchDevice"
#define OVS_DEVICE_NAME_USER   TEXT("\\\\.\\OpenvSwitchDevice")

#define OVS_IOCTL_DEVICE_TYPE 45000

#define OVS_IOCTL_START   0x100
/* We used Direct I/O (zero copy) for the buffers. */
/* Non-Netlink-based IOCTLs. */
#define OVS_IOCTL_GET_PID \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x0, METHOD_BUFFERED,\
              FILE_WRITE_ACCESS)
/* Netlink-based IOCTLs. */
#define OVS_IOCTL_READ \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x1, METHOD_OUT_DIRECT,\
              FILE_READ_ACCESS)
#define OVS_IOCTL_READ_EVENT \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x2, METHOD_OUT_DIRECT, \
              FILE_READ_ACCESS)
#define OVS_IOCTL_READ_PACKET \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x3, METHOD_OUT_DIRECT, \
              FILE_READ_ACCESS)
#define OVS_IOCTL_WRITE \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x4, METHOD_IN_DIRECT,\
              FILE_READ_ACCESS)
#define OVS_IOCTL_TRANSACT \
    CTL_CODE (OVS_IOCTL_DEVICE_TYPE, OVS_IOCTL_START + 0x5, METHOD_OUT_DIRECT,\
              FILE_WRITE_ACCESS)

/*
 * On platforms that support netlink natively, the operating system assigns a
 * dynamic value to a netlink family when it is registered. In the absense of
 * such mechanism, defined hard-coded values that are known both to userspace
 * and kernel.
 */
#define OVS_WIN_NL_INVALID_FAMILY_ID         0
#define OVS_WIN_NL_CTRL_FAMILY_ID            (NLMSG_MIN_TYPE + 1)
#define OVS_WIN_NL_DATAPATH_FAMILY_ID        (NLMSG_MIN_TYPE + 2)
#define OVS_WIN_NL_PACKET_FAMILY_ID          (NLMSG_MIN_TYPE + 3)
#define OVS_WIN_NL_VPORT_FAMILY_ID           (NLMSG_MIN_TYPE + 4)
#define OVS_WIN_NL_FLOW_FAMILY_ID            (NLMSG_MIN_TYPE + 5)
#define OVS_WIN_NL_NETDEV_FAMILY_ID          (NLMSG_MIN_TYPE + 6)
/*
 * Conntrack Family is defined in OvsDpInterfaceCtExt.h
 * OVS_WIN_NL_CT_FAMILY_ID is not used in the messages, but used internally
 * in the kernel as a placeholder to enable parsing out the ct family cmds.
 */

#define OVS_WIN_NL_CT_FAMILY_ID              (NLMSG_MIN_TYPE + 7)
#define OVS_WIN_NL_CTLIMIT_FAMILY_ID         (NLMSG_MIN_TYPE + 8)

/* Meter Family */
#define OVS_WIN_NL_METER_FAMILY_ID            (NLMSG_MIN_TYPE + 9)

#define OVS_WIN_NL_INVALID_MCGRP_ID          0
#define OVS_WIN_NL_MCGRP_START_ID            100
#define OVS_WIN_NL_VPORT_MCGRP_ID            (OVS_WIN_NL_MCGRP_START_ID + 1)

/*
 * Define a family of netlink command specific to Windows. This is part of the
 * extensions.
 */
#define OVS_WIN_CONTROL_FAMILY   "ovs_win_control"
#define OVS_WIN_CONTROL_MCGROUP  "ovs_win_control"
#define OVS_WIN_CONTROL_VERSION  1

/* Commands available under the OVS_WIN_CONTROL_FAMILY. */
enum ovs_win_control_cmd {
    OVS_CTRL_CMD_WIN_PEND_REQ,
    OVS_CTRL_CMD_WIN_PEND_PACKET_REQ,
    OVS_CTRL_CMD_MC_SUBSCRIBE_REQ,
    OVS_CTRL_CMD_PACKET_SUBSCRIBE_REQ,

    /* This command logically belongs to the Vport family */
    OVS_CTRL_CMD_EVENT_NOTIFY,
    OVS_CTRL_CMD_READ_NOTIFY,

    /* Used for Socket property */
    OVS_CTRL_CMD_SOCK_PROP
};

/* NL Attributes for joining/unjoining an MC group */
enum ovs_nl_mcast_attr {
    OVS_NL_ATTR_MCAST_GRP,        /* (UINT32) Join an MC group */
    OVS_NL_ATTR_MCAST_JOIN,       /* (UINT8) 1/0 - Join/Unjoin */
    OVS_NL_ATTR_PACKET_SUBSCRIBE, /* (UNINT8): 1/0 - subscribe/unsubscribe */
    OVS_NL_ATTR_PACKET_PID,       /* (UNINT32) netlink PID to receive upcalls */
    __OVS_NL_ATTR_CTRL_MAX
};
#define OVS_WIN_CONTROL_ATTR_MAX (__OVS_NL_ATTR_CTRL_MAX - 1)

/*
 * Netdev family of commands specific to Windows.
 */
#define OVS_WIN_NETDEV_FAMILY   "ovs_win_netdev"
#define OVS_WIN_NETDEV_MCGROUP  "ovs_win_netdev"
#define OVS_WIN_NETDEV_VERSION  1

enum ovs_win_netdev_cmd {
    OVS_WIN_NETDEV_CMD_UNSPEC,
    OVS_WIN_NETDEV_CMD_GET,     /* information about the netdev. */
};

/**
 * For every vport on the datapath, there is a corresponding netdev.  General
 * network device attributes of a vport that are not specific to OVS, such as
 * MTU are represented using a netdev.  For convenience, some of the vport
 * attributes are also included as netdev attributes.
 *
 * enum ovs_win_netdev_attr - attributes for %OVS_WIN_NETDEV_* commands.
 * @OVS_WIN_NETDEV_ATTR_PORT_NO: 32-bit port number of the vport within the
 * datapath.
 * @OVS_WIN_NETDEV_ATTR_TYPE: 32-bit %OVS_VPORT_TYPE_* constant describing
 * the type of vport.
 * @OVS_WIN_NETDEV_ATTR_NAME: Name of vport.  Maximum length %IFNAMSIZ-1 bytes
 * plus a null terminator.
 * @OVS_WIN_NETDEV_ATTR_MAC_ADDR: MAC address of the vport.  %ETH_ADDR_LEN bytes
 * long.
 * @OVS_WIN_NETDEV_ATTR_MTU : 32-bit MTU of the vport.
 * @OVS_WIN_NETDEV_ATTR_IF_FLAGS: 32-bit %OVS_WIN_NETDEV_IFF_* interface flags
 * of the vport.
 *
 * These attributes follow the &struct ovs_header within the Generic Netlink
 * payload for %OVS_WIN_NETDEV_* commands.
 *
 * For all requests, if %OVS_WIN_NETDEV_ATTR_NAME is specified then it is used
 * to look up the netdev to operate on; dp_idx from the &struct
 * ovs_header is not relevant for the look up.
 */
enum ovs_win_netdev_attr {
    OVS_WIN_NETDEV_ATTR_UNSPEC,
    OVS_WIN_NETDEV_ATTR_PORT_NO,     /* u32 port number within datapath. */
    OVS_WIN_NETDEV_ATTR_TYPE,        /* u32 OVS_NETDEV_TYPE_* constant. */
    OVS_WIN_NETDEV_ATTR_NAME,        /* string name, up to IFNAMSIZ bytes long. */
    OVS_WIN_NETDEV_ATTR_MAC_ADDR,    /* MAC address of the vport. */
    OVS_WIN_NETDEV_ATTR_MTU,         /* MTU of the vport. */
    OVS_WIN_NETDEV_ATTR_IF_FLAGS,    /* Interface flags o the vport. */
    __OVS_WIN_NETDEV_ATTR_MAX
};
#define OVS_WIN_NETDEV_ATTR_MAX (__OVS_WIN_NETDEV_ATTR_MAX - 1)

#define OVS_WIN_NETDEV_IFF_UP                   (1 << 0)
#define OVS_WIN_NETDEV_IFF_PROMISC              (1 << 1)

typedef struct ovs_dp_stats OVS_DP_STATS;
typedef enum ovs_vport_type OVS_VPORT_TYPE;

/* NL Attributes for setting socket attributes */
enum ovs_nl_sock_attr {
    /* (UINT32) Netlink Protocol set in Userspace and read in Kernel */
    OVS_NL_ATTR_SOCK_PROTO,
    /* (UINT32) Instance PID set in Kernel and read in Userspace */
    OVS_NL_ATTR_SOCK_PID,
    __OVS_NL_ATTR_SOCK_MAX
};
#define OVS_WIN_SOCK_ATTR_MAX (__OVS_NL_ATTR_SOCK_MAX - 1)

#endif /* __OVS_DP_INTERFACE_EXT_H_ */