Rev 422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 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 | |||
111 | #ifdef CONFIG_NET_DIVERT |
||
112 | int alloc_divert_blk(struct net_device *); |
||
113 | void free_divert_blk(struct net_device *); |
||
114 | int divert_ioctl(unsigned int cmd, struct divert_cf *arg); |
||
115 | void divert_frame(struct sk_buff *skb); |
||
116 | static inline void handle_diverter(struct sk_buff *skb) |
||
117 | { |
||
118 | /* if diversion is supported on device, then divert */ |
||
119 | if (skb->dev->divert && skb->dev->divert->divert) |
||
120 | divert_frame(skb); |
||
121 | } |
||
122 | |||
123 | #else |
||
124 | # define alloc_divert_blk(dev) (0) |
||
125 | # define free_divert_blk(dev) do {} while (0) |
||
126 | # define divert_ioctl(cmd, arg) (-ENOPKG) |
||
127 | # define handle_diverter(skb) do {} while (0) |
||
128 | #endif |
||
129 | #endif |
||
130 | #endif /* _LINUX_DIVERT_H */ |