Commit my hack (yes, I still call it hack) - command line switch for zebra
daemon to change netlink receive buffer size.
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 2ca0de4..9e6c440 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -84,6 +84,8 @@
 
 extern struct zebra_privs_t zserv_privs;
 
+extern u_int32_t nl_rcvbufsize;
+
 /* Make socket for Linux netlink interface. */
 static int
 netlink_socket (struct nlsock *nl, unsigned long groups)
@@ -110,6 +112,48 @@
       return -1;
     }
 
+  /* Set receive buffer size if it's set from command line */
+  if (nl_rcvbufsize)
+    {
+      u_int32_t oldsize, oldlen;
+      u_int32_t newsize, newlen;
+
+      oldlen = sizeof(oldsize);
+      newlen = sizeof(newsize);
+
+      ret = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &oldsize, &oldlen);
+      if (ret < 0)
+	{
+	  zlog (NULL, LOG_ERR, "Can't get %s receive buffer size: %s", nl->name,
+		strerror (errno));
+	  close (sock);
+	  return -1;
+	}
+
+      ret = setsockopt(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,
+		strerror (errno));
+	  close (sock);
+	  return -1;
+	}
+
+      ret = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &newsize, &newlen);
+      if (ret < 0)
+	{
+	  zlog (NULL, LOG_ERR, "Can't get %s receive buffer size: %s", nl->name,
+		strerror (errno));
+	  close (sock);
+	  return -1;
+	}
+
+      zlog (NULL, LOG_INFO,
+	    "Setting netlink socket receive buffer size: %u -> %u",
+	    oldsize, newsize);
+    }
+
   memset (&snl, 0, sizeof snl);
   snl.nl_family = AF_NETLINK;
   snl.nl_groups = groups;