diff options
-rw-r--r-- | sys/net/if_gre.c | 6 | ||||
-rw-r--r-- | sys/netinet/ip_gre.c | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 3d33766..df0fc82 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -341,6 +341,12 @@ gre_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, if (bpf_peers_present(ifp->if_bpf)) bpf_mtap2(ifp->if_bpf, &af, sizeof(af), m); + if ((ifp->if_flags & IFF_MONITOR) != 0) { + m_freem(m); + error = ENETDOWN; + goto end; + } + m->m_flags &= ~(M_BCAST|M_MCAST); if (sc->g_proto == IPPROTO_MOBILE) { diff --git a/sys/netinet/ip_gre.c b/sys/netinet/ip_gre.c index 0735311..776820f 100644 --- a/sys/netinet/ip_gre.c +++ b/sys/netinet/ip_gre.c @@ -205,6 +205,11 @@ gre_input2(struct mbuf *m ,int hlen, u_char proto) bpf_mtap2(GRE2IFP(sc)->if_bpf, &af, sizeof(af), m); } + if ((GRE2IFP(sc)->if_flags & IFF_MONITOR) != 0) { + m_freem(m); + return(NULL); + } + m->m_pkthdr.rcvif = GRE2IFP(sc); netisr_queue(isr, m); @@ -287,6 +292,11 @@ gre_mobile_input(struct mbuf *m, int hlen) bpf_mtap2(GRE2IFP(sc)->if_bpf, &af, sizeof(af), m); } + if ((GRE2IFP(sc)->if_flags & IFF_MONITOR) != 0) { + m_freem(m); + return; + } + m->m_pkthdr.rcvif = GRE2IFP(sc); netisr_queue(NETISR_IP, m); |