ipvs: Pull out update_pmtu code
Another step toward heterogeneous pools, this removes another piece of functionality currently specific to each address family type. Signed-off-by: Alex Gartrell <agartrell@fb.com> Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Simon Horman <horms@verge.net.au>
This commit is contained in:
parent
4a4739d56b
commit
919aa0b2bb
|
@ -204,6 +204,15 @@ static inline bool crosses_local_route_boundary(int skb_af, struct sk_buff *skb,
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline void maybe_update_pmtu(int skb_af, struct sk_buff *skb, int mtu)
|
||||
{
|
||||
struct sock *sk = skb->sk;
|
||||
struct rtable *ort = skb_rtable(skb);
|
||||
|
||||
if (!skb->dev && sk && sk->sk_state != TCP_TIME_WAIT)
|
||||
ort->dst.ops->update_pmtu(&ort->dst, sk, NULL, mtu);
|
||||
}
|
||||
|
||||
/* Get route to destination or remote server */
|
||||
static int
|
||||
__ip_vs_get_out_rt(int skb_af, struct sk_buff *skb, struct ip_vs_dest *dest,
|
||||
|
@ -213,7 +222,6 @@ __ip_vs_get_out_rt(int skb_af, struct sk_buff *skb, struct ip_vs_dest *dest,
|
|||
struct netns_ipvs *ipvs = net_ipvs(net);
|
||||
struct ip_vs_dest_dst *dest_dst;
|
||||
struct rtable *rt; /* Route to the other host */
|
||||
struct rtable *ort; /* Original route */
|
||||
struct iphdr *iph;
|
||||
__be16 df;
|
||||
int mtu;
|
||||
|
@ -284,16 +292,12 @@ __ip_vs_get_out_rt(int skb_af, struct sk_buff *skb, struct ip_vs_dest *dest,
|
|||
mtu = dst_mtu(&rt->dst);
|
||||
df = iph->frag_off & htons(IP_DF);
|
||||
} else {
|
||||
struct sock *sk = skb->sk;
|
||||
|
||||
mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr);
|
||||
if (mtu < 68) {
|
||||
IP_VS_DBG_RL("%s(): mtu less than 68\n", __func__);
|
||||
goto err_put;
|
||||
}
|
||||
ort = skb_rtable(skb);
|
||||
if (!skb->dev && sk && sk->sk_state != TCP_TIME_WAIT)
|
||||
ort->dst.ops->update_pmtu(&ort->dst, sk, NULL, mtu);
|
||||
maybe_update_pmtu(skb_af, skb, mtu);
|
||||
/* MTU check allowed? */
|
||||
df = sysctl_pmtu_disc(ipvs) ? iph->frag_off & htons(IP_DF) : 0;
|
||||
}
|
||||
|
@ -372,7 +376,6 @@ __ip_vs_get_out_rt_v6(int skb_af, struct sk_buff *skb, struct ip_vs_dest *dest,
|
|||
struct net *net = dev_net(skb_dst(skb)->dev);
|
||||
struct ip_vs_dest_dst *dest_dst;
|
||||
struct rt6_info *rt; /* Route to the other host */
|
||||
struct rt6_info *ort; /* Original route */
|
||||
struct dst_entry *dst;
|
||||
int mtu;
|
||||
int local, noref = 1;
|
||||
|
@ -438,17 +441,13 @@ __ip_vs_get_out_rt_v6(int skb_af, struct sk_buff *skb, struct ip_vs_dest *dest,
|
|||
if (likely(!(rt_mode & IP_VS_RT_MODE_TUNNEL)))
|
||||
mtu = dst_mtu(&rt->dst);
|
||||
else {
|
||||
struct sock *sk = skb->sk;
|
||||
|
||||
mtu = dst_mtu(&rt->dst) - sizeof(struct ipv6hdr);
|
||||
if (mtu < IPV6_MIN_MTU) {
|
||||
IP_VS_DBG_RL("%s(): mtu less than %d\n", __func__,
|
||||
IPV6_MIN_MTU);
|
||||
goto err_put;
|
||||
}
|
||||
ort = (struct rt6_info *) skb_dst(skb);
|
||||
if (!skb->dev && sk && sk->sk_state != TCP_TIME_WAIT)
|
||||
ort->dst.ops->update_pmtu(&ort->dst, sk, NULL, mtu);
|
||||
maybe_update_pmtu(skb_af, skb, mtu);
|
||||
}
|
||||
|
||||
if (unlikely(__mtu_check_toobig_v6(skb, mtu))) {
|
||||
|
|
Loading…
Reference in New Issue