root/include/net/flow.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. flowi4_init_output
  2. flowi4_update_output
  3. flowi4_to_flowi
  4. flowi6_to_flowi
  5. flowidn_to_flowi
  6. flow_key_size

   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 
  25 struct flowi_tunnel {
  26         __be64                  tun_id;
  27 };
  28 
  29 struct flowi_common {
  30         int     flowic_oif;
  31         int     flowic_iif;
  32         __u32   flowic_mark;
  33         __u8    flowic_tos;
  34         __u8    flowic_scope;
  35         __u8    flowic_proto;
  36         __u8    flowic_flags;
  37 #define FLOWI_FLAG_ANYSRC               0x01
  38 #define FLOWI_FLAG_KNOWN_NH             0x02
  39 #define FLOWI_FLAG_SKIP_NH_OIF          0x04
  40         __u32   flowic_secid;
  41         kuid_t  flowic_uid;
  42         struct flowi_tunnel flowic_tun_key;
  43         __u32           flowic_multipath_hash;
  44 };
  45 
  46 union 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          spi;
  63         __be32          gre_key;
  64 
  65         struct {
  66                 __u8    type;
  67         } mht;
  68 };
  69 
  70 struct flowi4 {
  71         struct flowi_common     __fl_common;
  72 #define flowi4_oif              __fl_common.flowic_oif
  73 #define flowi4_iif              __fl_common.flowic_iif
  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_ipsec_spi           uli.spi
  94 #define fl4_mh_type             uli.mht.type
  95 #define fl4_gre_key             uli.gre_key
  96 } __attribute__((__aligned__(BITS_PER_LONG/8)));
  97 
  98 static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
  99                                       __u32 mark, __u8 tos, __u8 scope,
 100                                       __u8 proto, __u8 flags,
 101                                       __be32 daddr, __be32 saddr,
 102                                       __be16 dport, __be16 sport,
 103                                       kuid_t uid)
 104 {
 105         fl4->flowi4_oif = oif;
 106         fl4->flowi4_iif = LOOPBACK_IFINDEX;
 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 }
 120 
 121 /* Reset some input parameters after previous lookup */
 122 static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos,
 123                                         __be32 daddr, __be32 saddr)
 124 {
 125         fl4->flowi4_oif = oif;
 126         fl4->flowi4_tos = tos;
 127         fl4->daddr = daddr;
 128         fl4->saddr = saddr;
 129 }
 130 
 131 
 132 struct flowi6 {
 133         struct flowi_common     __fl_common;
 134 #define flowi6_oif              __fl_common.flowic_oif
 135 #define flowi6_iif              __fl_common.flowic_iif
 136 #define flowi6_mark             __fl_common.flowic_mark
 137 #define flowi6_scope            __fl_common.flowic_scope
 138 #define flowi6_proto            __fl_common.flowic_proto
 139 #define flowi6_flags            __fl_common.flowic_flags
 140 #define flowi6_secid            __fl_common.flowic_secid
 141 #define flowi6_tun_key          __fl_common.flowic_tun_key
 142 #define flowi6_uid              __fl_common.flowic_uid
 143         struct in6_addr         daddr;
 144         struct in6_addr         saddr;
 145         /* Note: flowi6_tos is encoded in flowlabel, too. */
 146         __be32                  flowlabel;
 147         union flowi_uli         uli;
 148 #define fl6_sport               uli.ports.sport
 149 #define fl6_dport               uli.ports.dport
 150 #define fl6_icmp_type           uli.icmpt.type
 151 #define fl6_icmp_code           uli.icmpt.code
 152 #define fl6_ipsec_spi           uli.spi
 153 #define fl6_mh_type             uli.mht.type
 154 #define fl6_gre_key             uli.gre_key
 155         __u32                   mp_hash;
 156 } __attribute__((__aligned__(BITS_PER_LONG/8)));
 157 
 158 struct flowidn {
 159         struct flowi_common     __fl_common;
 160 #define flowidn_oif             __fl_common.flowic_oif
 161 #define flowidn_iif             __fl_common.flowic_iif
 162 #define flowidn_mark            __fl_common.flowic_mark
 163 #define flowidn_scope           __fl_common.flowic_scope
 164 #define flowidn_proto           __fl_common.flowic_proto
 165 #define flowidn_flags           __fl_common.flowic_flags
 166         __le16                  daddr;
 167         __le16                  saddr;
 168         union flowi_uli         uli;
 169 #define fld_sport               uli.ports.sport
 170 #define fld_dport               uli.ports.dport
 171 } __attribute__((__aligned__(BITS_PER_LONG/8)));
 172 
 173 struct flowi {
 174         union {
 175                 struct flowi_common     __fl_common;
 176                 struct flowi4           ip4;
 177                 struct flowi6           ip6;
 178                 struct flowidn          dn;
 179         } u;
 180 #define flowi_oif       u.__fl_common.flowic_oif
 181 #define flowi_iif       u.__fl_common.flowic_iif
 182 #define flowi_mark      u.__fl_common.flowic_mark
 183 #define flowi_tos       u.__fl_common.flowic_tos
 184 #define flowi_scope     u.__fl_common.flowic_scope
 185 #define flowi_proto     u.__fl_common.flowic_proto
 186 #define flowi_flags     u.__fl_common.flowic_flags
 187 #define flowi_secid     u.__fl_common.flowic_secid
 188 #define flowi_tun_key   u.__fl_common.flowic_tun_key
 189 #define flowi_uid       u.__fl_common.flowic_uid
 190 } __attribute__((__aligned__(BITS_PER_LONG/8)));
 191 
 192 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
 193 {
 194         return container_of(fl4, struct flowi, u.ip4);
 195 }
 196 
 197 static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
 198 {
 199         return container_of(fl6, struct flowi, u.ip6);
 200 }
 201 
 202 static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
 203 {
 204         return container_of(fldn, struct flowi, u.dn);
 205 }
 206 
 207 typedef unsigned long flow_compare_t;
 208 
 209 static inline unsigned int flow_key_size(u16 family)
 210 {
 211         switch (family) {
 212         case AF_INET:
 213                 BUILD_BUG_ON(sizeof(struct flowi4) % sizeof(flow_compare_t));
 214                 return sizeof(struct flowi4) / sizeof(flow_compare_t);
 215         case AF_INET6:
 216                 BUILD_BUG_ON(sizeof(struct flowi6) % sizeof(flow_compare_t));
 217                 return sizeof(struct flowi6) / sizeof(flow_compare_t);
 218         case AF_DECnet:
 219                 BUILD_BUG_ON(sizeof(struct flowidn) % sizeof(flow_compare_t));
 220                 return sizeof(struct flowidn) / sizeof(flow_compare_t);
 221         }
 222         return 0;
 223 }
 224 
 225 __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys);
 226 
 227 #endif

/* [<][>][^][v][top][bottom][index][help] */