summaryrefslogtreecommitdiffstats
path: root/zebra/rt_netlink.c
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-05-07 14:40:27 -0700
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-05-07 14:40:27 -0700
commitb805b43fde589feee4823145e1dc7b5ac5d4f080 (patch)
tree1acb8e78a322700b1ebbc69c9ef7ae0241d25a68 /zebra/rt_netlink.c
parent56a02122bd38bc5cafe24293a79abb81d90e0913 (diff)
parenta3e7619c03307908030fb03b1085f19e8809be43 (diff)
downloadquagga-b805b43fde589feee4823145e1dc7b5ac5d4f080.tar.bz2
quagga-b805b43fde589feee4823145e1dc7b5ac5d4f080.tar.xz
Merge branch 'hollywood' of suva.vyatta.com:/git/vyatta-quagga into hollywood
Diffstat (limited to 'zebra/rt_netlink.c')
-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 47aa8b10..b794f18a 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",
@@ -1948,22 +1954,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 = {
@@ -1992,7 +2002,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);
}
}