1/*
2 * lib/doc.c		Documentation Purpose
3 *
4 *	This library is free software; you can redistribute it and/or
5 *	modify it under the terms of the GNU Lesser General Public
6 *	License as published by the Free Software Foundation version 2.1
7 *	of the License.
8 *
9 * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
10 */
11
12/**
13 * @mainpage
14 *
15 * @section intro Introduction
16 *
17 * libnl is a set of libraries to deal with the netlink protocol and some
18 * of the high level protocols implemented on top of it. Its goal is to
19 * simplify netlink protocol usage and to create an abstraction layer using
20 * object based interfaces for various netlink based subsystems.The library
21 * was developed and tested on the 2.6.x kernel releases but it may work with
22 * older kernel series.
23 *
24 * @section toc Table of Contents
25 *
26 * - \subpage core_doc
27 * - \subpage route_doc
28 * - \subpage genl_doc
29 * - \subpage nf_doc
30 *
31 * @section remarks Remarks
32 *
33 * @subsection cache_alloc Allocation of Caches
34 *
35 * Almost all subsystem provide a function to allocate a new cache
36 * of some form. The function usually looks like this:
37 * @code
38 * struct nl_cache *<object name>_alloc_cache(struct nl_sock *sk);
39 * @endcode
40 *
41 * These functions allocate a new cache for the own object type,
42 * initializes it properly and updates it to represent the current
43 * state of their master, e.g. a link cache would include all
44 * links currently configured in the kernel.
45 *
46 * Some of the allocation functions may take additional arguments
47 * to further specify what will be part of the cache.
48 *
49 * All such functions return a newly allocated cache or NULL
50 * in case of an error.
51 *
52 * @subsection addr Setting of Addresses
53 * @code
54 * int <object name>_set_addr(struct nl_object *, struct nl_addr *)
55 * @endcode
56 *
57 * All attribute functions avaiable for assigning addresses to objects
58 * take a struct nl_addr argument. The provided address object is
59 * validated against the address family of the object if known already.
60 * The assignment fails if the address families mismatch. In case the
61 * address family has not been specified yet, the address family of
62 * the new address is elected to be the new requirement.
63 *
64 * The function will acquire a new reference on the address object
65 * before assignment, the caller is NOT responsible for this.
66 *
67 * All functions return 0 on success or a negative error code.
68 *
69 * @subsection flags Flags to Character StringTranslations
70 * All functions converting a set of flags to a character string follow
71 * the same principles, therefore, the following information applies
72 * to all functions convertings flags to a character string and vice versa.
73 *
74 * @subsubsection flags2str Flags to Character String
75 * @code
76 * char *<object name>_flags2str(int flags, char *buf, size_t len)
77 * @endcode
78 * @arg flags		Flags.
79 * @arg buf		Destination buffer.
80 * @arg len		Buffer length.
81 *
82 * Converts the specified flags to a character string separated by
83 * commas and stores it in the specified destination buffer.
84 *
85 * @return The destination buffer
86 *
87 * @subsubsection str2flags Character String to Flags
88 * @code
89 * int <object name>_str2flags(const char *name)
90 * @endcode
91 * @arg name		Name of flag.
92 *
93 * Converts the provided character string specifying a flag
94 * to the corresponding numeric value.
95 *
96 * @return Link flag or a negative value if none was found.
97 *
98 * @subsubsection type2str Type to Character String
99 * @code
100 * char *<object name>_<type>2str(int type, char *buf, size_t len)
101 * @endcode
102 * @arg type		Type as numeric value
103 * @arg buf		Destination buffer.
104 * @arg len		Buffer length.
105 *
106 * Converts an identifier (type) to a character string and stores
107 * it in the specified destination buffer.
108 *
109 * @return The destination buffer or the type encoded in hexidecimal
110 *         form if the identifier is unknown.
111 *
112 * @subsubsection str2type Character String to Type
113 * @code
114 * int <object name>_str2<type>(const char *name)
115 * @endcode
116 * @arg name		Name of identifier (type).
117 *
118 * Converts the provided character string specifying a identifier
119 * to the corresponding numeric value.
120 *
121 * @return Identifier as numeric value or a negative value if none was found.
122 *
123 * @page core_doc Core Library (-lnl)
124 *
125 * @section core_intro Introduction
126 *
127 * The core library contains the fundamentals required to communicate over
128 * netlink sockets. It deals with connecting and unconnecting of sockets,
129 * sending and receiving of data, provides a customizeable receiving state
130 * machine, and provides a abstract data type framework which eases the
131 * implementation of object based netlink protocols where objects are added,
132 * removed, or modified with the help of netlink messages.
133 *
134 * @section core_toc Table of Contents
135 *
136 * - \ref proto_fund
137 * - \ref sk_doc
138 * - \ref rxtx_doc
139 * - \ref cb_doc
140 *
141 * @section proto_fund Netlink Protocol Fundamentals
142 *
143 * The netlink protocol is a socket based IPC mechanism used for communication
144 * between userspace processes and the kernel. The netlink protocol uses the
145 * \c AF_NETLINK address family and defines a protocol type for each subsystem
146 * protocol (e.g. NETLINK_ROUTE, NETLINK_NETFILTER, etc). Its addressing
147 * schema is based on a 32 bit port number, formerly referred to as PID, which
148 * uniquely identifies each peer.
149 *
150 * The netlink protocol is based on messages each limited to the size of a
151 * memory page and consists of the netlink message header (struct nlmsghdr)
152 * plus the payload attached to it. The payload can consist of arbitary data
153 * but often contains a fixed sized family specifc header followed by a
154 * stream of \ref attr_doc. The use of attributes dramatically increases
155 * the flexibility of the protocol and allows for the protocol to be
156 * extended while maintaining backwards compatibility.
157 *
158 * The netlink message header (struct nlmsghdr):
159 * @code
160 * 0                   1                   2                   3
161 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
162 * +-------------------------------------------------------------+
163 * |                          Length                             |
164 * +------------------------------+------------------------------+
165 * |            Type              |           Flags              |
166 * +------------------------------+------------------------------+
167 * |                      Sequence Number                        |
168 * +-------------------------------------------------------------+
169 * |                       Port (Address)                        |
170 * +-------------------------------------------------------------+
171 * @endcode
172 *
173 * Netlink differs between requests, notifications, and replies. Requests
174 * are messages which have the \c NLM_F_REQUEST flag set and are meant to
175 * request an action from the receiver. A request is typically sent from
176 * a userspace process to the kernel. Every request should be assigned a
177 * sequence number which should be incremented for each request sent on the
178 * sending side. Depending on the nature of the request, the receiver may
179 * reply to the request with regular netlink messages which should contain
180 * the same sequence number as the request it relates to. Notifications are
181 * of informal nature and don't expect a reply, therefore the sequence number
182 * is typically set to 0. It should be noted that unlike in protocols such as
183 * TCP there is no strict enforcment of the sequence number. The sole purpose
184 * of sequence numbers is to assist a sender in relating replies to the
185 * corresponding requests.
186 *
187 * @msc
188 * A,B;
189 * A=>B [label="GET (seq=1, NLM_F_REQUEST)"];
190 * A<=B [label="PUT (seq=1)"];
191 * ...;
192 * A<=B [label="NOTIFY (seq=0)"];
193 * @endmsc
194 *
195 * If the size of a reply exceeds the size of a memory page and thus exceeds
196 * the maximum message size, the reply can be split into a series of multipart
197 * messages. A multipart message has the \c flag NLM_F_MULTI set and the
198 * receiver is expected to continue parsing the reply until the special
199 * message type \c NLMSG_DONE is received.
200 *
201 * @msc
202 * A,B;
203 * A=>B [label="GET (seq=1, NLM_F_REQUEST)"];
204 * A<=B [label="PUT (seq=1, NLM_F_MULTI)"];
205 * ...;
206 * A<=B [label="PUT (seq=1, NLM_F_MULTI)"];
207 * A<=B [label="NLMSG_DONE (seq=1)"];
208 * @endmsc
209 *
210 * Errors can be reported using the standard message type \c NLMSG_ERROR which
211 * can carry an error code and the netlink mesage header of the request.
212 * Error messages should set their sequence number to the sequence number
213 * of the message which caused the error.
214 *
215 * @msc
216 * A,B;
217 * A=>B [label="GET (seq=1, NLM_F_REQUEST)"];
218 * A<=B [label="NLMSG_ERROR code=EINVAL (seq=1)"];
219 * @endmsc
220 *
221 * The \c NLMSG_ERROR message type is also used to send acknowledge messages.
222 * An acknowledge message can be requested by setting the \c NLM_F_ACK flag
223 * message except that the error code is set to 0.
224 *
225 * @msc
226 * A,B;
227 * A=>B [label="GET (seq=1, NLM_F_REQUEST | NLM_F_ACK)"];
228 * A<=B [label="ACK (seq=1)"];
229 * @endmsc
230 *
231 * @section sk_doc Dealing with Netlink Sockets
232 *
233 * In order to use the netlink protocol, a netlink socket is required. Each
234 * socket defines a completely independent context for sending and receiving
235 * of messages. The netlink socket and all its related attributes are
236 * represented by struct nl_sock.
237 *
238 * @code
239 * nl_socket_alloc()                      Allocate new socket structure.
240 * nl_socket_free(s)                      Free socket structure.
241 * @endcode
242 *
243 * @subsection local_port Local Port
244 * The local port number uniquely identifies the socket and is used to
245 * address it. A unique local port is generated automatically when the socket
246 * is allocated. It will consist of the Process ID (22 bits) and a random
247 * number (10 bits) to allow up to 1024 sockets per process.
248 *
249 * @code
250 * nl_socket_get_local_port(sk)           Return the peer's port number.
251 * nl_socket_set_local_port(sk, port)     Set the peer's port number.
252 * @endcode
253 *
254 * @subsection peer_port Peer Port
255 * A peer port can be assigned to the socket which will result in all unicast
256 * messages sent over the socket to be addresses to the corresponding peer. If
257 * no peer is specified, the kernel will try to automatically bind the socket
258 * to a kernel side socket of the same netlink protocol family. It is common
259 * practice not to bind the socket to a peer port as typically only one kernel
260 * side socket exists per netlink protocol family.
261 *
262 * @code
263 * nl_socket_get_peer_port(sk)            Return the local port number.
264 * nl_socket_set_peer_port(sk, port)      Set the local port number.
265 * @endcode
266 *
267 * @subsection sock_fd File Descriptor
268 * The file descriptor of the socket(2).
269 *
270 * @code
271 * nl_socket_get_fd(sk)                   Return file descriptor.
272 * nl_socket_set_buffer_size(sk, rx, tx)  Set buffer size of socket.
273 * nl_socket_set_nonblocking(sk)          Set socket to non-blocking state.
274 * @endcode
275 *
276 * @subsection group_sub Group Subscriptions
277 * Each socket can subscribe to multicast groups of the netlink protocol
278 * family it is bound to. The socket will then receive a copy of each
279 * message sent to any of the groups. Multicast groups are commonly used
280 * to implement event notifications. Prior to kernel 2.6.14 the group
281 * subscription was performed using a bitmask which limited the number of
282 * groups per protocol family to 32. This outdated interface can still be
283 * accessed via the function nl_join_groups even though it is not recommended
284 * for new code. Starting with 2.6.14 a new method was introduced which
285 * supports subscribing to an almost unlimited number of multicast groups.
286 *
287 * @code
288 * nl_socket_add_membership(sk, group)    Become a member of a multicast group.
289 * nl_socket_drop_membership(sk, group)   Drop multicast group membership.
290 * nl_join_groups(sk, groupmask)          Join a multicast group (obsolete).
291 * @endcode
292 *
293 * @subsection seq_num Sequence Numbers
294 * The socket keeps track of the sequence numbers used. The library will
295 * automatically verify the sequence number of messages received unless
296 * the check was disabled using the function nl_socket_disable_seq_check().
297 * When a message is sent using nl_send_auto_complete(), the sequence number
298 * is automatically filled in, and replies will be verified correctly.
299 *
300 * @code
301 * nl_socket_disable_seq_check(sk)        Disable checking of sequece numbers.
302 * nl_socket_use_seq(sk)                  Use sequence number and bump to next.
303 * @endcode
304 *
305 * @subsection sock_cb Callback Configuration
306 * Every socket is associated a callback configuration which enables the
307 * applications to hook into various internal functions and control the
308 * receiving and sendings semantics. For more information, see section
309 * \ref cb_doc.
310 *
311 * @code
312 * nl_socket_alloc_cb(cb)                 Allocate socket based on callback set.
313 * nl_socket_get_cb(sk)                   Return callback configuration.
314 * nl_socket_set_cb(sk, cb)               Replace callback configuration.
315 * nl_socket_modify_cb(sk, ...)           Modify a specific callback function.
316 * @endcode
317 *
318 * @subsection sk_other Other Functions
319 * @code
320 * nl_socket_enable_auto_ack(sock)        Enable automatic request of ACK.
321 * nl_socket_disable_auto_ack(sock)       Disable automatic request of ACK.
322 * nl_socket_enable_msg_peek(sock)        Enable message peeking.
323 * nl_socket_disable_msg_peek(sock)       Disable message peeking.
324 * nl_socket_set_passcred(sk, state)      Enable/disable credential passing.
325 * nl_socket_recv_pktinfo(sk, state)      Enable/disable packet information.
326 * @endcode
327 *
328 * @section rxtx_doc Sending and Receiving of Data
329 *
330 * @subsection recv_semantisc Receiving Semantics
331 * @code
332 *          nl_recvmsgs_default(set)
333 *                 | cb = nl_socket_get_cb(sk)
334 *                 v
335 *          nl_recvmsgs(sk, cb)
336 *                 |           [Application provides nl_recvmsgs() replacement]
337 *                 |- - - - - - - - - - - - - - - v
338 *                 |                     cb->cb_recvmsgs_ow()
339 *                 |
340 *                 |               [Application provides nl_recv() replacement]
341 * +-------------->|- - - - - - - - - - - - - - - v
342 * |           nl_recv()                   cb->cb_recv_ow()
343 * |  +----------->|<- - - - - - - - - - - - - - -+
344 * |  |            v
345 * |  |      Parse Message
346 * |  |            |- - - - - - - - - - - - - - - v
347 * |  |            |                         NL_CB_MSG_IN()
348 * |  |            |<- - - - - - - - - - - - - - -+
349 * |  |            |
350 * |  |            |- - - - - - - - - - - - - - - v
351 * |  |      Sequence Check                NL_CB_SEQ_CHECK()
352 * |  |            |<- - - - - - - - - - - - - - -+
353 * |  |            |
354 * |  |            |- - - - - - - - - - - - - - - v  [ NLM_F_ACK is set ]
355 * |  |            |                      NL_CB_SEND_ACK()
356 * |  |            |<- - - - - - - - - - - - - - -+
357 * |  |            |
358 * |  |      +-----+------+--------------+----------------+--------------+
359 * |  |      v            v              v                v              v
360 * |  | Valid Message    ACK       NO-OP Message  End of Multipart     Error
361 * |  |      |            |              |                |              |
362 * |  |      v            v              v                v              v
363 * |  |NL_CB_VALID()  NL_CB_ACK()  NL_CB_SKIPPED()  NL_CB_FINISH()  cb->cb_err()
364 * |  |      |            |              |                |              |
365 * |  |      +------------+--------------+----------------+              v
366 * |  |                                  |                           (FAILURE)
367 * |  |                                  |  [Callback returned NL_SKIP]
368 * |  |  [More messages to be parsed]    |<-----------
369 * |  +----------------------------------|
370 * |                                     |
371 * |         [is Multipart message]      |
372 * +-------------------------------------|  [Callback returned NL_STOP]
373 *                                       |<-----------
374 *                                       v
375 *                                   (SUCCESS)
376 *
377 *                          At any time:
378 *                                Message Format Error
379 *                                         |- - - - - - - - - - - - v
380 *                                         v                  NL_CB_INVALID()
381 *                                     (FAILURE)
382 *
383 *                                Message Overrun (Kernel Lost Data)
384 *                                         |- - - - - - - - - - - - v
385 *                                         v                  NL_CB_OVERRUN()
386 *                                     (FAILURE)
387 *
388 *                                Callback returned negative error code
389 *                                     (FAILURE)
390 * @endcode
391 *
392 * @subsection send_semantics Sending Semantisc
393 *
394 * @code
395 *     nl_send_auto_complete(sk, msg)
396 *             | [Automatically completes netlink message header]
397 *             | [(local port, sequence number)                 ]
398 *             |
399 *             |                   [Application provies nl_send() replacement]
400 *             |- - - - - - - - - - - - - - - - - - - - v
401 *             v                                 cb->cb_send_ow()
402 *         nl_send(sk, msg)
403 *             | [If available, add peer port and credentials]
404 *             v
405 *        nl_sendmsg(sk, msg, msghdr)
406 *             |- - - - - - - - - - - - - - - - - - - - v
407 *             |                                 NL_CB_MSG_OUT()
408 *             |<- - - - - - - - - - - - - - - - - - - -+
409 *             v
410 *         sendmsg()
411 * @endcode
412 *
413 * @section cb_doc Callback Configurations
414 * Callbacks and overwriting capabilities are provided to control various
415 * semantics of the library. All callback functions are packed together in
416 * struct nl_cb which is attached to a netlink socket or passed on to
417 * the respective functions directly.
418 *
419 * @subsection cb_ret_doc Callback Return Values
420 * Callback functions can control the flow of the calling layer by returning
421 * appropriate error codes:
422 * @code
423 * Action ID        | Description
424 * -----------------+-------------------------------------------------------
425 * NL_OK            | Proceed with whatever comes next.
426 * NL_SKIP          | Skip message currently being processed and continue
427 *                  | with next message.
428 * NL_STOP          | Stop parsing and discard all remaining messages in
429 *                  | this set of messages.
430 * @endcode
431 *
432 * All callbacks are optional and a default action is performed if no
433 * application specific implementation is provided:
434 *
435 * @code
436 * Callback ID       | Default Return Value
437 * ------------------+----------------------
438 * NL_CB_VALID       | NL_OK
439 * NL_CB_FINISH      | NL_STOP
440 * NL_CB_OVERRUN     | NL_STOP
441 * NL_CB_SKIPPED     | NL_SKIP
442 * NL_CB_ACK         | NL_STOP
443 * NL_CB_MSG_IN      | NL_OK
444 * NL_CB_MSG_OUT     | NL_OK
445 * NL_CB_INVALID     | NL_STOP
446 * NL_CB_SEQ_CHECK   | NL_OK
447 * NL_CB_SEND_ACK    | NL_OK
448 *                   |
449 * Error Callback    | NL_STOP
450 * @endcode
451 *
452 * In order to simplify typical usages of the library, different sets of
453 * default callback implementations exist:
454 * @code
455 * NL_CB_DEFAULT: No additional actions
456 * NL_CB_VERBOSE: Automatically print warning and error messages to a file
457 *                descriptor as appropriate. This is useful for CLI based
458 *                applications.
459 * NL_CB_DEBUG:   Print informal debugging information for each message
460 *                received. This will result in every message beint sent or
461 *                received to be printed to the screen in a decoded,
462 *                human-readable format.
463 * @endcode
464 *
465 * @par 1) Setting up a callback set
466 * @code
467 * // Allocate a callback set and initialize it to the verbose default set
468 * struct nl_cb *cb = nl_cb_alloc(NL_CB_VERBOSE);
469 *
470 * // Modify the set to call my_func() for all valid messages
471 * nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, my_func, NULL);
472 *
473 * // Set the error message handler to the verbose default implementation
474 * // and direct it to print all errors to the given file descriptor.
475 * FILE *file = fopen(...);
476 * nl_cb_err(cb, NL_CB_VERBOSE, NULL, file);
477 * @endcode
478 *
479 * @page route_doc Routing Family
480 *
481 * @page genl_doc Generic Netlink Family
482 *
483 * @page nf_doc Netfilter Subsystem
484 */
485