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