1 #ifndef __NETLINK_KERNEL_H_ 2 #define __NETLINK_KERNEL_H_ 3 4 #if 0 5 6 /* 7 * FIXME: Goal is to preseve the documentation but make it simple 8 * to keep linux/netlink.h in sync. Maybe use named documentation 9 * sections. 10 */ 11 12 /** 13 * Netlink socket address 14 * @ingroup nl 15 */ 16 struct sockaddr_nl 17 { 18 /** socket family (AF_NETLINK) */ 19 sa_family_t nl_family; 20 21 /** Padding (unused) */ 22 unsigned short nl_pad; 23 24 /** Unique process ID */ 25 uint32_t nl_pid; 26 27 /** Multicast group subscriptions */ 28 uint32_t nl_groups; 29 }; 30 31 /** 32 * @addtogroup msg 33 * @{ 34 */ 35 36 37 /** 38 * Netlink message header 39 */ 40 struct nlmsghdr 41 { 42 /** Length of message including header and padding. */ 43 uint32_t nlmsg_len; 44 45 /** Message type (content type) */ 46 uint16_t nlmsg_type; 47 48 /** Message flags */ 49 uint16_t nlmsg_flags; 50 51 /** Sequence number of message \see core_sk_seq_num. */ 52 uint32_t nlmsg_seq; 53 54 /** Netlink port */ 55 uint32_t nlmsg_pid; 56 }; 57 58 /** 59 * @name Standard message flags 60 * @{ 61 */ 62 63 /** 64 * Must be set on all request messages (typically from user space to 65 * kernel space). 66 */ 67 #define NLM_F_REQUEST 1 68 69 /** 70 * Indicates the message is part of a multipart message terminated 71 * by NLMSG_DONE. 72 */ 73 #define NLM_F_MULTI 2 74 75 /** 76 * Request for an acknowledgment on success. 77 */ 78 #define NLM_F_ACK 4 79 80 /** 81 * Echo this request 82 */ 83 #define NLM_F_ECHO 8 84 85 /** @} */ 86 87 /** 88 * @name Additional message flags for GET requests 89 * @{ 90 */ 91 92 /** 93 * Return the complete table instead of a single entry. 94 */ 95 #define NLM_F_ROOT 0x100 96 97 /** 98 * Return all entries matching criteria passed in message content. 99 */ 100 #define NLM_F_MATCH 0x200 101 102 /** 103 * Return an atomic snapshot of the table being referenced. This 104 * may require special privileges because it has the potential to 105 * interrupt service in the FE for a longer time. 106 */ 107 #define NLM_F_ATOMIC 0x400 108 109 /** 110 * Dump all entries 111 */ 112 #define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) 113 114 /** @} */ 115 116 /** 117 * @name Additional messsage flags for NEW requests 118 * @{ 119 */ 120 121 /** 122 * Replace existing matching config object with this request. 123 */ 124 #define NLM_F_REPLACE 0x100 125 126 /** 127 * Don't replace the config object if it already exists. 128 */ 129 #define NLM_F_EXCL 0x200 130 131 /** 132 * Create config object if it doesn't already exist. 133 */ 134 #define NLM_F_CREATE 0x400 135 136 /** 137 * Add to the end of the object list. 138 */ 139 #define NLM_F_APPEND 0x800 140 141 /** @} */ 142 143 /** 144 * @name Standard Message types 145 * @{ 146 */ 147 148 /** 149 * No operation, message must be ignored 150 */ 151 #define NLMSG_NOOP 0x1 152 153 /** 154 * The message signals an error and the payload contains a nlmsgerr 155 * structure. This can be looked at as a NACK and typically it is 156 * from FEC to CPC. 157 */ 158 #define NLMSG_ERROR 0x2 159 160 /** 161 * Message terminates a multipart message. 162 */ 163 #define NLMSG_DONE 0x3 164 165 /** 166 * The message signals that data got lost 167 */ 168 #define NLMSG_OVERRUN 0x4 169 170 /** 171 * Lower limit of reserved message types 172 */ 173 #define NLMSG_MIN_TYPE 0x10 174 175 /** @} */ 176 177 /** 178 * Netlink error message header 179 */ 180 struct nlmsgerr 181 { 182 /** Error code (errno number) */ 183 int error; 184 185 /** Original netlink message causing the error */ 186 struct nlmsghdr msg; 187 }; 188 189 struct nl_pktinfo 190 { 191 __u32 group; 192 }; 193 194 /** 195 * Netlink alignment constant, all boundries within messages must be align to this. 196 * 197 * See \ref core_msg_fmt_align for more information on message alignment. 198 */ 199 #define NLMSG_ALIGNTO 4 200 201 /** 202 * Returns \p len properly aligned to NLMSG_ALIGNTO. 203 * 204 * See \ref core_msg_fmt_align for more information on message alignment. 205 */ 206 #define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) 207 208 /** 209 * Length of a netlink message header including padding. 210 * 211 * See \ref core_msg_fmt_align for more information on message alignment. 212 */ 213 #define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) 214 215 /** @} */ 216 217 /** 218 * @addtogroup attr 219 * @{ 220 */ 221 222 /* 223 */ 224 225 /** 226 * Netlink attribute structure 227 * 228 * @code 229 * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> 230 * +---------------------+- - -+- - - - - - - - - -+- - -+ 231 * | Header | Pad | Payload | Pad | 232 * | (struct nlattr) | ing | | ing | 233 * +---------------------+- - -+- - - - - - - - - -+- - -+ 234 * <-------------- nlattr->nla_len --------------> 235 * @endcode 236 */ 237 struct nlattr { 238 /** 239 * Attribute length in bytes including header 240 */ 241 __u16 nla_len; 242 243 /** 244 * Netlink attribute type 245 */ 246 __u16 nla_type; 247 }; 248 249 /** 250 * @name Attribute Type Flags 251 * 252 * @code 253 * nla_type (16 bits) 254 * +---+---+-------------------------------+ 255 * | N | O | Attribute Type | 256 * +---+---+-------------------------------+ 257 * N := Carries nested attributes 258 * O := Payload stored in network byte order 259 * @endcode 260 * 261 * @note The N and O flag are mutually exclusive. 262 * 263 * @{ 264 */ 265 266 /* 267 */ 268 #define NLA_F_NESTED (1 << 15) 269 #define NLA_F_NET_BYTEORDER (1 << 14) 270 #define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) 271 272 /** @} */ 273 274 #define NLA_ALIGNTO 4 275 276 /** 277 * Returns \p len properly aligned to NLA_ALIGNTO. 278 * 279 * See \ref core_msg_fmt_align for more information on message alignment. 280 */ 281 #define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) 282 283 /** 284 * Length of a netlink attribute header including padding. 285 * 286 * See \ref core_msg_fmt_align for more information on message alignment. 287 */ 288 #define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) 289 290 /** @} */ 291 292 #endif 293 #endif /* __LINUX_NETLINK_H */ 294