diff options
Diffstat (limited to 'include/net/ip.h')
| -rw-r--r-- | include/net/ip.h | 43 | 
1 files changed, 35 insertions, 8 deletions
diff --git a/include/net/ip.h b/include/net/ip.h index d14af7edd197..0750a186ea63 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -31,7 +31,7 @@  #include <net/route.h>  #include <net/snmp.h>  #include <net/flow.h> -#include <net/flow_keys.h> +#include <net/flow_dissector.h>  struct sock; @@ -45,6 +45,7 @@ struct inet_skb_parm {  #define IPSKB_FRAG_COMPLETE	BIT(3)  #define IPSKB_REROUTED		BIT(4)  #define IPSKB_DOREDIRECT	BIT(5) +#define IPSKB_FRAG_PMTU		BIT(6)  	u16			frag_max_size;  }; @@ -108,9 +109,8 @@ int ip_local_deliver(struct sk_buff *skb);  int ip_mr_input(struct sk_buff *skb);  int ip_output(struct sock *sk, struct sk_buff *skb);  int ip_mc_output(struct sock *sk, struct sk_buff *skb); -int ip_fragment(struct sock *sk, struct sk_buff *skb, -		int (*output)(struct sock *, struct sk_buff *)); -int ip_do_nat(struct sk_buff *skb); +int ip_do_fragment(struct sock *sk, struct sk_buff *skb, +		   int (*output)(struct sock *, struct sk_buff *));  void ip_send_check(struct iphdr *ip);  int __ip_local_out(struct sk_buff *skb);  int ip_local_out_sk(struct sock *sk, struct sk_buff *skb); @@ -355,15 +355,32 @@ static inline __wsum inet_compute_pseudo(struct sk_buff *skb, int proto)  				  skb->len, proto, 0);  } +/* copy IPv4 saddr & daddr to flow_keys, possibly using 64bit load/store + * Equivalent to :	flow->v4addrs.src = iph->saddr; + *			flow->v4addrs.dst = iph->daddr; + */ +static inline void iph_to_flow_copy_v4addrs(struct flow_keys *flow, +					    const struct iphdr *iph) +{ +	BUILD_BUG_ON(offsetof(typeof(flow->addrs), v4addrs.dst) != +		     offsetof(typeof(flow->addrs), v4addrs.src) + +			      sizeof(flow->addrs.v4addrs.src)); +	memcpy(&flow->addrs.v4addrs, &iph->saddr, sizeof(flow->addrs.v4addrs)); +	flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; +} +  static inline void inet_set_txhash(struct sock *sk)  {  	struct inet_sock *inet = inet_sk(sk);  	struct flow_keys keys; -	keys.src = inet->inet_saddr; -	keys.dst = inet->inet_daddr; -	keys.port16[0] = inet->inet_sport; -	keys.port16[1] = inet->inet_dport; +	memset(&keys, 0, sizeof(keys)); + +	keys.addrs.v4addrs.src = inet->inet_saddr; +	keys.addrs.v4addrs.dst = inet->inet_daddr; +	keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; +	keys.ports.src = inet->inet_sport; +	keys.ports.dst = inet->inet_dport;  	sk->sk_txhash = flow_hash_from_keys(&keys);  } @@ -478,6 +495,16 @@ enum ip_defrag_users {  	IP_DEFRAG_MACVLAN,  }; +/* Return true if the value of 'user' is between 'lower_bond' + * and 'upper_bond' inclusively. + */ +static inline bool ip_defrag_user_in_between(u32 user, +					     enum ip_defrag_users lower_bond, +					     enum ip_defrag_users upper_bond) +{ +	return user >= lower_bond && user <= upper_bond; +} +  int ip_defrag(struct sk_buff *skb, u32 user);  #ifdef CONFIG_INET  struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user);  |