Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.37-rc1 119 lines 2.4 kB view raw
1/* 2 * 3 * Generic internet FLOW. 4 * 5 */ 6 7#ifndef _NET_FLOW_H 8#define _NET_FLOW_H 9 10#include <linux/in6.h> 11#include <asm/atomic.h> 12 13struct flowi { 14 int oif; 15 int iif; 16 __u32 mark; 17 18 union { 19 struct { 20 __be32 daddr; 21 __be32 saddr; 22 __u8 tos; 23 __u8 scope; 24 } ip4_u; 25 26 struct { 27 struct in6_addr daddr; 28 struct in6_addr saddr; 29 __be32 flowlabel; 30 } ip6_u; 31 32 struct { 33 __le16 daddr; 34 __le16 saddr; 35 __u8 scope; 36 } dn_u; 37 } nl_u; 38#define fld_dst nl_u.dn_u.daddr 39#define fld_src nl_u.dn_u.saddr 40#define fld_scope nl_u.dn_u.scope 41#define fl6_dst nl_u.ip6_u.daddr 42#define fl6_src nl_u.ip6_u.saddr 43#define fl6_flowlabel nl_u.ip6_u.flowlabel 44#define fl4_dst nl_u.ip4_u.daddr 45#define fl4_src nl_u.ip4_u.saddr 46#define fl4_tos nl_u.ip4_u.tos 47#define fl4_scope nl_u.ip4_u.scope 48 49 __u8 proto; 50 __u8 flags; 51#define FLOWI_FLAG_ANYSRC 0x01 52#define FLOWI_FLAG_MATCH_ANY_IIF 0x02 53 union { 54 struct { 55 __be16 sport; 56 __be16 dport; 57 } ports; 58 59 struct { 60 __u8 type; 61 __u8 code; 62 } icmpt; 63 64 struct { 65 __le16 sport; 66 __le16 dport; 67 } dnports; 68 69 __be32 spi; 70 71 struct { 72 __u8 type; 73 } mht; 74 } uli_u; 75#define fl_ip_sport uli_u.ports.sport 76#define fl_ip_dport uli_u.ports.dport 77#define fl_icmp_type uli_u.icmpt.type 78#define fl_icmp_code uli_u.icmpt.code 79#define fl_ipsec_spi uli_u.spi 80#define fl_mh_type uli_u.mht.type 81 __u32 secid; /* used by xfrm; see secid.txt */ 82} __attribute__((__aligned__(BITS_PER_LONG/8))); 83 84#define FLOW_DIR_IN 0 85#define FLOW_DIR_OUT 1 86#define FLOW_DIR_FWD 2 87 88struct net; 89struct sock; 90struct flow_cache_ops; 91 92struct flow_cache_object { 93 const struct flow_cache_ops *ops; 94}; 95 96struct flow_cache_ops { 97 struct flow_cache_object *(*get)(struct flow_cache_object *); 98 int (*check)(struct flow_cache_object *); 99 void (*delete)(struct flow_cache_object *); 100}; 101 102typedef struct flow_cache_object *(*flow_resolve_t)( 103 struct net *net, struct flowi *key, u16 family, 104 u8 dir, struct flow_cache_object *oldobj, void *ctx); 105 106extern struct flow_cache_object *flow_cache_lookup( 107 struct net *net, struct flowi *key, u16 family, 108 u8 dir, flow_resolve_t resolver, void *ctx); 109 110extern void flow_cache_flush(void); 111extern atomic_t flow_cache_genid; 112 113static inline int flow_cache_uli_match(struct flowi *fl1, struct flowi *fl2) 114{ 115 return (fl1->proto == fl2->proto && 116 !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u))); 117} 118 119#endif