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>
        iph->tos      = 0;
        iph->daddr    = rt->rt_dst;
        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);
 
        skb_dst_drop(skb);
 
        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)
 {
        dst->_metrics[metric-1] = val;
 
        return test_bit(port, sysctl_local_reserved_ports);
 }
 
-extern int sysctl_ip_default_ttl;
 extern int sysctl_ip_nonlocal_bind;
 
 extern struct ctl_path net_core_path[];
 extern void    ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 dport,
                               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
 extern int ip_misc_proc_init(void);
 #endif
 
        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 */
 
        return ret;
 }
 
-int ipv4_doint_and_flush(ctl_table *ctl, int write,
-                        void __user *buffer,
-                        size_t *lenp, loff_t *ppos)
+static int ipv4_doint_and_flush(ctl_table *ctl, int write,
+                               void __user *buffer,
+                               size_t *lenp, loff_t *ppos)
 {
        int *valp = ctl->data;
        int val = *valp;
 
                        iph->ttl = ((struct ipv6hdr *)old_iph)->hop_limit;
 #endif
                else
-                       iph->ttl = dst_metric_hoplimit(&rt->dst);
+                       iph->ttl = ip4_dst_hoplimit(&rt->dst);
        }
 
        ((__be16 *)(iph + 1))[0] = tunnel->parms.o_flags;
 
 #include <linux/tcp.h>
 
 int sysctl_ip_default_ttl __read_mostly = IPDEFTTL;
+EXPORT_SYMBOL(sysctl_ip_default_ttl);
 
 /* Generate a checksum for an outgoing IP datagram. */
 __inline__ void ip_send_check(struct iphdr *iph)
        int ttl = inet->uc_ttl;
 
        if (ttl < 0)
-               ttl = dst_metric_hoplimit(dst);
+               ttl = ip4_dst_hoplimit(dst);
        return ttl;
 }
 
 
        if (ip_route_me_harder(nskb, addr_type))
                goto free_nskb;
 
-       niph->ttl       = dst_metric_hoplimit(skb_dst(nskb));
+       niph->ttl       = ip4_dst_hoplimit(skb_dst(nskb));
 
        /* "Never happens" */
        if (nskb->len > dst_mtu(skb_dst(nskb)))
 
        } else
                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)
                dst_metric_set(dst, RTAX_MTU, IP_MAX_MTU);
        if (dst_metric(dst, RTAX_ADVMSS) == 0)
 
                .data           = &sysctl_ip_default_ttl,
                .maxlen         = sizeof(int),
                .mode           = 0644,
-               .proc_handler   = ipv4_doint_and_flush,
+               .proc_handler   = proc_dointvec,
                .extra2         = &init_net,
        },
        {
 
                0 : (XFRM_MODE_SKB_CB(skb)->frag_off & htons(IP_DF));
        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->daddr = x->id.daddr.a4;