xref: /freebsd/sys/netinet6/in6_rss.c (revision b2bdc62a95a0241981d79c46eb79e3208eeec5f8)
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