• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * lib/nl.c		Core Netlink Interface
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-2012 Thomas Graf <tgraf@suug.ch>
10  */
11 
12 /**
13  * @defgroup core Core Library (libnl)
14  *
15  * Socket handling, connection management, sending and receiving of data,
16  * message construction and parsing, object caching system, ...
17  *
18  * This is the API reference of the core library. It is not meant as a guide
19  * but as a reference. Please refer to the core library guide for detailed
20  * documentation on the library architecture and examples:
21  *
22  * * @ref_asciidoc{core,_,Netlink Core Library Development Guide}
23  *
24  *
25  * @{
26  */
27 
28 #include <netlink-private/netlink.h>
29 #include <netlink-private/socket.h>
30 #include <netlink/netlink.h>
31 #include <netlink/utils.h>
32 #include <netlink/handlers.h>
33 #include <netlink/msg.h>
34 #include <netlink/attr.h>
35 
36 /**
37  * @defgroup core_types Data Types
38  *
39  * Core library data types
40  * @{
41  * @}
42  *
43  * @defgroup send_recv Send & Receive Data
44  *
45  * Connection management, sending & receiving of data
46  *
47  * Related sections in the development guide:
48  * - @core_doc{core_send_recv, Sending & Receiving}
49  * - @core_doc{core_sockets, Sockets}
50  *
51  * @{
52  *
53  * Header
54  * ------
55  * ~~~~{.c}
56  * #include <netlink/netlink.h>
57  * ~~~~
58  */
59 
60 /**
61  * @name Connection Management
62  * @{
63  */
64 
65 /**
66  * Create file descriptor and bind socket.
67  * @arg sk		Netlink socket (required)
68  * @arg protocol	Netlink protocol to use (required)
69  *
70  * Creates a new Netlink socket using `socket()` and binds the socket to the
71  * protocol and local port specified in the `sk` socket object. Fails if
72  * the socket is already connected.
73  *
74  * @note If available, the `close-on-exec` (`SOCK_CLOEXEC`) feature is enabled
75  *       automatically on the new file descriptor. This causes the socket to
76  *       be closed automatically if any of the `exec` family functions succeed.
77  *       This is essential for multi threaded programs.
78  *
79  * @note The local port (`nl_socket_get_local_port()`) is unspecified after
80  *       creating a new socket. It only gets determined when accessing the
81  *       port the first time or during `nl_connect()`. When nl_connect()
82  *       fails during `bind()` due to `ADDRINUSE`, it will retry with
83  *       different ports if the port is unspecified. Unless you want to enforce
84  *       the use of a specific local port, don't access the local port (or
85  *       reset it to `unspecified` by calling `nl_socket_set_local_port(sk, 0)`).
86  *       This capability is indicated by
87  *       `%NL_CAPABILITY_NL_CONNECT_RETRY_GENERATE_PORT_ON_ADDRINUSE`.
88  *
89  * @see nl_socket_alloc()
90  * @see nl_close()
91  *
92  * @return 0 on success or a negative error code.
93  *
94  * @retval -NLE_BAD_SOCK Socket is already connected
95  */
nl_connect(struct nl_sock * sk,int protocol)96 int nl_connect(struct nl_sock *sk, int protocol)
97 {
98 	int err, flags = 0;
99 	int errsv;
100 	socklen_t addrlen;
101 
102 #ifdef SOCK_CLOEXEC
103 	flags |= SOCK_CLOEXEC;
104 #endif
105 
106         if (sk->s_fd != -1)
107                 return -NLE_BAD_SOCK;
108 
109 	sk->s_fd = socket(AF_NETLINK, SOCK_RAW | flags, protocol);
110 	if (sk->s_fd < 0) {
111 		errsv = errno;
112 		NL_DBG(4, "nl_connect(%p): socket() failed with %d\n", sk, errsv);
113 		err = -nl_syserr2nlerr(errsv);
114 		goto errout;
115 	}
116 
117 	if (!(sk->s_flags & NL_SOCK_BUFSIZE_SET)) {
118 		err = nl_socket_set_buffer_size(sk, 0, 0);
119 		if (err < 0)
120 			goto errout;
121 	}
122 
123 	if (_nl_socket_is_local_port_unspecified (sk)) {
124 		uint32_t port;
125 		uint32_t used_ports[32] = { 0 };
126 
127 		while (1) {
128 			port = _nl_socket_generate_local_port_no_release(sk);
129 
130 			if (port == UINT32_MAX) {
131 				NL_DBG(4, "nl_connect(%p): no more unused local ports.\n", sk);
132 				_nl_socket_used_ports_release_all(used_ports);
133 				err = -NLE_EXIST;
134 				goto errout;
135 			}
136 			err = bind(sk->s_fd, (struct sockaddr*) &sk->s_local,
137 				   sizeof(sk->s_local));
138 			if (err == 0)
139 				break;
140 
141 			errsv = errno;
142 			if (errsv == EADDRINUSE) {
143 				NL_DBG(4, "nl_connect(%p): local port %u already in use. Retry.\n", sk, (unsigned) port);
144 				_nl_socket_used_ports_set(used_ports, port);
145 			} else {
146 				NL_DBG(4, "nl_connect(%p): bind() for port %u failed with %d\n", sk, (unsigned) port, errsv);
147 				_nl_socket_used_ports_release_all(used_ports);
148 				err = -nl_syserr2nlerr(errsv);
149 				goto errout;
150 			}
151 		}
152 		_nl_socket_used_ports_release_all(used_ports);
153 	} else {
154 		err = bind(sk->s_fd, (struct sockaddr*) &sk->s_local,
155 			   sizeof(sk->s_local));
156 		if (err != 0) {
157 			errsv = errno;
158 			NL_DBG(4, "nl_connect(%p): bind() failed with %d\n", sk, errsv);
159 			err = -nl_syserr2nlerr(errsv);
160 			goto errout;
161 		}
162 	}
163 
164 	addrlen = sizeof(sk->s_local);
165 	err = getsockname(sk->s_fd, (struct sockaddr *) &sk->s_local,
166 			  &addrlen);
167 	if (err < 0) {
168 		err = -nl_syserr2nlerr(errno);
169 		goto errout;
170 	}
171 
172 	if (addrlen != sizeof(sk->s_local)) {
173 		err = -NLE_NOADDR;
174 		goto errout;
175 	}
176 
177 	if (sk->s_local.nl_family != AF_NETLINK) {
178 		err = -NLE_AF_NOSUPPORT;
179 		goto errout;
180 	}
181 
182 	sk->s_proto = protocol;
183 
184 	return 0;
185 errout:
186         if (sk->s_fd != -1) {
187     		close(sk->s_fd);
188     		sk->s_fd = -1;
189         }
190 
191 	return err;
192 }
193 
194 /**
195  * Close Netlink socket
196  * @arg sk		Netlink socket (required)
197  *
198  * Closes the Netlink socket using `close()`.
199  *
200  * @note The socket is closed automatically if a `struct nl_sock` object is
201  *       freed using `nl_socket_free()`.
202  *
203  * @see nl_connect()
204  */
nl_close(struct nl_sock * sk)205 void nl_close(struct nl_sock *sk)
206 {
207 	if (sk->s_fd >= 0) {
208 		close(sk->s_fd);
209 		sk->s_fd = -1;
210 	}
211 
212 	sk->s_proto = 0;
213 }
214 
215 /** @} */
216 
217 /**
218  * @name Send
219  * @{
220  */
221 
222 /**
223  * Transmit raw data over Netlink socket.
224  * @arg sk		Netlink socket (required)
225  * @arg buf		Buffer carrying data to send (required)
226  * @arg size		Size of buffer (required)
227  *
228  * Transmits "raw" data over the specified Netlink socket. Unlike the other
229  * transmit functions it does not modify the data in any way. It directly
230  * passes the buffer \c buf of \c size to sendto().
231  *
232  * The message is addressed to the peer as specified in the socket by either
233  * the nl_socket_set_peer_port() or nl_socket_set_peer_groups() function.
234  *
235  * @note Because there is no indication on the message boundaries of the data
236  *       being sent, the \c NL_CB_MSG_OUT callback handler will not be invoked
237  *       for data that is being sent using this function.
238  *
239  * @see nl_socket_set_peer_port()
240  * @see nl_socket_set_peer_groups()
241  * @see nl_sendmsg()
242  *
243  * @return Number of bytes sent or a negative error code.
244  */
nl_sendto(struct nl_sock * sk,void * buf,size_t size)245 int nl_sendto(struct nl_sock *sk, void *buf, size_t size)
246 {
247 	int ret;
248 
249 	if (!buf)
250 		return -NLE_INVAL;
251 
252 	if (sk->s_fd < 0)
253 		return -NLE_BAD_SOCK;
254 
255 	ret = sendto(sk->s_fd, buf, size, 0, (struct sockaddr *)
256 		     &sk->s_peer, sizeof(sk->s_peer));
257 	if (ret < 0)
258 		return -nl_syserr2nlerr(errno);
259 
260 	return ret;
261 }
262 
263 /**
264  * Transmit Netlink message using sendmsg()
265  * @arg sk		Netlink socket (required)
266  * @arg msg		Netlink message to be sent (required)
267  * @arg hdr		sendmsg() message header (required)
268  *
269  * Transmits the message specified in \c hdr over the Netlink socket using the
270  * sendmsg() system call.
271  *
272  * @attention
273  * The `msg` argument will *not* be used to derive the message payload that
274  * is being sent out. The `msg` argument is *only* passed on to the
275  * `NL_CB_MSG_OUT` callback. The caller is responsible to initialize the
276  * `hdr` struct properly and have it point to the message payload and
277  * socket address.
278  *
279  * @note
280  * This function uses `nlmsg_set_src()` to modify the `msg` argument prior to
281  * invoking the `NL_CB_MSG_OUT` callback to provide the local port number.
282  *
283  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
284  *
285  * @attention
286  * Think twice before using this function. It provides a low level access to
287  * the Netlink socket. Among other limitations, it does not add credentials
288  * even if enabled or respect the destination address specified in the `msg`
289  * object.
290  *
291  * @see nl_socket_set_local_port()
292  * @see nl_send_auto()
293  * @see nl_send_iovec()
294  *
295  * @return Number of bytes sent on success or a negative error code.
296  *
297  * @lowlevel
298  */
nl_sendmsg(struct nl_sock * sk,struct nl_msg * msg,struct msghdr * hdr)299 int nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr)
300 {
301 	struct nl_cb *cb;
302 	int ret;
303 
304 	if (sk->s_fd < 0)
305 		return -NLE_BAD_SOCK;
306 
307 	nlmsg_set_src(msg, &sk->s_local);
308 
309 	cb = sk->s_cb;
310 	if (cb->cb_set[NL_CB_MSG_OUT])
311 		if ((ret = nl_cb_call(cb, NL_CB_MSG_OUT, msg)) != NL_OK)
312 			return ret;
313 
314 	ret = sendmsg(sk->s_fd, hdr, 0);
315 	if (ret < 0)
316 		return -nl_syserr2nlerr(errno);
317 
318 	NL_DBG(4, "sent %d bytes\n", ret);
319 	return ret;
320 }
321 
322 
323 /**
324  * Transmit Netlink message (taking IO vector)
325  * @arg sk		Netlink socket (required)
326  * @arg msg		Netlink message to be sent (required)
327  * @arg iov		IO vector to be sent (required)
328  * @arg iovlen		Number of struct iovec to be sent (required)
329  *
330  * This function is identical to nl_send() except that instead of taking a
331  * `struct nl_msg` object it takes an IO vector. Please see the description
332  * of `nl_send()`.
333  *
334  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
335  *
336  * @see nl_send()
337  *
338  * @return Number of bytes sent on success or a negative error code.
339  *
340  * @lowlevel
341  */
nl_send_iovec(struct nl_sock * sk,struct nl_msg * msg,struct iovec * iov,unsigned iovlen)342 int nl_send_iovec(struct nl_sock *sk, struct nl_msg *msg, struct iovec *iov, unsigned iovlen)
343 {
344 	struct sockaddr_nl *dst;
345 	struct ucred *creds;
346 	struct msghdr hdr = {
347 		.msg_name = (void *) &sk->s_peer,
348 		.msg_namelen = sizeof(struct sockaddr_nl),
349 		.msg_iov = iov,
350 		.msg_iovlen = iovlen,
351 	};
352 
353 	/* Overwrite destination if specified in the message itself, defaults
354 	 * to the peer address of the socket.
355 	 */
356 	dst = nlmsg_get_dst(msg);
357 	if (dst->nl_family == AF_NETLINK)
358 		hdr.msg_name = dst;
359 
360 	/* Add credentials if present. */
361 	creds = nlmsg_get_creds(msg);
362 	if (creds != NULL) {
363 		char buf[CMSG_SPACE(sizeof(struct ucred))];
364 		struct cmsghdr *cmsg;
365 
366 		hdr.msg_control = buf;
367 		hdr.msg_controllen = sizeof(buf);
368 
369 		cmsg = CMSG_FIRSTHDR(&hdr);
370 		cmsg->cmsg_level = SOL_SOCKET;
371 		cmsg->cmsg_type = SCM_CREDENTIALS;
372 		cmsg->cmsg_len = CMSG_LEN(sizeof(struct ucred));
373 		memcpy(CMSG_DATA(cmsg), creds, sizeof(struct ucred));
374 	}
375 
376 	return nl_sendmsg(sk, msg, &hdr);
377 }
378 
379 /**
380  * Transmit Netlink message
381  * @arg sk		Netlink socket (required)
382  * @arg msg		Netlink message (required)
383  *
384  * Transmits the Netlink message `msg` over the Netlink socket using the
385  * `sendmsg()` system call. This function is based on `nl_send_iovec()` but
386  * takes care of initializing a `struct iovec` based on the `msg` object.
387  *
388  * The message is addressed to the peer as specified in the socket by either
389  * the nl_socket_set_peer_port() or nl_socket_set_peer_groups() function.
390  * The peer address can be overwritten by specifying an address in the `msg`
391  * object using nlmsg_set_dst().
392  *
393  * If present in the `msg`, credentials set by the nlmsg_set_creds() function
394  * are added to the control buffer of the message.
395  *
396  * @par Overwriting Capability:
397  * Calls to this function can be overwritten by providing an alternative using
398  * the nl_cb_overwrite_send() function.
399  *
400  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
401  *
402  * @attention
403  * Unlike `nl_send_auto()`, this function does *not* finalize the message in
404  * terms of automatically adding needed flags or filling out port numbers.
405  *
406  * @see nl_send_auto()
407  * @see nl_send_iovec()
408  * @see nl_socket_set_peer_port()
409  * @see nl_socket_set_peer_groups()
410  * @see nlmsg_set_dst()
411  * @see nlmsg_set_creds()
412  * @see nl_cb_overwrite_send()
413  *
414  * @return Number of bytes sent on success or a negative error code.
415 */
nl_send(struct nl_sock * sk,struct nl_msg * msg)416 int nl_send(struct nl_sock *sk, struct nl_msg *msg)
417 {
418 	struct nl_cb *cb = sk->s_cb;
419 
420 	if (cb->cb_send_ow)
421 		return cb->cb_send_ow(sk, msg);
422 	else {
423 		struct iovec iov = {
424 			.iov_base = (void *) nlmsg_hdr(msg),
425 			.iov_len = nlmsg_hdr(msg)->nlmsg_len,
426 		};
427 
428 		return nl_send_iovec(sk, msg, &iov, 1);
429 	}
430 }
431 
432 /**
433  * Finalize Netlink message
434  * @arg sk		Netlink socket (required)
435  * @arg msg		Netlink message (required)
436  *
437  * This function finalizes a Netlink message by completing the message with
438  * desirable flags and values depending on the socket configuration.
439  *
440  *  - If not yet filled out, the source address of the message (`nlmsg_pid`)
441  *    will be set to the local port number of the socket.
442  *  - If not yet specified, the next available sequence number is assigned
443  *    to the message (`nlmsg_seq`).
444  *  - If not yet specified, the protocol field of the message will be set to
445  *    the protocol field of the socket.
446  *  - The `NLM_F_REQUEST` Netlink message flag will be set.
447  *  - The `NLM_F_ACK` flag will be set if Auto-ACK mode is enabled on the
448  *    socket.
449  */
nl_complete_msg(struct nl_sock * sk,struct nl_msg * msg)450 void nl_complete_msg(struct nl_sock *sk, struct nl_msg *msg)
451 {
452 	struct nlmsghdr *nlh;
453 
454 	nlh = nlmsg_hdr(msg);
455 	if (nlh->nlmsg_pid == NL_AUTO_PORT)
456 		nlh->nlmsg_pid = nl_socket_get_local_port(sk);
457 
458 	if (nlh->nlmsg_seq == NL_AUTO_SEQ)
459 		nlh->nlmsg_seq = sk->s_seq_next++;
460 
461 	if (msg->nm_protocol == -1)
462 		msg->nm_protocol = sk->s_proto;
463 
464 	nlh->nlmsg_flags |= NLM_F_REQUEST;
465 
466 	if (!(sk->s_flags & NL_NO_AUTO_ACK))
467 		nlh->nlmsg_flags |= NLM_F_ACK;
468 }
469 
470 /**
471  * Finalize and transmit Netlink message
472  * @arg sk		Netlink socket (required)
473  * @arg msg		Netlink message (required)
474  *
475  * Finalizes the message by passing it to `nl_complete_msg()` and transmits it
476  * by passing it to `nl_send()`.
477  *
478  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
479  *
480  * @see nl_complete_msg()
481  * @see nl_send()
482  *
483  * @return Number of bytes sent or a negative error code.
484  */
nl_send_auto(struct nl_sock * sk,struct nl_msg * msg)485 int nl_send_auto(struct nl_sock *sk, struct nl_msg *msg)
486 {
487 	nl_complete_msg(sk, msg);
488 
489 	return nl_send(sk, msg);
490 }
491 
492 /**
493  * Finalize and transmit Netlink message and wait for ACK or error message
494  * @arg sk		Netlink socket (required)
495  * @arg msg		Netlink message (required)
496  *
497  * Passes the `msg` to `nl_send_auto()` to finalize and transmit it. Frees the
498  * message and waits (sleeps) for the ACK or error message to be received.
499  *
500  * @attention
501  * Disabling Auto-ACK (nl_socket_disable_auto_ack()) will cause this function
502  * to return immediately after transmitting the message. However, the peer may
503  * still be returning an error message in response to the request. It is the
504  * responsibility of the caller to handle such messages.
505  *
506  * @callback This function triggers the `NL_CB_MSG_OUT` callback.
507  *
508  * @attention
509  * This function frees the `msg` object after transmitting it by calling
510  * `nlmsg_free()`.
511  *
512  * @see nl_send_auto().
513  * @see nl_wait_for_ack()
514  *
515  * @return 0 on success or a negative error code.
516  */
nl_send_sync(struct nl_sock * sk,struct nl_msg * msg)517 int nl_send_sync(struct nl_sock *sk, struct nl_msg *msg)
518 {
519 	int err;
520 
521 	err = nl_send_auto(sk, msg);
522 	nlmsg_free(msg);
523 	if (err < 0)
524 		return err;
525 
526 	return wait_for_ack(sk);
527 }
528 
529 /**
530  * Construct and transmit a Netlink message
531  * @arg sk		Netlink socket (required)
532  * @arg type		Netlink message type (required)
533  * @arg flags		Netlink message flags (optional)
534  * @arg buf		Data buffer (optional)
535  * @arg size		Size of data buffer (optional)
536  *
537  * Allocates a new Netlink message based on `type` and `flags`. If `buf`
538  * points to payload of length `size` that payload will be appended to the
539  * message.
540  *
541  * Sends out the message using `nl_send_auto()` and frees the message
542  * afterwards.
543  *
544  * @see nl_send_auto()
545  *
546  * @return Number of characters sent on success or a negative error code.
547  * @retval -NLE_NOMEM Unable to allocate Netlink message
548  */
nl_send_simple(struct nl_sock * sk,int type,int flags,void * buf,size_t size)549 int nl_send_simple(struct nl_sock *sk, int type, int flags, void *buf,
550 		   size_t size)
551 {
552 	int err;
553 	struct nl_msg *msg;
554 
555 	msg = nlmsg_alloc_simple(type, flags);
556 	if (!msg)
557 		return -NLE_NOMEM;
558 
559 	if (buf && size) {
560 		err = nlmsg_append(msg, buf, size, NLMSG_ALIGNTO);
561 		if (err < 0)
562 			goto errout;
563 	}
564 
565 	err = nl_send_auto(sk, msg);
566 errout:
567 	nlmsg_free(msg);
568 
569 	return err;
570 }
571 
572 /** @} */
573 
574 /**
575  * @name Receive
576  * @{
577  */
578 
579 /**
580  * Receive data from netlink socket
581  * @arg sk		Netlink socket (required)
582  * @arg nla		Netlink socket structure to hold address of peer (required)
583  * @arg buf		Destination pointer for message content (required)
584  * @arg creds		Destination pointer for credentials (optional)
585  *
586  * Receives data from a connected netlink socket using recvmsg() and returns
587  * the number of bytes read. The read data is stored in a newly allocated
588  * buffer that is assigned to \c *buf. The peer's netlink address will be
589  * stored in \c *nla.
590  *
591  * This function blocks until data is available to be read unless the socket
592  * has been put into non-blocking mode using nl_socket_set_nonblocking() in
593  * which case this function will return immediately with a return value of 0.
594  *
595  * The buffer size used when reading from the netlink socket and thus limiting
596  * the maximum size of a netlink message that can be read defaults to the size
597  * of a memory page (getpagesize()). The buffer size can be modified on a per
598  * socket level using the function nl_socket_set_msg_buf_size().
599  *
600  * If message peeking is enabled using nl_socket_enable_msg_peek() the size of
601  * the message to be read will be determined using the MSG_PEEK flag prior to
602  * performing the actual read. This leads to an additional recvmsg() call for
603  * every read operation which has performance implications and is not
604  * recommended for high throughput protocols.
605  *
606  * An eventual interruption of the recvmsg() system call is automatically
607  * handled by retrying the operation.
608  *
609  * If receiving of credentials has been enabled using the function
610  * nl_socket_set_passcred(), this function will allocate a new struct ucred
611  * filled with the received credentials and assign it to \c *creds. The caller
612  * is responsible for freeing the buffer.
613  *
614  * @note The caller is responsible to free the returned data buffer and if
615  *       enabled, the credentials buffer.
616  *
617  * @see nl_socket_set_nonblocking()
618  * @see nl_socket_set_msg_buf_size()
619  * @see nl_socket_enable_msg_peek()
620  * @see nl_socket_set_passcred()
621  *
622  * @return Number of bytes read, 0 on EOF, 0 on no data event (non-blocking
623  *         mode), or a negative error code.
624  */
nl_recv(struct nl_sock * sk,struct sockaddr_nl * nla,unsigned char ** buf,struct ucred ** creds)625 int nl_recv(struct nl_sock *sk, struct sockaddr_nl *nla,
626 	    unsigned char **buf, struct ucred **creds)
627 {
628 	ssize_t n;
629 	int flags = 0;
630 	static int page_size = 0;
631 	struct iovec iov;
632 	struct msghdr msg = {
633 		.msg_name = (void *) nla,
634 		.msg_namelen = sizeof(struct sockaddr_nl),
635 		.msg_iov = &iov,
636 		.msg_iovlen = 1,
637 	};
638 	struct ucred* tmpcreds = NULL;
639 	int retval = 0;
640 
641 	if (!buf || !nla)
642 		return -NLE_INVAL;
643 
644 	if (sk->s_flags & NL_MSG_PEEK)
645 		flags |= MSG_PEEK | MSG_TRUNC;
646 
647 	if (page_size == 0)
648 		page_size = getpagesize() * 4;
649 
650 	iov.iov_len = sk->s_bufsize ? : page_size;
651 	iov.iov_base = malloc(iov.iov_len);
652 
653 	if (!iov.iov_base) {
654 		retval = -NLE_NOMEM;
655 		goto abort;
656 	}
657 
658 	if (creds && (sk->s_flags & NL_SOCK_PASSCRED)) {
659 		msg.msg_controllen = CMSG_SPACE(sizeof(struct ucred));
660 		msg.msg_control = malloc(msg.msg_controllen);
661 		if (!msg.msg_control) {
662 			retval = -NLE_NOMEM;
663 			goto abort;
664 		}
665 	}
666 retry:
667 
668 	n = recvmsg(sk->s_fd, &msg, flags);
669 	if (!n) {
670 		retval = 0;
671 		goto abort;
672 	}
673 	if (n < 0) {
674 		if (errno == EINTR) {
675 			NL_DBG(3, "recvmsg() returned EINTR, retrying\n");
676 			goto retry;
677 		}
678 		retval = -nl_syserr2nlerr(errno);
679 		goto abort;
680 	}
681 
682 	if (msg.msg_flags & MSG_CTRUNC) {
683 		void *tmp;
684 		msg.msg_controllen *= 2;
685 		tmp = realloc(msg.msg_control, msg.msg_controllen);
686 		if (!tmp) {
687 			retval = -NLE_NOMEM;
688 			goto abort;
689 		}
690 		msg.msg_control = tmp;
691 		goto retry;
692 	}
693 
694 	if (iov.iov_len < n || (msg.msg_flags & MSG_TRUNC)) {
695 		void *tmp;
696 		/* Provided buffer is not long enough, enlarge it
697 		 * to size of n (which should be total length of the message)
698 		 * and try again. */
699 		iov.iov_len = n;
700 		tmp = realloc(iov.iov_base, iov.iov_len);
701 		if (!tmp) {
702 			retval = -NLE_NOMEM;
703 			goto abort;
704 		}
705 		iov.iov_base = tmp;
706 		flags = 0;
707 		goto retry;
708 	}
709 
710         if (flags != 0) {
711 		/* Buffer is big enough, do the actual reading */
712 		flags = 0;
713 		goto retry;
714 	}
715 
716 	if (msg.msg_namelen != sizeof(struct sockaddr_nl)) {
717 		retval =  -NLE_NOADDR;
718 		goto abort;
719 	}
720 
721 	if (creds && (sk->s_flags & NL_SOCK_PASSCRED)) {
722 		struct cmsghdr *cmsg;
723 
724 		for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
725 			if (cmsg->cmsg_level != SOL_SOCKET)
726 				continue;
727 			if (cmsg->cmsg_type != SCM_CREDENTIALS)
728 				continue;
729 			tmpcreds = malloc(sizeof(*tmpcreds));
730 			if (!tmpcreds) {
731 				retval = -NLE_NOMEM;
732 				goto abort;
733 			}
734 			memcpy(tmpcreds, CMSG_DATA(cmsg), sizeof(*tmpcreds));
735 			break;
736 		}
737 	}
738 
739 	retval = n;
740 abort:
741 	free(msg.msg_control);
742 
743 	if (retval <= 0) {
744 		free(iov.iov_base);
745 		iov.iov_base = NULL;
746 		free(tmpcreds);
747 		tmpcreds = NULL;
748 	} else
749 		*buf = iov.iov_base;
750 
751 	if (creds)
752 		*creds = tmpcreds;
753 
754 	return retval;
755 }
756 
757 /** @cond SKIP */
758 #define NL_CB_CALL(cb, type, msg) \
759 do { \
760 	err = nl_cb_call(cb, type, msg); \
761 	switch (err) { \
762 	case NL_OK: \
763 		err = 0; \
764 		break; \
765 	case NL_SKIP: \
766 		goto skip; \
767 	case NL_STOP: \
768 		goto stop; \
769 	default: \
770 		goto out; \
771 	} \
772 } while (0)
773 /** @endcond */
774 
recvmsgs(struct nl_sock * sk,struct nl_cb * cb)775 static int recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
776 {
777 	int n, err = 0, multipart = 0, interrupted = 0, nrecv = 0;
778 	unsigned char *buf = NULL;
779 	struct nlmsghdr *hdr;
780 
781 	/*
782 	nla is passed on to not only to nl_recv() but may also be passed
783 	to a function pointer provided by the caller which may or may not
784 	initialize the variable. Thomas Graf.
785 	*/
786 	struct sockaddr_nl nla = {0};
787 	struct nl_msg *msg = NULL;
788 	struct ucred *creds = NULL;
789 
790 continue_reading:
791 	NL_DBG(3, "Attempting to read from %p\n", sk);
792 	if (cb->cb_recv_ow)
793 		n = cb->cb_recv_ow(sk, &nla, &buf, &creds);
794 	else
795 		n = nl_recv(sk, &nla, &buf, &creds);
796 
797 	if (n <= 0)
798 		return n;
799 
800 	NL_DBG(3, "recvmsgs(%p): Read %d bytes\n", sk, n);
801 
802 	hdr = (struct nlmsghdr *) buf;
803 	while (nlmsg_ok(hdr, n)) {
804 		NL_DBG(3, "recvmsgs(%p): Processing valid message...\n", sk);
805 
806 		nlmsg_free(msg);
807 		msg = nlmsg_convert(hdr);
808 		if (!msg) {
809 			err = -NLE_NOMEM;
810 			goto out;
811 		}
812 
813 		nlmsg_set_proto(msg, sk->s_proto);
814 		nlmsg_set_src(msg, &nla);
815 		if (creds)
816 			nlmsg_set_creds(msg, creds);
817 
818 		nrecv++;
819 
820 		/* Raw callback is the first, it gives the most control
821 		 * to the user and he can do his very own parsing. */
822 		if (cb->cb_set[NL_CB_MSG_IN])
823 			NL_CB_CALL(cb, NL_CB_MSG_IN, msg);
824 
825 		/* Sequence number checking. The check may be done by
826 		 * the user, otherwise a very simple check is applied
827 		 * enforcing strict ordering */
828 		if (cb->cb_set[NL_CB_SEQ_CHECK]) {
829 			NL_CB_CALL(cb, NL_CB_SEQ_CHECK, msg);
830 
831 		/* Only do sequence checking if auto-ack mode is enabled */
832 		} else if (!(sk->s_flags & NL_NO_AUTO_ACK)) {
833 			if (hdr->nlmsg_seq != sk->s_seq_expect) {
834 				if (cb->cb_set[NL_CB_INVALID])
835 					NL_CB_CALL(cb, NL_CB_INVALID, msg);
836 				else {
837 					err = -NLE_SEQ_MISMATCH;
838 					goto out;
839 				}
840 			}
841 		}
842 
843 		if (hdr->nlmsg_type == NLMSG_DONE ||
844 		    hdr->nlmsg_type == NLMSG_ERROR ||
845 		    hdr->nlmsg_type == NLMSG_NOOP ||
846 		    hdr->nlmsg_type == NLMSG_OVERRUN) {
847 			/* We can't check for !NLM_F_MULTI since some netlink
848 			 * users in the kernel are broken. */
849 			sk->s_seq_expect++;
850 			NL_DBG(3, "recvmsgs(%p): Increased expected " \
851 			       "sequence number to %d\n",
852 			       sk, sk->s_seq_expect);
853 		}
854 
855 		if (hdr->nlmsg_flags & NLM_F_MULTI)
856 			multipart = 1;
857 
858 		if (hdr->nlmsg_flags & NLM_F_DUMP_INTR) {
859 			if (cb->cb_set[NL_CB_DUMP_INTR])
860 				NL_CB_CALL(cb, NL_CB_DUMP_INTR, msg);
861 			else {
862 				/*
863 				 * We have to continue reading to clear
864 				 * all messages until a NLMSG_DONE is
865 				 * received and report the inconsistency.
866 				 */
867 				interrupted = 1;
868 			}
869 		}
870 
871 		/* Other side wishes to see an ack for this message */
872 		if (hdr->nlmsg_flags & NLM_F_ACK) {
873 			if (cb->cb_set[NL_CB_SEND_ACK])
874 				NL_CB_CALL(cb, NL_CB_SEND_ACK, msg);
875 			else {
876 				/* FIXME: implement */
877 			}
878 		}
879 
880 		/* messages terminates a multipart message, this is
881 		 * usually the end of a message and therefore we slip
882 		 * out of the loop by default. the user may overrule
883 		 * this action by skipping this packet. */
884 		if (hdr->nlmsg_type == NLMSG_DONE) {
885 			multipart = 0;
886 			if (cb->cb_set[NL_CB_FINISH])
887 				NL_CB_CALL(cb, NL_CB_FINISH, msg);
888 		}
889 
890 		/* Message to be ignored, the default action is to
891 		 * skip this message if no callback is specified. The
892 		 * user may overrule this action by returning
893 		 * NL_PROCEED. */
894 		else if (hdr->nlmsg_type == NLMSG_NOOP) {
895 			if (cb->cb_set[NL_CB_SKIPPED])
896 				NL_CB_CALL(cb, NL_CB_SKIPPED, msg);
897 			else
898 				goto skip;
899 		}
900 
901 		/* Data got lost, report back to user. The default action is to
902 		 * quit parsing. The user may overrule this action by retuning
903 		 * NL_SKIP or NL_PROCEED (dangerous) */
904 		else if (hdr->nlmsg_type == NLMSG_OVERRUN) {
905 			if (cb->cb_set[NL_CB_OVERRUN])
906 				NL_CB_CALL(cb, NL_CB_OVERRUN, msg);
907 			else {
908 				err = -NLE_MSG_OVERFLOW;
909 				goto out;
910 			}
911 		}
912 
913 		/* Message carries a nlmsgerr */
914 		else if (hdr->nlmsg_type == NLMSG_ERROR) {
915 			struct nlmsgerr *e = nlmsg_data(hdr);
916 
917 			if (hdr->nlmsg_len < nlmsg_size(sizeof(*e))) {
918 				/* Truncated error message, the default action
919 				 * is to stop parsing. The user may overrule
920 				 * this action by returning NL_SKIP or
921 				 * NL_PROCEED (dangerous) */
922 				if (cb->cb_set[NL_CB_INVALID])
923 					NL_CB_CALL(cb, NL_CB_INVALID, msg);
924 				else {
925 					err = -NLE_MSG_TRUNC;
926 					goto out;
927 				}
928 			} else if (e->error) {
929 				/* Error message reported back from kernel. */
930 				if (cb->cb_err) {
931 					err = cb->cb_err(&nla, e,
932 							   cb->cb_err_arg);
933 					if (err < 0)
934 						goto out;
935 					else if (err == NL_SKIP)
936 						goto skip;
937 					else if (err == NL_STOP) {
938 						err = -nl_syserr2nlerr(e->error);
939 						goto out;
940 					}
941 				} else {
942 					err = -nl_syserr2nlerr(e->error);
943 					goto out;
944 				}
945 			} else if (cb->cb_set[NL_CB_ACK])
946 				NL_CB_CALL(cb, NL_CB_ACK, msg);
947 		} else {
948 			/* Valid message (not checking for MULTIPART bit to
949 			 * get along with broken kernels. NL_SKIP has no
950 			 * effect on this.  */
951 			if (cb->cb_set[NL_CB_VALID])
952 				NL_CB_CALL(cb, NL_CB_VALID, msg);
953 		}
954 skip:
955 		err = 0;
956 		hdr = nlmsg_next(hdr, &n);
957 	}
958 
959 	nlmsg_free(msg);
960 	free(buf);
961 	free(creds);
962 	buf = NULL;
963 	msg = NULL;
964 	creds = NULL;
965 
966 	if (multipart) {
967 		/* Multipart message not yet complete, continue reading */
968 		goto continue_reading;
969 	}
970 stop:
971 	err = 0;
972 out:
973 	nlmsg_free(msg);
974 	free(buf);
975 	free(creds);
976 
977 	if (interrupted)
978 		err = -NLE_DUMP_INTR;
979 
980 	if (!err)
981 		err = nrecv;
982 
983 	return err;
984 }
985 
986 /**
987  * Receive a set of messages from a netlink socket and report parsed messages
988  * @arg sk		Netlink socket.
989  * @arg cb		set of callbacks to control behaviour.
990  *
991  * This function is identical to nl_recvmsgs() to the point that it will
992  * return the number of parsed messages instead of 0 on success.
993  *
994  * @see nl_recvmsgs()
995  *
996  * @return Number of received messages or a negative error code from nl_recv().
997  */
nl_recvmsgs_report(struct nl_sock * sk,struct nl_cb * cb)998 int nl_recvmsgs_report(struct nl_sock *sk, struct nl_cb *cb)
999 {
1000 	if (cb->cb_recvmsgs_ow)
1001 		return cb->cb_recvmsgs_ow(sk, cb);
1002 	else
1003 		return recvmsgs(sk, cb);
1004 }
1005 
1006 /**
1007  * Receive a set of messages from a netlink socket.
1008  * @arg sk		Netlink socket.
1009  * @arg cb		set of callbacks to control behaviour.
1010  *
1011  * Repeatedly calls nl_recv() or the respective replacement if provided
1012  * by the application (see nl_cb_overwrite_recv()) and parses the
1013  * received data as netlink messages. Stops reading if one of the
1014  * callbacks returns NL_STOP or nl_recv returns either 0 or a negative error code.
1015  *
1016  * A non-blocking sockets causes the function to return immediately if
1017  * no data is available.
1018  *
1019  * @see nl_recvmsgs_report()
1020  *
1021  * @return 0 on success or a negative error code from nl_recv().
1022  */
nl_recvmsgs(struct nl_sock * sk,struct nl_cb * cb)1023 int nl_recvmsgs(struct nl_sock *sk, struct nl_cb *cb)
1024 {
1025 	int err;
1026 
1027 	if ((err = nl_recvmsgs_report(sk, cb)) > 0)
1028 		err = 0;
1029 
1030 	return err;
1031 }
1032 
1033 /**
1034  * Receive a set of message from a netlink socket using handlers in nl_sock.
1035  * @arg sk		Netlink socket.
1036  *
1037  * Calls nl_recvmsgs() with the handlers configured in the netlink socket.
1038  */
nl_recvmsgs_default(struct nl_sock * sk)1039 int nl_recvmsgs_default(struct nl_sock *sk)
1040 {
1041 	return nl_recvmsgs(sk, sk->s_cb);
1042 
1043 }
1044 
ack_wait_handler(struct nl_msg * msg,void * arg)1045 static int ack_wait_handler(struct nl_msg *msg, void *arg)
1046 {
1047 	return NL_STOP;
1048 }
1049 
1050 /**
1051  * Wait for ACK.
1052  * @arg sk		Netlink socket.
1053  * @pre The netlink socket must be in blocking state.
1054  *
1055  * Waits until an ACK is received for the latest not yet acknowledged
1056  * netlink message.
1057  */
nl_wait_for_ack(struct nl_sock * sk)1058 int nl_wait_for_ack(struct nl_sock *sk)
1059 {
1060 	int err;
1061 	struct nl_cb *cb;
1062 
1063 	cb = nl_cb_clone(sk->s_cb);
1064 	if (cb == NULL)
1065 		return -NLE_NOMEM;
1066 
1067 	nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_wait_handler, NULL);
1068 	err = nl_recvmsgs(sk, cb);
1069 	nl_cb_put(cb);
1070 
1071 	return err;
1072 }
1073 
1074 /** @cond SKIP */
1075 struct pickup_param
1076 {
1077 	int (*parser)(struct nl_cache_ops *, struct sockaddr_nl *,
1078 		      struct nlmsghdr *, struct nl_parser_param *);
1079 	struct nl_object *result;
1080 };
1081 
__store_answer(struct nl_object * obj,struct nl_parser_param * p)1082 static int __store_answer(struct nl_object *obj, struct nl_parser_param *p)
1083 {
1084 	struct pickup_param *pp = p->pp_arg;
1085 	/*
1086 	 * the parser will put() the object at the end, expecting the cache
1087 	 * to take the reference.
1088 	 */
1089 	nl_object_get(obj);
1090 	pp->result =  obj;
1091 
1092 	return 0;
1093 }
1094 
__pickup_answer(struct nl_msg * msg,void * arg)1095 static int __pickup_answer(struct nl_msg *msg, void *arg)
1096 {
1097 	struct pickup_param *pp = arg;
1098 	struct nl_parser_param parse_arg = {
1099 		.pp_cb = __store_answer,
1100 		.pp_arg = pp,
1101 	};
1102 
1103 	return pp->parser(NULL, &msg->nm_src, msg->nm_nlh, &parse_arg);
1104 }
1105 
1106 /** @endcond */
1107 
1108 /**
1109  * Pickup netlink answer, parse is and return object
1110  * @arg sk		Netlink socket
1111  * @arg parser		Parser function to parse answer
1112  * @arg result		Result pointer to return parsed object
1113  *
1114  * @return 0 on success or a negative error code.
1115  */
nl_pickup(struct nl_sock * sk,int (* parser)(struct nl_cache_ops *,struct sockaddr_nl *,struct nlmsghdr *,struct nl_parser_param *),struct nl_object ** result)1116 int nl_pickup(struct nl_sock *sk,
1117 	      int (*parser)(struct nl_cache_ops *, struct sockaddr_nl *,
1118 			    struct nlmsghdr *, struct nl_parser_param *),
1119 	      struct nl_object **result)
1120 {
1121 	struct nl_cb *cb;
1122 	int err;
1123 	struct pickup_param pp = {
1124 		.parser = parser,
1125 	};
1126 
1127 	cb = nl_cb_clone(sk->s_cb);
1128 	if (cb == NULL)
1129 		return -NLE_NOMEM;
1130 
1131 	nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, __pickup_answer, &pp);
1132 
1133 	err = nl_recvmsgs(sk, cb);
1134 	if (err < 0)
1135 		goto errout;
1136 
1137 	*result = pp.result;
1138 errout:
1139 	nl_cb_put(cb);
1140 
1141 	return err;
1142 }
1143 
1144 /** @} */
1145 
1146 /**
1147  * @name Deprecated
1148  * @{
1149  */
1150 
1151 /**
1152  * @deprecated Please use nl_complete_msg()
1153  */
nl_auto_complete(struct nl_sock * sk,struct nl_msg * msg)1154 void nl_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
1155 {
1156 	nl_complete_msg(sk, msg);
1157 }
1158 
1159 /**
1160  * @deprecated Please use nl_send_auto()
1161  */
nl_send_auto_complete(struct nl_sock * sk,struct nl_msg * msg)1162 int nl_send_auto_complete(struct nl_sock *sk, struct nl_msg *msg)
1163 {
1164 	return nl_send_auto(sk, msg);
1165 }
1166 
1167 
1168 /** @} */
1169 
1170 /** @} */
1171 
1172 /** @} */
1173