Index: net/if_ethersubr.c =================================================================== RCS file: /cvs/src/sys/net/if_ethersubr.c,v retrieving revision 1.213 diff -u -p -r1.213 if_ethersubr.c --- net/if_ethersubr.c 30 Jun 2015 15:30:17 -0000 1.213 +++ net/if_ethersubr.c 2 Jul 2015 03:54:07 -0000 @@ -276,9 +276,8 @@ bad: * the ether header, which is provided separately. */ int -ether_input(struct mbuf *m) +ether_input(void *cookie, struct ifnet *ifp, struct mbuf *m) { - struct ifnet *ifp; struct ether_header *eh; struct niqueue *inq; u_int16_t etype; @@ -289,13 +288,6 @@ ether_input(struct mbuf *m) struct ether_header *eh_tmp; #endif - ifp = if_get(m->m_pkthdr.ph_ifidx); - KASSERT(ifp != NULL); - if ((ifp->if_flags & IFF_UP) == 0) { - m_freem(m); - return (1); - } - eh = mtod(m, struct ether_header *); m_adj(m, ETHER_HDR_LEN); @@ -392,10 +384,13 @@ decapsulate: if (pipex_enable) { struct pipex_session *session; + KERNEL_LOCK(); if ((session = pipex_pppoe_lookup_session(m)) != NULL) { pipex_pppoe_input(m, session); + KERNEL_UNLOCK(); return (1); } + KERNEL_UNLOCK(); } #endif if (etype == ETHERTYPE_PPPOEDISC)