| /* |
| * |
| * 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 |