Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  *
0004  *  Generic internet FLOW.
0005  *
0006  */
0007 
0008 #ifndef _NET_FLOW_H
0009 #define _NET_FLOW_H
0010 
0011 #include <linux/socket.h>
0012 #include <linux/in6.h>
0013 #include <linux/atomic.h>
0014 #include <net/flow_dissector.h>
0015 #include <linux/uidgid.h>
0016 
0017 /*
0018  * ifindex generation is per-net namespace, and loopback is
0019  * always the 1st device in ns (see net_dev_init), thus any
0020  * loopback device should get ifindex 1
0021  */
0022 
0023 #define LOOPBACK_IFINDEX    1
0024 
0025 struct flowi_tunnel {
0026     __be64          tun_id;
0027 };
0028 
0029 struct flowi_common {
0030     int flowic_oif;
0031     int flowic_iif;
0032     int     flowic_l3mdev;
0033     __u32   flowic_mark;
0034     __u8    flowic_tos;
0035     __u8    flowic_scope;
0036     __u8    flowic_proto;
0037     __u8    flowic_flags;
0038 #define FLOWI_FLAG_ANYSRC       0x01
0039 #define FLOWI_FLAG_KNOWN_NH     0x02
0040     __u32   flowic_secid;
0041     kuid_t  flowic_uid;
0042     struct flowi_tunnel flowic_tun_key;
0043     __u32       flowic_multipath_hash;
0044 };
0045 
0046 union flowi_uli {
0047     struct {
0048         __be16  dport;
0049         __be16  sport;
0050     } ports;
0051 
0052     struct {
0053         __u8    type;
0054         __u8    code;
0055     } icmpt;
0056 
0057     struct {
0058         __le16  dport;
0059         __le16  sport;
0060     } dnports;
0061 
0062     __be32      gre_key;
0063 
0064     struct {
0065         __u8    type;
0066     } mht;
0067 };
0068 
0069 struct flowi4 {
0070     struct flowi_common __fl_common;
0071 #define flowi4_oif      __fl_common.flowic_oif
0072 #define flowi4_iif      __fl_common.flowic_iif
0073 #define flowi4_l3mdev       __fl_common.flowic_l3mdev
0074 #define flowi4_mark     __fl_common.flowic_mark
0075 #define flowi4_tos      __fl_common.flowic_tos
0076 #define flowi4_scope        __fl_common.flowic_scope
0077 #define flowi4_proto        __fl_common.flowic_proto
0078 #define flowi4_flags        __fl_common.flowic_flags
0079 #define flowi4_secid        __fl_common.flowic_secid
0080 #define flowi4_tun_key      __fl_common.flowic_tun_key
0081 #define flowi4_uid      __fl_common.flowic_uid
0082 #define flowi4_multipath_hash   __fl_common.flowic_multipath_hash
0083 
0084     /* (saddr,daddr) must be grouped, same order as in IP header */
0085     __be32          saddr;
0086     __be32          daddr;
0087 
0088     union flowi_uli     uli;
0089 #define fl4_sport       uli.ports.sport
0090 #define fl4_dport       uli.ports.dport
0091 #define fl4_icmp_type       uli.icmpt.type
0092 #define fl4_icmp_code       uli.icmpt.code
0093 #define fl4_mh_type     uli.mht.type
0094 #define fl4_gre_key     uli.gre_key
0095 } __attribute__((__aligned__(BITS_PER_LONG/8)));
0096 
0097 static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
0098                       __u32 mark, __u8 tos, __u8 scope,
0099                       __u8 proto, __u8 flags,
0100                       __be32 daddr, __be32 saddr,
0101                       __be16 dport, __be16 sport,
0102                       kuid_t uid)
0103 {
0104     fl4->flowi4_oif = oif;
0105     fl4->flowi4_iif = LOOPBACK_IFINDEX;
0106     fl4->flowi4_l3mdev = 0;
0107     fl4->flowi4_mark = mark;
0108     fl4->flowi4_tos = tos;
0109     fl4->flowi4_scope = scope;
0110     fl4->flowi4_proto = proto;
0111     fl4->flowi4_flags = flags;
0112     fl4->flowi4_secid = 0;
0113     fl4->flowi4_tun_key.tun_id = 0;
0114     fl4->flowi4_uid = uid;
0115     fl4->daddr = daddr;
0116     fl4->saddr = saddr;
0117     fl4->fl4_dport = dport;
0118     fl4->fl4_sport = sport;
0119     fl4->flowi4_multipath_hash = 0;
0120 }
0121 
0122 /* Reset some input parameters after previous lookup */
0123 static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos,
0124                     __be32 daddr, __be32 saddr)
0125 {
0126     fl4->flowi4_oif = oif;
0127     fl4->flowi4_tos = tos;
0128     fl4->daddr = daddr;
0129     fl4->saddr = saddr;
0130 }
0131 
0132 
0133 struct flowi6 {
0134     struct flowi_common __fl_common;
0135 #define flowi6_oif      __fl_common.flowic_oif
0136 #define flowi6_iif      __fl_common.flowic_iif
0137 #define flowi6_l3mdev       __fl_common.flowic_l3mdev
0138 #define flowi6_mark     __fl_common.flowic_mark
0139 #define flowi6_scope        __fl_common.flowic_scope
0140 #define flowi6_proto        __fl_common.flowic_proto
0141 #define flowi6_flags        __fl_common.flowic_flags
0142 #define flowi6_secid        __fl_common.flowic_secid
0143 #define flowi6_tun_key      __fl_common.flowic_tun_key
0144 #define flowi6_uid      __fl_common.flowic_uid
0145     struct in6_addr     daddr;
0146     struct in6_addr     saddr;
0147     /* Note: flowi6_tos is encoded in flowlabel, too. */
0148     __be32          flowlabel;
0149     union flowi_uli     uli;
0150 #define fl6_sport       uli.ports.sport
0151 #define fl6_dport       uli.ports.dport
0152 #define fl6_icmp_type       uli.icmpt.type
0153 #define fl6_icmp_code       uli.icmpt.code
0154 #define fl6_mh_type     uli.mht.type
0155 #define fl6_gre_key     uli.gre_key
0156     __u32           mp_hash;
0157 } __attribute__((__aligned__(BITS_PER_LONG/8)));
0158 
0159 struct flowidn {
0160     struct flowi_common __fl_common;
0161 #define flowidn_oif     __fl_common.flowic_oif
0162 #define flowidn_iif     __fl_common.flowic_iif
0163 #define flowidn_mark        __fl_common.flowic_mark
0164 #define flowidn_scope       __fl_common.flowic_scope
0165 #define flowidn_proto       __fl_common.flowic_proto
0166 #define flowidn_flags       __fl_common.flowic_flags
0167     __le16          daddr;
0168     __le16          saddr;
0169     union flowi_uli     uli;
0170 #define fld_sport       uli.ports.sport
0171 #define fld_dport       uli.ports.dport
0172 } __attribute__((__aligned__(BITS_PER_LONG/8)));
0173 
0174 struct flowi {
0175     union {
0176         struct flowi_common __fl_common;
0177         struct flowi4       ip4;
0178         struct flowi6       ip6;
0179         struct flowidn      dn;
0180     } u;
0181 #define flowi_oif   u.__fl_common.flowic_oif
0182 #define flowi_iif   u.__fl_common.flowic_iif
0183 #define flowi_l3mdev    u.__fl_common.flowic_l3mdev
0184 #define flowi_mark  u.__fl_common.flowic_mark
0185 #define flowi_tos   u.__fl_common.flowic_tos
0186 #define flowi_scope u.__fl_common.flowic_scope
0187 #define flowi_proto u.__fl_common.flowic_proto
0188 #define flowi_flags u.__fl_common.flowic_flags
0189 #define flowi_secid u.__fl_common.flowic_secid
0190 #define flowi_tun_key   u.__fl_common.flowic_tun_key
0191 #define flowi_uid   u.__fl_common.flowic_uid
0192 } __attribute__((__aligned__(BITS_PER_LONG/8)));
0193 
0194 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
0195 {
0196     return container_of(fl4, struct flowi, u.ip4);
0197 }
0198 
0199 static inline struct flowi_common *flowi4_to_flowi_common(struct flowi4 *fl4)
0200 {
0201     return &(fl4->__fl_common);
0202 }
0203 
0204 static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
0205 {
0206     return container_of(fl6, struct flowi, u.ip6);
0207 }
0208 
0209 static inline struct flowi_common *flowi6_to_flowi_common(struct flowi6 *fl6)
0210 {
0211     return &(fl6->__fl_common);
0212 }
0213 
0214 static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
0215 {
0216     return container_of(fldn, struct flowi, u.dn);
0217 }
0218 
0219 __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys);
0220 
0221 #endif