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_xfrm { 30 __u32 if_id; 31 }; 32 33 struct flowi_common { 34 int flowic_oif; 35 int flowic_iif; 36 __u32 flowic_mark; 37 __u8 flowic_tos; 38 __u8 flowic_scope; 39 __u8 flowic_proto; 40 __u8 flowic_flags; 41 #define FLOWI_FLAG_ANYSRC 0x01 42 #define FLOWI_FLAG_KNOWN_NH 0x02 43 #define FLOWI_FLAG_SKIP_NH_OIF 0x04 44 __u32 flowic_secid; 45 struct flowi_tunnel flowic_tun_key; 46 struct flowi_xfrm xfrm; 47 kuid_t flowic_uid; 48 }; 49 50 union flowi_uli { 51 struct { 52 __be16 dport; 53 __be16 sport; 54 } ports; 55 56 struct { 57 __u8 type; 58 __u8 code; 59 } icmpt; 60 61 struct { 62 __le16 dport; 63 __le16 sport; 64 } dnports; 65 66 __be32 spi; 67 __be32 gre_key; 68 69 struct { 70 __u8 type; 71 } mht; 72 }; 73 74 struct flowi4 { 75 struct flowi_common __fl_common; 76 #define flowi4_oif __fl_common.flowic_oif 77 #define flowi4_iif __fl_common.flowic_iif 78 #define flowi4_mark __fl_common.flowic_mark 79 #define flowi4_tos __fl_common.flowic_tos 80 #define flowi4_scope __fl_common.flowic_scope 81 #define flowi4_proto __fl_common.flowic_proto 82 #define flowi4_flags __fl_common.flowic_flags 83 #define flowi4_secid __fl_common.flowic_secid 84 #define flowi4_tun_key __fl_common.flowic_tun_key 85 #define flowi4_uid __fl_common.flowic_uid 86 #define flowi4_xfrm __fl_common.xfrm 87 88 /* (saddr,daddr) must be grouped, same order as in IP header */ 89 __be32 saddr; 90 __be32 daddr; 91 92 union flowi_uli uli; 93 #define fl4_sport uli.ports.sport 94 #define fl4_dport uli.ports.dport 95 #define fl4_icmp_type uli.icmpt.type 96 #define fl4_icmp_code uli.icmpt.code 97 #define fl4_ipsec_spi uli.spi 98 #define fl4_mh_type uli.mht.type 99 #define fl4_gre_key uli.gre_key 100 } __attribute__((__aligned__(BITS_PER_LONG/8))); 101 102 static inline void flowi4_init_output(struct flowi4 *fl4, int oif, 103 __u32 mark, __u8 tos, __u8 scope, 104 __u8 proto, __u8 flags, 105 __be32 daddr, __be32 saddr, 106 __be16 dport, __be16 sport, 107 kuid_t uid) 108 { 109 fl4->flowi4_oif = oif; 110 fl4->flowi4_iif = LOOPBACK_IFINDEX; 111 fl4->flowi4_mark = mark; 112 fl4->flowi4_tos = tos; 113 fl4->flowi4_scope = scope; 114 fl4->flowi4_proto = proto; 115 fl4->flowi4_flags = flags; 116 fl4->flowi4_secid = 0; 117 fl4->flowi4_tun_key.tun_id = 0; 118 fl4->flowi4_xfrm.if_id = 0; 119 fl4->flowi4_uid = uid; 120 fl4->daddr = daddr; 121 fl4->saddr = saddr; 122 fl4->fl4_dport = dport; 123 fl4->fl4_sport = sport; 124 } 125 126 /* Reset some input parameters after previous lookup */ 127 static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos, 128 __be32 daddr, __be32 saddr) 129 { 130 fl4->flowi4_oif = oif; 131 fl4->flowi4_tos = tos; 132 fl4->daddr = daddr; 133 fl4->saddr = saddr; 134 } 135 136 137 struct flowi6 { 138 struct flowi_common __fl_common; 139 #define flowi6_oif __fl_common.flowic_oif 140 #define flowi6_iif __fl_common.flowic_iif 141 #define flowi6_mark __fl_common.flowic_mark 142 #define flowi6_scope __fl_common.flowic_scope 143 #define flowi6_proto __fl_common.flowic_proto 144 #define flowi6_flags __fl_common.flowic_flags 145 #define flowi6_secid __fl_common.flowic_secid 146 #define flowi6_tun_key __fl_common.flowic_tun_key 147 #define flowi6_uid __fl_common.flowic_uid 148 #define flowi6_xfrm __fl_common.xfrm 149 struct in6_addr daddr; 150 struct in6_addr saddr; 151 /* Note: flowi6_tos is encoded in flowlabel, too. */ 152 __be32 flowlabel; 153 union flowi_uli uli; 154 #define fl6_sport uli.ports.sport 155 #define fl6_dport uli.ports.dport 156 #define fl6_icmp_type uli.icmpt.type 157 #define fl6_icmp_code uli.icmpt.code 158 #define fl6_ipsec_spi uli.spi 159 #define fl6_mh_type uli.mht.type 160 #define fl6_gre_key uli.gre_key 161 __u32 mp_hash; 162 } __attribute__((__aligned__(BITS_PER_LONG/8))); 163 164 struct flowidn { 165 struct flowi_common __fl_common; 166 #define flowidn_oif __fl_common.flowic_oif 167 #define flowidn_iif __fl_common.flowic_iif 168 #define flowidn_mark __fl_common.flowic_mark 169 #define flowidn_scope __fl_common.flowic_scope 170 #define flowidn_proto __fl_common.flowic_proto 171 #define flowidn_flags __fl_common.flowic_flags 172 __le16 daddr; 173 __le16 saddr; 174 union flowi_uli uli; 175 #define fld_sport uli.ports.sport 176 #define fld_dport uli.ports.dport 177 } __attribute__((__aligned__(BITS_PER_LONG/8))); 178 179 struct flowi { 180 union { 181 struct flowi_common __fl_common; 182 struct flowi4 ip4; 183 struct flowi6 ip6; 184 struct flowidn dn; 185 } u; 186 #define flowi_oif u.__fl_common.flowic_oif 187 #define flowi_iif u.__fl_common.flowic_iif 188 #define flowi_mark u.__fl_common.flowic_mark 189 #define flowi_tos u.__fl_common.flowic_tos 190 #define flowi_scope u.__fl_common.flowic_scope 191 #define flowi_proto u.__fl_common.flowic_proto 192 #define flowi_flags u.__fl_common.flowic_flags 193 #define flowi_secid u.__fl_common.flowic_secid 194 #define flowi_tun_key u.__fl_common.flowic_tun_key 195 #define flowi_uid u.__fl_common.flowic_uid 196 #define flowi_xfrm u.__fl_common.xfrm 197 } __attribute__((__aligned__(BITS_PER_LONG/8))); 198 199 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) 200 { 201 return container_of(fl4, struct flowi, u.ip4); 202 } 203 204 static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) 205 { 206 return container_of(fl6, struct flowi, u.ip6); 207 } 208 209 static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) 210 { 211 return container_of(fldn, struct flowi, u.dn); 212 } 213 214 typedef unsigned long flow_compare_t; 215 216 static inline unsigned int flow_key_size(u16 family) 217 { 218 switch (family) { 219 case AF_INET: 220 BUILD_BUG_ON(sizeof(struct flowi4) % sizeof(flow_compare_t)); 221 return sizeof(struct flowi4) / sizeof(flow_compare_t); 222 case AF_INET6: 223 BUILD_BUG_ON(sizeof(struct flowi6) % sizeof(flow_compare_t)); 224 return sizeof(struct flowi6) / sizeof(flow_compare_t); 225 case AF_DECnet: 226 BUILD_BUG_ON(sizeof(struct flowidn) % sizeof(flow_compare_t)); 227 return sizeof(struct flowidn) / sizeof(flow_compare_t); 228 } 229 return 0; 230 } 231 232 __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys); 233 234 #endif 235