]>
Commit | Line | Data |
---|---|---|
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 | */ | |
28 | typedef 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 | */ | |
38 | typedef 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. */ |
44 | typedef 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. */ | |
64 | typedef 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 | 89 | BOOLEAN NlFillOvsMsg(PNL_BUFFER nlBuf, |
e6ac5e9e | 90 | UINT16 nlmsgType, UINT16 nlmsgFlags, |
1ad44ad4 NR |
91 | UINT32 nlmsgSeq, UINT32 nlmsgPid, |
92 | UINT8 genlCmd, UINT8 genlVer, UINT32 dpNo); | |
93 | BOOLEAN NlFillNlHdr(PNL_BUFFER nlBuf, | |
94 | UINT16 nlmsgType, UINT16 nlmsgFlags, | |
95 | UINT32 nlmsgSeq, UINT32 nlmsgPid); | |
d5f1e533 | 96 | |
5fc8ea2d NR |
97 | VOID NlBuildErrorMsg(POVS_MESSAGE msgIn, POVS_MESSAGE_ERROR msgOut, |
98 | UINT errorCode); | |
fa8266a8 | 99 | |
344b47e1 AS |
100 | /* Netlink message accessing the payload */ |
101 | PVOID NlMsgAt(const PNL_MSG_HDR nlh, UINT32 offset); | |
102 | UINT32 NlMsgSize(const PNL_MSG_HDR nlh); | |
e6ac5e9e AS |
103 | VOID NlMsgAlignSize(const PNL_MSG_HDR nlh); |
104 | VOID NlMsgSetSize(const PNL_MSG_HDR nlh, UINT32 msgLen); | |
5b224954 AS |
105 | PCHAR NlHdrPayload(const PNL_MSG_HDR nlh); |
106 | UINT32 NlHdrPayloadLen(const PNL_MSG_HDR nlh); | |
344b47e1 | 107 | PNL_ATTR NlMsgAttrs(const PNL_MSG_HDR nlh); |
5b224954 | 108 | UINT32 NlMsgAttrsLen(const PNL_MSG_HDR nlh); |
344b47e1 AS |
109 | |
110 | /* Netlink message parse */ | |
111 | PNL_MSG_HDR NlMsgNext(const PNL_MSG_HDR nlh); | |
112 | INT NlAttrIsValid(const PNL_ATTR nla, UINT32 maxlen); | |
113 | UINT32 NlAttrLenPad(const PNL_ATTR nla, UINT32 maxlen); | |
114 | ||
115 | /* Netlink attribute parsing. */ | |
116 | UINT32 NlAttrMinLen(NL_ATTR_TYPE type); | |
117 | UINT32 NlAttrMinLen(NL_ATTR_TYPE type); | |
118 | PNL_ATTR NlAttrNext(const PNL_ATTR nla); | |
119 | UINT16 NlAttrType(const PNL_ATTR nla); | |
120 | PVOID NlAttrData(const PNL_ATTR nla); | |
121 | UINT32 NlAttrGetSize(const PNL_ATTR nla); | |
122 | const PVOID NlAttrGet(const PNL_ATTR nla); | |
123 | const PVOID NlAttrGetUnspec(const PNL_ATTR nla, UINT32 size); | |
124 | BE64 NlAttrGetBe64(const PNL_ATTR nla); | |
125 | BE32 NlAttrGetBe32(const PNL_ATTR nla); | |
5874d571 | 126 | BE16 NlAttrGetBe16(const PNL_ATTR nla); |
344b47e1 | 127 | UINT8 NlAttrGetU8(const PNL_ATTR nla); |
8722e8f3 | 128 | UINT16 NlAttrGetU16(const PNL_ATTR nla); |
344b47e1 | 129 | UINT32 NlAttrGetU32(const PNL_ATTR nla); |
8722e8f3 | 130 | UINT64 NlAttrGetU64(const PNL_ATTR nla); |
344b47e1 AS |
131 | const PNL_ATTR NlAttrFind__(const PNL_ATTR attrs, |
132 | UINT32 size, UINT16 type); | |
133 | const PNL_ATTR NlAttrFindNested(const PNL_ATTR nla, | |
134 | UINT16 type); | |
135 | BOOLEAN 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 |
139 | BOOLEAN 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 | */ | |
148 | static __inline UINT16 | |
149 | NlAttrLen(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 | */ | |
159 | UINT32 | |
160 | static __inline NlAttrSize(UINT32 payloadSize) | |
161 | { | |
162 | return NLA_HDRLEN + payloadSize; | |
163 | } | |
164 | ||
165 | /* | |
166 | * --------------------------------------------------------------------------- | |
167 | * Total length including padding. | |
168 | * --------------------------------------------------------------------------- | |
169 | */ | |
170 | UINT32 | |
171 | static __inline NlAttrTotalSize(UINT32 payloadSize) | |
172 | { | |
173 | return NLA_ALIGN(NlAttrSize(payloadSize)); | |
174 | } | |
175 | ||
344b47e1 AS |
176 | /* Netlink attribute validation */ |
177 | BOOLEAN NlAttrValidate(const PNL_ATTR, const PNL_POLICY); | |
178 | ||
edf3fb0f AS |
179 | /* Put APis */ |
180 | BOOLEAN NlMsgPutNlHdr(PNL_BUFFER buf, PNL_MSG_HDR nlMsg); | |
181 | BOOLEAN NlMsgPutGenlHdr(PNL_BUFFER buf, PGENL_MSG_HDR genlMsg); | |
182 | BOOLEAN NlMsgPutOvsHdr(PNL_BUFFER buf, POVS_HDR ovsHdr); | |
183 | ||
184 | BOOLEAN NlMsgPutTail(PNL_BUFFER buf, const PCHAR data, UINT32 len); | |
185 | PCHAR NlMsgPutTailUninit(PNL_BUFFER buf, UINT32 len); | |
186 | PCHAR NlMsgPutTailUnspecUninit(PNL_BUFFER buf, UINT16 type, UINT16 len); | |
187 | BOOLEAN NlMsgPutTailUnspec(PNL_BUFFER buf, UINT16 type, PCHAR data, UINT16 len); | |
188 | BOOLEAN NlMsgPutTailFlag(PNL_BUFFER buf, UINT16 type); | |
189 | BOOLEAN NlMsgPutTailU8(PNL_BUFFER buf, UINT16 type, UINT8 value); | |
190 | BOOLEAN NlMsgPutTailU16(PNL_BUFFER buf, UINT16 type, UINT16 value); | |
191 | BOOLEAN NlMsgPutTailU32(PNL_BUFFER buf, UINT16 type, UINT32 value); | |
192 | BOOLEAN NlMsgPutTailU64(PNL_BUFFER buf, UINT16 type, UINT64 value); | |
193 | BOOLEAN NlMsgPutTailString(PNL_BUFFER buf, UINT16 type, PCHAR value); | |
194 | ||
195 | BOOLEAN NlMsgPutHead(PNL_BUFFER buf, const PCHAR data, UINT32 len); | |
196 | PCHAR NlMsgPutHeadUninit(PNL_BUFFER buf, UINT32 len); | |
197 | PCHAR NlMsgPutHeadUnspecUninit(PNL_BUFFER buf, UINT16 type, UINT16 len); | |
198 | BOOLEAN NlMsgPutHeadUnspec(PNL_BUFFER buf, UINT16 type, PCHAR data, UINT16 len); | |
199 | BOOLEAN NlMsgPutHeadFlag(PNL_BUFFER buf, UINT16 type); | |
200 | BOOLEAN NlMsgPutHeadU8(PNL_BUFFER buf, UINT16 type, UINT8 value); | |
201 | BOOLEAN NlMsgPutHeadU16(PNL_BUFFER buf, UINT16 type, UINT16 value); | |
202 | BOOLEAN NlMsgPutHeadU32(PNL_BUFFER buf, UINT16 type, UINT32 value); | |
203 | BOOLEAN NlMsgPutHeadU64(PNL_BUFFER buf, UINT16 type, UINT64 value); | |
204 | BOOLEAN NlMsgPutHeadString(PNL_BUFFER buf, UINT16 type, PCHAR value); | |
988672a7 AS |
205 | UINT32 NlMsgStartNested(PNL_BUFFER buf, UINT16 type); |
206 | VOID NlMsgEndNested(PNL_BUFFER buf, UINT32 offset); | |
b113e510 AS |
207 | BOOLEAN 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_ */ |