summaryrefslogtreecommitdiffstats
path: root/sys/dev/cxgbe/t4_sge.c
diff options
context:
space:
mode:
authornp <np@FreeBSD.org>2012-06-29 16:50:52 +0000
committernp <np@FreeBSD.org>2012-06-29 16:50:52 +0000
commit8d97a9ef0e017e3f897627de7b4b55e731dab62d (patch)
treea0c9ba35a19fba956c0cc3848af9e28047c09156 /sys/dev/cxgbe/t4_sge.c
parentb257ff8e05ab818913c3f7ab328d3b2b320d638b (diff)
downloadFreeBSD-src-8d97a9ef0e017e3f897627de7b4b55e731dab62d.zip
FreeBSD-src-8d97a9ef0e017e3f897627de7b4b55e731dab62d.tar.gz
cxgbe(4): support for IPv6 hardware checksumming (rx and tx).
Diffstat (limited to 'sys/dev/cxgbe/t4_sge.c')
-rw-r--r--sys/dev/cxgbe/t4_sge.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sys/dev/cxgbe/t4_sge.c b/sys/dev/cxgbe/t4_sge.c
index 1486773..4d56a34 100644
--- a/sys/dev/cxgbe/t4_sge.c
+++ b/sys/dev/cxgbe/t4_sge.c
@@ -1054,15 +1054,23 @@ t4_eth_rx(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m0)
m0->m_flags |= M_FLOWID;
m0->m_pkthdr.flowid = rss->hash_val;
- if (cpl->csum_calc && !cpl->err_vec &&
- ifp->if_capenable & IFCAP_RXCSUM) {
- m0->m_pkthdr.csum_flags |= (CSUM_IP_CHECKED |
- CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
- if (cpl->ip_frag)
+ if (cpl->csum_calc && !cpl->err_vec) {
+ if (ifp->if_capenable & IFCAP_RXCSUM &&
+ cpl->l2info & htobe32(F_RXF_IP)) {
+ m0->m_pkthdr.csum_flags |= (CSUM_IP_CHECKED |
+ CSUM_IP_VALID | CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
+ rxq->rxcsum++;
+ } else if (ifp->if_capenable & IFCAP_RXCSUM_IPV6 &&
+ cpl->l2info & htobe32(F_RXF_IP6)) {
+ m0->m_pkthdr.csum_flags |= (CSUM_DATA_VALID_IPV6 |
+ CSUM_PSEUDO_HDR);
+ rxq->rxcsum++;
+ }
+
+ if (__predict_false(cpl->ip_frag))
m0->m_pkthdr.csum_data = be16toh(cpl->csum);
else
m0->m_pkthdr.csum_data = 0xffff;
- rxq->rxcsum++;
}
if (cpl->vlan_ex) {
@@ -2827,9 +2835,11 @@ write_txpkt_wr(struct port_info *pi, struct sge_txq *txq, struct mbuf *m,
ctrl1 = 0;
if (!(m->m_pkthdr.csum_flags & CSUM_IP))
ctrl1 |= F_TXPKT_IPCSUM_DIS;
- if (!(m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)))
+ if (!(m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP | CSUM_UDP_IPV6 |
+ CSUM_TCP_IPV6)))
ctrl1 |= F_TXPKT_L4CSUM_DIS;
- if (m->m_pkthdr.csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP))
+ if (m->m_pkthdr.csum_flags & (CSUM_IP | CSUM_TCP | CSUM_UDP |
+ CSUM_UDP_IPV6 | CSUM_TCP_IPV6))
txq->txcsum++; /* some hardware assistance provided */
/* VLAN tag insertion */
OpenPOWER on IntegriCloud