in_rss.h revision 266737
1/*-
2 * Copyright (c) 2010-2011 Juniper Networks, Inc.
3 * All rights reserved.
4 *
5 * This software was developed by Robert N. M. Watson under contract
6 * to Juniper Networks, Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/sys/netinet/in_rss.h 266737 2014-05-27 08:06:20Z adrian $
30 */
31
32#ifndef _NETINET_IN_RSS_H_
33#define	_NETINET_IN_RSS_H_
34
35#include <netinet/in.h>		/* in_addr_t */
36
37/*
38 * Supported RSS hash functions.
39 */
40#define	RSS_HASH_NAIVE		0x00000001	/* Poor but fast hash. */
41#define	RSS_HASH_TOEPLITZ	0x00000002	/* Required by RSS. */
42#define	RSS_HASH_CRC32		0x00000004	/* Future; some NICs do it. */
43
44#define	RSS_HASH_MASK		(RSS_HASH_NAIVE | RSS_HASH_TOEPLITZ)
45
46/*
47 * Instances of struct inpcbinfo declare an RSS hash type indicating what
48 * header fields are covered.
49 */
50#define	RSS_HASHFIELDS_NONE		0
51#define	RSS_HASHFIELDS_4TUPLE		1
52#define	RSS_HASHFIELDS_2TUPLE		2
53
54/*
55 * Compile-time limits on the size of the indirection table.
56 */
57#define	RSS_MAXBITS	7
58#define	RSS_TABLE_MAXLEN	(1 << RSS_MAXBITS)
59
60/*
61 * Maximum key size used throughout.  It's OK for hardware to use only the
62 * first 16 bytes, which is all that's required for IPv4.
63 */
64#define	RSS_KEYSIZE	40
65
66/*
67 * Device driver interfaces to query RSS properties that must be programmed
68 * into hardware.
69 */
70u_int	rss_getbits(void);
71u_int	rss_getbucket(u_int hash);
72u_int	rss_getcpu(u_int bucket);
73void	rss_getkey(uint8_t *key);
74u_int	rss_gethashalgo(void);
75u_int	rss_getnumbuckets(void);
76u_int	rss_getnumcpus(void);
77
78/*
79 * Network stack interface to generate a hash for a protocol tuple.
80 */
81uint32_t	rss_hash_ip4_4tuple(struct in_addr src, u_short srcport,
82		    struct in_addr dst, u_short dstport);
83uint32_t	rss_hash_ip4_2tuple(struct in_addr src, struct in_addr dst);
84uint32_t	rss_hash_ip6_4tuple(struct in6_addr src, u_short srcport,
85		    struct in6_addr dst, u_short dstport);
86uint32_t	rss_hash_ip6_2tuple(struct in6_addr src,
87		    struct in6_addr dst);
88
89/*
90 * Network stack interface to query desired CPU affinity of a packet.
91 */
92struct mbuf	*rss_m2cpuid(struct mbuf *m, uintptr_t source, u_int *cpuid);
93u_int		rss_hash2cpuid(uint32_t hash_val, uint32_t hash_type);
94int		rss_hash2bucket(uint32_t hash_val, uint32_t hash_type,
95		uint32_t *bucket_id);
96int		rss_m2bucket(struct mbuf *m, uint32_t *bucket_id);
97
98#endif /* !_NETINET_IN_RSS_H_ */
99