aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-12-13 00:55:08 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-13 01:08:17 -0500
commit323e126f0c5995f779d7df7fd035f6e8fed8764d (patch)
tree402c7267a45ae488363bb1ef8e4c786b65b82572
parenta02e4b7dae455151c423e2f69ef222c502a321fd (diff)
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: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/pptp.c2
-rw-r--r--include/net/dst.h6
-rw-r--r--include/net/ip.h10
-rw-r--r--include/net/route.h11
-rw-r--r--net/ipv4/devinet.c6
-rw-r--r--net/ipv4/ip_gre.c2
-rw-r--r--net/ipv4/ip_output.c3
-rw-r--r--net/ipv4/netfilter/ipt_REJECT.c2
-rw-r--r--net/ipv4/route.c2
-rw-r--r--net/ipv4/sysctl_net_ipv4.c2
-rw-r--r--net/ipv4/xfrm4_mode_tunnel.c2
11 files changed, 21 insertions, 27 deletions
diff --git a/drivers/net/pptp.c b/drivers/net/pptp.c
index c83e168eef21..164cfad6ce79 100644
--- a/drivers/net/pptp.c
+++ b/drivers/net/pptp.c
@@ -277,7 +277,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
277 iph->tos = 0; 277 iph->tos = 0;
278 iph->daddr = rt->rt_dst; 278 iph->daddr = rt->rt_dst;
279 iph->saddr = rt->rt_src; 279 iph->saddr = rt->rt_src;
280 iph->ttl = dst_metric_hoplimit(&rt->dst); 280 iph->ttl = ip4_dst_hoplimit(&rt->dst);
281 iph->tot_len = htons(skb->len); 281 iph->tot_len = htons(skb->len);
282 282
283 skb_dst_drop(skb); 283 skb_dst_drop(skb);
diff --git a/include/net/dst.h b/include/net/dst.h
index 9208b500aaaf..755ac6c1aa03 100644
--- a/include/net/dst.h
+++ b/include/net/dst.h
@@ -116,12 +116,6 @@ dst_metric(const struct dst_entry *dst, const int metric)
116 return dst_metric_raw(dst, metric); 116 return dst_metric_raw(dst, metric);
117} 117}
118 118
119static inline u32
120dst_metric_hoplimit(const struct dst_entry *dst)
121{
122 return dst_metric_raw(dst, RTAX_HOPLIMIT);
123}
124
125static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val) 119static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val)
126{ 120{
127 dst->_metrics[metric-1] = val; 121 dst->_metrics[metric-1] = val;
diff --git a/include/net/ip.h b/include/net/ip.h
index 86e2b182a0c0..67fac78a186b 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -201,7 +201,6 @@ static inline int inet_is_reserved_local_port(int port)
201 return test_bit(port, sysctl_local_reserved_ports); 201 return test_bit(port, sysctl_local_reserved_ports);
202} 202}
203 203
204extern int sysctl_ip_default_ttl;
205extern int sysctl_ip_nonlocal_bind; 204extern int sysctl_ip_nonlocal_bind;
206 205
207extern struct ctl_path net_core_path[]; 206extern struct ctl_path net_core_path[];
@@ -428,15 +427,6 @@ extern void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
428extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport, 427extern void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
429 u32 info); 428 u32 info);
430 429
431/* sysctl helpers - any sysctl which holds a value that ends up being
432 * fed into the routing cache should use these handlers.
433 */
434int ipv4_doint_and_flush(ctl_table *ctl, int write,
435 void __user *buffer,
436 size_t *lenp, loff_t *ppos);
437int ipv4_doint_and_flush_strategy(ctl_table *table,
438 void __user *oldval, size_t __user *oldlenp,
439 void __user *newval, size_t newlen);
440#ifdef CONFIG_PROC_FS 430#ifdef CONFIG_PROC_FS
441extern int ip_misc_proc_init(void); 431extern int ip_misc_proc_init(void);
442#endif 432#endif
diff --git a/include/net/route.h b/include/net/route.h
index b8c1f7703fc6..27002362944a 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -231,4 +231,15 @@ static inline int inet_iif(const struct sk_buff *skb)
231 return skb_rtable(skb)->rt_iif; 231 return skb_rtable(skb)->rt_iif;
232} 232}
233 233
234extern int sysctl_ip_default_ttl;
235
236static inline int ip4_dst_hoplimit(const struct dst_entry *dst)
237{
238 int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
239
240 if (hoplimit == 0)
241 hoplimit = sysctl_ip_default_ttl;
242 return hoplimit;
243}
244
234#endif /* _ROUTE_H */ 245#endif /* _ROUTE_H */
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 3b067704ab38..748cb5b337bd 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1430,9 +1430,9 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write,
1430 return ret; 1430 return ret;
1431} 1431}
1432 1432
1433int ipv4_doint_and_flush(ctl_table *ctl, int write, 1433static int ipv4_doint_and_flush(ctl_table *ctl, int write,
1434 void __user *buffer, 1434 void __user *buffer,
1435 size_t *lenp, loff_t *ppos) 1435 size_t *lenp, loff_t *ppos)
1436{ 1436{
1437 int *valp = ctl->data; 1437 int *valp = ctl->data;
1438 int val = *valp; 1438 int val = *valp;
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 46eb3dc37ec6..eb68a0e34e49 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -890,7 +890,7 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
890 iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit; 890 iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit;
891#endif 891#endif
892 else 892 else
893 iph->ttl = dst_metric_hoplimit(&rt->dst); 893 iph->ttl = ip4_dst_hoplimit(&rt->dst);
894 } 894 }
895 895
896 ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags; 896 ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index ea28fa5f1992..04c7b3ba6b39 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -82,6 +82,7 @@
82#include <linux/tcp.h> 82#include <linux/tcp.h>
83 83
84int sysctl_ip_default_ttl __read_mostly = IPDEFTTL; 84int sysctl_ip_default_ttl __read_mostly = IPDEFTTL;
85EXPORT_SYMBOL(sysctl_ip_default_ttl);
85 86
86/* Generate a checksum for an outgoing IP datagram. */ 87/* Generate a checksum for an outgoing IP datagram. */
87__inline__ void ip_send_check(struct iphdr *iph) 88__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 int ttl = inet->uc_ttl; 131 int ttl = inet->uc_ttl;
131 132
132 if (ttl < 0) 133 if (ttl < 0)
133 ttl = dst_metric_hoplimit(dst); 134 ttl = ip4_dst_hoplimit(dst);
134 return ttl; 135 return ttl;
135} 136}
136 137
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c
index f1309072c541..1ff79e557f96 100644
--- a/net/ipv4/netfilter/ipt_REJECT.c
+++ b/net/ipv4/netfilter/ipt_REJECT.c
@@ -116,7 +116,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
116 if (ip_route_me_harder(nskb, addr_type)) 116 if (ip_route_me_harder(nskb, addr_type))
117 goto free_nskb; 117 goto free_nskb;
118 118
119 niph->ttl = dst_metric_hoplimit(skb_dst(nskb)); 119 niph->ttl = ip4_dst_hoplimit(skb_dst(nskb));
120 120
121 /* "Never happens" */ 121 /* "Never happens" */
122 if (nskb->len > dst_mtu(skb_dst(nskb))) 122 if (nskb->len > dst_mtu(skb_dst(nskb)))
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 90b5a37555ab..770f70427f0b 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -1821,8 +1821,6 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag)
1821 } else 1821 } else
1822 dst_metric_set(dst, RTAX_MTU, dst->dev->mtu); 1822 dst_metric_set(dst, RTAX_MTU, dst->dev->mtu);
1823 1823
1824 if (dst_metric_raw(dst, RTAX_HOPLIMIT) == 0)
1825 dst_metric_set(dst, RTAX_HOPLIMIT, sysctl_ip_default_ttl);
1826 if (dst_mtu(dst) > IP_MAX_MTU) 1824 if (dst_mtu(dst) > IP_MAX_MTU)
1827 dst_metric_set(dst, RTAX_MTU, IP_MAX_MTU); 1825 dst_metric_set(dst, RTAX_MTU, IP_MAX_MTU);
1828 if (dst_metric(dst, RTAX_ADVMSS) == 0) 1826 if (dst_metric(dst, RTAX_ADVMSS) == 0)
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
index 1b4ec21497a4..e85ff5930607 100644
--- a/net/ipv4/sysctl_net_ipv4.c
+++ b/net/ipv4/sysctl_net_ipv4.c
@@ -155,7 +155,7 @@ static struct ctl_table ipv4_table[] = {
155 .data = &sysctl_ip_default_ttl, 155 .data = &sysctl_ip_default_ttl,
156 .maxlen = sizeof(int), 156 .maxlen = sizeof(int),
157 .mode = 0644, 157 .mode = 0644,
158 .proc_handler = ipv4_doint_and_flush, 158 .proc_handler = proc_dointvec,
159 .extra2 = &init_net, 159 .extra2 = &init_net,
160 }, 160 },
161 { 161 {
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c
index 63b854e74d99..534972e114ac 100644
--- a/net/ipv4/xfrm4_mode_tunnel.c
+++ b/net/ipv4/xfrm4_mode_tunnel.c
@@ -56,7 +56,7 @@ static int xfrm4_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
56 0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF)); 56 0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF));
57 ip_select_ident(top_iph, dst->child, NULL); 57 ip_select_ident(top_iph, dst->child, NULL);
58 58
59 top_iph->ttl = dst_metric_hoplimit(dst->child); 59 top_iph->ttl = ip4_dst_hoplimit(dst->child);
60 60
61 top_iph->saddr = x->props.saddr.a4; 61 top_iph->saddr = x->props.saddr.a4;
62 top_iph->daddr = x->id.daddr.a4; 62 top_iph->daddr = x->id.daddr.a4;