summaryrefslogtreecommitdiffstats
path: root/zebra/rt_netlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/rt_netlink.c')
-rw-r--r--zebra/rt_netlink.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 05254498..07e86647 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1831,12 +1831,57 @@ kernel_read (struct thread *thread)
return 0;
}
+<<<<<<< HEAD:zebra/rt_netlink.c
+/* 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)
+>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:zebra/rt_netlink.c
{
+<<<<<<< HEAD:zebra/rt_netlink.c
+ /*
+ * Filter is equivalent to netlink_route_change
+ *
+ * if (h->nlmsg_type == RTM_DELROUTE || h->nlmsg_type == RTM_NEWROUTE) {
+ * if (rtm->rtm_type != RTM_UNICAST)
+ * return 0;
+ * if (rtm->rtm_flags & RTM_F_CLONED)
+ * return 0;
+ * if (rtm->rtm_protocol == RTPROT_REDIRECT)
+ * return 0;
+ * if (rtm->rtm_protocol == RTPROT_KERNEL)
+ * return 0;
+ * if (rtm->rtm_protocol == RTPROT_ZEBRA && h->nlmsg_type == RTM_NEWROUTE)
+ * return 0;
+ * }
+ * return 0xffff;
+ */
+=======
+>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:zebra/rt_netlink.c
struct sock_filter filter[] = {
+<<<<<<< HEAD:zebra/rt_netlink.c
+ /* 0*/ BPF_STMT(BPF_LD|BPF_ABS|BPF_H, offsetof(struct nlmsghdr, nlmsg_type)),
+ /* 1*/ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_DELROUTE), 1, 0),
+ /* 2*/ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_NEWROUTE), 0, 11),
+ /* 3*/ BPF_STMT(BPF_LD|BPF_ABS|BPF_B,
+ sizeof(struct nlmsghdr) + offsetof(struct rtmsg, rtm_type)),
+ /* 4*/ BPF_JUMP(BPF_JMP|BPF_B, RTN_UNICAST, 0, 8),
+ /* 5*/ BPF_STMT(BPF_LD|BPF_ABS|BPF_B,
+ sizeof(struct nlmsghdr) + offsetof(struct rtmsg, rtm_flags)),
+ /* 6*/ BPF_JUMP(BPF_JMP|BPF_JSET|BPF_K, RTM_F_CLONED, 6, 0),
+ /* 7*/ BPF_STMT(BPF_LD|BPF_ABS|BPF_B,
+ sizeof(struct nlmsghdr) + offsetof(struct rtmsg, rtm_protocol)),
+ /* 8*/ BPF_JUMP(BPF_JMP+ BPF_B, RTPROT_REDIRECT, 4, 0),
+ /* 9*/ BPF_JUMP(BPF_JMP+ BPF_B, RTPROT_KERNEL, 0, 1),
+ /*10*/ BPF_JUMP(BPF_JMP+ BPF_B, RTPROT_ZEBRA, 0, 3),
+ /*11*/ BPF_STMT(BPF_LD|BPF_ABS|BPF_H, offsetof(struct nlmsghdr, nlmsg_type)),
+ /*12*/ BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(RTM_NEWROUTE), 0, 1),
+ /*13*/ BPF_STMT(BPF_RET|BPF_K, 0), /* drop */
+ /*14*/ BPF_STMT(BPF_RET|BPF_K, 0xffff), /* keep */
+=======
/* 0: ldh [4] */
BPF_STMT(BPF_LD|BPF_ABS|BPF_H, offsetof(struct nlmsghdr, nlmsg_type)),
/* 1: jeq 0x18 jt 3 jf 6 */
@@ -1851,6 +1896,7 @@ static void netlink_install_filter (int sock, __u32 pid)
BPF_STMT(BPF_RET|BPF_K, 0),
/* 6: ret 0xffff (keep) */
BPF_STMT(BPF_RET|BPF_K, 0xffff),
+>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:zebra/rt_netlink.c
};
struct sock_fprog prog = {
@@ -1879,6 +1925,9 @@ kernel_init (void)
/* Register kernel socket. */
if (netlink.sock > 0)
{
+<<<<<<< HEAD:zebra/rt_netlink.c
+ netlink_install_filter (netlink.sock);
+=======
/* Only want non-blocking on the netlink event socket */
if (fcntl (netlink.sock, F_SETFL, O_NONBLOCK) < 0)
zlog (NULL, LOG_ERR, "Can't set %s socket flags: %s", netlink.name,
@@ -1889,6 +1938,7 @@ kernel_init (void)
netlink_recvbuf (&netlink, nl_rcvbufsize);
netlink_install_filter (netlink.sock, netlink_cmd.snl.nl_pid);
+>>>>>>> 41dc3488cf127a1e23333459a0c316ded67f7ff3:zebra/rt_netlink.c
thread_add_read (zebrad.master, kernel_read, NULL, netlink.sock);
}
}