From owner-svn-soc-all@FreeBSD.ORG Sun Jun 14 03:05:04 2015 Return-Path: Delivered-To: svn-soc-all@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 7218CC5D for ; Sun, 14 Jun 2015 03:05:04 +0000 (UTC) (envelope-from btw@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 603C26DD for ; Sun, 14 Jun 2015 03:05:04 +0000 (UTC) (envelope-from btw@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.9/8.14.9) with ESMTP id t5E354kx099537 for ; Sun, 14 Jun 2015 03:05:04 GMT (envelope-from btw@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.9/8.14.9/Submit) id t5E353GF098924 for svn-soc-all@FreeBSD.org; Sun, 14 Jun 2015 03:05:03 GMT (envelope-from btw@FreeBSD.org) Date: Sun, 14 Jun 2015 03:05:03 GMT Message-Id: <201506140305.t5E353GF098924@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to btw@FreeBSD.org using -f From: btw@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r287063 - soc2015/btw/head/tools/tools/mq-testing/vme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 Jun 2015 03:05:04 -0000 Author: btw Date: Sun Jun 14 03:05:03 2015 New Revision: 287063 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=287063 Log: Add the supports for hashing the IPv6 packets to vme. Modified: soc2015/btw/head/tools/tools/mq-testing/vme/if_vme.c Modified: soc2015/btw/head/tools/tools/mq-testing/vme/if_vme.c ============================================================================== --- soc2015/btw/head/tools/tools/mq-testing/vme/if_vme.c Sun Jun 14 02:21:19 2015 (r287062) +++ soc2015/btw/head/tools/tools/mq-testing/vme/if_vme.c Sun Jun 14 03:05:03 2015 (r287063) @@ -73,9 +73,12 @@ #include #include #include +#include #include #include +#include + #include "if_vme.h" /* @@ -1111,6 +1114,8 @@ if (m->m_pkthdr.len < hdrlen || (m->m_len < hdrlen && (m = m_pullup(m, hdrlen)) == NULL)) return; + eh = mtod(m, struct ether_header *); + ip = (const struct ip *)(eh + 1); uh = (const struct udphdr *)((c_caddr_t)ip + iphlen); rss_proto_software_hash_v4(ip->ip_src, ip->ip_dst, uh->uh_sport, uh->uh_dport, proto, hashval, @@ -1121,6 +1126,8 @@ if (m->m_pkthdr.len < hdrlen || (m->m_len < hdrlen && (m = m_pullup(m, hdrlen)) == NULL)) return; + eh = mtod(m, struct ether_header *); + ip = (const struct ip *)(eh + 1); th = (const struct tcphdr *)((c_caddr_t)ip + iphlen); rss_proto_software_hash_v4(ip->ip_src, ip->ip_dst, th->th_sport, th->th_dport, proto, hashval, @@ -1137,6 +1144,54 @@ static void vmersshash_v6(struct mbuf *m, uint32_t *hashval, uint32_t *hashtype) { + const struct ether_header *eh; + const struct ip6_hdr *ip6; + const struct tcphdr *th; + const struct udphdr *uh; + int hdrlen; + uint8_t proto; + + hdrlen = sizeof(*eh) + sizeof(*ip6); + + if (m->m_pkthdr.len < hdrlen || (m->m_len < hdrlen && + (m = m_pullup(m, hdrlen)) == NULL)) + return; + + eh = mtod(m, struct ether_header *); + ip6 = (const struct ip6_hdr *)(eh + 1); + proto = ip6->ip6_nxt; + + if ((rss_gethashconfig() & RSS_HASHTYPE_RSS_UDP_IPV6) && + (proto == IPPROTO_UDP)) { + hdrlen += sizeof(*uh); + if (m->m_pkthdr.len < hdrlen || (m->m_len < hdrlen && + (m = m_pullup(m, hdrlen)) == NULL)) + return; + eh = mtod(m, struct ether_header *); + ip6 = (const struct ip6_hdr *)(eh + 1); + uh = (const struct udphdr *)(ip6 + 1); + rss_proto_software_hash_v6(&ip6->ip6_src, &ip6->ip6_dst, + uh->uh_sport, uh->uh_dport, proto, hashval, + hashtype); + } else if ((rss_gethashconfig() & RSS_HASHTYPE_RSS_TCP_IPV6) && + (proto == IPPROTO_TCP)) { + hdrlen += sizeof(*th); + if (m->m_pkthdr.len < hdrlen || (m->m_len < hdrlen && + (m = m_pullup(m, hdrlen)) == NULL)) + return; + eh = mtod(m, struct ether_header *); + ip6 = (const struct ip6_hdr *)(eh + 1); + th = (const struct tcphdr *)(ip6 + 1); + rss_proto_software_hash_v6(&ip6->ip6_src, &ip6->ip6_dst, + th->th_sport, th->th_dport, proto, hashval, + hashtype); + } else if (rss_gethashconfig() & RSS_HASHTYPE_RSS_IPV6) { + rss_proto_software_hash_v6(&ip6->ip6_src, &ip6->ip6_dst, + 0 /* src port */, 0 /* dst port */, 0 /* proto */, + hashval, hashtype); + } else { + printf("%s: no available hashtypes!\n", __func__); + } } static void