]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
nl: Provide API to specify the default buffer size when receiving netlink messages
authorThomas Graf <tgraf@redhat.com>
Tue, 9 Oct 2012 14:15:08 +0000 (16:15 +0200)
committerThomas Graf <tgraf@redhat.com>
Tue, 9 Oct 2012 14:16:54 +0000 (16:16 +0200)
New functions:
  nl_socket_set_msg_buf_size(sk, size)
  nl_socket_get_msg_buf_size(sk)

Default remains getpagesize()

Signed-off-by: Thomas Graf <tgraf@redhat.com>
include/netlink-types.h
include/netlink/socket.h
lib/nl.c
lib/socket.c

index 2e80b05831889557b08ab8945048180008987b10..e88557150e46ffe5691c9d940c18e7dae4945c87 100644 (file)
@@ -69,6 +69,7 @@ struct nl_sock
        unsigned int            s_seq_expect;
        int                     s_flags;
        struct nl_cb *          s_cb;
+       size_t                  s_bufsize;
 };
 
 struct nl_cache
index d0f5a6a5b6ad8581395551a5286168ac698c0b12..1007eba03ad982b67402f3d4b01cfc480fdf50ec 100644 (file)
@@ -49,6 +49,8 @@ extern int nl_socket_modify_err_cb(struct nl_sock *, enum nl_cb_kind,
                                   nl_recvmsg_err_cb_t, void *);
 
 extern int             nl_socket_set_buffer_size(struct nl_sock *, int, int);
+extern int             nl_socket_set_msg_buf_size(struct nl_sock *, size_t);
+extern size_t          nl_socket_get_msg_buf_size(struct nl_sock *);
 extern int             nl_socket_set_passcred(struct nl_sock *, int);
 extern int             nl_socket_recv_pktinfo(struct nl_sock *, int);
 
index ea3e0871550164ebd4987b9888e2cbb7721f5e0e..5b37c2a3a20b492e0ff2738951eb961c1390eb22 100644 (file)
--- a/lib/nl.c
+++ b/lib/nl.c
@@ -447,7 +447,7 @@ int nl_recv(struct nl_sock *sk, struct sockaddr_nl *nla,
        if (page_size == 0)
                page_size = getpagesize();
 
-       iov.iov_len = page_size;
+       iov.iov_len = sk->s_bufsize ? : page_size;
        iov.iov_base = *buf = malloc(iov.iov_len);
 
        if (sk->s_flags & NL_SOCK_PASSCRED) {
index 7e3ebf6750173a435ba4a06793559b20d01da190..d53a714bae7a352ea11bffa620d352a2c771067e 100644 (file)
@@ -586,6 +586,36 @@ int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf)
        return 0;
 }
 
+/**
+ * Set default message buffer size of netlink socket.
+ * @arg sk             Netlink socket.
+ * @arg bufsize                Default message buffer size in bytes.
+ *
+ * Sets the default message buffer size to the specified length in bytes.
+ * The default message buffer size limits the maximum message size the
+ * socket will be able to receive. It is generally recommneded to specify
+ * a buffer size no less than the size of a memory page.
+ *
+ * @return 0 on success or a negative error code.
+ */
+int nl_socket_set_msg_buf_size(struct nl_sock *sk, size_t bufsize)
+{
+       sk->s_bufsize = bufsize;
+
+       return 0;
+}
+
+/**
+ * Get default message buffer size of netlink socket.
+ * @arg sk             Netlink socket.
+ *
+ * @return Size of default message buffer.
+ */
+size_t nl_socket_get_msg_buf_size(struct nl_sock *sk)
+{
+       return sk->s_bufsize;
+}
+
 /**
  * Enable/disable credential passing on netlink socket.
  * @arg sk             Netlink socket.