]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: use SO_RCVBUFFORCE for netlink socket
authorUlrich Weber <ulrich.weber@Sophos.com>
Tue, 22 Jan 2013 10:39:18 +0000 (10:39 +0000)
committerDavid Lamparter <equinox@opensourcerouting.org>
Sat, 23 Feb 2013 17:19:24 +0000 (18:19 +0100)
so net.core.rmem_max must not be adjusted. Requires
linux kernel >= 2.6.14, falls back to SO_RCVBUF on error

Signed-off-by: Ulrich Weber <ulrich.weber@sophos.com>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
doc/zebra.8
zebra/rt_netlink.c

index 23703e7279c9cb860b5147d8f3bb05da5b60ea5d..a40909a69938313f6fb0fcedbe067fccb9a9ce98 100644 (file)
@@ -80,7 +80,7 @@ handle flood of netlink messages from kernel. If you ever see "recvmsg overrun"
 messages in zebra log, you are in trouble.
 
 Solution is to increase receive buffer of netlink socket. Note that kernel
-doesn't allow to increase it over maximum value defined in
+< 2.6.14 doesn't allow to increase it over maximum value defined in
 \fI/proc/sys/net/core/rmem_max\fR. If you want to do it, you have to increase
 maximum before starting zebra.
 
index fa446a56fcb3195308cdf633e9d3f13b1430a5a9..bab170371f58f0c61bf295263c6c3995ff9fe342 100644 (file)
@@ -101,6 +101,10 @@ set_ifindex(struct interface *ifp, unsigned int ifi_index)
   ifp->ifindex = ifi_index;
 }
 
+#ifndef SO_RCVBUFFORCE
+#define SO_RCVBUFFORCE  (33)
+#endif
+
 static int
 netlink_recvbuf (struct nlsock *nl, uint32_t newsize)
 {
@@ -117,8 +121,16 @@ netlink_recvbuf (struct nlsock *nl, uint32_t newsize)
       return -1;
     }
 
-  ret = setsockopt(nl->sock, SOL_SOCKET, SO_RCVBUF, &nl_rcvbufsize,
+  /* Try force option (linux >= 2.6.14) and fall back to normal set */
+  if ( zserv_privs.change (ZPRIVS_RAISE) )
+    zlog_err ("routing_socket: Can't raise privileges");
+  ret = setsockopt(nl->sock, SOL_SOCKET, SO_RCVBUFFORCE, &nl_rcvbufsize,
                   sizeof(nl_rcvbufsize));
+  if ( zserv_privs.change (ZPRIVS_LOWER) )
+    zlog_err ("routing_socket: Can't lower privileges");
+  if (ret < 0)
+     ret = setsockopt(nl->sock, SOL_SOCKET, SO_RCVBUF, &nl_rcvbufsize,
+                     sizeof(nl_rcvbufsize));
   if (ret < 0)
     {
       zlog (NULL, LOG_ERR, "Can't set %s receive buffer size: %s", nl->name,