]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
e0edde6f | 2 | * Copyright (c) 2008, 2010, 2011 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
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: | |
064af421 | 7 | * |
a14bc59f BP |
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. | |
064af421 BP |
15 | */ |
16 | ||
17 | #ifndef NETLINK_PROTOCOL_H | |
18 | #define NETLINK_PROTOCOL_H 1 | |
19 | ||
20 | /* Netlink protocol definitions. | |
21 | * | |
365a2517 BP |
22 | * Netlink is a message framing format described in RFC 3549 and used heavily |
23 | * in Linux to access the network stack. Open vSwitch uses AF_NETLINK sockets | |
24 | * for this purpose on Linux. But on all platforms, Open vSwitch uses Netlink | |
25 | * message framing internally for certain purposes. | |
26 | * | |
27 | * This header provides access to the Netlink message framing definitions | |
28 | * regardless of platform. On Linux, it includes the proper headers directly; | |
29 | * on other platforms it directly defines the structures and macros itself. | |
30 | */ | |
064af421 BP |
31 | |
32 | #include <stdint.h> | |
33 | #include <sys/socket.h> | |
34 | #include "util.h" | |
35 | ||
365a2517 BP |
36 | #ifdef HAVE_NETLINK |
37 | #include <linux/netlink.h> | |
38 | #include <linux/genetlink.h> | |
b0025c83 | 39 | |
365a2517 | 40 | #else |
064af421 BP |
41 | #define NETLINK_GENERIC 16 |
42 | ||
43 | struct sockaddr_nl { | |
44 | sa_family_t nl_family; | |
45 | unsigned short int nl_pad; | |
46 | uint32_t nl_pid; | |
47 | uint32_t nl_groups; | |
48 | }; | |
49 | BUILD_ASSERT_DECL(sizeof(struct sockaddr_nl) == 12); | |
50 | ||
51 | /* nlmsg_flags bits. */ | |
52 | #define NLM_F_REQUEST 0x001 | |
53 | #define NLM_F_MULTI 0x002 | |
54 | #define NLM_F_ACK 0x004 | |
55 | #define NLM_F_ECHO 0x008 | |
56 | ||
57 | #define NLM_F_ROOT 0x100 | |
58 | #define NLM_F_MATCH 0x200 | |
59 | #define NLM_F_ATOMIC 0x400 | |
60 | #define NLM_F_DUMP (NLM_F_ROOT | NLM_F_MATCH) | |
61 | ||
62 | /* nlmsg_type values. */ | |
63 | #define NLMSG_NOOP 1 | |
64 | #define NLMSG_ERROR 2 | |
65 | #define NLMSG_DONE 3 | |
66 | #define NLMSG_OVERRUN 4 | |
67 | ||
68 | #define NLMSG_MIN_TYPE 0x10 | |
69 | ||
70 | struct nlmsghdr { | |
71 | uint32_t nlmsg_len; | |
72 | uint16_t nlmsg_type; | |
73 | uint16_t nlmsg_flags; | |
74 | uint32_t nlmsg_seq; | |
75 | uint32_t nlmsg_pid; | |
76 | }; | |
77 | BUILD_ASSERT_DECL(sizeof(struct nlmsghdr) == 16); | |
78 | ||
79 | #define NLMSG_ALIGNTO 4 | |
80 | #define NLMSG_ALIGN(SIZE) ROUND_UP(SIZE, NLMSG_ALIGNTO) | |
81 | #define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) | |
82 | ||
83 | struct nlmsgerr | |
84 | { | |
85 | int error; | |
86 | struct nlmsghdr msg; | |
87 | }; | |
88 | BUILD_ASSERT_DECL(sizeof(struct nlmsgerr) == 20); | |
89 | ||
064af421 BP |
90 | struct genlmsghdr { |
91 | uint8_t cmd; | |
92 | uint8_t version; | |
93 | uint16_t reserved; | |
94 | }; | |
95 | BUILD_ASSERT_DECL(sizeof(struct genlmsghdr) == 4); | |
96 | ||
97 | #define GENL_HDRLEN NLMSG_ALIGN(sizeof(struct genlmsghdr)) | |
98 | ||
99 | struct nlattr { | |
100 | uint16_t nla_len; | |
101 | uint16_t nla_type; | |
102 | }; | |
103 | BUILD_ASSERT_DECL(sizeof(struct nlattr) == 4); | |
104 | ||
105 | #define NLA_ALIGNTO 4 | |
106 | #define NLA_ALIGN(SIZE) ROUND_UP(SIZE, NLA_ALIGNTO) | |
107 | #define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) | |
108 | ||
109 | #define GENL_MIN_ID NLMSG_MIN_TYPE | |
110 | #define GENL_MAX_ID 1023 | |
111 | ||
112 | #define GENL_ID_CTRL NLMSG_MIN_TYPE | |
113 | ||
114 | enum { | |
115 | CTRL_CMD_UNSPEC, | |
116 | CTRL_CMD_NEWFAMILY, | |
117 | CTRL_CMD_DELFAMILY, | |
118 | CTRL_CMD_GETFAMILY, | |
119 | CTRL_CMD_NEWOPS, | |
120 | CTRL_CMD_DELOPS, | |
121 | CTRL_CMD_GETOPS, | |
122 | __CTRL_CMD_MAX, | |
123 | }; | |
124 | ||
125 | #define CTRL_CMD_MAX (__CTRL_CMD_MAX - 1) | |
126 | ||
127 | enum { | |
128 | CTRL_ATTR_UNSPEC, | |
129 | CTRL_ATTR_FAMILY_ID, | |
130 | CTRL_ATTR_FAMILY_NAME, | |
131 | CTRL_ATTR_VERSION, | |
132 | CTRL_ATTR_HDRSIZE, | |
133 | CTRL_ATTR_MAXATTR, | |
134 | CTRL_ATTR_OPS, | |
135 | __CTRL_ATTR_MAX, | |
136 | }; | |
137 | ||
138 | #define CTRL_ATTR_MAX (__CTRL_ATTR_MAX - 1) | |
139 | ||
140 | enum { | |
141 | CTRL_ATTR_OP_UNSPEC, | |
142 | CTRL_ATTR_OP_ID, | |
143 | CTRL_ATTR_OP_FLAGS, | |
144 | __CTRL_ATTR_OP_MAX, | |
145 | }; | |
146 | ||
147 | #define CTRL_ATTR_OP_MAX (__CTRL_ATTR_OP_MAX - 1) | |
365a2517 | 148 | #endif /* !HAVE_NETLINK */ |
064af421 | 149 | |
7c624478 BP |
150 | /* These were introduced all together in 2.6.24. */ |
151 | #ifndef NLA_TYPE_MASK | |
05fe1764 BP |
152 | #define NLA_F_NESTED (1 << 15) |
153 | #define NLA_F_NET_BYTEORDER (1 << 14) | |
154 | #define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) | |
7c624478 BP |
155 | #endif |
156 | ||
cceb11f5 BP |
157 | /* These were introduced all together in 2.6.14. (We want our programs to |
158 | * support the newer kernel features even if compiled with older headers.) */ | |
159 | #ifndef NETLINK_ADD_MEMBERSHIP | |
160 | #define NETLINK_ADD_MEMBERSHIP 1 | |
161 | #define NETLINK_DROP_MEMBERSHIP 2 | |
162 | #endif | |
163 | ||
0a397a2f BP |
164 | /* These were introduced all together in 2.6.23. (We want our programs to |
165 | * support the newer kernel features even if compiled with older headers.) */ | |
166 | #ifndef CTRL_ATTR_MCAST_GRP_MAX | |
167 | ||
168 | #undef CTRL_ATTR_MAX | |
169 | #define CTRL_ATTR_MAX 7 | |
170 | #define CTRL_ATTR_MCAST_GROUPS 7 | |
171 | ||
172 | enum { | |
05fe1764 BP |
173 | CTRL_ATTR_MCAST_GRP_UNSPEC, |
174 | CTRL_ATTR_MCAST_GRP_NAME, | |
175 | CTRL_ATTR_MCAST_GRP_ID, | |
176 | __CTRL_ATTR_MCAST_GRP_MAX, | |
0a397a2f BP |
177 | }; |
178 | ||
179 | #define CTRL_ATTR_MCAST_GRP_MAX (__CTRL_ATTR_MCAST_GRP_MAX - 1) | |
180 | #endif /* CTRL_ATTR_MCAST_GRP_MAX */ | |
181 | ||
064af421 | 182 | #endif /* netlink-protocol.h */ |