diff options
author | np <np@FreeBSD.org> | 2012-06-29 16:50:52 +0000 |
---|---|---|
committer | np <np@FreeBSD.org> | 2012-06-29 16:50:52 +0000 |
commit | 8d97a9ef0e017e3f897627de7b4b55e731dab62d (patch) | |
tree | a0c9ba35a19fba956c0cc3848af9e28047c09156 /sys/dev/cxgbe/t4_sge.c | |
parent | b257ff8e05ab818913c3f7ab328d3b2b320d638b (diff) | |
download | FreeBSD-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.c | 26 |
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 */ |