summaryrefslogtreecommitdiffstats
path: root/sys/dev/netmap/netmap_freebsd.c
diff options
context:
space:
mode:
authorluigi <luigi@FreeBSD.org>2014-06-09 15:24:45 +0000
committerluigi <luigi@FreeBSD.org>2014-06-09 15:24:45 +0000
commitebbf6b80b7c61883bee08d58e7291d274b4201a0 (patch)
treea448df913c38e0849c39af93fd624da3bf845225 /sys/dev/netmap/netmap_freebsd.c
parent2472187c4f707df7b460212773ffae872c03d247 (diff)
downloadFreeBSD-src-ebbf6b80b7c61883bee08d58e7291d274b4201a0.zip
FreeBSD-src-ebbf6b80b7c61883bee08d58e7291d274b4201a0.tar.gz
sync netmap code with the version in HEAD:
- fix handling of tx mbufs in emulated netmap mode; - introduce mbq_lock() and mbq_unlock() - rate limit some error messages - many whitespace and comment fixes
Diffstat (limited to 'sys/dev/netmap/netmap_freebsd.c')
-rw-r--r--sys/dev/netmap/netmap_freebsd.c71
1 files changed, 54 insertions, 17 deletions
diff --git a/sys/dev/netmap/netmap_freebsd.c b/sys/dev/netmap/netmap_freebsd.c
index 6572ca1..e43d669 100644
--- a/sys/dev/netmap/netmap_freebsd.c
+++ b/sys/dev/netmap/netmap_freebsd.c
@@ -61,7 +61,8 @@
/* ======================== FREEBSD-SPECIFIC ROUTINES ================== */
-rawsum_t nm_csum_raw(uint8_t *data, size_t len, rawsum_t cur_sum)
+rawsum_t
+nm_csum_raw(uint8_t *data, size_t len, rawsum_t cur_sum)
{
/* TODO XXX please use the FreeBSD implementation for this. */
uint16_t *words = (uint16_t *)data;
@@ -80,7 +81,8 @@ rawsum_t nm_csum_raw(uint8_t *data, size_t len, rawsum_t cur_sum)
/* Fold a raw checksum: 'cur_sum' is in host byte order, while the
* return value is in network byte order.
*/
-uint16_t nm_csum_fold(rawsum_t cur_sum)
+uint16_t
+nm_csum_fold(rawsum_t cur_sum)
{
/* TODO XXX please use the FreeBSD implementation for this. */
while (cur_sum >> 16)
@@ -89,7 +91,8 @@ uint16_t nm_csum_fold(rawsum_t cur_sum)
return htobe16((~cur_sum) & 0xFFFF);
}
-uint16_t nm_csum_ipv4(struct nm_iphdr *iph)
+uint16_t
+nm_csum_ipv4(struct nm_iphdr *iph)
{
#if 0
return in_cksum_hdr((void *)iph);
@@ -98,7 +101,8 @@ uint16_t nm_csum_ipv4(struct nm_iphdr *iph)
#endif
}
-void nm_csum_tcpudp_ipv4(struct nm_iphdr *iph, void *data,
+void
+nm_csum_tcpudp_ipv4(struct nm_iphdr *iph, void *data,
size_t datalen, uint16_t *check)
{
#ifdef INET
@@ -120,7 +124,8 @@ void nm_csum_tcpudp_ipv4(struct nm_iphdr *iph, void *data,
#endif
}
-void nm_csum_tcpudp_ipv6(struct nm_ipv6hdr *ip6h, void *data,
+void
+nm_csum_tcpudp_ipv6(struct nm_ipv6hdr *ip6h, void *data,
size_t datalen, uint16_t *check)
{
#ifdef INET6
@@ -143,7 +148,8 @@ void nm_csum_tcpudp_ipv6(struct nm_ipv6hdr *ip6h, void *data,
int
netmap_catch_rx(struct netmap_adapter *na, int intercept)
{
- struct netmap_generic_adapter *gna = (struct netmap_generic_adapter *)na;
+ struct netmap_generic_adapter *gna =
+ (struct netmap_generic_adapter *)na;
struct ifnet *ifp = na->ifp;
if (intercept) {
@@ -209,11 +215,29 @@ generic_xmit_frame(struct ifnet *ifp, struct mbuf *m,
{
int ret;
- m->m_len = m->m_pkthdr.len = 0;
+ /*
+ * The mbuf should be a cluster from our special pool,
+ * so we do not need to do an m_copyback but just copy
+ * (and eventually, just reference the netmap buffer)
+ */
- // copy data to the mbuf
- m_copyback(m, 0, len, addr);
- // inc refcount. We are alone, so we can skip the atomic
+ if (*m->m_ext.ref_cnt != 1) {
+ D("invalid refcnt %d for %p",
+ *m->m_ext.ref_cnt, m);
+ panic("in generic_xmit_frame");
+ }
+ // XXX the ext_size check is unnecessary if we link the netmap buf
+ if (m->m_ext.ext_size < len) {
+ RD(5, "size %d < len %d", m->m_ext.ext_size, len);
+ len = m->m_ext.ext_size;
+ }
+ if (1) { /* XXX seems to have negligible benefits */
+ m->m_ext.ext_buf = m->m_data = addr;
+ } else {
+ bcopy(addr, m->m_data, len);
+ }
+ m->m_len = m->m_pkthdr.len = len;
+ // inc refcount. All ours, we could skip the atomic
atomic_fetchadd_int(m->m_ext.ref_cnt, 1);
m->m_flags |= M_FLOWID;
m->m_pkthdr.flowid = ring_nr;
@@ -223,6 +247,14 @@ generic_xmit_frame(struct ifnet *ifp, struct mbuf *m,
}
+#if __FreeBSD_version >= 1100005
+struct netmap_adapter *
+netmap_getna(if_t ifp)
+{
+ return (NA((struct ifnet *)ifp));
+}
+#endif /* __FreeBSD_version >= 1100005 */
+
/*
* The following two functions are empty until we have a generic
* way to extract the info from the ifp
@@ -230,7 +262,7 @@ generic_xmit_frame(struct ifnet *ifp, struct mbuf *m,
int
generic_find_num_desc(struct ifnet *ifp, unsigned int *tx, unsigned int *rx)
{
- D("called");
+ D("called, in tx %d rx %d", *tx, *rx);
return 0;
}
@@ -238,13 +270,14 @@ generic_find_num_desc(struct ifnet *ifp, unsigned int *tx, unsigned int *rx)
void
generic_find_num_queues(struct ifnet *ifp, u_int *txq, u_int *rxq)
{
- D("called");
+ D("called, in txq %d rxq %d", *txq, *rxq);
*txq = netmap_generic_rings;
*rxq = netmap_generic_rings;
}
-void netmap_mitigation_init(struct nm_generic_mit *mit, struct netmap_adapter *na)
+void
+netmap_mitigation_init(struct nm_generic_mit *mit, struct netmap_adapter *na)
{
ND("called");
mit->mit_pending = 0;
@@ -252,26 +285,30 @@ void netmap_mitigation_init(struct nm_generic_mit *mit, struct netmap_adapter *n
}
-void netmap_mitigation_start(struct nm_generic_mit *mit)
+void
+netmap_mitigation_start(struct nm_generic_mit *mit)
{
ND("called");
}
-void netmap_mitigation_restart(struct nm_generic_mit *mit)
+void
+netmap_mitigation_restart(struct nm_generic_mit *mit)
{
ND("called");
}
-int netmap_mitigation_active(struct nm_generic_mit *mit)
+int
+netmap_mitigation_active(struct nm_generic_mit *mit)
{
ND("called");
return 0;
}
-void netmap_mitigation_cleanup(struct nm_generic_mit *mit)
+void
+netmap_mitigation_cleanup(struct nm_generic_mit *mit)
{
ND("called");
}
OpenPOWER on IntegriCloud