ip_nat.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

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