2005-04-17 02:20:36 +04:00
/*
*
* Generic internet FLOW .
*
*/
# ifndef _NET_FLOW_H
# define _NET_FLOW_H
2011-09-05 20:47:24 +04:00
# include <linux/socket.h>
2005-04-17 02:20:36 +04:00
# include <linux/in6.h>
2011-07-27 03:09:06 +04:00
# include <linux/atomic.h>
2015-09-01 19:24:25 +03:00
# include <net/flow_dissector.h>
2016-11-03 20:23:42 +03:00
# include <linux/uidgid.h>
2005-04-17 02:20:36 +04:00
ipv4, fib: pass LOOPBACK_IFINDEX instead of 0 to flowi4_iif
As suggested by Julian:
Simply, flowi4_iif must not contain 0, it does not
look logical to ignore all ip rules with specified iif.
because in fib_rule_match() we do:
if (rule->iifindex && (rule->iifindex != fl->flowi_iif))
goto out;
flowi4_iif should be LOOPBACK_IFINDEX by default.
We need to move LOOPBACK_IFINDEX to include/net/flow.h:
1) It is mostly used by flowi_iif
2) Fix the following compile error if we use it in flow.h
by the patches latter:
In file included from include/linux/netfilter.h:277:0,
from include/net/netns/netfilter.h:5,
from include/net/net_namespace.h:21,
from include/linux/netdevice.h:43,
from include/linux/icmpv6.h:12,
from include/linux/ipv6.h:61,
from include/net/ipv6.h:16,
from include/linux/sunrpc/clnt.h:27,
from include/linux/nfs_fs.h:30,
from init/do_mounts.c:32:
include/net/flow.h: In function ‘flowi4_init_output’:
include/net/flow.h:84:32: error: ‘LOOPBACK_IFINDEX’ undeclared (first use in this function)
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Cong Wang <cwang@twopensource.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-04-16 03:25:34 +04:00
/*
* ifindex generation is per - net namespace , and loopback is
* always the 1 st device in ns ( see net_dev_init ) , thus any
* loopback device should get ifindex 1
*/
# define LOOPBACK_IFINDEX 1
2015-07-21 11:43:59 +03:00
struct flowi_tunnel {
__be64 tun_id ;
} ;
2011-03-12 02:22:00 +03:00
struct flowi_common {
int flowic_oif ;
int flowic_iif ;
__u32 flowic_mark ;
__u8 flowic_tos ;
__u8 flowic_scope ;
__u8 flowic_proto ;
__u8 flowic_flags ;
2011-03-11 23:55:37 +03:00
# define FLOWI_FLAG_ANYSRC 0x01
2013-08-28 10:04:14 +04:00
# define FLOWI_FLAG_KNOWN_NH 0x02
2016-09-10 22:10:02 +03:00
# define FLOWI_FLAG_SKIP_NH_OIF 0x04
2011-03-12 02:22:00 +03:00
__u32 flowic_secid ;
2015-07-21 11:43:59 +03:00
struct flowi_tunnel flowic_tun_key ;
2016-11-03 20:23:42 +03:00
kuid_t flowic_uid ;
2011-03-12 02:22:00 +03:00
} ;
2011-03-12 02:36:42 +03:00
union flowi_uli {
struct {
__be16 dport ;
2011-04-01 05:03:35 +04:00
__be16 sport ;
2011-03-12 02:36:42 +03:00
} ports ;
struct {
__u8 type ;
__u8 code ;
} icmpt ;
struct {
__le16 dport ;
2011-04-01 05:03:35 +04:00
__le16 sport ;
2011-03-12 02:36:42 +03:00
} dnports ;
__be32 spi ;
__be32 gre_key ;
struct {
__u8 type ;
} mht ;
} ;
2011-03-12 08:44:35 +03:00
struct flowi4 {
struct flowi_common __fl_common ;
2011-03-12 03:54:08 +03:00
# define flowi4_oif __fl_common.flowic_oif
# define flowi4_iif __fl_common.flowic_iif
# define flowi4_mark __fl_common.flowic_mark
# define flowi4_tos __fl_common.flowic_tos
# define flowi4_scope __fl_common.flowic_scope
# define flowi4_proto __fl_common.flowic_proto
# define flowi4_flags __fl_common.flowic_flags
# define flowi4_secid __fl_common.flowic_secid
2015-07-21 11:43:59 +03:00
# define flowi4_tun_key __fl_common.flowic_tun_key
2016-11-03 20:23:42 +03:00
# define flowi4_uid __fl_common.flowic_uid
2011-11-30 23:00:53 +04:00
/* (saddr,daddr) must be grouped, same order as in IP header */
2011-03-12 08:44:35 +03:00
__be32 saddr ;
2011-11-30 23:00:53 +04:00
__be32 daddr ;
2011-03-12 08:44:35 +03:00
union flowi_uli uli ;
2011-03-12 11:00:33 +03:00
# define fl4_sport uli.ports.sport
# define fl4_dport uli.ports.dport
# define fl4_icmp_type uli.icmpt.type
# define fl4_icmp_code uli.icmpt.code
# define fl4_ipsec_spi uli.spi
# define fl4_mh_type uli.mht.type
# define fl4_gre_key uli.gre_key
2011-09-05 20:47:23 +04:00
} __attribute__ ( ( __aligned__ ( BITS_PER_LONG / 8 ) ) ) ;
2011-03-12 08:44:35 +03:00
2011-03-31 15:52:14 +04:00
static inline void flowi4_init_output ( struct flowi4 * fl4 , int oif ,
__u32 mark , __u8 tos , __u8 scope ,
__u8 proto , __u8 flags ,
__be32 daddr , __be32 saddr ,
2016-11-03 20:23:43 +03:00
__be16 dport , __be16 sport ,
kuid_t uid )
2011-03-31 15:52:14 +04:00
{
fl4 - > flowi4_oif = oif ;
ipv4, fib: pass LOOPBACK_IFINDEX instead of 0 to flowi4_iif
As suggested by Julian:
Simply, flowi4_iif must not contain 0, it does not
look logical to ignore all ip rules with specified iif.
because in fib_rule_match() we do:
if (rule->iifindex && (rule->iifindex != fl->flowi_iif))
goto out;
flowi4_iif should be LOOPBACK_IFINDEX by default.
We need to move LOOPBACK_IFINDEX to include/net/flow.h:
1) It is mostly used by flowi_iif
2) Fix the following compile error if we use it in flow.h
by the patches latter:
In file included from include/linux/netfilter.h:277:0,
from include/net/netns/netfilter.h:5,
from include/net/net_namespace.h:21,
from include/linux/netdevice.h:43,
from include/linux/icmpv6.h:12,
from include/linux/ipv6.h:61,
from include/net/ipv6.h:16,
from include/linux/sunrpc/clnt.h:27,
from include/linux/nfs_fs.h:30,
from init/do_mounts.c:32:
include/net/flow.h: In function ‘flowi4_init_output’:
include/net/flow.h:84:32: error: ‘LOOPBACK_IFINDEX’ undeclared (first use in this function)
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Cong Wang <cwang@twopensource.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2014-04-16 03:25:34 +04:00
fl4 - > flowi4_iif = LOOPBACK_IFINDEX ;
2011-03-31 15:52:14 +04:00
fl4 - > flowi4_mark = mark ;
fl4 - > flowi4_tos = tos ;
fl4 - > flowi4_scope = scope ;
fl4 - > flowi4_proto = proto ;
fl4 - > flowi4_flags = flags ;
fl4 - > flowi4_secid = 0 ;
2015-07-21 11:43:59 +03:00
fl4 - > flowi4_tun_key . tun_id = 0 ;
2016-11-03 20:23:43 +03:00
fl4 - > flowi4_uid = uid ;
2011-03-31 15:52:14 +04:00
fl4 - > daddr = daddr ;
fl4 - > saddr = saddr ;
fl4 - > fl4_dport = dport ;
2011-04-01 05:03:35 +04:00
fl4 - > fl4_sport = sport ;
2011-03-31 15:52:14 +04:00
}
2012-02-04 17:04:46 +04:00
/* Reset some input parameters after previous lookup */
static inline void flowi4_update_output ( struct flowi4 * fl4 , int oif , __u8 tos ,
__be32 daddr , __be32 saddr )
{
fl4 - > flowi4_oif = oif ;
fl4 - > flowi4_tos = tos ;
fl4 - > daddr = daddr ;
fl4 - > saddr = saddr ;
}
2011-03-31 15:52:14 +04:00
2011-03-12 08:44:35 +03:00
struct flowi6 {
2011-03-12 02:22:00 +03:00
struct flowi_common __fl_common ;
2011-03-12 10:30:50 +03:00
# define flowi6_oif __fl_common.flowic_oif
# define flowi6_iif __fl_common.flowic_iif
# define flowi6_mark __fl_common.flowic_mark
# define flowi6_scope __fl_common.flowic_scope
# define flowi6_proto __fl_common.flowic_proto
# define flowi6_flags __fl_common.flowic_flags
# define flowi6_secid __fl_common.flowic_secid
2015-08-20 14:56:31 +03:00
# define flowi6_tun_key __fl_common.flowic_tun_key
2016-11-03 20:23:42 +03:00
# define flowi6_uid __fl_common.flowic_uid
2011-03-12 08:44:35 +03:00
struct in6_addr daddr ;
struct in6_addr saddr ;
2016-03-18 20:37:59 +03:00
/* Note: flowi6_tos is encoded in flowlabel, too. */
2011-03-12 08:44:35 +03:00
__be32 flowlabel ;
union flowi_uli uli ;
2011-03-13 00:36:19 +03:00
# define fl6_sport uli.ports.sport
# define fl6_dport uli.ports.dport
# define fl6_icmp_type uli.icmpt.type
# define fl6_icmp_code uli.icmpt.code
# define fl6_ipsec_spi uli.spi
# define fl6_mh_type uli.mht.type
# define fl6_gre_key uli.gre_key
2017-08-23 10:58:28 +03:00
__u32 mp_hash ;
2011-09-05 20:47:23 +04:00
} __attribute__ ( ( __aligned__ ( BITS_PER_LONG / 8 ) ) ) ;
2005-04-17 02:20:36 +04:00
2011-03-12 08:44:35 +03:00
struct flowidn {
struct flowi_common __fl_common ;
2011-03-13 01:17:10 +03:00
# define flowidn_oif __fl_common.flowic_oif
# define flowidn_iif __fl_common.flowic_iif
# define flowidn_mark __fl_common.flowic_mark
# define flowidn_scope __fl_common.flowic_scope
# define flowidn_proto __fl_common.flowic_proto
# define flowidn_flags __fl_common.flowic_flags
2011-03-12 08:44:35 +03:00
__le16 daddr ;
__le16 saddr ;
union flowi_uli uli ;
2011-03-13 01:17:10 +03:00
# define fld_sport uli.ports.sport
# define fld_dport uli.ports.dport
2011-09-05 20:47:23 +04:00
} __attribute__ ( ( __aligned__ ( BITS_PER_LONG / 8 ) ) ) ;
2011-03-12 08:44:35 +03:00
struct flowi {
2005-04-17 02:20:36 +04:00
union {
2011-03-12 08:44:35 +03:00
struct flowi_common __fl_common ;
struct flowi4 ip4 ;
struct flowi6 ip6 ;
struct flowidn dn ;
} u ;
# define flowi_oif u.__fl_common.flowic_oif
# define flowi_iif u.__fl_common.flowic_iif
# define flowi_mark u.__fl_common.flowic_mark
# define flowi_tos u.__fl_common.flowic_tos
# define flowi_scope u.__fl_common.flowic_scope
# define flowi_proto u.__fl_common.flowic_proto
# define flowi_flags u.__fl_common.flowic_flags
# define flowi_secid u.__fl_common.flowic_secid
2015-07-21 11:43:59 +03:00
# define flowi_tun_key u.__fl_common.flowic_tun_key
2016-11-03 20:23:42 +03:00
# define flowi_uid u.__fl_common.flowic_uid
2005-04-17 02:20:36 +04:00
} __attribute__ ( ( __aligned__ ( BITS_PER_LONG / 8 ) ) ) ;
2011-03-12 03:23:02 +03:00
static inline struct flowi * flowi4_to_flowi ( struct flowi4 * fl4 )
{
return container_of ( fl4 , struct flowi , u . ip4 ) ;
}
static inline struct flowi * flowi6_to_flowi ( struct flowi6 * fl6 )
{
return container_of ( fl6 , struct flowi , u . ip6 ) ;
}
static inline struct flowi * flowidn_to_flowi ( struct flowidn * fldn )
{
return container_of ( fldn , struct flowi , u . dn ) ;
}
2011-09-05 20:47:24 +04:00
typedef unsigned long flow_compare_t ;
2017-04-03 00:51:50 +03:00
static inline unsigned int flow_key_size ( u16 family )
2011-09-05 20:47:24 +04:00
{
switch ( family ) {
case AF_INET :
BUILD_BUG_ON ( sizeof ( struct flowi4 ) % sizeof ( flow_compare_t ) ) ;
return sizeof ( struct flowi4 ) / sizeof ( flow_compare_t ) ;
case AF_INET6 :
BUILD_BUG_ON ( sizeof ( struct flowi6 ) % sizeof ( flow_compare_t ) ) ;
return sizeof ( struct flowi6 ) / sizeof ( flow_compare_t ) ;
case AF_DECnet :
BUILD_BUG_ON ( sizeof ( struct flowidn ) % sizeof ( flow_compare_t ) ) ;
return sizeof ( struct flowidn ) / sizeof ( flow_compare_t ) ;
}
return 0 ;
}
2015-09-02 07:19:17 +03:00
__u32 __get_hash_from_flowi6 ( const struct flowi6 * fl6 , struct flow_keys * keys ) ;
2015-09-01 19:24:25 +03:00
2015-09-02 07:19:17 +03:00
static inline __u32 get_hash_from_flowi6 ( const struct flowi6 * fl6 )
2015-09-01 19:24:25 +03:00
{
struct flow_keys keys ;
return __get_hash_from_flowi6 ( fl6 , & keys ) ;
}
2015-09-02 07:19:17 +03:00
__u32 __get_hash_from_flowi4 ( const struct flowi4 * fl4 , struct flow_keys * keys ) ;
2015-09-01 19:24:25 +03:00
2015-09-02 07:19:17 +03:00
static inline __u32 get_hash_from_flowi4 ( const struct flowi4 * fl4 )
2015-09-01 19:24:25 +03:00
{
struct flow_keys keys ;
return __get_hash_from_flowi4 ( fl4 , & keys ) ;
}
2005-04-17 02:20:36 +04:00
# endif