Commit 323e126f authored by David S. Miller's avatar David S. Miller

ipv4: Don't pre-seed hoplimit metric.

Always go through a new ip4_dst_hoplimit() helper, just like ipv6.

This allowed several simplifications:

1) The interim dst_metric_hoplimit() can go as it's no longer
   userd.

2) The sysctl_ip_default_ttl entry no longer needs to use
   ipv4_doint_and_flush, since the sysctl is not cached in
   routing cache metrics any longer.

3) ipv4_doint_and_flush no longer needs to be exported and
   therefore can be marked static.

When ipv4_doint_and_flush_strategy was removed some time ago,
the external declaration in ip.h was mistakenly left around
so kill that off too.

We have to move the sysctl_ip_default_ttl declaration into
ipv4's route cache definition header net/route.h, because
currently net/ip.h (where the declaration lives now) has
a back dependency on net/route.h
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a02e4b7d
...@@ -277,7 +277,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) ...@@ -277,7 +277,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
iph->tos = 0; iph->tos = 0;
iph->daddr = rt->rt_dst; iph->daddr = rt->rt_dst;
iph->saddr = rt->rt_src; iph->saddr = rt->rt_src;
iph->ttl = dst_metric_hoplimit(&rt->dst); iph->ttl = ip4_dst_hoplimit(&rt->dst);
iph->tot_len = htons(skb->len); iph->tot_len = htons(skb->len);
skb_dst_drop(skb); skb_dst_drop(skb);
......
...@@ -116,12 +116,6 @@ dst_metric(const struct dst_entry *dst, const int metric) ...@@ -116,12 +116,6 @@ dst_metric(const struct dst_entry *dst, const int metric)
return dst_metric_raw(dst, metric); return dst_metric_raw(dst, metric);
} }
static inline u32
dst_metric_hoplimit(const struct dst_entry *dst)
{
return dst_metric_raw(dst, RTAX_HOPLIMIT);
}
static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val)
{ {
dst->_metrics[metric-1] = val; dst->_metrics[metric-1] = val;
......
...@@ -201,7 +201,6 @@ static inline int inet_is_reserved_local_port(int port) ...@@ -201,7 +201,6 @@ static inline int inet_is_reserved_local_port(int port)
return test_bit(port, sysctl_local_reserved_ports); return test_bit(port, sysctl_local_reserved_ports);
} }
extern int sysctl_ip_default_ttl;
extern int sysctl_ip_nonlocal_bind; extern int sysctl_ip_nonlocal_bind;
extern struct ctl_path net_core_path[]; extern struct ctl_path net_core_path[];
...@@ -428,15 +427,6 @@ extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, ...@@ -428,15 +427,6 @@ extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
u32 info); u32 info);
/* sysctl helpers - any sysctl which holds a value that ends up being
* fed into the routing cache should use these handlers.
*/
int ipv4_doint_and_flush(ctl_table *ctl, int write,
void __user *buffer,
size_t *lenp, loff_t *ppos);
int ipv4_doint_and_flush_strategy(ctl_table *table,
void __user *oldval, size_t __user *oldlenp,
void __user *newval, size_t newlen);
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
extern int ip_misc_proc_init(void); extern int ip_misc_proc_init(void);
#endif #endif
......
...@@ -231,4 +231,15 @@ static inline int inet_iif(const struct sk_buff *skb) ...@@ -231,4 +231,15 @@ static inline int inet_iif(const struct sk_buff *skb)
return skb_rtable(skb)->rt_iif; return skb_rtable(skb)->rt_iif;
} }
extern int sysctl_ip_default_ttl;
static inline int ip4_dst_hoplimit(const struct dst_entry *dst)
{
int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
if (hoplimit == 0)
hoplimit = sysctl_ip_default_ttl;
return hoplimit;
}
#endif /* _ROUTE_H */ #endif /* _ROUTE_H */
...@@ -1430,9 +1430,9 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write, ...@@ -1430,9 +1430,9 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write,
return ret; return ret;
} }
int ipv4_doint_and_flush(ctl_table *ctl, int write, static int ipv4_doint_and_flush(ctl_table *ctl, int write,
void __user *buffer, void __user *buffer,
size_t *lenp, loff_t *ppos) size_t *lenp, loff_t *ppos)
{ {
int *valp = ctl->data; int *valp = ctl->data;
int val = *valp; int val = *valp;
......
...@@ -890,7 +890,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -890,7 +890,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit; iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit;
#endif #endif
else else
iph->ttl = dst_metric_hoplimit(&rt->dst); iph->ttl = ip4_dst_hoplimit(&rt->dst);
} }
((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags; ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags;
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
#include <linux/tcp.h> #include <linux/tcp.h>
int sysctl_ip_default_ttl __read_mostly = IPDEFTTL; int sysctl_ip_default_ttl __read_mostly = IPDEFTTL;
EXPORT_SYMBOL(sysctl_ip_default_ttl);
/* Generate a checksum for an outgoing IP datagram. */ /* Generate a checksum for an outgoing IP datagram. */
__inline__ void ip_send_check(struct iphdr *iph) __inline__ void ip_send_check(struct iphdr *iph)
...@@ -130,7 +131,7 @@ static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst) ...@@ -130,7 +131,7 @@ static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
int ttl = inet->uc_ttl; int ttl = inet->uc_ttl;
if (ttl < 0) if (ttl < 0)
ttl = dst_metric_hoplimit(dst); ttl = ip4_dst_hoplimit(dst);
return ttl; return ttl;
} }
......
...@@ -116,7 +116,7 @@ static void send_reset(struct sk_buff *oldskb, int hook) ...@@ -116,7 +116,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
if (ip_route_me_harder(nskb, addr_type)) if (ip_route_me_harder(nskb, addr_type))
goto free_nskb; goto free_nskb;
niph->ttl = dst_metric_hoplimit(skb_dst(nskb)); niph->ttl = ip4_dst_hoplimit(skb_dst(nskb));
/* "Never happens" */ /* "Never happens" */
if (nskb->len > dst_mtu(skb_dst(nskb))) if (nskb->len > dst_mtu(skb_dst(nskb)))
......
...@@ -1821,8 +1821,6 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag) ...@@ -1821,8 +1821,6 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag)
} else } else
dst_metric_set(dst, RTAX_MTU, dst->dev->mtu); dst_metric_set(dst, RTAX_MTU, dst->dev->mtu);
if (dst_metric_raw(dst, RTAX_HOPLIMIT) == 0)
dst_metric_set(dst, RTAX_HOPLIMIT, sysctl_ip_default_ttl);
if (dst_mtu(dst) > IP_MAX_MTU) if (dst_mtu(dst) > IP_MAX_MTU)
dst_metric_set(dst, RTAX_MTU, IP_MAX_MTU); dst_metric_set(dst, RTAX_MTU, IP_MAX_MTU);
if (dst_metric(dst, RTAX_ADVMSS) == 0) if (dst_metric(dst, RTAX_ADVMSS) == 0)
......
...@@ -155,7 +155,7 @@ static struct ctl_table ipv4_table[] = { ...@@ -155,7 +155,7 @@ static struct ctl_table ipv4_table[] = {
.data = &sysctl_ip_default_ttl, .data = &sysctl_ip_default_ttl,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = ipv4_doint_and_flush, .proc_handler = proc_dointvec,
.extra2 = &init_net, .extra2 = &init_net,
}, },
{ {
......
...@@ -56,7 +56,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) ...@@ -56,7 +56,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF)); 0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF));
ip_select_ident(top_iph, dst->child, NULL); ip_select_ident(top_iph, dst->child, NULL);
top_iph->ttl = dst_metric_hoplimit(dst->child); top_iph->ttl = ip4_dst_hoplimit(dst->child);
top_iph->saddr = x->props.saddr.a4; top_iph->saddr = x->props.saddr.a4;
top_iph->daddr = x->id.daddr.a4; top_iph->daddr = x->id.daddr.a4;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment