cregit-Linux how code gets into the kernel

Release 4.15 include/net/flow.h

Directory: include/net
/* SPDX-License-Identifier: GPL-2.0 */
/*
 *
 *      Generic internet FLOW.
 *
 */

#ifndef _NET_FLOW_H

#define _NET_FLOW_H

#include <linux/socket.h>
#include <linux/in6.h>
#include <linux/atomic.h>
#include <net/flow_dissector.h>
#include <linux/uidgid.h>

/*
 * ifindex generation is per-net namespace, and loopback is
 * always the 1st device in ns (see net_dev_init), thus any
 * loopback device should get ifindex 1
 */


#define LOOPBACK_IFINDEX	1


struct flowi_tunnel {
	
__be64			tun_id;
};


struct flowi_common {
	
int	flowic_oif;
	
int	flowic_iif;
	
__u32	flowic_mark;
	
__u8	flowic_tos;
	
__u8	flowic_scope;
	
__u8	flowic_proto;
	
__u8	flowic_flags;

#define FLOWI_FLAG_ANYSRC		0x01

#define FLOWI_FLAG_KNOWN_NH		0x02

#define FLOWI_FLAG_SKIP_NH_OIF		0x04
	
__u32	flowic_secid;
	
struct flowi_tunnel flowic_tun_key;
	
kuid_t  flowic_uid;
};


union flowi_uli {
	struct {
		
__be16	dport;
		
__be16	sport;
	
} ports;

	struct {
		
__u8	type;
		
__u8	code;
	
} icmpt;

	struct {
		
__le16	dport;
		
__le16	sport;
	
} dnports;

	
__be32		spi;
	
__be32		gre_key;

	struct {
		
__u8	type;
	
} mht;
};


struct flowi4 {
	
struct flowi_common	__fl_common;

#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

#define flowi4_tun_key		__fl_common.flowic_tun_key

#define flowi4_uid		__fl_common.flowic_uid

	/* (saddr,daddr) must be grouped, same order as in IP header */
	
__be32			saddr;
	
__be32			daddr;

	
union flowi_uli		uli;

#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
} __attribute__((__aligned__(BITS_PER_LONG/8)));


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, __be16 dport, __be16 sport, kuid_t uid) { fl4->flowi4_oif = oif; fl4->flowi4_iif = LOOPBACK_IFINDEX; fl4->flowi4_mark = mark; fl4->flowi4_tos = tos; fl4->flowi4_scope = scope; fl4->flowi4_proto = proto; fl4->flowi4_flags = flags; fl4->flowi4_secid = 0; fl4->flowi4_tun_key.tun_id = 0; fl4->flowi4_uid = uid; fl4->daddr = daddr; fl4->saddr = saddr; fl4->fl4_dport = dport; fl4->fl4_sport = sport; }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller11285.50%233.33%
Lorenzo Colitti96.87%116.67%
Thomas Graf86.11%116.67%
Eric Dumazet10.76%116.67%
Cong Wang10.76%116.67%
Total131100.00%6100.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; }

Contributors

PersonTokensPropCommitsCommitProp
Julian Anastasov48100.00%1100.00%
Total48100.00%1100.00%

struct flowi6 { struct flowi_common __fl_common; #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 #define flowi6_tun_key __fl_common.flowic_tun_key #define flowi6_uid __fl_common.flowic_uid struct in6_addr daddr; struct in6_addr saddr; /* Note: flowi6_tos is encoded in flowlabel, too. */ __be32 flowlabel; union flowi_uli uli; #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 __u32 mp_hash; } __attribute__((__aligned__(BITS_PER_LONG/8))); struct flowidn { struct flowi_common __fl_common; #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 __le16 daddr; __le16 saddr; union flowi_uli uli; #define fld_sport uli.ports.sport #define fld_dport uli.ports.dport } __attribute__((__aligned__(BITS_PER_LONG/8))); struct flowi { union { 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 #define flowi_tun_key u.__fl_common.flowic_tun_key #define flowi_uid u.__fl_common.flowic_uid } __attribute__((__aligned__(BITS_PER_LONG/8)));
static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) { return container_of(fl4, struct flowi, u.ip4); }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller27100.00%1100.00%
Total27100.00%1100.00%


static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) { return container_of(fl6, struct flowi, u.ip6); }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller27100.00%1100.00%
Total27100.00%1100.00%


static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) { return container_of(fldn, struct flowi, u.dn); }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller27100.00%1100.00%
Total27100.00%1100.00%

typedef unsigned long flow_compare_t;
static inline unsigned int flow_key_size(u16 family) { 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; }

Contributors

PersonTokensPropCommitsCommitProp
David Ward10598.13%150.00%
Alexey Dobriyan21.87%150.00%
Total107100.00%2100.00%

__u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys);
static inline __u32 get_hash_from_flowi6(const struct flowi6 *fl6) { struct flow_keys keys; return __get_hash_from_flowi6(fl6, &keys); }

Contributors

PersonTokensPropCommitsCommitProp
Tom Herbert2596.15%150.00%
David S. Miller13.85%150.00%
Total26100.00%2100.00%

__u32 __get_hash_from_flowi4(const struct flowi4 *fl4, struct flow_keys *keys);
static inline __u32 get_hash_from_flowi4(const struct flowi4 *fl4) { struct flow_keys keys; return __get_hash_from_flowi4(fl4, &keys); }

Contributors

PersonTokensPropCommitsCommitProp
Tom Herbert2596.15%150.00%
David S. Miller13.85%150.00%
Total26100.00%2100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
David S. Miller50654.18%1534.09%
David Ward14615.63%24.55%
Tom Herbert818.67%12.27%
Julian Anastasov525.57%24.55%
Linus Torvalds (pre-git)343.64%24.55%
Thomas Graf303.21%24.55%
Lorenzo Colitti272.89%24.55%
Steven Whitehouse151.61%24.55%
Andrew Morton111.18%12.27%
Cong Wang60.64%12.27%
Eric Dumazet50.54%24.55%
David Ahern40.43%24.55%
Jiri Benc40.43%12.27%
Jakub Sitnicki30.32%12.27%
Herbert Xu20.21%12.27%
Alexey Dobriyan20.21%12.27%
Al Viro20.21%24.55%
Arun Sharma10.11%12.27%
Steffen Klassert10.11%12.27%
Greg Kroah-Hartman10.11%12.27%
Daniel Borkmann10.11%12.27%
Total934100.00%44100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.