network interface and link layer changes:

o on input don't strip the Ethernet header from packets
o input packet handling is now done with if_input
o track changes to ether_ifattach/ether_ifdetach API
o track changes to bpf tapping
o call ether_ioctl for default handling of ioctl's
o use constants from net/ethernet.h where possible

Reviewed by:	many
Approved by:	re
This commit is contained in:
Sam Leffler 2002-11-15 00:00:15 +00:00
parent 2f907a97c7
commit 6fc32a2495
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=106939
23 changed files with 102 additions and 161 deletions

View File

@ -56,6 +56,13 @@
#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
#include <net/bpf.h>
#ifndef BPF_MTAP
#define BPF_MTAP(_ifp, _m) do { \
if ((_ifp)->if_bpf) \
bpf_mtap((_ifp), (_m)); \
} while (0)
#endif
#endif
#include <vm/vm.h> /* for vtophys */
@ -760,8 +767,7 @@ oltr_start(struct ifnet *ifp)
sc->tx_frame++;
#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
if (ifp->if_bpf)
bpf_mtap(ifp, m0);
BPF_MTAP(ifp, m0);
#endif
/*ifp->if_opackets++;*/
@ -1465,8 +1471,7 @@ DriverReceiveFrameCompleted(void *DriverHandle, int ByteCount, int FragmentCount
}
}
#if (NBPFILTER > 0) || (__FreeBSD_version > 400000)
if (ifp->if_bpf)
bpf_mtap(ifp, m0);
BPF_MTAP(ifp, m0);
#endif
/*if (ifp->if_flags & IFF_PROMISC) {*/

View File

@ -476,8 +476,7 @@ cxput (cx_chan_t *c, char b)
return;
}
m_copydata (m, 0, len, buf);
if (c->ifp->if_bpf)
bpf_mtap (c->ifp, m);
BPF_MTAP (c->ifp, m);
m_freem (m);
/* Start transmitter. */
@ -802,8 +801,7 @@ cxinput (cx_chan_t *c, void *buf, unsigned len)
* Check if there's a BPF listener on this interface.
* If so, hand off the raw packet to bpf.
*/
if (c->ifp->if_bpf)
bpf_tap (c->ifp, buf, len);
BPF_TAP (c->ifp, buf, len);
/* Count the received bytes to the subchannel, not the master. */
c->master->if_ibytes -= len + 3;

View File

@ -265,7 +265,6 @@ el_attach(device_t dev)
ifp->if_unit = device_get_unit(dev);;
ifp->if_name = "el";
ifp->if_mtu = ETHERMTU;
ifp->if_output = ether_output;
ifp->if_start = el_start;
ifp->if_ioctl = el_ioctl;
ifp->if_watchdog = el_watchdog;
@ -275,7 +274,7 @@ el_attach(device_t dev)
/* Now we can attach the interface */
dprintf(("Attaching interface...\n"));
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
/* Print out some information for the user */
device_printf(dev, "3c501 address %6D\n",
@ -296,7 +295,7 @@ static int el_detach(dev)
el_stop(sc);
EL_LOCK(sc);
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
ether_ifdetach(ifp);
bus_teardown_intr(dev, sc->el_irq, sc->el_intrhand);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->el_irq);
bus_release_resource(dev, SYS_RES_IOPORT, 0, sc->el_res);
@ -444,8 +443,7 @@ el_start(struct ifnet *ifp)
len = max(len,ETHER_MIN_LEN);
/* Give the packet to the bpf, if any */
if(sc->arpcom.ac_if.if_bpf)
bpf_tap(&sc->arpcom.ac_if, sc->el_pktbuf, len);
BPF_TAP(&sc->arpcom.ac_if, sc->el_pktbuf, len);
/* Transfer datagram to board */
dprintf(("el: xfr pkt length=%d...\n",len));
@ -528,19 +526,17 @@ el_xmit(struct el_softc *sc,int len)
static __inline void
elread(struct el_softc *sc,caddr_t buf,int len)
{
register struct ether_header *eh;
struct ifnet *ifp = &sc->arpcom.ac_if;
struct mbuf *m;
eh = (struct ether_header *)buf;
/*
* Put packet into an mbuf chain
*/
m = elget(buf,len,&sc->arpcom.ac_if);
m = elget(buf,len,ifp);
if(m == 0)
return;
ether_input(&sc->arpcom.ac_if,eh,m);
(*ifp->if_input)(ifp,m);
}
/* controller interrupt */
@ -638,7 +634,6 @@ elintr(void *xsc)
dprintf(("%6D\n",sc->el_pktbuf,":"));
/* Pass data up to upper levels */
len -= sizeof(struct ether_header);
elread(sc,(caddr_t)(sc->el_pktbuf),len);
/* Is there another packet? */
@ -739,12 +734,6 @@ el_ioctl(ifp, command, data)
EL_LOCK(sc);
switch (command) {
case SIOCSIFADDR:
case SIOCGIFADDR:
case SIOCSIFMTU:
error = ether_ioctl(ifp, command, data);
break;
case SIOCSIFFLAGS:
/*
* If interface is marked down and it is running, then stop it
@ -763,7 +752,8 @@ el_ioctl(ifp, command, data)
}
break;
default:
error = EINVAL;
error = ether_ioctl(ifp, command, data);
break;
}
EL_UNLOCK(sc);
return (error);

View File

@ -351,13 +351,12 @@ le_attach(
sc->le_ac.ac_enaddr, ":");
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_output = ether_output;
ifp->if_ioctl = le_ioctl;
ifp->if_type = IFT_ETHER;
ifp->if_addrlen = 6;
ifp->if_hdrlen = 14;
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
ether_ifattach(ifp, sc->le_ac.ac_enaddr);
return 1;
}
@ -384,37 +383,28 @@ le_input(
size_t len1,
caddr_t seg2)
{
struct ether_header eh;
struct ifnet *ifp = &sc->le_if;
struct mbuf *m;
if (total_len - sizeof(eh) > ETHERMTU
|| total_len - sizeof(eh) < ETHERMIN) {
sc->le_if.if_ierrors++;
return;
}
MEMCPY(&eh, seg1, sizeof(eh));
seg1 += sizeof(eh); total_len -= sizeof(eh); len1 -= sizeof(eh);
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL) {
sc->le_if.if_ierrors++;
ifp->if_ierrors++;
return;
}
m->m_pkthdr.len = total_len;
m->m_pkthdr.rcvif = &sc->le_if;
m->m_pkthdr.rcvif = ifp;
if (total_len + LE_XTRA > MHLEN /* >= MINCLSIZE */) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
sc->le_if.if_ierrors++;
ifp->if_ierrors++;
return;
}
} else if (total_len + LE_XTRA > MHLEN && MINCLSIZE == (MHLEN+MLEN)) {
MGET(m->m_next, M_DONTWAIT, MT_DATA);
if (m->m_next == NULL) {
m_free(m);
sc->le_if.if_ierrors++;
ifp->if_ierrors++;
return;
}
m->m_next->m_len = total_len - MHLEN - LE_XTRA;
@ -428,7 +418,8 @@ le_input(
MEMCPY(mtod(m, caddr_t), seg1, len1);
if (seg2 != NULL)
MEMCPY(mtod(m, caddr_t) + len1, seg2, total_len - len1);
ether_input(&sc->le_if, &eh, m);
(*ifp->if_input)(ifp, m);
}
static int
@ -446,12 +437,6 @@ le_ioctl(
s = splimp();
switch (cmd) {
case SIOCSIFADDR:
case SIOCGIFADDR:
case SIOCSIFMTU:
error = ether_ioctl(ifp, cmd, data);
break;
case SIOCSIFFLAGS: {
sc->if_init(sc);
break;
@ -467,7 +452,8 @@ le_ioctl(
break;
default: {
error = EINVAL;
error = ether_ioctl(ifp, cmd, data);
break;
}
}
@ -1016,8 +1002,7 @@ lemac_start(
LE_OUTB(sc, LEMAC_REG_TQ, tx_pg); /* tell chip to transmit this packet */
if (sc->le_if.if_bpf)
bpf_mtap(&sc->le_if, m);
BPF_MTAP(&sc->le_if, m);
m_freem(m); /* free the mbuf */
}

View File

@ -602,7 +602,6 @@ rdp_attach(struct isa_device *isa_dev)
ifp->if_softc = sc;
ifp->if_unit = unit;
ifp->if_name = "rdp";
ifp->if_output = ether_output;
ifp->if_start = rdp_start;
ifp->if_ioctl = rdp_ioctl;
ifp->if_watchdog = rdp_watchdog;
@ -613,7 +612,7 @@ rdp_attach(struct isa_device *isa_dev)
/*
* Attach the interface
*/
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
}
/*
@ -807,9 +806,7 @@ rdp_start(struct ifnet *ifp)
/*
* Tap off here if there is a bpf listener.
*/
if (ifp->if_bpf) {
bpf_mtap(ifp, m);
}
BPF_MTAP(ifp, m);
m_freem(m);
@ -832,12 +829,6 @@ rdp_ioctl(struct ifnet *ifp, IOCTL_CMD_T command, caddr_t data)
switch (command) {
case SIOCSIFADDR:
case SIOCGIFADDR:
case SIOCSIFMTU:
error = ether_ioctl(ifp, command, data);
break;
case SIOCSIFFLAGS:
/*
* If the interface is marked up and stopped, then start it.
@ -873,7 +864,8 @@ rdp_ioctl(struct ifnet *ifp, IOCTL_CMD_T command, caddr_t data)
break;
default:
error = EINVAL;
error = ether_ioctl(ifp, command, data);
break;
}
(void) splx(s);
return (error);
@ -1097,7 +1089,7 @@ rdp_rint(struct rdp_softc *sc)
static void
rdp_get_packet(struct rdp_softc *sc, unsigned len)
{
struct ether_header *eh;
struct ifnet *ifp = &sc->arpcom.ac_if;
struct mbuf *m;
u_char *packet_ptr;
size_t s;
@ -1106,7 +1098,7 @@ rdp_get_packet(struct rdp_softc *sc, unsigned len)
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL)
return;
m->m_pkthdr.rcvif = &sc->arpcom.ac_if;
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = m->m_len = len;
/*
@ -1115,7 +1107,7 @@ rdp_get_packet(struct rdp_softc *sc, unsigned len)
* to the header. The +2 is to compensate for the alignment
* fixup below.
*/
if ((len + 2) > MHLEN) {
if ((len + ETHER_ALIGN) > MHLEN) {
/* Attach an mbuf cluster */
MCLGET(m, M_DONTWAIT);
@ -1130,8 +1122,7 @@ rdp_get_packet(struct rdp_softc *sc, unsigned len)
* The +2 is to longword align the start of the real packet.
* This is important for NFS.
*/
m->m_data += 2;
eh = mtod(m, struct ether_header *);
m->m_data += ETHER_ALIGN;
/*
* Get packet, including link layer address, from interface.
@ -1139,7 +1130,7 @@ rdp_get_packet(struct rdp_softc *sc, unsigned len)
outb(sc->baseaddr + lpt_control, Ctrl_LNibRead);
outb(sc->baseaddr + lpt_data, RdAddr + MAR);
packet_ptr = (u_char *)eh;
packet_ptr = mtod(m, u_char *);
if (sc->slow)
for (s = 0; s < len; s++, packet_ptr++)
*packet_ptr = RdByteA2(sc);
@ -1151,13 +1142,7 @@ rdp_get_packet(struct rdp_softc *sc, unsigned len)
outb(sc->baseaddr + lpt_control, Ctrl_SelData);
WrNib(sc, CMR1, CMR1_RDPAC);
/*
* Remove link layer address.
*/
m->m_pkthdr.len = m->m_len = len - sizeof(struct ether_header);
m->m_data += sizeof(struct ether_header);
ether_input(&sc->arpcom.ac_if, eh, m);
(*ifp->if_input)(ifp, m);
}
/*

View File

@ -876,7 +876,7 @@ ipr_rx_data_rdy(int unit)
mm.m_next = m;
mm.m_len = 4;
mm.m_data = (char *)&af;
bpf_mtap(&sc->sc_if, &mm);
BPF_MTAP(&sc->sc_if, &mm);
}
if(! IF_HANDOFF(&ipintrq, m, NULL))
@ -934,7 +934,7 @@ ipr_tx_queue_empty(int unit)
mm.m_next = m;
mm.m_len = 4;
mm.m_data = (char *)&af;
bpf_mtap(&sc->sc_if, &mm);
BPF_MTAP(&sc->sc_if, &mm);
}
#if I4BIPRACCT

View File

@ -289,8 +289,7 @@ i4bisppp_start(struct ifnet *ifp)
while ((m = sppp_dequeue(&sc->sc_if)) != NULL)
{
if (ifp->if_bpf)
bpf_mtap(ifp, m);
BPF_MTAP(ifp, m);
microtime(&ifp->if_lastchange);
@ -581,8 +580,7 @@ i4bisppp_rx_data_rdy(int unit)
printf("i4bisppp_rx_data_ready: received packet!\n");
#endif
if(sc->sc_if.if_bpf)
bpf_mtap(&sc->sc_if, m);
BPF_MTAP(&sc->sc_if, m);
s = splimp();

View File

@ -103,8 +103,7 @@ struct bdg_stats {
#ifdef _KERNEL
typedef struct ifnet *bridge_in_t(struct ifnet *, struct ether_header *);
/* bdg_forward frees the mbuf if necessary, returning null */
typedef struct mbuf *bdg_forward_t(struct mbuf *, struct ether_header *const,
struct ifnet *);
typedef struct mbuf *bdg_forward_t(struct mbuf *, struct ifnet *);
typedef void bdgtakeifaces_t(void);
extern bridge_in_t *bridge_in_ptr;
extern bdg_forward_t *bdg_forward_ptr;

View File

@ -99,7 +99,6 @@ struct fddi_header {
void fddi_ifattach(struct ifnet *, int);
void fddi_ifdetach(struct ifnet *, int);
void fddi_input(struct ifnet *, struct fddi_header *, struct mbuf *);
int fddi_ioctl(struct ifnet *, int, caddr_t);
#endif /* _KERNEL */

View File

@ -211,8 +211,7 @@ arc_output(ifp, m, dst, rt0)
ah->arc_dhost = adst;
ah->arc_shost = *IF_LLADDR(ifp);
if (ifp->if_bpf)
bpf_mtap(ifp, m);
BPF_MTAP(ifp, m);
#if __FreeBSD_version < 500000
s = splimp();
@ -541,8 +540,7 @@ arc_input(ifp, m)
if (m == NULL)
return;
if (ifp->if_bpf)
bpf_mtap(ifp, m);
BPF_MTAP(ifp, m);
ah = mtod(m, struct arc_header *);

View File

@ -321,6 +321,9 @@ atm_ifattach(ifp)
ifp->if_hdrlen = 0;
ifp->if_mtu = ATMMTU;
ifp->if_output = atm_output;
#if 0
ifp->if_input = atm_input;
#endif
ifp->if_snd.ifq_maxlen = 50; /* dummy */
#if defined(__NetBSD__) || defined(__OpenBSD__)

View File

@ -180,7 +180,7 @@ discoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
m0.m_len = 4;
m0.m_data = (char *)&af;
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
}
m->m_pkthdr.rcvif = ifp;

View File

@ -116,8 +116,8 @@ static int
ef_attach(struct efnet *sc)
{
struct ifnet *ifp = (struct ifnet*)&sc->ef_ac.ac_if;
struct ifaddr *ifa1, *ifa2;
struct sockaddr_dl *sdl1, *sdl2;
struct ifaddr *ifa2;
struct sockaddr_dl *sdl2;
ifp->if_output = ether_output;
ifp->if_start = ef_start;
@ -128,19 +128,14 @@ ef_attach(struct efnet *sc)
/*
* Attach the interface
*/
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
ifa2 = ifaddr_byindex(sc->ef_ifp->if_index);
sdl2 = (struct sockaddr_dl *)ifa2->ifa_addr;
ether_ifattach(ifp, LLADDR(sdl2));
ifp->if_resolvemulti = 0;
ifp->if_type = IFT_XETHER;
ifp->if_flags |= IFF_RUNNING;
ifa1 = ifaddr_byindex(ifp->if_index);
ifa2 = ifaddr_byindex(sc->ef_ifp->if_index);
sdl1 = (struct sockaddr_dl *)ifa1->ifa_addr;
sdl2 = (struct sockaddr_dl *)ifa2->ifa_addr;
sdl1->sdl_type = IFT_ETHER;
sdl1->sdl_alen = ETHER_ADDR_LEN;
bcopy(LLADDR(sdl2), LLADDR(sdl1), ETHER_ADDR_LEN);
bcopy(LLADDR(sdl2), sc->ef_ac.ac_enaddr, ETHER_ADDR_LEN);
EFDEBUG("%s%d: attached\n", ifp->if_name, ifp->if_unit);
@ -190,6 +185,9 @@ ef_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
error = 0;
s = splimp();
switch (cmd) {
case SIOCSIFFLAGS:
error = 0;
break;
case SIOCSIFADDR:
if (ifp->if_unit == ETHER_FT_8023 &&
ifa->ifa_addr->sa_family != AF_IPX) {
@ -198,15 +196,9 @@ ef_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
ifp->if_flags |= IFF_UP;
/* FALL THROUGH */
case SIOCGIFADDR:
case SIOCSIFMTU:
default:
error = ether_ioctl(ifp, cmd, data);
break;
case SIOCSIFFLAGS:
error = 0;
break;
default:
error = EINVAL;
}
splx(s);
return error;
@ -231,8 +223,7 @@ ef_start(struct ifnet *ifp)
IF_DEQUEUE(&ifp->if_snd, m);
if (m == 0)
break;
if (ifp->if_bpf)
bpf_mtap(ifp, m);
BPF_MTAP(ifp, m);
if (! IF_HANDOFF(&p->if_snd, m, p)) {
ifp->if_oerrors++;
continue;
@ -380,7 +371,7 @@ ef_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m)
m0.m_next = m;
m0.m_len = sizeof(struct ether_header);
m0.m_data = (char *)eh;
bpf_mtap(eifp, &m0);
BPF_MTAP(eifp, &m0);
}
/*
* Now we ready to adjust mbufs and pass them to protocol intr's

View File

@ -230,7 +230,7 @@ faithoutput(ifp, m, dst, rt)
m0.m_len = 4;
m0.m_data = (char *)&af;
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
}
if (rt && rt->rt_flags & (RTF_REJECT|RTF_BLACKHOLE)) {

View File

@ -100,6 +100,7 @@ static int fddi_resolvemulti(struct ifnet *, struct sockaddr **,
struct sockaddr *);
static int fddi_output(struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *);
static void fddi_input(struct ifnet *ifp, struct mbuf *m);
#define IFP2AC(IFP) ((struct arpcom *)IFP)
@ -356,14 +357,22 @@ fddi_output(ifp, m, dst, rt0)
* the packet is in the mbuf chain m without
* the fddi header, which is provided separately.
*/
void
fddi_input(ifp, fh, m)
static void
fddi_input(ifp, m)
struct ifnet *ifp;
struct fddi_header *fh;
struct mbuf *m;
{
struct ifqueue *inq;
struct llc *l;
struct fddi_header *fh;
fh = mtod(m, struct fddi_header *);
/*
* Update interface statistics.
*/
ifp->if_ibytes += m->m_pkthdr.len;
getmicrotime(&ifp->if_lastchange);
/*
* Discard packet if interface is not up.
@ -396,12 +405,6 @@ fddi_input(ifp, fh, m)
ifp->if_imcasts++;
}
/*
* Update interface statistics.
*/
getmicrotime(&ifp->if_lastchange);
ifp->if_ibytes += (m->m_pkthdr.len + FDDI_HDR_LEN);
#ifdef M_LINK0
/*
* If this has a LLC priority of 0, then mark it so upper
@ -412,6 +415,9 @@ fddi_input(ifp, fh, m)
m->m_flags |= M_LINK0;
#endif
/* Strip off FDDI header. */
m_adj(m, sizeof(struct fddi_header));
m = m_pullup(m, sizeof(struct llc));
if (m == 0) {
ifp->if_ierrors++;
@ -548,6 +554,7 @@ fddi_ifattach(ifp, bpf)
ifp->if_mtu = FDDIMTU;
ifp->if_output = fddi_output;
ifp->if_input = fddi_input;
ifp->if_resolvemulti = fddi_resolvemulti;
ifp->if_broadcastaddr = fddibroadcastaddr;
ifp->if_baudrate = 100000000;

View File

@ -364,7 +364,7 @@ gif_output(ifp, m, dst, rt)
m0.m_len = 4;
m0.m_data = (char *)&af;
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
}
ifp->if_opackets++;
ifp->if_obytes += m->m_pkthdr.len;
@ -434,7 +434,7 @@ gif_input(m, af, ifp)
m0.m_len = 4;
m0.m_data = (char *)&af1;
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
}
if (ng_gif_input_p != NULL) {

View File

@ -249,7 +249,7 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
m0.m_len = 4;
m0.m_data = (char *)&af;
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
}
m->m_flags &= ~(M_BCAST|M_MCAST);

View File

@ -302,7 +302,7 @@ if_simloop(ifp, m, af, hlen)
m0.m_data = (char *)&af;
n = &m0;
}
bpf_mtap(ifp, n);
BPF_MTAP(ifp, n);
}
/* Strip away media header */

View File

@ -887,8 +887,7 @@ pppoutput(ifp, m0, dst, rtp)
/*
* See if bpf wants to look at the packet.
*/
if (ifp->if_bpf)
bpf_mtap(ifp, m0);
BPF_MTAP(ifp, m0);
/*
* Put the packet on the appropriate queue.
@ -1519,8 +1518,7 @@ ppp_inproc(sc, m)
}
/* See if bpf wants to look at the packet. */
if (sc->sc_if.if_bpf)
bpf_mtap(&sc->sc_if, m);
BPF_MTAP(&sc->sc_if, m);
rv = 0;
switch (proto) {

View File

@ -685,7 +685,7 @@ slstart(tp)
*/
sc->bpfbuf[SLX_DIR] = SLIPDIR_OUT;
bcopy(mtod(m, caddr_t), &sc->bpfbuf[SLX_CHDR], CHDR_LEN);
bpf_tap(&sc->sc_if, sc->bpfbuf, len + SLIP_HDRLEN);
BPF_TAP(&sc->sc_if, sc->bpfbuf, len + SLIP_HDRLEN);
}
/*
@ -957,7 +957,7 @@ slinput(c, tp)
hp[SLX_DIR] = SLIPDIR_IN;
bcopy(chdr, &hp[SLX_CHDR], CHDR_LEN);
bpf_tap(&sc->sc_if, hp, len + SLIP_HDRLEN);
BPF_TAP(&sc->sc_if, hp, len + SLIP_HDRLEN);
}
m = sl_btom(sc, len);
if (m == NULL)

View File

@ -430,7 +430,7 @@ stf_output(ifp, m, dst, rt)
m0.m_data = (char *)&af;
#ifdef HAVE_OLD_BPF
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
#else
bpf_mtap(ifp->if_bpf, &m0);
#endif
@ -684,7 +684,7 @@ in_stf_input(m, off)
m0.m_data = (char *)&af;
#ifdef HAVE_OLD_BPF
bpf_mtap(ifp, &m0);
BPF_MTAP(ifp, &m0);
#else
bpf_mtap(ifp->if_bpf, &m0);
#endif

View File

@ -220,7 +220,7 @@ tapmodevent(mod, type, data)
/* XXX makedev check? nah.. not right now :) */
s = splimp();
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
ether_ifdetach(ifp);
splx(s);
free(tp, M_TAP);
@ -363,7 +363,6 @@ tapcreate(dev)
ifp->if_unit = unit;
ifp->if_name = name;
ifp->if_init = tapifinit;
ifp->if_output = ether_output;
ifp->if_start = tapifstart;
ifp->if_ioctl = tapifioctl;
ifp->if_mtu = ETHERMTU;
@ -373,7 +372,7 @@ tapcreate(dev)
dev->si_drv1 = tp;
s = splimp();
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
ether_ifattach(ifp, tp->arpcom.ac_enaddr);
splx(s);
tp->tap_flags |= TAP_INITED;
@ -546,14 +545,6 @@ tapifioctl(ifp, cmd, data)
int s, dummy;
switch (cmd) {
case SIOCSIFADDR:
case SIOCGIFADDR:
case SIOCSIFMTU:
s = splimp();
dummy = ether_ioctl(ifp, cmd, data);
splx(s);
return (dummy);
case SIOCSIFFLAGS: /* XXX -- just like vmnet does */
case SIOCADDMULTI:
case SIOCDELMULTI:
@ -571,7 +562,10 @@ tapifioctl(ifp, cmd, data)
break;
default:
return (EINVAL);
s = splimp();
dummy = ether_ioctl(ifp, cmd, data);
splx(s);
return (dummy);
}
return (0);
@ -801,8 +795,7 @@ tapread(dev, uio, flag)
} while (m == NULL);
/* feed packet to bpf */
if (ifp->if_bpf != NULL)
bpf_mtap(ifp, m);
BPF_MTAP(ifp, m);
/* xfer packet to user space */
while ((m != NULL) && (uio->uio_resid > 0) && (error == 0)) {
@ -838,7 +831,6 @@ tapwrite(dev, uio, flag)
struct tap_softc *tp = dev->si_drv1;
struct ifnet *ifp = &tp->tap_if;
struct mbuf *top = NULL, **mp = NULL, *m = NULL;
struct ether_header *eh = NULL;
int error = 0, tlen, mlen;
TAPDEBUG("%s%d writting, minor = %#x\n",
@ -887,16 +879,9 @@ tapwrite(dev, uio, flag)
top->m_pkthdr.len = tlen;
top->m_pkthdr.rcvif = ifp;
/*
* Ethernet bridge and bpf are handled in ether_input
*
* adjust mbuf and give packet to the ether_input
*/
eh = mtod(top, struct ether_header *);
m_adj(top, sizeof(struct ether_header));
ether_input(ifp, eh, top);
ifp->if_ipackets ++; /* ibytes are counted in ether_input */
/* Pass packet up to parent. */
(*ifp->if_input)(ifp, top);
ifp->if_ipackets ++; /* ibytes are counted in parent */
return (0);
} /* tapwrite */

View File

@ -487,7 +487,7 @@ tunoutput(
m.m_len = 4;
m.m_data = (char *)&af;
bpf_mtap(ifp, &m);
BPF_MTAP(ifp, &m);
}
/* prepend sockaddr? this may abort if the mbuf allocation fails */
@ -772,7 +772,7 @@ tunwrite(dev_t dev, struct uio *uio, int flag)
return (ENOBUFS);
*mtod(top, u_int32_t *) =
ntohl(*mtod(top, u_int32_t *));
bpf_mtap(ifp, top);
BPF_MTAP(ifp, top);
*mtod(top, u_int32_t *) =
htonl(*mtod(top, u_int32_t *));
} else {
@ -790,7 +790,7 @@ tunwrite(dev_t dev, struct uio *uio, int flag)
m.m_len = 4;
m.m_data = (char *)&af;
bpf_mtap(ifp, &m);
BPF_MTAP(ifp, &m);
}
}