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 */
26struct 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
41typedef 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
53struct 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>
110int alloc_divert_blk(struct net_device *);
111void free_divert_blk(struct net_device *);
112int divert_ioctl(unsigned int cmd, struct divert_cf *arg);
113void divert_frame(struct sk_buff *skb);
114
115#endif
116
117#endif	/* _LINUX_DIVERT_H */
118