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