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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Frame Diversion, Benoit Locher <Benoit.Locher@skf.com>
  3.  *
  4.  * Changes:
  5.  *  06/09/2000 BL: initial version
  6.  * 
  7.  */
  8.  
  9. #ifndef _LINUX_DIVERT_H
  10. #define _LINUX_DIVERT_H
  11. #include <asm/types.h>
  12. #define MAX_DIVERT_PORTS 8 /* Max number of ports to divert (tcp, udp) */
  13. /* Divertable protocols */
  14. #define DIVERT_PROTO_NONE 0x0000
  15. #define DIVERT_PROTO_IP 0x0001
  16. #define DIVERT_PROTO_ICMP 0x0002
  17. #define DIVERT_PROTO_TCP 0x0004
  18. #define DIVERT_PROTO_UDP 0x0008
  19. /*
  20.  * This is an Ethernet Frame Diverter option block
  21.  */
  22. struct divert_blk
  23. {
  24. int divert;  /* are we active */
  25. unsigned int protos; /* protocols */
  26. u16 tcp_dst[MAX_DIVERT_PORTS]; /* specific tcp dst ports to divert */
  27. u16 tcp_src[MAX_DIVERT_PORTS]; /* specific tcp src ports to divert */
  28. u16 udp_dst[MAX_DIVERT_PORTS]; /* specific udp dst ports to divert */
  29. u16 udp_src[MAX_DIVERT_PORTS]; /* specific udp src ports to divert */
  30. };
  31. /*
  32.  * Diversion control block, for configuration with the userspace tool
  33.  * divert
  34.  */
  35. typedef union _divert_cf_arg
  36. {
  37. s16 int16;
  38. u16 uint16;
  39. s32 int32;
  40. u32 uint32;
  41. s64 int64;
  42. u64 uint64;
  43. void __user *ptr;
  44. } divert_cf_arg;
  45. struct divert_cf
  46. {
  47. int cmd; /* Command */
  48. divert_cf_arg  arg1,
  49. arg2,
  50. arg3;
  51. int dev_index; /* device index (eth0=0, etc...) */
  52. };
  53. /* Diversion commands */
  54. #define DIVCMD_DIVERT 1 /* ENABLE/DISABLE diversion */
  55. #define DIVCMD_IP 2 /* ENABLE/DISABLE whold IP diversion */
  56. #define DIVCMD_TCP 3 /* ENABLE/DISABLE whold TCP diversion */
  57. #define DIVCMD_TCPDST 4 /* ADD/REMOVE TCP DST port for diversion */
  58. #define DIVCMD_TCPSRC 5 /* ADD/REMOVE TCP SRC port for diversion */
  59. #define DIVCMD_UDP 6 /* ENABLE/DISABLE whole UDP diversion */
  60. #define DIVCMD_UDPDST 7 /* ADD/REMOVE UDP DST port for diversion */
  61. #define DIVCMD_UDPSRC 8 /* ADD/REMOVE UDP SRC port for diversion */
  62. #define DIVCMD_ICMP 9 /* ENABLE/DISABLE whole ICMP diversion */
  63. #define DIVCMD_GETSTATUS 10 /* GET the status of the diverter */
  64. #define DIVCMD_RESET 11 /* Reset the diverter on the specified dev */
  65. #define DIVCMD_GETVERSION 12 /* Retrieve the diverter code version (char[32]) */
  66. /* General syntax of the commands:
  67.  * 
  68.  * DIVCMD_xxxxxx(arg1, arg2, arg3, dev_index)
  69.  * 
  70.  * SIOCSIFDIVERT:
  71.  *   DIVCMD_DIVERT(DIVARG1_ENABLE|DIVARG1_DISABLE, , ,ifindex)
  72.  *   DIVCMD_IP(DIVARG1_ENABLE|DIVARG1_DISABLE, , , ifindex)
  73.  *   DIVCMD_TCP(DIVARG1_ENABLE|DIVARG1_DISABLE, , , ifindex)
  74.  *   DIVCMD_TCPDST(DIVARG1_ADD|DIVARG1_REMOVE, port, , ifindex)
  75.  *   DIVCMD_TCPSRC(DIVARG1_ADD|DIVARG1_REMOVE, port, , ifindex)
  76.  *   DIVCMD_UDP(DIVARG1_ENABLE|DIVARG1_DISABLE, , , ifindex)
  77.  *   DIVCMD_UDPDST(DIVARG1_ADD|DIVARG1_REMOVE, port, , ifindex)
  78.  *   DIVCMD_UDPSRC(DIVARG1_ADD|DIVARG1_REMOVE, port, , ifindex)
  79.  *   DIVCMD_ICMP(DIVARG1_ENABLE|DIVARG1_DISABLE, , , ifindex)
  80.  *   DIVCMD_RESET(, , , ifindex)
  81.  *   
  82.  * SIOGIFDIVERT:
  83.  *   DIVCMD_GETSTATUS(divert_blk, , , ifindex)
  84.  *   DIVCMD_GETVERSION(string[3])
  85.  */
  86. /* Possible values for arg1 */
  87. #define DIVARG1_ENABLE 0 /* ENABLE something */
  88. #define DIVARG1_DISABLE 1 /* DISABLE something */
  89. #define DIVARG1_ADD 2 /* ADD something */
  90. #define DIVARG1_REMOVE 3 /* REMOVE something */
  91. #ifdef __KERNEL__
  92. /* diverter functions */
  93. #include <linux/skbuff.h>
  94. #ifdef CONFIG_NET_DIVERT
  95. #include <linux/netdevice.h>
  96. int alloc_divert_blk(struct net_device *);
  97. void free_divert_blk(struct net_device *);
  98. int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg);
  99. void divert_frame(struct sk_buff *skb);
  100. static inline void handle_diverter(struct sk_buff *skb)
  101. {
  102. /* if diversion is supported on device, then divert */
  103. if (skb->dev->divert && skb->dev->divert->divert)
  104. divert_frame(skb);
  105. }
  106. #else
  107. # define alloc_divert_blk(dev) (0)
  108. # define free_divert_blk(dev) do {} while (0)
  109. # define divert_ioctl(cmd, arg) (-ENOPKG)
  110. # define handle_diverter(skb) do {} while (0)
  111. #endif
  112. #endif 
  113. #endif /* _LINUX_DIVERT_H */