diff options
author | hasso <hasso> | 2004-08-31 13:41:49 +0000 |
---|---|---|
committer | hasso <hasso> | 2004-08-31 13:41:49 +0000 |
commit | c34b6b577ef58e7609de1e088e7923c4c056cfeb (patch) | |
tree | 6cc1c399962c8dec074fe21aad73cc1fc7cad3dd /zebra/rt_netlink.c | |
parent | 7b90143f14ba21f6bd3ff2c8b60f69500f46c0e8 (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.c | 44 |
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; |