diff options
Diffstat (limited to 'include/linux/divert.h')
-rw-r--r-- | include/linux/divert.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/include/linux/divert.h b/include/linux/divert.h new file mode 100644 index 000000000000..6919b09133d4 --- /dev/null +++ b/include/linux/divert.h | |||
@@ -0,0 +1,132 @@ | |||
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 __user *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 | |||
111 | #ifdef CONFIG_NET_DIVERT | ||
112 | #include <linux/netdevice.h> | ||
113 | |||
114 | int alloc_divert_blk(struct net_device *); | ||
115 | void free_divert_blk(struct net_device *); | ||
116 | int divert_ioctl(unsigned int cmd, struct divert_cf __user *arg); | ||
117 | void divert_frame(struct sk_buff *skb); | ||
118 | static inline void handle_diverter(struct sk_buff *skb) | ||
119 | { | ||
120 | /* if diversion is supported on device, then divert */ | ||
121 | if (skb->dev->divert && skb->dev->divert->divert) | ||
122 | divert_frame(skb); | ||
123 | } | ||
124 | |||
125 | #else | ||
126 | # define alloc_divert_blk(dev) (0) | ||
127 | # define free_divert_blk(dev) do {} while (0) | ||
128 | # define divert_ioctl(cmd, arg) (-ENOPKG) | ||
129 | # define handle_diverter(skb) do {} while (0) | ||
130 | #endif | ||
131 | #endif | ||
132 | #endif /* _LINUX_DIVERT_H */ | ||