ip_nat.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _IP_NAT_H
  2. #define _IP_NAT_H
  3. #include <linux/netfilter_ipv4.h>
  4. #include <linux/netfilter_ipv4/ip_conntrack_tuple.h>
  5. #define IP_NAT_MAPPING_TYPE_MAX_NAMELEN 16
  6. enum ip_nat_manip_type
  7. {
  8. IP_NAT_MANIP_SRC,
  9. IP_NAT_MANIP_DST
  10. };
  11. #ifndef CONFIG_IP_NF_NAT_LOCAL
  12. /* SRC manip occurs only on POST_ROUTING */
  13. #define HOOK2MANIP(hooknum) ((hooknum) != NF_IP_POST_ROUTING)
  14. #else
  15. /* SRC manip occurs POST_ROUTING or LOCAL_IN */
  16. #define HOOK2MANIP(hooknum) ((hooknum) != NF_IP_POST_ROUTING && (hooknum) != NF_IP_LOCAL_IN)
  17. #endif
  18. /* 2.3.19 (I hope) will define this in linux/netfilter_ipv4.h. */
  19. #ifndef SO_ORIGINAL_DST
  20. #define SO_ORIGINAL_DST 80
  21. #endif
  22. #define IP_NAT_RANGE_MAP_IPS 1
  23. #define IP_NAT_RANGE_PROTO_SPECIFIED 2
  24. /* Used internally by get_unique_tuple(). */
  25. #define IP_NAT_RANGE_FULL 4
  26. /* NAT sequence number modifications */
  27. struct ip_nat_seq {
  28. /* position of the last TCP sequence number 
  29.  * modification (if any) */
  30. u_int32_t correction_pos;
  31. /* sequence number offset before and after last modification */
  32. int32_t offset_before, offset_after;
  33. };
  34. /* Single range specification. */
  35. struct ip_nat_range
  36. {
  37. /* Set to OR of flags above. */
  38. unsigned int flags;
  39. /* Inclusive: network order. */
  40. u_int32_t min_ip, max_ip;
  41. /* Inclusive: network order */
  42. union ip_conntrack_manip_proto min, max;
  43. };
  44. /* A range consists of an array of 1 or more ip_nat_range */
  45. struct ip_nat_multi_range
  46. {
  47. unsigned int rangesize;
  48. /* hangs off end. */
  49. struct ip_nat_range range[1];
  50. };
  51. /* Worst case: local-out manip + 1 post-routing, and reverse dirn. */
  52. #define IP_NAT_MAX_MANIPS (2*3)
  53. struct ip_nat_info_manip
  54. {
  55. /* The direction. */
  56. u_int8_t direction;
  57. /* Which hook the manipulation happens on. */
  58. u_int8_t hooknum;
  59. /* The manipulation type. */
  60. u_int8_t maniptype;
  61. /* Manipulations to occur at each conntrack in this dirn. */
  62. struct ip_conntrack_manip manip;
  63. };
  64. #ifdef __KERNEL__
  65. #include <linux/list.h>
  66. #include <linux/netfilter_ipv4/lockhelp.h>
  67. /* Protects NAT hash tables, and NAT-private part of conntracks. */
  68. DECLARE_RWLOCK_EXTERN(ip_nat_lock);
  69. /* Hashes for by-source and IP/protocol. */
  70. struct ip_nat_hash
  71. {
  72. struct list_head list;
  73. /* conntrack we're embedded in: NULL if not in hash. */
  74. struct ip_conntrack *conntrack;
  75. };
  76. /* The structure embedded in the conntrack structure. */
  77. struct ip_nat_info
  78. {
  79. /* Set to zero when conntrack created: bitmask of maniptypes */
  80. int initialized;
  81. unsigned int num_manips;
  82. /* Manipulations to be done on this conntrack. */
  83. struct ip_nat_info_manip manips[IP_NAT_MAX_MANIPS];
  84. /* The mapping type which created us (NULL for null mapping). */
  85. const struct ip_nat_mapping_type *mtype;
  86. struct ip_nat_hash bysource, byipsproto;
  87. /* Helper (NULL if none). */
  88. struct ip_nat_helper *helper;
  89. struct ip_nat_seq seq[IP_CT_DIR_MAX];
  90. };
  91. /* Set up the info structure to map into this range. */
  92. extern unsigned int ip_nat_setup_info(struct ip_conntrack *conntrack,
  93.       const struct ip_nat_multi_range *mr,
  94.       unsigned int hooknum);
  95. /* Is this tuple already taken? (not by us)*/
  96. extern int ip_nat_used_tuple(const struct ip_conntrack_tuple *tuple,
  97.      const struct ip_conntrack *ignored_conntrack);
  98. /* Calculate relative checksum. */
  99. extern u_int16_t ip_nat_cheat_check(u_int32_t oldvalinv,
  100.     u_int32_t newval,
  101.     u_int16_t oldcheck);
  102. #endif /*__KERNEL__*/
  103. #endif