diff --git a/sysdep/linux/netlink/krt-scan.h b/sysdep/linux/netlink/krt-scan.h index ec10a7fe..2f8fe761 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 36a447d1..c5dcf620 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 + * (c) 1999--2000 Martin Mares * * 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 7f66af92..db744135 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(); }