0001
0002
0003
0004
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
0019
0020
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
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
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
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