xref: /openbmc/linux/include/net/flow.h (revision 4324a174)
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 {
19f2c3fe24SAl Viro 			__be32			daddr;
20f2c3fe24SAl Viro 			__be32			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;
2975bff8f0SYOSHIFUJI Hideaki 			__u32			fwmark;
301da177e4SLinus Torvalds 			__u32			flowlabel;
311da177e4SLinus Torvalds 		} ip6_u;
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds 		struct {
34c4ea94abSSteven Whitehouse 			__le16			daddr;
35c4ea94abSSteven Whitehouse 			__le16			saddr;
361da177e4SLinus Torvalds 			__u32			fwmark;
371da177e4SLinus Torvalds 			__u8			scope;
381da177e4SLinus Torvalds 		} dn_u;
391da177e4SLinus Torvalds 	} nl_u;
401da177e4SLinus Torvalds #define fld_dst		nl_u.dn_u.daddr
411da177e4SLinus Torvalds #define fld_src		nl_u.dn_u.saddr
421da177e4SLinus Torvalds #define fld_fwmark	nl_u.dn_u.fwmark
431da177e4SLinus Torvalds #define fld_scope	nl_u.dn_u.scope
441da177e4SLinus Torvalds #define fl6_dst		nl_u.ip6_u.daddr
451da177e4SLinus Torvalds #define fl6_src		nl_u.ip6_u.saddr
4675bff8f0SYOSHIFUJI Hideaki #define fl6_fwmark	nl_u.ip6_u.fwmark
471da177e4SLinus Torvalds #define fl6_flowlabel	nl_u.ip6_u.flowlabel
481da177e4SLinus Torvalds #define fl4_dst		nl_u.ip4_u.daddr
491da177e4SLinus Torvalds #define fl4_src		nl_u.ip4_u.saddr
501da177e4SLinus Torvalds #define fl4_fwmark	nl_u.ip4_u.fwmark
511da177e4SLinus Torvalds #define fl4_tos		nl_u.ip4_u.tos
521da177e4SLinus Torvalds #define fl4_scope	nl_u.ip4_u.scope
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds 	__u8	proto;
551da177e4SLinus Torvalds 	__u8	flags;
561da177e4SLinus Torvalds #define FLOWI_FLAG_MULTIPATHOLDROUTE 0x01
571da177e4SLinus Torvalds 	union {
581da177e4SLinus Torvalds 		struct {
59cc939d37SAl Viro 			__be16	sport;
60cc939d37SAl Viro 			__be16	dport;
611da177e4SLinus Torvalds 		} ports;
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds 		struct {
641da177e4SLinus Torvalds 			__u8	type;
651da177e4SLinus Torvalds 			__u8	code;
661da177e4SLinus Torvalds 		} icmpt;
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds 		struct {
69c4ea94abSSteven Whitehouse 			__le16	sport;
70c4ea94abSSteven Whitehouse 			__le16	dport;
711da177e4SLinus Torvalds 			__u8	objnum;
721da177e4SLinus Torvalds 			__u8	objnamel; /* Not 16 bits since max val is 16 */
731da177e4SLinus Torvalds 			__u8	objname[16]; /* Not zero terminated */
741da177e4SLinus Torvalds 		} dnports;
751da177e4SLinus Torvalds 
764324a174SAl Viro 		__be32		spi;
772b741653SMasahide NAKAMURA 
782b741653SMasahide NAKAMURA #ifdef CONFIG_IPV6_MIP6
792b741653SMasahide NAKAMURA 		struct {
802b741653SMasahide NAKAMURA 			__u8	type;
812b741653SMasahide NAKAMURA 		} mht;
822b741653SMasahide NAKAMURA #endif
831da177e4SLinus Torvalds 	} uli_u;
841da177e4SLinus Torvalds #define fl_ip_sport	uli_u.ports.sport
851da177e4SLinus Torvalds #define fl_ip_dport	uli_u.ports.dport
861da177e4SLinus Torvalds #define fl_icmp_type	uli_u.icmpt.type
871da177e4SLinus Torvalds #define fl_icmp_code	uli_u.icmpt.code
881da177e4SLinus Torvalds #define fl_ipsec_spi	uli_u.spi
892b741653SMasahide NAKAMURA #ifdef CONFIG_IPV6_MIP6
902b741653SMasahide NAKAMURA #define fl_mh_type	uli_u.mht.type
912b741653SMasahide NAKAMURA #endif
92b6340fcdSVenkat Yekkirala 	__u32           secid;	/* used by xfrm; see secid.txt */
931da177e4SLinus Torvalds } __attribute__((__aligned__(BITS_PER_LONG/8)));
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds #define FLOW_DIR_IN	0
961da177e4SLinus Torvalds #define FLOW_DIR_OUT	1
971da177e4SLinus Torvalds #define FLOW_DIR_FWD	2
981da177e4SLinus Torvalds 
99df71837dSTrent Jaeger struct sock;
100e0d1caa7SVenkat Yekkirala typedef void (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir,
1011da177e4SLinus Torvalds 			       void **objp, atomic_t **obj_refp);
1021da177e4SLinus Torvalds 
103e0d1caa7SVenkat Yekkirala extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
1041da177e4SLinus Torvalds 	 		       flow_resolve_t resolver);
1051da177e4SLinus Torvalds extern void flow_cache_flush(void);
1061da177e4SLinus Torvalds extern atomic_t flow_cache_genid;
1071da177e4SLinus Torvalds 
1081da177e4SLinus Torvalds #endif
109