summaryrefslogtreecommitdiffstats
path: root/include/net/flow.h
blob: e1ce1b2aea31c704905e056c653109999ed53102 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 *
 *	Flow based forwarding rules (usage: firewalling, etc)
 *
 */

#ifndef _NET_FLOW_H
#define _NET_FLOW_H

struct flowi {
	int	proto;		/*	{TCP, UDP, ICMP}	*/

	union {
		struct {
			__u32			daddr;
			__u32			saddr;
		} ip4_u;
		
		struct {
			struct in6_addr *	daddr;
			struct in6_addr *	saddr;
			__u32			flowlabel;
		} ip6_u;
	} nl_u;
#define fl6_dst		nl_u.ip6_u.daddr
#define fl6_src		nl_u.ip6_u.saddr
#define fl6_flowlabel	nl_u.ip6_u.flowlabel
#define fl4_dst		nl_u.ip4_u.daddr
#define fl4_src		nl_u.ip4_u.saddr

	int	oif;

	union {
		struct {
			__u16	sport;
			__u16	dport;
		} ports;

		struct {
			__u8	type;
			__u8	code;
		} icmpt;

		unsigned long	data;
	} uli_u;
};

#define FLOWR_NODECISION	0	/* rule not appliable to flow	*/
#define FLOWR_SELECT		1	/* flow must follow this rule	*/
#define FLOWR_CLEAR		2	/* priority level clears flow	*/
#define FLOWR_ERROR		3

struct fl_acc_args {
	int	type;


#define FL_ARG_FORWARD	1
#define FL_ARG_ORIGIN	2

	union {
		struct sk_buff		*skb;
		struct {
			struct sock	*sk;
			struct flowi	*flow;
		} fl_o;
	} fl_u;
};


struct pkt_filter {
	atomic_t		refcnt;
	unsigned int		offset;
	__u32			value;
	__u32			mask;
	struct pkt_filter	*next;
};

#define FLR_INPUT		1
#define FLR_OUTPUT		2

struct flow_filter {
	int				type;
	union {
		struct pkt_filter	*filter;
		struct sock		*sk;
	} u;
};

struct flow_rule {
	struct flow_rule_ops		*ops;
	unsigned char			private[0];
};

struct flow_rule_ops {
	int			(*accept)(struct rt6_info *rt,
					  struct rt6_info *rule,
					  struct fl_acc_args *args,
					  struct rt6_info **nrt);
};

#endif