]> git.proxmox.com Git - ovs.git/blame - datapath-windows/ovsext/Netlink/Netlink.h
datapath-windows: Support for OVS_KEY_ATTR_MPLS attribute
[ovs.git] / datapath-windows / ovsext / Netlink / Netlink.h
CommitLineData
344b47e1
AS
1/*
2 * Copyright (c) 2008, 2009, 2010, 2011, 2013, 2014 Nicira, 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 __NETLINK_H_
18#define __NETLINK_H_ 1
19
fa1324c9 20#include "Types.h"
344b47e1 21#include "NetlinkProto.h"
edf3fb0f 22#include "NetlinkBuf.h"
08288ce0
AS
23#include "..\..\include\OvsDpInterface.h"
24
25/*
26 * Structure of any message passed between userspace and kernel.
27 */
28typedef struct _OVS_MESSAGE {
29 NL_MSG_HDR nlMsg;
30 GENL_MSG_HDR genlMsg;
31 OVS_HDR ovsHdr;
32 /* Variable length nl_attrs follow. */
33} OVS_MESSAGE, *POVS_MESSAGE;
344b47e1 34
fa8266a8
NR
35/*
36 * Structure of an error message sent as a reply from kernel.
37 */
38typedef struct _OVS_MESSAGE_ERROR {
39 NL_MSG_HDR nlMsg;
40 NL_MSG_ERR errorMsg;
41} OVS_MESSAGE_ERROR, *POVS_MESSAGE_ERROR;
42
344b47e1
AS
43/* Netlink attribute types. */
44typedef enum
45{
46 NL_A_NO_ATTR = 0,
5ab37d7a 47 NL_A_VAR_LEN,
344b47e1
AS
48 NL_A_UNSPEC,
49 NL_A_U8,
50 NL_A_U16,
51 NL_A_BE16 = NL_A_U16,
52 NL_A_U32,
53 NL_A_BE32 = NL_A_U32,
54 NL_A_U64,
55 NL_A_BE64 = NL_A_U64,
56 NL_A_STRING,
57 NL_A_FLAG,
58 NL_A_NESTED,
59 N_NL_ATTR_TYPES
60} NL_ATTR_TYPE;
61
62/* Netlink attribute policy.
63 * Specifies the policy for parsing for netlink attribute. */
64typedef struct _NL_POLICY
65{
66 NL_ATTR_TYPE type;
67 UINT32 minLen;
68 UINT32 maxLen;
cd002ede 69 BOOLEAN optional;
344b47e1
AS
70} NL_POLICY, *PNL_POLICY;
71
72/* This macro is careful to check for attributes with bad lengths. */
73#define NL_ATTR_FOR_EACH(ITER, LEFT, ATTRS, ATTRS_LEN) \
74 for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \
75 NlAttrIsValid(ITER, LEFT); \
76 (LEFT) -= NlAttrLenPad(ITER, LEFT), (ITER) = NlAttrNext(ITER))
77
78/* This macro does not check for attributes with bad lengths. It should only
79 * be used with messages from trusted sources or with messages that have
80 * already been validated (e.g. with NL_ATTR_FOR_EACH). */
81#define NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, ATTRS, ATTRS_LEN) \
82 for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \
83 (LEFT) > 0; \
84 (LEFT) -= NLA_ALIGN((ITER)->nlaLen), (ITER) = NlAttrNext(ITER))
85
86#define NL_ATTR_GET_AS(NLA, TYPE) \
87 (*(TYPE*) NlAttrGetUnspec(nla, sizeof(TYPE)))
88
1ad44ad4 89BOOLEAN NlFillOvsMsg(PNL_BUFFER nlBuf,
e6ac5e9e 90 UINT16 nlmsgType, UINT16 nlmsgFlags,
1ad44ad4
NR
91 UINT32 nlmsgSeq, UINT32 nlmsgPid,
92 UINT8 genlCmd, UINT8 genlVer, UINT32 dpNo);
93BOOLEAN NlFillNlHdr(PNL_BUFFER nlBuf,
94 UINT16 nlmsgType, UINT16 nlmsgFlags,
95 UINT32 nlmsgSeq, UINT32 nlmsgPid);
d5f1e533 96
5fc8ea2d
NR
97VOID NlBuildErrorMsg(POVS_MESSAGE msgIn, POVS_MESSAGE_ERROR msgOut,
98 UINT errorCode);
fa8266a8 99
344b47e1
AS
100/* Netlink message accessing the payload */
101PVOID NlMsgAt(const PNL_MSG_HDR nlh, UINT32 offset);
102UINT32 NlMsgSize(const PNL_MSG_HDR nlh);
e6ac5e9e
AS
103VOID NlMsgAlignSize(const PNL_MSG_HDR nlh);
104VOID NlMsgSetSize(const PNL_MSG_HDR nlh, UINT32 msgLen);
5b224954
AS
105PCHAR NlHdrPayload(const PNL_MSG_HDR nlh);
106UINT32 NlHdrPayloadLen(const PNL_MSG_HDR nlh);
344b47e1 107PNL_ATTR NlMsgAttrs(const PNL_MSG_HDR nlh);
5b224954 108UINT32 NlMsgAttrsLen(const PNL_MSG_HDR nlh);
344b47e1
AS
109
110/* Netlink message parse */
111PNL_MSG_HDR NlMsgNext(const PNL_MSG_HDR nlh);
112INT NlAttrIsValid(const PNL_ATTR nla, UINT32 maxlen);
113UINT32 NlAttrLenPad(const PNL_ATTR nla, UINT32 maxlen);
114
115/* Netlink attribute parsing. */
116UINT32 NlAttrMinLen(NL_ATTR_TYPE type);
117UINT32 NlAttrMinLen(NL_ATTR_TYPE type);
118PNL_ATTR NlAttrNext(const PNL_ATTR nla);
119UINT16 NlAttrType(const PNL_ATTR nla);
120PVOID NlAttrData(const PNL_ATTR nla);
121UINT32 NlAttrGetSize(const PNL_ATTR nla);
122const PVOID NlAttrGet(const PNL_ATTR nla);
123const PVOID NlAttrGetUnspec(const PNL_ATTR nla, UINT32 size);
124BE64 NlAttrGetBe64(const PNL_ATTR nla);
125BE32 NlAttrGetBe32(const PNL_ATTR nla);
5874d571 126BE16 NlAttrGetBe16(const PNL_ATTR nla);
344b47e1 127UINT8 NlAttrGetU8(const PNL_ATTR nla);
8722e8f3 128UINT16 NlAttrGetU16(const PNL_ATTR nla);
344b47e1 129UINT32 NlAttrGetU32(const PNL_ATTR nla);
8722e8f3 130UINT64 NlAttrGetU64(const PNL_ATTR nla);
344b47e1
AS
131const PNL_ATTR NlAttrFind__(const PNL_ATTR attrs,
132 UINT32 size, UINT16 type);
133const PNL_ATTR NlAttrFindNested(const PNL_ATTR nla,
134 UINT16 type);
135BOOLEAN NlAttrParse(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
5b224954 136 UINT32 totalAttrLen, const NL_POLICY policy[],
b8b00f0c
SV
137 const UINT32 numPolicy, PNL_ATTR attrs[],
138 UINT32 numAttrs);
5b224954
AS
139BOOLEAN NlAttrParseNested(const PNL_MSG_HDR nlMsg, UINT32 attrOffset,
140 UINT32 totalAttrLen, const NL_POLICY policy[],
b8b00f0c
SV
141 const UINT32 numPolicy, PNL_ATTR attrs[],
142 UINT32 numAttrs);
dac95740
AS
143/*
144 * --------------------------------------------------------------------------
145 * Returns the length of attribute.
146 * --------------------------------------------------------------------------
147 */
148static __inline UINT16
149NlAttrLen(const PNL_ATTR nla)
150{
151 return nla->nlaLen;
152}
153
152f11b6
EE
154/*
155 * ---------------------------------------------------------------------------
156 * Default maximum payload size for each type of attribute.
157 * ---------------------------------------------------------------------------
158 */
159UINT32
160static __inline NlAttrSize(UINT32 payloadSize)
161{
162 return NLA_HDRLEN + payloadSize;
163}
164
165/*
166 * ---------------------------------------------------------------------------
167 * Total length including padding.
168 * ---------------------------------------------------------------------------
169 */
170UINT32
171static __inline NlAttrTotalSize(UINT32 payloadSize)
172{
173 return NLA_ALIGN(NlAttrSize(payloadSize));
174}
175
344b47e1
AS
176/* Netlink attribute validation */
177BOOLEAN NlAttrValidate(const PNL_ATTR, const PNL_POLICY);
178
edf3fb0f
AS
179/* Put APis */
180BOOLEAN NlMsgPutNlHdr(PNL_BUFFER buf, PNL_MSG_HDR nlMsg);
181BOOLEAN NlMsgPutGenlHdr(PNL_BUFFER buf, PGENL_MSG_HDR genlMsg);
182BOOLEAN NlMsgPutOvsHdr(PNL_BUFFER buf, POVS_HDR ovsHdr);
183
184BOOLEAN NlMsgPutTail(PNL_BUFFER buf, const PCHAR data, UINT32 len);
185PCHAR NlMsgPutTailUninit(PNL_BUFFER buf, UINT32 len);
186PCHAR NlMsgPutTailUnspecUninit(PNL_BUFFER buf, UINT16 type, UINT16 len);
187BOOLEAN NlMsgPutTailUnspec(PNL_BUFFER buf, UINT16 type, PCHAR data, UINT16 len);
188BOOLEAN NlMsgPutTailFlag(PNL_BUFFER buf, UINT16 type);
189BOOLEAN NlMsgPutTailU8(PNL_BUFFER buf, UINT16 type, UINT8 value);
190BOOLEAN NlMsgPutTailU16(PNL_BUFFER buf, UINT16 type, UINT16 value);
191BOOLEAN NlMsgPutTailU32(PNL_BUFFER buf, UINT16 type, UINT32 value);
192BOOLEAN NlMsgPutTailU64(PNL_BUFFER buf, UINT16 type, UINT64 value);
193BOOLEAN NlMsgPutTailString(PNL_BUFFER buf, UINT16 type, PCHAR value);
194
195BOOLEAN NlMsgPutHead(PNL_BUFFER buf, const PCHAR data, UINT32 len);
196PCHAR NlMsgPutHeadUninit(PNL_BUFFER buf, UINT32 len);
197PCHAR NlMsgPutHeadUnspecUninit(PNL_BUFFER buf, UINT16 type, UINT16 len);
198BOOLEAN NlMsgPutHeadUnspec(PNL_BUFFER buf, UINT16 type, PCHAR data, UINT16 len);
199BOOLEAN NlMsgPutHeadFlag(PNL_BUFFER buf, UINT16 type);
200BOOLEAN NlMsgPutHeadU8(PNL_BUFFER buf, UINT16 type, UINT8 value);
201BOOLEAN NlMsgPutHeadU16(PNL_BUFFER buf, UINT16 type, UINT16 value);
202BOOLEAN NlMsgPutHeadU32(PNL_BUFFER buf, UINT16 type, UINT32 value);
203BOOLEAN NlMsgPutHeadU64(PNL_BUFFER buf, UINT16 type, UINT64 value);
204BOOLEAN NlMsgPutHeadString(PNL_BUFFER buf, UINT16 type, PCHAR value);
988672a7
AS
205UINT32 NlMsgStartNested(PNL_BUFFER buf, UINT16 type);
206VOID NlMsgEndNested(PNL_BUFFER buf, UINT32 offset);
b113e510
AS
207BOOLEAN NlMsgPutNested(PNL_BUFFER buf, UINT16 type,
208 const PVOID data, UINT32 size);
988672a7
AS
209
210/* These variants are convenient for iterating nested attributes. */
211#define NL_NESTED_FOR_EACH(ITER, LEFT, A) \
212 NL_ATTR_FOR_EACH(ITER, LEFT, NlAttrGet(A), NlAttrGetSize(A))
213#define NL_NESTED_FOR_EACH_UNSAFE(ITER, LEFT, A) \
214 NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, NlAttrGet(A), NlAttrGetSize(A))
edf3fb0f 215
344b47e1 216#endif /* __NETLINK_H_ */