1 /* 2 * 3 * Generic internet FLOW. 4 * 5 */ 6 7 #ifndef _NET_FLOW_H 8 #define _NET_FLOW_H 9 10 #include <linux/socket.h> 11 #include <linux/in6.h> 12 #include <linux/atomic.h> 13 #include <net/flow_dissector.h> 14 15 /* 16 * ifindex generation is per-net namespace, and loopback is 17 * always the 1st device in ns (see net_dev_init), thus any 18 * loopback device should get ifindex 1 19 */ 20 21 #define LOOPBACK_IFINDEX 1 22 23 struct flowi_tunnel { 24 __be64 tun_id; 25 }; 26 27 struct flowi_common { 28 int flowic_oif; 29 int flowic_iif; 30 __u32 flowic_mark; 31 __u8 flowic_tos; 32 __u8 flowic_scope; 33 __u8 flowic_proto; 34 __u8 flowic_flags; 35 #define FLOWI_FLAG_ANYSRC 0x01 36 #define FLOWI_FLAG_KNOWN_NH 0x02 37 #define FLOWI_FLAG_SKIP_NH_OIF 0x04 38 __u32 flowic_secid; 39 struct flowi_tunnel flowic_tun_key; 40 }; 41 42 union flowi_uli { 43 struct { 44 __be16 dport; 45 __be16 sport; 46 } ports; 47 48 struct { 49 __u8 type; 50 __u8 code; 51 } icmpt; 52 53 struct { 54 __le16 dport; 55 __le16 sport; 56 } dnports; 57 58 __be32 spi; 59 __be32 gre_key; 60 61 struct { 62 __u8 type; 63 } mht; 64 }; 65 66 struct flowi4 { 67 struct flowi_common __fl_common; 68 #define flowi4_oif __fl_common.flowic_oif 69 #define flowi4_iif __fl_common.flowic_iif 70 #define flowi4_mark __fl_common.flowic_mark 71 #define flowi4_tos __fl_common.flowic_tos 72 #define flowi4_scope __fl_common.flowic_scope 73 #define flowi4_proto __fl_common.flowic_proto 74 #define flowi4_flags __fl_common.flowic_flags 75 #define flowi4_secid __fl_common.flowic_secid 76 #define flowi4_tun_key __fl_common.flowic_tun_key 77 78 /* (saddr,daddr) must be grouped, same order as in IP header */ 79 __be32 saddr; 80 __be32 daddr; 81 82 union flowi_uli uli; 83 #define fl4_sport uli.ports.sport 84 #define fl4_dport uli.ports.dport 85 #define fl4_icmp_type uli.icmpt.type 86 #define fl4_icmp_code uli.icmpt.code 87 #define fl4_ipsec_spi uli.spi 88 #define fl4_mh_type uli.mht.type 89 #define fl4_gre_key uli.gre_key 90 } __attribute__((__aligned__(BITS_PER_LONG/8))); 91 92 static inline void flowi4_init_output(struct flowi4 *fl4, int oif, 93 __u32 mark, __u8 tos, __u8 scope, 94 __u8 proto, __u8 flags, 95 __be32 daddr, __be32 saddr, 96 __be16 dport, __be16 sport) 97 { 98 fl4->flowi4_oif = oif; 99 fl4->flowi4_iif = LOOPBACK_IFINDEX; 100 fl4->flowi4_mark = mark; 101 fl4->flowi4_tos = tos; 102 fl4->flowi4_scope = scope; 103 fl4->flowi4_proto = proto; 104 fl4->flowi4_flags = flags; 105 fl4->flowi4_secid = 0; 106 fl4->flowi4_tun_key.tun_id = 0; 107 fl4->daddr = daddr; 108 fl4->saddr = saddr; 109 fl4->fl4_dport = dport; 110 fl4->fl4_sport = sport; 111 } 112 113 /* Reset some input parameters after previous lookup */ 114 static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos, 115 __be32 daddr, __be32 saddr) 116 { 117 fl4->flowi4_oif = oif; 118 fl4->flowi4_tos = tos; 119 fl4->daddr = daddr; 120 fl4->saddr = saddr; 121 } 122 123 124 struct flowi6 { 125 struct flowi_common __fl_common; 126 #define flowi6_oif __fl_common.flowic_oif 127 #define flowi6_iif __fl_common.flowic_iif 128 #define flowi6_mark __fl_common.flowic_mark 129 #define flowi6_scope __fl_common.flowic_scope 130 #define flowi6_proto __fl_common.flowic_proto 131 #define flowi6_flags __fl_common.flowic_flags 132 #define flowi6_secid __fl_common.flowic_secid 133 #define flowi6_tun_key __fl_common.flowic_tun_key 134 struct in6_addr daddr; 135 struct in6_addr saddr; 136 /* Note: flowi6_tos is encoded in flowlabel, too. */ 137 __be32 flowlabel; 138 union flowi_uli uli; 139 #define fl6_sport uli.ports.sport 140 #define fl6_dport uli.ports.dport 141 #define fl6_icmp_type uli.icmpt.type 142 #define fl6_icmp_code uli.icmpt.code 143 #define fl6_ipsec_spi uli.spi 144 #define fl6_mh_type uli.mht.type 145 #define fl6_gre_key uli.gre_key 146 } __attribute__((__aligned__(BITS_PER_LONG/8))); 147 148 struct flowidn { 149 struct flowi_common __fl_common; 150 #define flowidn_oif __fl_common.flowic_oif 151 #define flowidn_iif __fl_common.flowic_iif 152 #define flowidn_mark __fl_common.flowic_mark 153 #define flowidn_scope __fl_common.flowic_scope 154 #define flowidn_proto __fl_common.flowic_proto 155 #define flowidn_flags __fl_common.flowic_flags 156 __le16 daddr; 157 __le16 saddr; 158 union flowi_uli uli; 159 #define fld_sport uli.ports.sport 160 #define fld_dport uli.ports.dport 161 } __attribute__((__aligned__(BITS_PER_LONG/8))); 162 163 struct flowi { 164 union { 165 struct flowi_common __fl_common; 166 struct flowi4 ip4; 167 struct flowi6 ip6; 168 struct flowidn dn; 169 } u; 170 #define flowi_oif u.__fl_common.flowic_oif 171 #define flowi_iif u.__fl_common.flowic_iif 172 #define flowi_mark u.__fl_common.flowic_mark 173 #define flowi_tos u.__fl_common.flowic_tos 174 #define flowi_scope u.__fl_common.flowic_scope 175 #define flowi_proto u.__fl_common.flowic_proto 176 #define flowi_flags u.__fl_common.flowic_flags 177 #define flowi_secid u.__fl_common.flowic_secid 178 #define flowi_tun_key u.__fl_common.flowic_tun_key 179 } __attribute__((__aligned__(BITS_PER_LONG/8))); 180 181 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) 182 { 183 return container_of(fl4, struct flowi, u.ip4); 184 } 185 186 static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) 187 { 188 return container_of(fl6, struct flowi, u.ip6); 189 } 190 191 static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) 192 { 193 return container_of(fldn, struct flowi, u.dn); 194 } 195 196 typedef unsigned long flow_compare_t; 197 198 static inline size_t flow_key_size(u16 family) 199 { 200 switch (family) { 201 case AF_INET: 202 BUILD_BUG_ON(sizeof(struct flowi4) % sizeof(flow_compare_t)); 203 return sizeof(struct flowi4) / sizeof(flow_compare_t); 204 case AF_INET6: 205 BUILD_BUG_ON(sizeof(struct flowi6) % sizeof(flow_compare_t)); 206 return sizeof(struct flowi6) / sizeof(flow_compare_t); 207 case AF_DECnet: 208 BUILD_BUG_ON(sizeof(struct flowidn) % sizeof(flow_compare_t)); 209 return sizeof(struct flowidn) / sizeof(flow_compare_t); 210 } 211 return 0; 212 } 213 214 #define FLOW_DIR_IN 0 215 #define FLOW_DIR_OUT 1 216 #define FLOW_DIR_FWD 2 217 218 struct net; 219 struct sock; 220 struct flow_cache_ops; 221 222 struct flow_cache_object { 223 const struct flow_cache_ops *ops; 224 }; 225 226 struct flow_cache_ops { 227 struct flow_cache_object *(*get)(struct flow_cache_object *); 228 int (*check)(struct flow_cache_object *); 229 void (*delete)(struct flow_cache_object *); 230 }; 231 232 typedef struct flow_cache_object *(*flow_resolve_t)( 233 struct net *net, const struct flowi *key, u16 family, 234 u8 dir, struct flow_cache_object *oldobj, void *ctx); 235 236 struct flow_cache_object *flow_cache_lookup(struct net *net, 237 const struct flowi *key, u16 family, 238 u8 dir, flow_resolve_t resolver, 239 void *ctx); 240 int flow_cache_init(struct net *net); 241 void flow_cache_fini(struct net *net); 242 243 void flow_cache_flush(struct net *net); 244 void flow_cache_flush_deferred(struct net *net); 245 extern atomic_t flow_cache_genid; 246 247 __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys); 248 249 static inline __u32 get_hash_from_flowi6(const struct flowi6 *fl6) 250 { 251 struct flow_keys keys; 252 253 return __get_hash_from_flowi6(fl6, &keys); 254 } 255 256 __u32 __get_hash_from_flowi4(const struct flowi4 *fl4, struct flow_keys *keys); 257 258 static inline __u32 get_hash_from_flowi4(const struct flowi4 *fl4) 259 { 260 struct flow_keys keys; 261 262 return __get_hash_from_flowi4(fl4, &keys); 263 } 264 265 #endif 266