11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * 31da177e4SLinus Torvalds * Generic internet FLOW. 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds 71da177e4SLinus Torvalds #ifndef _NET_FLOW_H 81da177e4SLinus Torvalds #define _NET_FLOW_H 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/in6.h> 111da177e4SLinus Torvalds #include <asm/atomic.h> 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds struct flowi { 141da177e4SLinus Torvalds int oif; 151da177e4SLinus Torvalds int iif; 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds union { 181da177e4SLinus Torvalds struct { 191da177e4SLinus Torvalds __u32 daddr; 201da177e4SLinus Torvalds __u32 saddr; 211da177e4SLinus Torvalds __u32 fwmark; 221da177e4SLinus Torvalds __u8 tos; 231da177e4SLinus Torvalds __u8 scope; 241da177e4SLinus Torvalds } ip4_u; 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds struct { 271da177e4SLinus Torvalds struct in6_addr daddr; 281da177e4SLinus Torvalds struct in6_addr saddr; 291da177e4SLinus Torvalds __u32 flowlabel; 301da177e4SLinus Torvalds } ip6_u; 311da177e4SLinus Torvalds 321da177e4SLinus Torvalds struct { 33c4ea94abSSteven Whitehouse __le16 daddr; 34c4ea94abSSteven Whitehouse __le16 saddr; 351da177e4SLinus Torvalds __u32 fwmark; 361da177e4SLinus Torvalds __u8 scope; 371da177e4SLinus Torvalds } dn_u; 381da177e4SLinus Torvalds } nl_u; 391da177e4SLinus Torvalds #define fld_dst nl_u.dn_u.daddr 401da177e4SLinus Torvalds #define fld_src nl_u.dn_u.saddr 411da177e4SLinus Torvalds #define fld_fwmark nl_u.dn_u.fwmark 421da177e4SLinus Torvalds #define fld_scope nl_u.dn_u.scope 431da177e4SLinus Torvalds #define fl6_dst nl_u.ip6_u.daddr 441da177e4SLinus Torvalds #define fl6_src nl_u.ip6_u.saddr 451da177e4SLinus Torvalds #define fl6_flowlabel nl_u.ip6_u.flowlabel 461da177e4SLinus Torvalds #define fl4_dst nl_u.ip4_u.daddr 471da177e4SLinus Torvalds #define fl4_src nl_u.ip4_u.saddr 481da177e4SLinus Torvalds #define fl4_fwmark nl_u.ip4_u.fwmark 491da177e4SLinus Torvalds #define fl4_tos nl_u.ip4_u.tos 501da177e4SLinus Torvalds #define fl4_scope nl_u.ip4_u.scope 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds __u8 proto; 531da177e4SLinus Torvalds __u8 flags; 541da177e4SLinus Torvalds #define FLOWI_FLAG_MULTIPATHOLDROUTE 0x01 551da177e4SLinus Torvalds union { 561da177e4SLinus Torvalds struct { 571da177e4SLinus Torvalds __u16 sport; 581da177e4SLinus Torvalds __u16 dport; 591da177e4SLinus Torvalds } ports; 601da177e4SLinus Torvalds 611da177e4SLinus Torvalds struct { 621da177e4SLinus Torvalds __u8 type; 631da177e4SLinus Torvalds __u8 code; 641da177e4SLinus Torvalds } icmpt; 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds struct { 67c4ea94abSSteven Whitehouse __le16 sport; 68c4ea94abSSteven Whitehouse __le16 dport; 691da177e4SLinus Torvalds __u8 objnum; 701da177e4SLinus Torvalds __u8 objnamel; /* Not 16 bits since max val is 16 */ 711da177e4SLinus Torvalds __u8 objname[16]; /* Not zero terminated */ 721da177e4SLinus Torvalds } dnports; 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds __u32 spi; 752b741653SMasahide NAKAMURA 762b741653SMasahide NAKAMURA #ifdef CONFIG_IPV6_MIP6 772b741653SMasahide NAKAMURA struct { 782b741653SMasahide NAKAMURA __u8 type; 792b741653SMasahide NAKAMURA } mht; 802b741653SMasahide NAKAMURA #endif 811da177e4SLinus Torvalds } uli_u; 821da177e4SLinus Torvalds #define fl_ip_sport uli_u.ports.sport 831da177e4SLinus Torvalds #define fl_ip_dport uli_u.ports.dport 841da177e4SLinus Torvalds #define fl_icmp_type uli_u.icmpt.type 851da177e4SLinus Torvalds #define fl_icmp_code uli_u.icmpt.code 861da177e4SLinus Torvalds #define fl_ipsec_spi uli_u.spi 872b741653SMasahide NAKAMURA #ifdef CONFIG_IPV6_MIP6 882b741653SMasahide NAKAMURA #define fl_mh_type uli_u.mht.type 892b741653SMasahide NAKAMURA #endif 90b6340fcdSVenkat Yekkirala __u32 secid; /* used by xfrm; see secid.txt */ 911da177e4SLinus Torvalds } __attribute__((__aligned__(BITS_PER_LONG/8))); 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds #define FLOW_DIR_IN 0 941da177e4SLinus Torvalds #define FLOW_DIR_OUT 1 951da177e4SLinus Torvalds #define FLOW_DIR_FWD 2 961da177e4SLinus Torvalds 97df71837dSTrent Jaeger struct sock; 98e0d1caa7SVenkat Yekkirala typedef void (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir, 991da177e4SLinus Torvalds void **objp, atomic_t **obj_refp); 1001da177e4SLinus Torvalds 101e0d1caa7SVenkat Yekkirala extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir, 1021da177e4SLinus Torvalds flow_resolve_t resolver); 1031da177e4SLinus Torvalds extern void flow_cache_flush(void); 1041da177e4SLinus Torvalds extern atomic_t flow_cache_genid; 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds #endif 107