cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

flow.h (5822B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 *
      4 *	Generic internet FLOW.
      5 *
      6 */
      7
      8#ifndef _NET_FLOW_H
      9#define _NET_FLOW_H
     10
     11#include <linux/socket.h>
     12#include <linux/in6.h>
     13#include <linux/atomic.h>
     14#include <net/flow_dissector.h>
     15#include <linux/uidgid.h>
     16
     17/*
     18 * ifindex generation is per-net namespace, and loopback is
     19 * always the 1st device in ns (see net_dev_init), thus any
     20 * loopback device should get ifindex 1
     21 */
     22
     23#define LOOPBACK_IFINDEX	1
     24
     25struct flowi_tunnel {
     26	__be64			tun_id;
     27};
     28
     29struct flowi_common {
     30	int	flowic_oif;
     31	int	flowic_iif;
     32	int     flowic_l3mdev;
     33	__u32	flowic_mark;
     34	__u8	flowic_tos;
     35	__u8	flowic_scope;
     36	__u8	flowic_proto;
     37	__u8	flowic_flags;
     38#define FLOWI_FLAG_ANYSRC		0x01
     39#define FLOWI_FLAG_KNOWN_NH		0x02
     40	__u32	flowic_secid;
     41	kuid_t  flowic_uid;
     42	struct flowi_tunnel flowic_tun_key;
     43	__u32		flowic_multipath_hash;
     44};
     45
     46union flowi_uli {
     47	struct {
     48		__be16	dport;
     49		__be16	sport;
     50	} ports;
     51
     52	struct {
     53		__u8	type;
     54		__u8	code;
     55	} icmpt;
     56
     57	struct {
     58		__le16	dport;
     59		__le16	sport;
     60	} dnports;
     61
     62	__be32		gre_key;
     63
     64	struct {
     65		__u8	type;
     66	} mht;
     67};
     68
     69struct flowi4 {
     70	struct flowi_common	__fl_common;
     71#define flowi4_oif		__fl_common.flowic_oif
     72#define flowi4_iif		__fl_common.flowic_iif
     73#define flowi4_l3mdev		__fl_common.flowic_l3mdev
     74#define flowi4_mark		__fl_common.flowic_mark
     75#define flowi4_tos		__fl_common.flowic_tos
     76#define flowi4_scope		__fl_common.flowic_scope
     77#define flowi4_proto		__fl_common.flowic_proto
     78#define flowi4_flags		__fl_common.flowic_flags
     79#define flowi4_secid		__fl_common.flowic_secid
     80#define flowi4_tun_key		__fl_common.flowic_tun_key
     81#define flowi4_uid		__fl_common.flowic_uid
     82#define flowi4_multipath_hash	__fl_common.flowic_multipath_hash
     83
     84	/* (saddr,daddr) must be grouped, same order as in IP header */
     85	__be32			saddr;
     86	__be32			daddr;
     87
     88	union flowi_uli		uli;
     89#define fl4_sport		uli.ports.sport
     90#define fl4_dport		uli.ports.dport
     91#define fl4_icmp_type		uli.icmpt.type
     92#define fl4_icmp_code		uli.icmpt.code
     93#define fl4_mh_type		uli.mht.type
     94#define fl4_gre_key		uli.gre_key
     95} __attribute__((__aligned__(BITS_PER_LONG/8)));
     96
     97static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
     98				      __u32 mark, __u8 tos, __u8 scope,
     99				      __u8 proto, __u8 flags,
    100				      __be32 daddr, __be32 saddr,
    101				      __be16 dport, __be16 sport,
    102				      kuid_t uid)
    103{
    104	fl4->flowi4_oif = oif;
    105	fl4->flowi4_iif = LOOPBACK_IFINDEX;
    106	fl4->flowi4_l3mdev = 0;
    107	fl4->flowi4_mark = mark;
    108	fl4->flowi4_tos = tos;
    109	fl4->flowi4_scope = scope;
    110	fl4->flowi4_proto = proto;
    111	fl4->flowi4_flags = flags;
    112	fl4->flowi4_secid = 0;
    113	fl4->flowi4_tun_key.tun_id = 0;
    114	fl4->flowi4_uid = uid;
    115	fl4->daddr = daddr;
    116	fl4->saddr = saddr;
    117	fl4->fl4_dport = dport;
    118	fl4->fl4_sport = sport;
    119	fl4->flowi4_multipath_hash = 0;
    120}
    121
    122/* Reset some input parameters after previous lookup */
    123static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos,
    124					__be32 daddr, __be32 saddr)
    125{
    126	fl4->flowi4_oif = oif;
    127	fl4->flowi4_tos = tos;
    128	fl4->daddr = daddr;
    129	fl4->saddr = saddr;
    130}
    131
    132
    133struct flowi6 {
    134	struct flowi_common	__fl_common;
    135#define flowi6_oif		__fl_common.flowic_oif
    136#define flowi6_iif		__fl_common.flowic_iif
    137#define flowi6_l3mdev		__fl_common.flowic_l3mdev
    138#define flowi6_mark		__fl_common.flowic_mark
    139#define flowi6_scope		__fl_common.flowic_scope
    140#define flowi6_proto		__fl_common.flowic_proto
    141#define flowi6_flags		__fl_common.flowic_flags
    142#define flowi6_secid		__fl_common.flowic_secid
    143#define flowi6_tun_key		__fl_common.flowic_tun_key
    144#define flowi6_uid		__fl_common.flowic_uid
    145	struct in6_addr		daddr;
    146	struct in6_addr		saddr;
    147	/* Note: flowi6_tos is encoded in flowlabel, too. */
    148	__be32			flowlabel;
    149	union flowi_uli		uli;
    150#define fl6_sport		uli.ports.sport
    151#define fl6_dport		uli.ports.dport
    152#define fl6_icmp_type		uli.icmpt.type
    153#define fl6_icmp_code		uli.icmpt.code
    154#define fl6_mh_type		uli.mht.type
    155#define fl6_gre_key		uli.gre_key
    156	__u32			mp_hash;
    157} __attribute__((__aligned__(BITS_PER_LONG/8)));
    158
    159struct flowidn {
    160	struct flowi_common	__fl_common;
    161#define flowidn_oif		__fl_common.flowic_oif
    162#define flowidn_iif		__fl_common.flowic_iif
    163#define flowidn_mark		__fl_common.flowic_mark
    164#define flowidn_scope		__fl_common.flowic_scope
    165#define flowidn_proto		__fl_common.flowic_proto
    166#define flowidn_flags		__fl_common.flowic_flags
    167	__le16			daddr;
    168	__le16			saddr;
    169	union flowi_uli		uli;
    170#define fld_sport		uli.ports.sport
    171#define fld_dport		uli.ports.dport
    172} __attribute__((__aligned__(BITS_PER_LONG/8)));
    173
    174struct flowi {
    175	union {
    176		struct flowi_common	__fl_common;
    177		struct flowi4		ip4;
    178		struct flowi6		ip6;
    179		struct flowidn		dn;
    180	} u;
    181#define flowi_oif	u.__fl_common.flowic_oif
    182#define flowi_iif	u.__fl_common.flowic_iif
    183#define flowi_l3mdev	u.__fl_common.flowic_l3mdev
    184#define flowi_mark	u.__fl_common.flowic_mark
    185#define flowi_tos	u.__fl_common.flowic_tos
    186#define flowi_scope	u.__fl_common.flowic_scope
    187#define flowi_proto	u.__fl_common.flowic_proto
    188#define flowi_flags	u.__fl_common.flowic_flags
    189#define flowi_secid	u.__fl_common.flowic_secid
    190#define flowi_tun_key	u.__fl_common.flowic_tun_key
    191#define flowi_uid	u.__fl_common.flowic_uid
    192} __attribute__((__aligned__(BITS_PER_LONG/8)));
    193
    194static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
    195{
    196	return container_of(fl4, struct flowi, u.ip4);
    197}
    198
    199static inline struct flowi_common *flowi4_to_flowi_common(struct flowi4 *fl4)
    200{
    201	return &(fl4->__fl_common);
    202}
    203
    204static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
    205{
    206	return container_of(fl6, struct flowi, u.ip6);
    207}
    208
    209static inline struct flowi_common *flowi6_to_flowi_common(struct flowi6 *fl6)
    210{
    211	return &(fl6->__fl_common);
    212}
    213
    214static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
    215{
    216	return container_of(fldn, struct flowi, u.dn);
    217}
    218
    219__u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys);
    220
    221#endif