Upgrade to 1.6.3
Michal
bird at hudrydum.cz
Fri Dec 30 16:53:52 CET 2016
On 2016-12-30 13:30, Michal wrote:
> On 2016-12-30 13:26, Ondrej Zajicek wrote:
>> On Fri, Dec 30, 2016 at 01:13:59PM +0100, Michal wrote:
>>> Stupid... increasing read buffer helped of course
>>>
>>> sysctl -w net.core.rmem_default=1064960
>>>
>>> I see, the bird is not increasing the read buffer on it's netlink
>>> socket.
>>> Would it be bad idea to create an configuration option for that?
>>
>> Yes, that is probably a good idea.
>
> Ok, let's see if can pull up some C skills.
So here comes the ugly patch. I can confirm that rising rcvbuf size to
something bigger fixes my problem.
conf/conf.c | 1 +
conf/conf.h | 1 +
sysdep/linux/netlink.Y | 7 ++++++-
sysdep/linux/netlink.c | 18 ++++++++++++++----
4 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/conf/conf.c b/conf/conf.c
index 0a4e3f8c..b8d77bdd 100644
--- a/conf/conf.c
+++ b/conf/conf.c
@@ -104,6 +104,7 @@ config_alloc(const byte *name)
c->tf_route = c->tf_proto = (struct timeformat){"%T", "%F", 20*3600};
c->tf_base = c->tf_log = (struct timeformat){"%F %T", NULL, 0};
c->gr_wait = DEFAULT_GR_WAIT;
+ c->netlink_rcvbuf = 0;
return c;
}
diff --git a/conf/conf.h b/conf/conf.h
index 41cb434f..cf0bfc67 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -55,6 +55,7 @@ struct config {
int obstacle_count; /* Number of items blocking freeing of this
config */
int shutdown; /* This is a pseudo-config for daemon shutdown */
bird_clock_t load_time; /* When we've got this configuration */
+ size_t netlink_rcvbuf; /* netlink receive buffer size */
};
/* Please don't use these variables in protocols. Use
proto_config->global instead. */
diff --git a/sysdep/linux/netlink.Y b/sysdep/linux/netlink.Y
index f577244d..d7dc3347 100644
--- a/sysdep/linux/netlink.Y
+++ b/sysdep/linux/netlink.Y
@@ -10,7 +10,7 @@ CF_HDR
CF_DECLS
-CF_KEYWORDS(KERNEL, TABLE, METRIC, KRT_PREFSRC, KRT_REALM, KRT_SCOPE,
KRT_MTU, KRT_WINDOW,
+CF_KEYWORDS(NETLINK, RCVBUF, KERNEL, TABLE, METRIC, KRT_PREFSRC,
KRT_REALM, KRT_SCOPE, KRT_MTU, KRT_WINDOW,
KRT_RTT, KRT_RTTVAR, KRT_SSTRESH, KRT_CWND, KRT_ADVMSS,
KRT_REORDERING,
KRT_HOPLIMIT, KRT_INITCWND, KRT_RTO_MIN, KRT_INITRWND,
KRT_QUICKACK,
KRT_LOCK_MTU, KRT_LOCK_WINDOW, KRT_LOCK_RTT, KRT_LOCK_RTTVAR,
@@ -19,6 +19,11 @@ CF_KEYWORDS(KERNEL, TABLE, METRIC, KRT_PREFSRC,
KRT_REALM, KRT_SCOPE, KRT_MTU, K
CF_GRAMMAR
+CF_ADDTO(conf, netlink)
+
+netlink:
+ NETLINK RCVBUF expr ';' { new_config->netlink_rcvbuf = $3; }
+
CF_ADDTO(kern_proto, kern_proto kern_sys_item ';')
kern_sys_item:
diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index 22313f43..28fd26f3 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -1533,11 +1533,12 @@ nl_async_err_hook(sock *sk, int e UNUSED)
}
static void
-nl_open_async(void)
+nl_open_async(struct proto *p)
{
sock *sk;
struct sockaddr_nl sa;
int fd;
+ size_t rcvbuf;
if (nl_async_sk)
return;
@@ -1551,6 +1552,15 @@ nl_open_async(void)
return;
}
+ rcvbuf = p->cf->global->netlink_rcvbuf;
+ if (rcvbuf > 0)
+ {
+ if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf,
sizeof(rcvbuf)) < 0)
+ {
+ log(L_ERR "Unable to set netlink socket receive buffer size:
%m");
+ }
+ }
+
bzero(&sa, sizeof(sa));
sa.nl_family = AF_NETLINK;
#ifdef IPV6
@@ -1603,7 +1613,7 @@ krt_sys_start(struct krt_proto *p)
HASH_INSERT2(nl_table_map, RTH, krt_pool, p);
nl_open();
- nl_open_async();
+ nl_open_async(&(p->p));
return 1;
}
@@ -1685,10 +1695,10 @@ krt_sys_get_attr(eattr *a, byte *buf, int buflen
UNUSED)
void
-kif_sys_start(struct kif_proto *p UNUSED)
+kif_sys_start(struct kif_proto *p)
{
nl_open();
- nl_open_async();
+ nl_open_async(&(p->p));
}
void
More information about the Bird-users
mailing list