flow.h revision fbef0a40919a80eb8a02fe9d3b96dfdcdebf4317
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 __u8 tos; 18 __u8 scope; 19 __u8 proto; 20 __u8 flags; 21#define FLOWI_FLAG_ANYSRC 0x01 22#define FLOWI_FLAG_PRECOW_METRICS 0x02 23#define FLOWI_FLAG_CAN_SLEEP 0x04 24 __u32 secid; 25 26 union { 27 struct { 28 __be32 daddr; 29 __be32 saddr; 30 } ip4_u; 31 32 struct { 33 struct in6_addr daddr; 34 struct in6_addr saddr; 35 __be32 flowlabel; 36 } ip6_u; 37 38 struct { 39 __le16 daddr; 40 __le16 saddr; 41 __u8 scope; 42 } dn_u; 43 } nl_u; 44#define fld_dst nl_u.dn_u.daddr 45#define fld_src nl_u.dn_u.saddr 46#define fld_scope nl_u.dn_u.scope 47#define fl6_dst nl_u.ip6_u.daddr 48#define fl6_src nl_u.ip6_u.saddr 49#define fl6_flowlabel nl_u.ip6_u.flowlabel 50#define fl4_dst nl_u.ip4_u.daddr 51#define fl4_src nl_u.ip4_u.saddr 52#define fl4_tos tos 53#define fl4_scope scope 54 55 union { 56 struct { 57 __be16 sport; 58 __be16 dport; 59 } ports; 60 61 struct { 62 __u8 type; 63 __u8 code; 64 } icmpt; 65 66 struct { 67 __le16 sport; 68 __le16 dport; 69 } dnports; 70 71 __be32 spi; 72 __be32 gre_key; 73 74 struct { 75 __u8 type; 76 } mht; 77 } uli_u; 78#define fl_ip_sport uli_u.ports.sport 79#define fl_ip_dport uli_u.ports.dport 80#define fl_icmp_type uli_u.icmpt.type 81#define fl_icmp_code uli_u.icmpt.code 82#define fl_ipsec_spi uli_u.spi 83#define fl_mh_type uli_u.mht.type 84#define fl_gre_key uli_u.gre_key 85} __attribute__((__aligned__(BITS_PER_LONG/8))); 86 87#define FLOW_DIR_IN 0 88#define FLOW_DIR_OUT 1 89#define FLOW_DIR_FWD 2 90 91struct net; 92struct sock; 93struct flow_cache_ops; 94 95struct flow_cache_object { 96 const struct flow_cache_ops *ops; 97}; 98 99struct flow_cache_ops { 100 struct flow_cache_object *(*get)(struct flow_cache_object *); 101 int (*check)(struct flow_cache_object *); 102 void (*delete)(struct flow_cache_object *); 103}; 104 105typedef struct flow_cache_object *(*flow_resolve_t)( 106 struct net *net, const struct flowi *key, u16 family, 107 u8 dir, struct flow_cache_object *oldobj, void *ctx); 108 109extern struct flow_cache_object *flow_cache_lookup( 110 struct net *net, const struct flowi *key, u16 family, 111 u8 dir, flow_resolve_t resolver, void *ctx); 112 113extern void flow_cache_flush(void); 114extern atomic_t flow_cache_genid; 115 116static inline int flow_cache_uli_match(const struct flowi *fl1, 117 const struct flowi *fl2) 118{ 119 return (fl1->proto == fl2->proto && 120 !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u))); 121} 122 123#endif 124