Line data Source code
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 45 : 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 45 : fl4->flowi4_oif = oif; 106 45 : fl4->flowi4_iif = LOOPBACK_IFINDEX; 107 45 : fl4->flowi4_mark = mark; 108 45 : fl4->flowi4_tos = tos; 109 45 : fl4->flowi4_scope = scope; 110 45 : fl4->flowi4_proto = proto; 111 45 : fl4->flowi4_flags = flags; 112 45 : fl4->flowi4_secid = 0; 113 45 : fl4->flowi4_tun_key.tun_id = 0; 114 45 : fl4->flowi4_uid = uid; 115 45 : fl4->daddr = daddr; 116 45 : fl4->saddr = saddr; 117 45 : fl4->fl4_dport = dport; 118 45 : fl4->fl4_sport = sport; 119 45 : fl4->flowi4_multipath_hash = 0; 120 : } 121 : 122 : /* Reset some input parameters after previous lookup */ 123 13 : static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos, 124 : __be32 daddr, __be32 saddr) 125 : { 126 13 : fl4->flowi4_oif = oif; 127 13 : fl4->flowi4_tos = tos; 128 13 : fl4->daddr = daddr; 129 13 : fl4->saddr = saddr; 130 13 : } 131 : 132 : 133 : struct 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_mark __fl_common.flowic_mark 138 : #define flowi6_scope __fl_common.flowic_scope 139 : #define flowi6_proto __fl_common.flowic_proto 140 : #define flowi6_flags __fl_common.flowic_flags 141 : #define flowi6_secid __fl_common.flowic_secid 142 : #define flowi6_tun_key __fl_common.flowic_tun_key 143 : #define flowi6_uid __fl_common.flowic_uid 144 : struct in6_addr daddr; 145 : struct in6_addr saddr; 146 : /* Note: flowi6_tos is encoded in flowlabel, too. */ 147 : __be32 flowlabel; 148 : union flowi_uli uli; 149 : #define fl6_sport uli.ports.sport 150 : #define fl6_dport uli.ports.dport 151 : #define fl6_icmp_type uli.icmpt.type 152 : #define fl6_icmp_code uli.icmpt.code 153 : #define fl6_ipsec_spi uli.spi 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 : 159 : struct 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 : 174 : struct 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_mark u.__fl_common.flowic_mark 184 : #define flowi_tos u.__fl_common.flowic_tos 185 : #define flowi_scope u.__fl_common.flowic_scope 186 : #define flowi_proto u.__fl_common.flowic_proto 187 : #define flowi_flags u.__fl_common.flowic_flags 188 : #define flowi_secid u.__fl_common.flowic_secid 189 : #define flowi_tun_key u.__fl_common.flowic_tun_key 190 : #define flowi_uid u.__fl_common.flowic_uid 191 : } __attribute__((__aligned__(BITS_PER_LONG/8))); 192 : 193 46 : static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) 194 : { 195 46 : return container_of(fl4, struct flowi, u.ip4); 196 : } 197 : 198 21 : static inline struct flowi_common *flowi4_to_flowi_common(struct flowi4 *fl4) 199 : { 200 21 : return &(flowi4_to_flowi(fl4)->u.__fl_common); 201 : } 202 : 203 : static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) 204 : { 205 : return container_of(fl6, struct flowi, u.ip6); 206 : } 207 : 208 : static inline struct flowi_common *flowi6_to_flowi_common(struct flowi6 *fl6) 209 : { 210 : return &(flowi6_to_flowi(fl6)->u.__fl_common); 211 : } 212 : 213 : static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) 214 : { 215 : return container_of(fldn, struct flowi, u.dn); 216 : } 217 : 218 : __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys); 219 : 220 : #endif