ip_conntrack_tuple.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _IP_CONNTRACK_TUPLE_H
  2. #define _IP_CONNTRACK_TUPLE_H
  3. #include <linux/types.h>
  4. /* A `tuple' is a structure containing the information to uniquely
  5.   identify a connection.  ie. if two packets have the same tuple, they
  6.   are in the same connection; if not, they are not.
  7.   We divide the structure along "manipulatable" and
  8.   "non-manipulatable" lines, for the benefit of the NAT code.
  9. */
  10. /* The protocol-specific manipulable parts of the tuple: always in
  11.    network order! */
  12. union ip_conntrack_manip_proto
  13. {
  14. /* Add other protocols here. */
  15. u_int16_t all;
  16. struct {
  17. __be16 port;
  18. } tcp;
  19. struct {
  20. u_int16_t port;
  21. } udp;
  22. struct {
  23. u_int16_t id;
  24. } icmp;
  25. struct {
  26. u_int16_t port;
  27. } sctp;
  28. struct {
  29. __be16 key; /* key is 32bit, pptp only uses 16 */
  30. } gre;
  31. };
  32. /* The manipulable part of the tuple. */
  33. struct ip_conntrack_manip
  34. {
  35. u_int32_t ip;
  36. union ip_conntrack_manip_proto u;
  37. };
  38. /* This contains the information to distinguish a connection. */
  39. struct ip_conntrack_tuple
  40. {
  41. struct ip_conntrack_manip src;
  42. /* These are the parts of the tuple which are fixed. */
  43. struct {
  44. u_int32_t ip;
  45. union {
  46. /* Add other protocols here. */
  47. u_int16_t all;
  48. struct {
  49. u_int16_t port;
  50. } tcp;
  51. struct {
  52. u_int16_t port;
  53. } udp;
  54. struct {
  55. u_int8_t type, code;
  56. } icmp;
  57. struct {
  58. u_int16_t port;
  59. } sctp;
  60. struct {
  61. __be16 key; /* key is 32bit, 
  62.  * pptp only uses 16 */
  63. } gre;
  64. } u;
  65. /* The protocol. */
  66. u_int8_t protonum;
  67. /* The direction (for tuplehash) */
  68. u_int8_t dir;
  69. } dst;
  70. };
  71. /* This is optimized opposed to a memset of the whole structure.  Everything we
  72.  * really care about is the  source/destination unions */
  73. #define IP_CT_TUPLE_U_BLANK(tuple) 
  74. do {
  75. (tuple)->src.u.all = 0;
  76. (tuple)->dst.u.all = 0;
  77. } while (0)
  78. enum ip_conntrack_dir
  79. {
  80. IP_CT_DIR_ORIGINAL,
  81. IP_CT_DIR_REPLY,
  82. IP_CT_DIR_MAX
  83. };
  84. #ifdef __KERNEL__
  85. #define DUMP_TUPLE(tp)
  86. DEBUGP("tuple %p: %u %u.%u.%u.%u:%hu -> %u.%u.%u.%u:%hun",
  87.        (tp), (tp)->dst.protonum,
  88.        NIPQUAD((tp)->src.ip), ntohs((tp)->src.u.all),
  89.        NIPQUAD((tp)->dst.ip), ntohs((tp)->dst.u.all))
  90. #define CTINFO2DIR(ctinfo) ((ctinfo) >= IP_CT_IS_REPLY ? IP_CT_DIR_REPLY : IP_CT_DIR_ORIGINAL)
  91. /* If we're the first tuple, it's the original dir. */
  92. #define DIRECTION(h) ((enum ip_conntrack_dir)(h)->tuple.dst.dir)
  93. /* Connections have two entries in the hash table: one for each way */
  94. struct ip_conntrack_tuple_hash
  95. {
  96. struct list_head list;
  97. struct ip_conntrack_tuple tuple;
  98. };
  99. #endif /* __KERNEL__ */
  100. static inline int ip_ct_tuple_src_equal(const struct ip_conntrack_tuple *t1,
  101.         const struct ip_conntrack_tuple *t2)
  102. {
  103. return t1->src.ip == t2->src.ip
  104. && t1->src.u.all == t2->src.u.all;
  105. }
  106. static inline int ip_ct_tuple_dst_equal(const struct ip_conntrack_tuple *t1,
  107.         const struct ip_conntrack_tuple *t2)
  108. {
  109. return t1->dst.ip == t2->dst.ip
  110. && t1->dst.u.all == t2->dst.u.all
  111. && t1->dst.protonum == t2->dst.protonum;
  112. }
  113. static inline int ip_ct_tuple_equal(const struct ip_conntrack_tuple *t1,
  114.     const struct ip_conntrack_tuple *t2)
  115. {
  116. return ip_ct_tuple_src_equal(t1, t2) && ip_ct_tuple_dst_equal(t1, t2);
  117. }
  118. static inline int ip_ct_tuple_mask_cmp(const struct ip_conntrack_tuple *t,
  119.        const struct ip_conntrack_tuple *tuple,
  120.        const struct ip_conntrack_tuple *mask)
  121. {
  122. return !(((t->src.ip ^ tuple->src.ip) & mask->src.ip)
  123.  || ((t->dst.ip ^ tuple->dst.ip) & mask->dst.ip)
  124.  || ((t->src.u.all ^ tuple->src.u.all) & mask->src.u.all)
  125.  || ((t->dst.u.all ^ tuple->dst.u.all) & mask->dst.u.all)
  126.  || ((t->dst.protonum ^ tuple->dst.protonum)
  127.      & mask->dst.protonum));
  128. }
  129. #endif /* _IP_CONNTRACK_TUPLE_H */