/* * Given a hash of whatever the covered tuple might be, return a pcbgroup * index. Where RSS is supported, try to align bucket selection with RSS CPU * affinity strategy. */ static __inline u_int in_pcbgroup_getbucket(struct inpcbinfo *pcbinfo, uint32_t hash) { #ifdef RSS return (rss_getbucket(hash)); #else return (hash % pcbinfo->ipi_npcbgroups); #endif }
/* * netisr CPU affinity lookup given just the hash and hashtype. */ u_int rss_hash2cpuid(uint32_t hash_val, uint32_t hash_type) { switch (hash_type) { case M_HASHTYPE_RSS_IPV4: case M_HASHTYPE_RSS_TCP_IPV4: return (rss_getcpu(rss_getbucket(hash_val))); default: return (NETISR_CPUID_NONE); } }
/* * Query the RSS bucket associated with the given hash value and * type. */ int rss_hash2bucket(uint32_t hash_val, uint32_t hash_type, uint32_t *bucket_id) { switch (hash_type) { case M_HASHTYPE_RSS_IPV4: case M_HASHTYPE_RSS_TCP_IPV4: case M_HASHTYPE_RSS_UDP_IPV4: case M_HASHTYPE_RSS_IPV6: case M_HASHTYPE_RSS_TCP_IPV6: case M_HASHTYPE_RSS_UDP_IPV6: *bucket_id = rss_getbucket(hash_val); return (0); default: return (-1); } }