at v4.9 6.9 kB view raw
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 23struct flowi_tunnel { 24 __be64 tun_id; 25}; 26 27struct 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 42union 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 66struct 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 92static 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 */ 114static 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 124struct 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 148struct 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 163struct 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 181static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4) 182{ 183 return container_of(fl4, struct flowi, u.ip4); 184} 185 186static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6) 187{ 188 return container_of(fl6, struct flowi, u.ip6); 189} 190 191static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn) 192{ 193 return container_of(fldn, struct flowi, u.dn); 194} 195 196typedef unsigned long flow_compare_t; 197 198static 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 218struct net; 219struct sock; 220struct flow_cache_ops; 221 222struct flow_cache_object { 223 const struct flow_cache_ops *ops; 224}; 225 226struct 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 232typedef 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 236struct 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); 240int flow_cache_init(struct net *net); 241void flow_cache_fini(struct net *net); 242 243void flow_cache_flush(struct net *net); 244void flow_cache_flush_deferred(struct net *net); 245extern atomic_t flow_cache_genid; 246 247__u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys); 248 249static 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 258static 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