xref: /openbmc/linux/include/net/flow.h (revision dee9f4bc)
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;
1647dcf0cbSThomas Graf 	__u32	mark;
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds 	union {
191da177e4SLinus Torvalds 		struct {
20f2c3fe24SAl Viro 			__be32			daddr;
21f2c3fe24SAl Viro 			__be32			saddr;
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;
2990bcaf7bSAl Viro 			__be32			flowlabel;
301da177e4SLinus Torvalds 		} ip6_u;
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds 		struct {
33c4ea94abSSteven Whitehouse 			__le16			daddr;
34c4ea94abSSteven Whitehouse 			__le16			saddr;
351da177e4SLinus Torvalds 			__u8			scope;
361da177e4SLinus Torvalds 		} dn_u;
371da177e4SLinus Torvalds 	} nl_u;
381da177e4SLinus Torvalds #define fld_dst		nl_u.dn_u.daddr
391da177e4SLinus Torvalds #define fld_src		nl_u.dn_u.saddr
401da177e4SLinus Torvalds #define fld_scope	nl_u.dn_u.scope
411da177e4SLinus Torvalds #define fl6_dst		nl_u.ip6_u.daddr
421da177e4SLinus Torvalds #define fl6_src		nl_u.ip6_u.saddr
431da177e4SLinus Torvalds #define fl6_flowlabel	nl_u.ip6_u.flowlabel
441da177e4SLinus Torvalds #define fl4_dst		nl_u.ip4_u.daddr
451da177e4SLinus Torvalds #define fl4_src		nl_u.ip4_u.saddr
461da177e4SLinus Torvalds #define fl4_tos		nl_u.ip4_u.tos
471da177e4SLinus Torvalds #define fl4_scope	nl_u.ip4_u.scope
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds 	__u8	proto;
50a210d01aSJulian Anastasov 	__u8	flags;
51a210d01aSJulian Anastasov #define FLOWI_FLAG_ANYSRC		0x01
52a4daad6bSDavid S. Miller #define FLOWI_FLAG_PRECOW_METRICS	0x02
531da177e4SLinus Torvalds 	union {
541da177e4SLinus Torvalds 		struct {
55cc939d37SAl Viro 			__be16	sport;
56cc939d37SAl Viro 			__be16	dport;
571da177e4SLinus Torvalds 		} ports;
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds 		struct {
601da177e4SLinus Torvalds 			__u8	type;
611da177e4SLinus Torvalds 			__u8	code;
621da177e4SLinus Torvalds 		} icmpt;
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds 		struct {
65c4ea94abSSteven Whitehouse 			__le16	sport;
66c4ea94abSSteven Whitehouse 			__le16	dport;
671da177e4SLinus Torvalds 		} dnports;
681da177e4SLinus Torvalds 
694324a174SAl Viro 		__be32		spi;
70cc9ff19dSTimo Teräs 		__be32		gre_key;
712b741653SMasahide NAKAMURA 
722b741653SMasahide NAKAMURA 		struct {
732b741653SMasahide NAKAMURA 			__u8	type;
742b741653SMasahide NAKAMURA 		} mht;
751da177e4SLinus Torvalds 	} uli_u;
761da177e4SLinus Torvalds #define fl_ip_sport	uli_u.ports.sport
771da177e4SLinus Torvalds #define fl_ip_dport	uli_u.ports.dport
781da177e4SLinus Torvalds #define fl_icmp_type	uli_u.icmpt.type
791da177e4SLinus Torvalds #define fl_icmp_code	uli_u.icmpt.code
801da177e4SLinus Torvalds #define fl_ipsec_spi	uli_u.spi
812b741653SMasahide NAKAMURA #define fl_mh_type	uli_u.mht.type
82cc9ff19dSTimo Teräs #define fl_gre_key	uli_u.gre_key
83b6340fcdSVenkat Yekkirala 	__u32           secid;	/* used by xfrm; see secid.txt */
841da177e4SLinus Torvalds } __attribute__((__aligned__(BITS_PER_LONG/8)));
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds #define FLOW_DIR_IN	0
871da177e4SLinus Torvalds #define FLOW_DIR_OUT	1
881da177e4SLinus Torvalds #define FLOW_DIR_FWD	2
891da177e4SLinus Torvalds 
9052479b62SAlexey Dobriyan struct net;
91df71837dSTrent Jaeger struct sock;
92fe1a5f03STimo Teräs struct flow_cache_ops;
931da177e4SLinus Torvalds 
94fe1a5f03STimo Teräs struct flow_cache_object {
95fe1a5f03STimo Teräs 	const struct flow_cache_ops *ops;
96fe1a5f03STimo Teräs };
97fe1a5f03STimo Teräs 
98fe1a5f03STimo Teräs struct flow_cache_ops {
99fe1a5f03STimo Teräs 	struct flow_cache_object *(*get)(struct flow_cache_object *);
100fe1a5f03STimo Teräs 	int (*check)(struct flow_cache_object *);
101fe1a5f03STimo Teräs 	void (*delete)(struct flow_cache_object *);
102fe1a5f03STimo Teräs };
103fe1a5f03STimo Teräs 
104fe1a5f03STimo Teräs typedef struct flow_cache_object *(*flow_resolve_t)(
105dee9f4bcSDavid S. Miller 		struct net *net, const struct flowi *key, u16 family,
106fe1a5f03STimo Teräs 		u8 dir, struct flow_cache_object *oldobj, void *ctx);
107fe1a5f03STimo Teräs 
108fe1a5f03STimo Teräs extern struct flow_cache_object *flow_cache_lookup(
109dee9f4bcSDavid S. Miller 		struct net *net, const struct flowi *key, u16 family,
110fe1a5f03STimo Teräs 		u8 dir, flow_resolve_t resolver, void *ctx);
111fe1a5f03STimo Teräs 
1121da177e4SLinus Torvalds extern void flow_cache_flush(void);
1131da177e4SLinus Torvalds extern atomic_t flow_cache_genid;
1141da177e4SLinus Torvalds 
1150730b9a1SDavid S. Miller static inline int flow_cache_uli_match(const struct flowi *fl1,
1160730b9a1SDavid S. Miller 				       const struct flowi *fl2)
117157bfc25SMasahide NAKAMURA {
118157bfc25SMasahide NAKAMURA 	return (fl1->proto == fl2->proto &&
119157bfc25SMasahide NAKAMURA 		!memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u)));
120157bfc25SMasahide NAKAMURA }
121157bfc25SMasahide NAKAMURA 
1221da177e4SLinus Torvalds #endif
123