Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 9 Jan 2011 08:07:58 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r217185 - projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib
Message-ID:  <201101090807.p0987wbt034598@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Sun Jan  9 08:07:58 2011
New Revision: 217185
URL: http://svn.freebsd.org/changeset/base/217185

Log:
   - Support bpf/tcpdump by pretending to have an ethernet header.  Only
     the destination mac address and proto are filled in.
  
  Sponsored by:	Isilon Systems, iX Systems, and Panasas.

Modified:
  projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
  projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c

Modified: projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h	Sun Jan  9 06:17:46 2011	(r217184)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib.h	Sun Jan  9 08:07:58 2011	(r217185)
@@ -421,8 +421,16 @@ struct ipoib_path {
 
 extern struct workqueue_struct *ipoib_workqueue;
 
-/* functions */
+#define IPOIB_MTAP_PROTO(_ifp, _m, _proto)			\
+do {								\
+	if (bpf_peers_present((_ifp)->if_bpf)) {		\
+		M_ASSERTVALID(_m);				\
+		ipoib_mtap_proto((_ifp), (_m), (_proto));	\
+	}							\
+} while (0)
 
+/* functions */
+void ipoib_mtap_proto(struct ifnet *ifp, struct mbuf *mb, uint16_t proto);
 void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
 void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
 

Modified: projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c	Sun Jan  9 06:17:46 2011	(r217184)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c	Sun Jan  9 08:07:58 2011	(r217185)
@@ -575,10 +575,11 @@ void ipoib_cm_handle_rx_wc(struct ipoib_
 	dev->if_obytes += mb->m_pkthdr.len;
 
 	mb->m_pkthdr.rcvif = dev;
-	proto = ntohs(*mtod(mb, uint16_t *));
+	proto = *mtod(mb, uint16_t *);
 	m_adj(mb, IPOIB_ENCAP_LEN);
+	IPOIB_MTAP_PROTO(dev, mb, proto);
 	spin_unlock(&priv->lock);
-	ipoib_demux(dev, mb, proto);
+	ipoib_demux(dev, mb, ntohs(proto));
 	spin_lock(&priv->lock);
 
 repost:

Modified: projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c
==============================================================================
--- projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c	Sun Jan  9 06:17:46 2011	(r217184)
+++ projects/ofed/head/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_main.c	Sun Jan  9 08:07:58 2011	(r217185)
@@ -92,6 +92,45 @@ static int ipoib_output(struct ifnet *if
 static int ipoib_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
 static void ipoib_input(struct ifnet *ifp, struct mbuf *m);
 
+#define	IPOIB_MTAP(_ifp, _m)					\
+do {								\
+	if (bpf_peers_present((_ifp)->if_bpf)) {		\
+		M_ASSERTVALID(_m);				\
+		ipoib_mtap_mb((_ifp), (_m));			\
+	}							\
+} while (0)
+
+/*
+ * This is for clients that have an ipoib_header in the mbuf.
+ */
+static void
+ipoib_mtap_mb(struct ifnet *ifp, struct mbuf *mb)
+{
+	struct ipoib_header *ih;
+	struct ether_header eh;
+
+	ih = mtod(mb, struct ipoib_header *);
+	eh.ether_type = ih->proto;
+	bcopy(ih->hwaddr, &eh.ether_dhost, ETHER_ADDR_LEN);
+	bzero(&eh.ether_shost, ETHER_ADDR_LEN);
+	mb->m_data += sizeof(struct ipoib_header);
+	mb->m_len -= sizeof(struct ipoib_header);
+	bpf_mtap2(ifp->if_bpf, &eh, sizeof(eh), mb);
+	mb->m_data -= sizeof(struct ipoib_header);
+	mb->m_len += sizeof(struct ipoib_header);
+}
+
+void
+ipoib_mtap_proto(struct ifnet *ifp, struct mbuf *mb, uint16_t proto)
+{
+	struct ether_header eh;
+
+	eh.ether_type = proto;
+	bzero(&eh.ether_shost, ETHER_ADDR_LEN);
+	bzero(&eh.ether_dhost, ETHER_ADDR_LEN);
+	bpf_mtap2(ifp->if_bpf, &eh, sizeof(eh), mb);
+}
+
 static struct ib_client ipoib_client = {
 	.name   = "ipoib",
 	.add    = ipoib_add_one,
@@ -681,7 +720,7 @@ _ipoib_start(struct ifnet *dev, struct i
 		IFQ_DRV_DEQUEUE(&dev->if_snd, mb);
 		if (mb == NULL)
 			break;
-		BPF_MTAP(dev, mb);
+		IPOIB_MTAP(dev, mb);
 		ipoib_send_one(priv, mb);
 	}
 	spin_unlock(&priv->lock);
@@ -884,7 +923,7 @@ ipoib_intf_alloc(const char *name)
 	sdl->sdl_alen = dev->if_addrlen;
 	priv->dev = dev;
 	if_link_state_change(dev, LINK_STATE_DOWN);
-	bpfattach(dev, DLT_EN10MB, IPOIB_HEADER_LEN);
+	bpfattach(dev, DLT_EN10MB, ETHER_HDR_LEN);
 
 	return dev->if_softc;
 }
@@ -1375,12 +1414,6 @@ ipoib_demux(struct ifnet *ifp, struct mb
 	 */
 	mac_ifnet_create_mbuf(ifp, m);
 #endif
-
-	/*
-	 * Give bpf a chance at the packet.
-	 */
-	BPF_MTAP(ifp, m);
-
 	/* Allow monitor mode to claim this frame, after stats are updated. */
 	if (ifp->if_flags & IFF_MONITOR) {
 		if_printf(ifp, "discard frame at IFF_MONITOR\n");
@@ -1434,6 +1467,8 @@ ipoib_input(struct ifnet *ifp, struct mb
 	}
 	CURVNET_SET_QUIET(ifp->if_vnet);
 
+	/* Let BPF have it before we strip the header. */
+	IPOIB_MTAP(ifp, m);
 	eh = mtod(m, struct ipoib_header *);
 	/*
 	 * Reset layer specific mbuf flags to avoid confusing upper layers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101090807.p0987wbt034598>