summaryrefslogtreecommitdiffstats
path: root/zebra
diff options
context:
space:
mode:
authorrbalocca <rbalocca@vyatta.com>2008-05-07 12:17:22 -0700
committerrbalocca <rbalocca@vyatta.com>2008-05-07 12:17:22 -0700
commita3e7619c03307908030fb03b1085f19e8809be43 (patch)
tree4b75d74e1173143ca62165caae0d1a3fdacf7145 /zebra
parent4ac9235258754e07aa7ea596accba0ba38a425ee (diff)
parent5ba6d58ff687409ce5ff561d6557a11de9aef6b6 (diff)
downloadquagga-a3e7619c03307908030fb03b1085f19e8809be43.tar.bz2
quagga-a3e7619c03307908030fb03b1085f19e8809be43.tar.xz
Merge branch 'glendale' into hollywood
Diffstat (limited to 'zebra')
-rw-r--r--zebra/rt_netlink.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 273c3121..c387917b 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -425,7 +425,13 @@ netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *),
if (nl == &netlink_cmd
&& (-errnum == ENODEV || -errnum == ESRCH)
&& (msg_type == RTM_NEWROUTE || msg_type == RTM_DELROUTE))
- loglvl = LOG_DEBUG;
+ {
+ /* These errors are normal during link transistion */
+ if (IS_ZEBRA_DEBUG_KERNEL)
+ loglvl = LOG_DEBUG;
+ else
+ return -1;
+ }
zlog (NULL, loglvl, "%s error: %s, type=%s(%u), "
"seq=%u, pid=%u",
@@ -1939,22 +1945,26 @@ kernel_read (struct thread *thread)
return 0;
}
-/* Filter out messages from self that occur on listener socket */
-static void netlink_install_filter (int sock)
+/* Filter out messages from self that occur on listener socket,
+ caused by our actions on the command socket
+ */
+static void netlink_install_filter (int sock, __u32 pid)
{
- /* BPF code to exclude all RTM_NEWROUTE messages from ZEBRA */
struct sock_filter filter[] = {
+ /* 0: ldh [4] */
BPF_STMT(BPF_LD|BPF_ABS|BPF_H, offsetof(struct nlmsghdr, nlmsg_type)),
- /* 0: ldh [4] */
- BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_NEWROUTE), 0, 3),
- /* 1: jeq 0x18 jt 2 jf 5 */
- BPF_STMT(BPF_LD|BPF_ABS|BPF_B,
- sizeof(struct nlmsghdr) + offsetof(struct rtmsg, rtm_protocol)),
- /* 2: ldb [23] */
- BPF_JUMP(BPF_JMP+ BPF_B, RTPROT_ZEBRA, 0, 1),
- /* 3: jeq 0xb jt 4 jf 5 */
- BPF_STMT(BPF_RET|BPF_K, 0), /* 4: ret 0 */
- BPF_STMT(BPF_RET|BPF_K, 0xffff), /* 5: ret 0xffff */
+ /* 1: jeq 0x18 jt 3 jf 6 */
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_NEWROUTE), 1, 0),
+ /* 2: jeq 0x19 jt 3 jf 6 */
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_DELROUTE), 0, 3),
+ /* 3: ldw [12] */
+ BPF_STMT(BPF_LD|BPF_ABS|BPF_W, offsetof(struct nlmsghdr, nlmsg_pid)),
+ /* 4: jeq XX jt 5 jf 6 */
+ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htonl(pid), 0, 1),
+ /* 5: ret 0 (skip) */
+ BPF_STMT(BPF_RET|BPF_K, 0),
+ /* 6: ret 0xffff (keep) */
+ BPF_STMT(BPF_RET|BPF_K, 0xffff),
};
struct sock_fprog prog = {
@@ -1983,7 +1993,7 @@ kernel_init (void)
/* Register kernel socket. */
if (netlink.sock > 0)
{
- netlink_install_filter (netlink.sock);
+ netlink_install_filter (netlink.sock, netlink_cmd.snl.nl_pid);
thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);
}
}