summaryrefslogtreecommitdiff
path: root/zebra/rt_netlink.c
diff options
context:
space:
mode:
authorhasso <hasso>2004-08-31 13:41:49 +0000
committerhasso <hasso>2004-08-31 13:41:49 +0000
commitc34b6b577ef58e7609de1e088e7923c4c056cfeb (patch)
tree6cc1c399962c8dec074fe21aad73cc1fc7cad3dd /zebra/rt_netlink.c
parent7b90143f14ba21f6bd3ff2c8b60f69500f46c0e8 (diff)
Commit my hack (yes, I still call it hack) - command line switch for zebra
daemon to change netlink receive buffer size.
Diffstat (limited to 'zebra/rt_netlink.c')
-rw-r--r--zebra/rt_netlink.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 2ca0de43..9e6c440b 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -84,6 +84,8 @@ extern struct zebra_t zebrad;
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 @@ netlink_socket (struct nlsock *nl, unsigned long groups)
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;