From e442401e5387041fd13f6f9fa120baaef9fe170d Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Mon, 12 Mar 2018 00:26:50 +0100 Subject: [PATCH] Minor fixme - mkernel --- sysdep/unix/io.c | 3 ++- sysdep/unix/mkrt.c | 28 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index e4b8cc373..f56f69430 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -852,7 +852,8 @@ sk_free(resource *r) current_sock = sk_next(s); if (s == stored_sock) stored_sock = sk_next(s); - rem_node(&s->n); + if (NODE_VALID(&s->n)) + rem_node(&s->n); } if (s->type != SK_SSH && s->type != SK_SSH_ACTIVE) diff --git a/sysdep/unix/mkrt.c b/sysdep/unix/mkrt.c index d8566254e..ad699e412 100644 --- a/sysdep/unix/mkrt.c +++ b/sysdep/unix/mkrt.c @@ -305,24 +305,34 @@ mkrt_rx_hook(sock *sk, uint len) { struct mkrt_proto *p = sk->data; struct igmpmsg *msg = (void *) sk->rbuf; - u8 igmp_type = * (u8 *) sk_rx_buffer(sk, &len); - switch (igmp_type) + /* + * We need to distinguish kernel upcalls from regular traffic. This can be + * done with field im_mbz, which must-be-zero for upcalls, but it overlaps + * with protocol number in IP header so it is nonzero for regular traffic. + */ + if (msg->im_mbz) + { + /* Regular IGMP messages, just delegate them */ + struct mif *mif = mif_find_by_index(p->mif_group, sk->lifindex); + mif_forward_igmp(p->mif_group, mif, sk, len); + return 1; + } + + /* Upcalls from kernel, handle then */ + switch (msg->im_msgtype) { case IGMPMSG_NOCACHE: mkrt_resolve_mfc(p, ip4_from_in4(msg->im_src), ip4_from_in4(msg->im_dst), msg->im_vif); - return 1; + break; case IGMPMSG_WRONGVIF: case IGMPMSG_WHOLEPKT: - /* These should not happen unless some PIM-specific MRT options are enabled */ - return 1; - default: - // FIXME: Use sk->lifindex or msg->im_vif ? - mif_forward_igmp(p->mif_group, NULL, sk, len); - return 1; + /* These should not happen unless some PIM-specific MRT options are enabled */ + break; } + return 1; } static void -- 2.47.2