summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2010-10-21 12:00:27 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2010-10-21 12:00:27 +0200
commit4eaebf5ef25f97cc6960da9f1a29b61737da8abd (patch)
treee28f06c05e5a722e3a2a6de4b42f54bc3d72a81a
parent781a9f058327730723525d3c4b85533920a00e9b (diff)
src: define MNL_SOCKET_BUFFER_SIZE to 8192UL
Davem spotted during the Netfilter Workshop that user-space applications should use 8KB buffers for recv(). I accidentally found that NFLOG is not following this approach (in this case we're using 131072 bytes messages), we have to document this. Anyway, according to linux/netlink.h (and to complete this log message): "skb should fit one page. This choice is good for headerless malloc. But we should limit to 8K so that userspace does not have to use enormous buffer sizes on recvmsg() calls just to avoid MSG_TRUNC when PAGE_SIZE is very large." Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--examples/genl/genl-family-get.c2
-rw-r--r--examples/netfilter/nf-queue.c2
-rw-r--r--examples/netfilter/nfct-event.c2
-rw-r--r--examples/rtnl/rtnl-link-dump.c2
-rw-r--r--examples/rtnl/rtnl-link-dump2.c2
-rw-r--r--examples/rtnl/rtnl-link-dump3.c2
-rw-r--r--examples/rtnl/rtnl-link-event.c2
-rw-r--r--examples/rtnl/rtnl-link-set.c2
-rw-r--r--examples/rtnl/rtnl-route-add.c2
-rw-r--r--examples/rtnl/rtnl-route-dump.c2
-rw-r--r--include/libmnl/libmnl.h1
-rw-r--r--src/socket.c7
12 files changed, 16 insertions, 12 deletions
diff --git a/examples/genl/genl-family-get.c b/examples/genl/genl-family-get.c
index 326755e..b015466 100644
--- a/examples/genl/genl-family-get.c
+++ b/examples/genl/genl-family-get.c
@@ -183,7 +183,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main(int argc, char *argv[])
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct genlmsghdr *genl;
int ret;
diff --git a/examples/netfilter/nf-queue.c b/examples/netfilter/nf-queue.c
index 1df004a..8b1a5e7 100644
--- a/examples/netfilter/nf-queue.c
+++ b/examples/netfilter/nf-queue.c
@@ -167,7 +167,7 @@ nfq_build_verdict(char *buf, int id, int queue_num, int verd)
int main(int argc, char *argv[])
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
int ret;
unsigned int portid, queue_num;
diff --git a/examples/netfilter/nfct-event.c b/examples/netfilter/nfct-event.c
index 9dcf6cc..c713946 100644
--- a/examples/netfilter/nfct-event.c
+++ b/examples/netfilter/nfct-event.c
@@ -208,7 +208,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
int ret;
nl = mnl_socket_open(NETLINK_NETFILTER);
diff --git a/examples/rtnl/rtnl-link-dump.c b/examples/rtnl/rtnl-link-dump.c
index 8bce803..d47d32e 100644
--- a/examples/rtnl/rtnl-link-dump.c
+++ b/examples/rtnl/rtnl-link-dump.c
@@ -69,7 +69,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct rtgenmsg *rt;
int ret;
diff --git a/examples/rtnl/rtnl-link-dump2.c b/examples/rtnl/rtnl-link-dump2.c
index ac3a6be..8189e7c 100644
--- a/examples/rtnl/rtnl-link-dump2.c
+++ b/examples/rtnl/rtnl-link-dump2.c
@@ -60,7 +60,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct rtgenmsg *rt;
int ret;
diff --git a/examples/rtnl/rtnl-link-dump3.c b/examples/rtnl/rtnl-link-dump3.c
index 6d06d7c..d8cacb4 100644
--- a/examples/rtnl/rtnl-link-dump3.c
+++ b/examples/rtnl/rtnl-link-dump3.c
@@ -60,7 +60,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct rtgenmsg *rt;
int ret;
diff --git a/examples/rtnl/rtnl-link-event.c b/examples/rtnl/rtnl-link-event.c
index aa51a1e..4aa11ef 100644
--- a/examples/rtnl/rtnl-link-event.c
+++ b/examples/rtnl/rtnl-link-event.c
@@ -68,7 +68,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
int ret;
nl = mnl_socket_open(NETLINK_ROUTE);
diff --git a/examples/rtnl/rtnl-link-set.c b/examples/rtnl/rtnl-link-set.c
index d5cf9b1..00afe27 100644
--- a/examples/rtnl/rtnl-link-set.c
+++ b/examples/rtnl/rtnl-link-set.c
@@ -18,7 +18,7 @@
int main(int argc, char *argv[])
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct ifinfomsg *ifm;
int ret;
diff --git a/examples/rtnl/rtnl-route-add.c b/examples/rtnl/rtnl-route-add.c
index 1f2d1a0..26105b3 100644
--- a/examples/rtnl/rtnl-route-add.c
+++ b/examples/rtnl/rtnl-route-add.c
@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
}
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct rtmsg *rtm;
diff --git a/examples/rtnl/rtnl-route-dump.c b/examples/rtnl/rtnl-route-dump.c
index 34c95cf..22395c4 100644
--- a/examples/rtnl/rtnl-route-dump.c
+++ b/examples/rtnl/rtnl-route-dump.c
@@ -199,7 +199,7 @@ static int data_cb(const struct nlmsghdr *nlh, void *data)
int main()
{
struct mnl_socket *nl;
- char buf[getpagesize()];
+ char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
struct rtmsg *rtm;
int ret;
diff --git a/include/libmnl/libmnl.h b/include/libmnl/libmnl.h
index 09099a1..f658428 100644
--- a/include/libmnl/libmnl.h
+++ b/include/libmnl/libmnl.h
@@ -11,6 +11,7 @@
*/
#define MNL_SOCKET_AUTOPID 0
+#define MNL_SOCKET_BUFFER_SIZE 8192UL /* see linux/netlink.h */
struct mnl_socket;
diff --git a/src/socket.c b/src/socket.c
index 08ac138..53f98c7 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -186,8 +186,11 @@ int mnl_socket_sendto(const struct mnl_socket *nl, const void *buf, size_t len)
*
* On error, it returns -1 and errno is appropriately set. If errno is set
* to ENOSPC, it means that the buffer that you have passed to store the
- * netlink message is small so you have received a truncated message. Make
- * sure your program set a buffer big enough to store the netlink message.
+ * netlink message is too small so you have received a truncated message.
+ * To avoid this you have to allocate a buffer of MNL_SOCKET_BUFFER_SIZE
+ * (which is 8KB, see linux/netlink.h for more information). Using this
+ * buffer size ensures that your buffer is big enough to store the netlink
+ * message without truncating it.
*/
int mnl_socket_recvfrom(const struct mnl_socket *nl, void *buf, size_t bufsiz)
{