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 13 struct 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 union { 52 struct { 53 __be16 sport; 54 __be16 dport; 55 } ports; 56 57 struct { 58 __u8 type; 59 __u8 code; 60 } icmpt; 61 62 struct { 63 __le16 sport; 64 __le16 dport; 65 } dnports; 66 67 __be32 spi; 68 69 struct { 70 __u8 type; 71 } mht; 72 } uli_u; 73 #define fl_ip_sport uli_u.ports.sport 74 #define fl_ip_dport uli_u.ports.dport 75 #define fl_icmp_type uli_u.icmpt.type 76 #define fl_icmp_code uli_u.icmpt.code 77 #define fl_ipsec_spi uli_u.spi 78 #define fl_mh_type uli_u.mht.type 79 __u32 secid; /* used by xfrm; see secid.txt */ 80 } __attribute__((__aligned__(BITS_PER_LONG/8))); 81 82 #define FLOW_DIR_IN 0 83 #define FLOW_DIR_OUT 1 84 #define FLOW_DIR_FWD 2 85 86 struct sock; 87 typedef int (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir, 88 void **objp, atomic_t **obj_refp); 89 90 extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir, 91 flow_resolve_t resolver); 92 extern void flow_cache_flush(void); 93 extern atomic_t flow_cache_genid; 94 95 static inline int flow_cache_uli_match(struct flowi *fl1, struct flowi *fl2) 96 { 97 return (fl1->proto == fl2->proto && 98 !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u))); 99 } 100 101 #endif 102