Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/in_rss.h
- This file was copied to sys/net/rss_config.h, sys/netinet6/in6_rss.h.
Show All 29 Lines | |||||
*/ | */ | ||||
#ifndef _NETINET_IN_RSS_H_ | #ifndef _NETINET_IN_RSS_H_ | ||||
#define _NETINET_IN_RSS_H_ | #define _NETINET_IN_RSS_H_ | ||||
#include <netinet/in.h> /* in_addr_t */ | #include <netinet/in.h> /* in_addr_t */ | ||||
/* | /* | ||||
* Supported RSS hash functions. | |||||
*/ | |||||
#define RSS_HASH_NAIVE 0x00000001 /* Poor but fast hash. */ | |||||
#define RSS_HASH_TOEPLITZ 0x00000002 /* Required by RSS. */ | |||||
#define RSS_HASH_CRC32 0x00000004 /* Future; some NICs do it. */ | |||||
#define RSS_HASH_MASK (RSS_HASH_NAIVE | RSS_HASH_TOEPLITZ) | |||||
/* | |||||
* Instances of struct inpcbinfo declare an RSS hash type indicating what | |||||
* header fields are covered. | |||||
*/ | |||||
#define RSS_HASHFIELDS_NONE 0 | |||||
#define RSS_HASHFIELDS_4TUPLE 1 | |||||
#define RSS_HASHFIELDS_2TUPLE 2 | |||||
/* | |||||
* Define RSS representations of the M_HASHTYPE_* values, representing | |||||
* which particular bits are supported. The NICs can then use this to | |||||
* calculate which hash types to enable and which not to enable. | |||||
* | |||||
* The fact that these line up with M_HASHTYPE_* is not to be relied | |||||
* upon. | |||||
*/ | |||||
#define RSS_HASHTYPE_RSS_IPV4 (1 << 1) /* IPv4 2-tuple */ | |||||
#define RSS_HASHTYPE_RSS_TCP_IPV4 (1 << 2) /* TCPv4 4-tuple */ | |||||
#define RSS_HASHTYPE_RSS_IPV6 (1 << 3) /* IPv6 2-tuple */ | |||||
#define RSS_HASHTYPE_RSS_TCP_IPV6 (1 << 4) /* TCPv6 4-tuple */ | |||||
#define RSS_HASHTYPE_RSS_IPV6_EX (1 << 5) /* IPv6 2-tuple + ext hdrs */ | |||||
#define RSS_HASHTYPE_RSS_TCP_IPV6_EX (1 << 6) /* TCPv6 4-tiple + ext hdrs */ | |||||
#define RSS_HASHTYPE_RSS_UDP_IPV4 (1 << 7) /* IPv4 UDP 4-tuple */ | |||||
#define RSS_HASHTYPE_RSS_UDP_IPV4_EX (1 << 8) /* IPv4 UDP 4-tuple + ext hdrs */ | |||||
#define RSS_HASHTYPE_RSS_UDP_IPV6 (1 << 9) /* IPv6 UDP 4-tuple */ | |||||
#define RSS_HASHTYPE_RSS_UDP_IPV6_EX (1 << 10) /* IPv6 UDP 4-tuple + ext hdrs */ | |||||
/* | |||||
* Compile-time limits on the size of the indirection table. | |||||
*/ | |||||
#define RSS_MAXBITS 7 | |||||
#define RSS_TABLE_MAXLEN (1 << RSS_MAXBITS) | |||||
/* | |||||
* Maximum key size used throughout. It's OK for hardware to use only the | |||||
* first 16 bytes, which is all that's required for IPv4. | |||||
*/ | |||||
#define RSS_KEYSIZE 40 | |||||
/* | |||||
* For RSS hash methods that do a software hash on an mbuf, the packet | |||||
* direction (ingress / egress) is required. | |||||
* | |||||
* The default direction (INGRESS) is the "receive into the NIC" - ie, | |||||
* what the hardware is hashing on. | |||||
*/ | |||||
#define RSS_HASH_PKT_INGRESS 0 | |||||
#define RSS_HASH_PKT_EGRESS 1 | |||||
/* | |||||
* Device driver interfaces to query RSS properties that must be programmed | |||||
* into hardware. | |||||
*/ | |||||
u_int rss_getbits(void); | |||||
u_int rss_getbucket(u_int hash); | |||||
u_int rss_get_indirection_to_bucket(u_int index); | |||||
u_int rss_getcpu(u_int bucket); | |||||
void rss_getkey(uint8_t *key); | |||||
u_int rss_gethashalgo(void); | |||||
u_int rss_getnumbuckets(void); | |||||
u_int rss_getnumcpus(void); | |||||
u_int rss_gethashconfig(void); | |||||
/* | |||||
* Network stack interface to generate a hash for a protocol tuple. | * Network stack interface to generate a hash for a protocol tuple. | ||||
*/ | */ | ||||
uint32_t rss_hash_ip4_4tuple(struct in_addr src, u_short srcport, | uint32_t rss_hash_ip4_4tuple(struct in_addr src, u_short srcport, | ||||
struct in_addr dst, u_short dstport); | struct in_addr dst, u_short dstport); | ||||
uint32_t rss_hash_ip4_2tuple(struct in_addr src, struct in_addr dst); | uint32_t rss_hash_ip4_2tuple(struct in_addr src, struct in_addr dst); | ||||
uint32_t rss_hash_ip6_4tuple(const struct in6_addr *src, u_short srcport, | |||||
const struct in6_addr *dst, u_short dstport); | |||||
uint32_t rss_hash_ip6_2tuple(const struct in6_addr *src, | |||||
const struct in6_addr *dst); | |||||
/* | |||||
* Network stack interface to query desired CPU affinity of a packet. | |||||
*/ | |||||
struct mbuf *rss_m2cpuid(struct mbuf *m, uintptr_t source, u_int *cpuid); | |||||
u_int rss_hash2cpuid(uint32_t hash_val, uint32_t hash_type); | |||||
int rss_hash2bucket(uint32_t hash_val, uint32_t hash_type, | |||||
uint32_t *bucket_id); | |||||
int rss_m2bucket(struct mbuf *m, uint32_t *bucket_id); | |||||
/* | /* | ||||
* Functions to calculate a software RSS hash for a given mbuf or | * Functions to calculate a software RSS hash for a given mbuf or | ||||
* packet detail. | * packet detail. | ||||
*/ | */ | ||||
int rss_mbuf_software_hash_v4(const struct mbuf *m, int dir, | int rss_mbuf_software_hash_v4(const struct mbuf *m, int dir, | ||||
uint32_t *hashval, uint32_t *hashtype); | uint32_t *hashval, uint32_t *hashtype); | ||||
int rss_proto_software_hash_v4(struct in_addr src, | int rss_proto_software_hash_v4(struct in_addr src, | ||||
struct in_addr dst, u_short src_port, u_short dst_port, | struct in_addr dst, u_short src_port, u_short dst_port, | ||||
int proto, uint32_t *hashval, | int proto, uint32_t *hashval, | ||||
uint32_t *hashtype); | uint32_t *hashtype); | ||||
struct mbuf * rss_soft_m2cpuid(struct mbuf *m, uintptr_t source, | struct mbuf * rss_soft_m2cpuid(struct mbuf *m, uintptr_t source, | ||||
u_int *cpuid); | u_int *cpuid); | ||||
#endif /* !_NETINET_IN_RSS_H_ */ | #endif /* !_NETINET_IN_RSS_H_ */ |