rss_config.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. #ifndef _NET_RSS_CONFIG_H_
  30. #define _NET_RSS_CONFIG_H_
  31. #include <netinet/in.h> /* in_addr_t */
  32. /*
  33. * Supported RSS hash functions.
  34. */
  35. #define RSS_HASH_NAIVE 0x00000001 /* Poor but fast hash. */
  36. #define RSS_HASH_TOEPLITZ 0x00000002 /* Required by RSS. */
  37. #define RSS_HASH_CRC32 0x00000004 /* Future; some NICs do it. */
  38. #define RSS_HASH_MASK (RSS_HASH_NAIVE | RSS_HASH_TOEPLITZ)
  39. /*
  40. * Instances of struct inpcbinfo declare an RSS hash type indicating what
  41. * header fields are covered.
  42. */
  43. #define RSS_HASHFIELDS_NONE 0
  44. #define RSS_HASHFIELDS_4TUPLE 1
  45. #define RSS_HASHFIELDS_2TUPLE 2
  46. /*
  47. * Define RSS representations of the M_HASHTYPE_* values, representing
  48. * which particular bits are supported. The NICs can then use this to
  49. * calculate which hash types to enable and which not to enable.
  50. *
  51. * The fact that these line up with M_HASHTYPE_* is not to be relied
  52. * upon.
  53. */
  54. #define RSS_HASHTYPE_RSS_IPV4 (1 << 1) /* IPv4 2-tuple */
  55. #define RSS_HASHTYPE_RSS_TCP_IPV4 (1 << 2) /* TCPv4 4-tuple */
  56. #define RSS_HASHTYPE_RSS_IPV6 (1 << 3) /* IPv6 2-tuple */
  57. #define RSS_HASHTYPE_RSS_TCP_IPV6 (1 << 4) /* TCPv6 4-tuple */
  58. #define RSS_HASHTYPE_RSS_IPV6_EX (1 << 5) /* IPv6 2-tuple + ext hdrs */
  59. #define RSS_HASHTYPE_RSS_TCP_IPV6_EX (1 << 6) /* TCPv6 4-tiple + ext hdrs */
  60. #define RSS_HASHTYPE_RSS_UDP_IPV4 (1 << 7) /* IPv4 UDP 4-tuple */
  61. #define RSS_HASHTYPE_RSS_UDP_IPV6 (1 << 9) /* IPv6 UDP 4-tuple */
  62. #define RSS_HASHTYPE_RSS_UDP_IPV6_EX (1 << 10) /* IPv6 UDP 4-tuple + ext hdrs */
  63. /*
  64. * Compile-time limits on the size of the indirection table.
  65. */
  66. #define RSS_MAXBITS 7
  67. #define RSS_TABLE_MAXLEN (1 << RSS_MAXBITS)
  68. /*
  69. * Maximum key size used throughout. It's OK for hardware to use only the
  70. * first 16 bytes, which is all that's required for IPv4.
  71. */
  72. #define RSS_KEYSIZE 40
  73. /*
  74. * For RSS hash methods that do a software hash on an mbuf, the packet
  75. * direction (ingress / egress) is required.
  76. *
  77. * The default direction (INGRESS) is the "receive into the NIC" - ie,
  78. * what the hardware is hashing on.
  79. */
  80. #define RSS_HASH_PKT_INGRESS 0
  81. #define RSS_HASH_PKT_EGRESS 1
  82. /*
  83. * Rate limited debugging routines.
  84. */
  85. #define RSS_DEBUG(format, ...) do { \
  86. if (rss_debug) { \
  87. static struct timeval lastfail; \
  88. static int curfail; \
  89. if (ppsratecheck(&lastfail, &curfail, 5)) \
  90. printf("RSS (%s:%u): " format, __func__, __LINE__,\
  91. ##__VA_ARGS__); \
  92. } \
  93. } while (0)
  94. extern int rss_debug;
  95. /*
  96. * Device driver interfaces to query RSS properties that must be programmed
  97. * into hardware.
  98. */
  99. u_int rss_getbits(void);
  100. u_int rss_getbucket(u_int hash);
  101. u_int rss_get_indirection_to_bucket(u_int index);
  102. u_int rss_getcpu(u_int bucket);
  103. void rss_getkey(uint8_t *key);
  104. u_int rss_gethashalgo(void);
  105. u_int rss_getnumbuckets(void);
  106. u_int rss_getnumcpus(void);
  107. u_int rss_gethashconfig(void);
  108. /*
  109. * Hash calculation functions.
  110. */
  111. uint32_t rss_hash(u_int datalen, const uint8_t *data);
  112. /*
  113. * Network stack interface to query desired CPU affinity of a packet.
  114. */
  115. struct mbuf * rss_m2cpuid(struct mbuf *m, uintptr_t source, u_int *cpuid);
  116. u_int rss_hash2cpuid(uint32_t hash_val, uint32_t hash_type);
  117. int rss_hash2bucket(uint32_t hash_val, uint32_t hash_type,
  118. uint32_t *bucket_id);
  119. int rss_m2bucket(struct mbuf *m, uint32_t *bucket_id);
  120. #endif /* !_NET_RSS_CONFIG_H_ */