1*b2bdc62aSAdrian Chadd /*- 2*b2bdc62aSAdrian Chadd * Copyright (c) 2010-2011 Juniper Networks, Inc. 3*b2bdc62aSAdrian Chadd * All rights reserved. 4*b2bdc62aSAdrian Chadd * 5*b2bdc62aSAdrian Chadd * This software was developed by Robert N. M. Watson under contract 6*b2bdc62aSAdrian Chadd * to Juniper Networks, Inc. 7*b2bdc62aSAdrian Chadd * 8*b2bdc62aSAdrian Chadd * Redistribution and use in source and binary forms, with or without 9*b2bdc62aSAdrian Chadd * modification, are permitted provided that the following conditions 10*b2bdc62aSAdrian Chadd * are met: 11*b2bdc62aSAdrian Chadd * 1. Redistributions of source code must retain the above copyright 12*b2bdc62aSAdrian Chadd * notice, this list of conditions and the following disclaimer. 13*b2bdc62aSAdrian Chadd * 2. Redistributions in binary form must reproduce the above copyright 14*b2bdc62aSAdrian Chadd * notice, this list of conditions and the following disclaimer in the 15*b2bdc62aSAdrian Chadd * documentation and/or other materials provided with the distribution. 16*b2bdc62aSAdrian Chadd * 17*b2bdc62aSAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*b2bdc62aSAdrian Chadd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*b2bdc62aSAdrian Chadd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*b2bdc62aSAdrian Chadd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*b2bdc62aSAdrian Chadd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*b2bdc62aSAdrian Chadd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*b2bdc62aSAdrian Chadd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*b2bdc62aSAdrian Chadd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*b2bdc62aSAdrian Chadd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*b2bdc62aSAdrian Chadd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*b2bdc62aSAdrian Chadd * SUCH DAMAGE. 28*b2bdc62aSAdrian Chadd */ 29*b2bdc62aSAdrian Chadd 30*b2bdc62aSAdrian Chadd #include <sys/cdefs.h> 31*b2bdc62aSAdrian Chadd 32*b2bdc62aSAdrian Chadd __FBSDID("$FreeBSD$"); 33*b2bdc62aSAdrian Chadd 34*b2bdc62aSAdrian Chadd #include "opt_inet6.h" 35*b2bdc62aSAdrian Chadd #include "opt_pcbgroup.h" 36*b2bdc62aSAdrian Chadd 37*b2bdc62aSAdrian Chadd #ifndef PCBGROUP 38*b2bdc62aSAdrian Chadd #error "options RSS depends on options PCBGROUP" 39*b2bdc62aSAdrian Chadd #endif 40*b2bdc62aSAdrian Chadd 41*b2bdc62aSAdrian Chadd #include <sys/param.h> 42*b2bdc62aSAdrian Chadd #include <sys/mbuf.h> 43*b2bdc62aSAdrian Chadd #include <sys/socket.h> 44*b2bdc62aSAdrian Chadd #include <sys/priv.h> 45*b2bdc62aSAdrian Chadd #include <sys/kernel.h> 46*b2bdc62aSAdrian Chadd #include <sys/smp.h> 47*b2bdc62aSAdrian Chadd #include <sys/sysctl.h> 48*b2bdc62aSAdrian Chadd #include <sys/sbuf.h> 49*b2bdc62aSAdrian Chadd 50*b2bdc62aSAdrian Chadd #include <net/if.h> 51*b2bdc62aSAdrian Chadd #include <net/if_var.h> 52*b2bdc62aSAdrian Chadd #include <net/netisr.h> 53*b2bdc62aSAdrian Chadd #include <net/rss_config.h> 54*b2bdc62aSAdrian Chadd 55*b2bdc62aSAdrian Chadd #include <netinet/in.h> 56*b2bdc62aSAdrian Chadd #include <netinet/in_pcb.h> 57*b2bdc62aSAdrian Chadd #include <netinet6/in6_rss.h> 58*b2bdc62aSAdrian Chadd #include <netinet/in_var.h> 59*b2bdc62aSAdrian Chadd 60*b2bdc62aSAdrian Chadd /* for software rss hash support */ 61*b2bdc62aSAdrian Chadd #include <netinet/ip.h> 62*b2bdc62aSAdrian Chadd #include <netinet/tcp.h> 63*b2bdc62aSAdrian Chadd #include <netinet/udp.h> 64*b2bdc62aSAdrian Chadd 65*b2bdc62aSAdrian Chadd /* 66*b2bdc62aSAdrian Chadd * Hash an IPv6 2-tuple. 67*b2bdc62aSAdrian Chadd */ 68*b2bdc62aSAdrian Chadd uint32_t 69*b2bdc62aSAdrian Chadd rss_hash_ip6_2tuple(const struct in6_addr *src, const struct in6_addr *dst) 70*b2bdc62aSAdrian Chadd { 71*b2bdc62aSAdrian Chadd uint8_t data[sizeof(*src) + sizeof(*dst)]; 72*b2bdc62aSAdrian Chadd u_int datalen; 73*b2bdc62aSAdrian Chadd 74*b2bdc62aSAdrian Chadd datalen = 0; 75*b2bdc62aSAdrian Chadd bcopy(src, &data[datalen], sizeof(*src)); 76*b2bdc62aSAdrian Chadd datalen += sizeof(*src); 77*b2bdc62aSAdrian Chadd bcopy(dst, &data[datalen], sizeof(*dst)); 78*b2bdc62aSAdrian Chadd datalen += sizeof(*dst); 79*b2bdc62aSAdrian Chadd return (rss_hash(datalen, data)); 80*b2bdc62aSAdrian Chadd } 81*b2bdc62aSAdrian Chadd 82*b2bdc62aSAdrian Chadd /* 83*b2bdc62aSAdrian Chadd * Hash an IPv6 4-tuple. 84*b2bdc62aSAdrian Chadd */ 85*b2bdc62aSAdrian Chadd uint32_t 86*b2bdc62aSAdrian Chadd rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport, 87*b2bdc62aSAdrian Chadd const struct in6_addr *dst, u_short dstport) 88*b2bdc62aSAdrian Chadd { 89*b2bdc62aSAdrian Chadd uint8_t data[sizeof(*src) + sizeof(*dst) + sizeof(srcport) + 90*b2bdc62aSAdrian Chadd sizeof(dstport)]; 91*b2bdc62aSAdrian Chadd u_int datalen; 92*b2bdc62aSAdrian Chadd 93*b2bdc62aSAdrian Chadd datalen = 0; 94*b2bdc62aSAdrian Chadd bcopy(src, &data[datalen], sizeof(*src)); 95*b2bdc62aSAdrian Chadd datalen += sizeof(*src); 96*b2bdc62aSAdrian Chadd bcopy(dst, &data[datalen], sizeof(*dst)); 97*b2bdc62aSAdrian Chadd datalen += sizeof(*dst); 98*b2bdc62aSAdrian Chadd bcopy(&srcport, &data[datalen], sizeof(srcport)); 99*b2bdc62aSAdrian Chadd datalen += sizeof(srcport); 100*b2bdc62aSAdrian Chadd bcopy(&dstport, &data[datalen], sizeof(dstport)); 101*b2bdc62aSAdrian Chadd datalen += sizeof(dstport); 102*b2bdc62aSAdrian Chadd return (rss_hash(datalen, data)); 103*b2bdc62aSAdrian Chadd } 104