summaryrefslogtreecommitdiffstats
path: root/sysdep/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdep/linux')
-rw-r--r--sysdep/linux/netlink/krt-scan.h3
-rw-r--r--sysdep/linux/netlink/netlink.Y5
-rw-r--r--sysdep/linux/netlink/netlink.c23
3 files changed, 20 insertions, 11 deletions
diff --git a/sysdep/linux/netlink/krt-scan.h b/sysdep/linux/netlink/krt-scan.h
index ec10a7f..2f8fe76 100644
--- a/sysdep/linux/netlink/krt-scan.h
+++ b/sysdep/linux/netlink/krt-scan.h
@@ -22,7 +22,6 @@
#endif
struct krt_scan_params {
- int async; /* Allow asynchronous events */
int table_id; /* Kernel table ID we sync with */
};
@@ -32,7 +31,7 @@ struct krt_scan_status {
static inline int krt_scan_params_same(struct krt_scan_params *o, struct krt_scan_params *n)
{
- return o->async == n->async && o->table_id == n->table_id;
+ return o->table_id == n->table_id;
}
#endif
diff --git a/sysdep/linux/netlink/netlink.Y b/sysdep/linux/netlink/netlink.Y
index 36a447d..c5dcf62 100644
--- a/sysdep/linux/netlink/netlink.Y
+++ b/sysdep/linux/netlink/netlink.Y
@@ -1,7 +1,7 @@
/*
* BIRD -- Linux Netlink Configuration
*
- * (c) 1999 Martin Mares <mj@ucw.cz>
+ * (c) 1999--2000 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
@@ -17,8 +17,7 @@ CF_GRAMMAR
CF_ADDTO(kern_proto, kern_proto nl_item ';')
nl_item:
- ASYNC bool { THIS_KRT->scan.async = $2; }
- | KERNEL TABLE expr {
+ KERNEL TABLE expr {
if ($3 <= 0 || $3 >= NL_NUM_TABLES)
cf_error("Kernel routing table number out of range");
THIS_KRT->scan.table_id = $3;
diff --git a/sysdep/linux/netlink/netlink.c b/sysdep/linux/netlink/netlink.c
index 7f66af9..db74413 100644
--- a/sysdep/linux/netlink/netlink.c
+++ b/sysdep/linux/netlink/netlink.c
@@ -768,7 +768,16 @@ nl_async_hook(sock *sk, int size)
x = recvmsg(sk->fd, &m, 0);
if (x < 0)
{
- if (errno != EWOULDBLOCK)
+ if (errno == ENOBUFS)
+ {
+ /*
+ * Netlink reports some packets have been thrown away.
+ * One day we might react to it by asking for route table
+ * scan in near future.
+ */
+ return 1; /* More data are likely to be ready */
+ }
+ else if (errno != EWOULDBLOCK)
log(L_ERR "Netlink recvmsg: %m");
return 0;
}
@@ -800,6 +809,11 @@ nl_open_async(void)
sock *sk;
struct sockaddr_nl sa;
int fd;
+ static int nl_open_tried = 0;
+
+ if (nl_open_tried)
+ return;
+ nl_open_tried = 1;
DBG("KRT: Opening async netlink socket\n");
@@ -859,11 +873,9 @@ krt_scan_postconfig(struct krt_config *x)
void
krt_scan_construct(struct krt_config *x)
{
- x->scan.async = 1;
#ifndef IPV6
x->scan.table_id = RT_TABLE_MAIN;
#endif
- /* FIXME: Use larger defaults for scanning times? */
}
void
@@ -874,8 +886,7 @@ krt_scan_start(struct krt_proto *p, int first)
if (first)
{
nl_open();
- if (KRT_CF->scan.async) /* FIXME: Async is for debugging only. Get rid of it some day. */
- nl_open_async();
+ nl_open_async();
}
}
@@ -888,5 +899,5 @@ void
krt_if_start(struct kif_proto *p)
{
nl_open();
- /* FIXME: nl_open_async() after scan.async is gone */
+ nl_open_async();
}