[IPV6]: Optimize hop-limit determination.
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Mon, 10 Mar 2008 10:00:30 +0000 (06:00 -0400)
committerYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tue, 25 Mar 2008 01:24:00 +0000 (10:24 +0900)
Last part of hop-limit determination is always:
    hoplimit = dst_metric(dst, RTAX_HOPLIMIT);
    if (hoplimit < 0)
        hoplimit = ipv6_get_hoplimit(dst->dev).

Let's consolidate it as ip6_dst_hoplimit(dst).

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
include/net/addrconf.h
include/net/ip6_route.h
net/ipv6/icmp.c
net/ipv6/ip6_output.c
net/ipv6/ipv6_sockglue.c
net/ipv6/raw.c
net/ipv6/route.c
net/ipv6/udp.c

index 232da20e7171c8314046ab367fb2428df8844321..edcb4bbaab7dc8e5c2f04662c52871a215330119 100644 (file)
@@ -123,8 +123,6 @@ extern int ipv6_is_mld(struct sk_buff *skb, int nexthdr);
 
 extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len);
 
-extern int ipv6_get_hoplimit(struct net_device *dev);
-
 /*
  *     anycast prototypes (anycast.c)
  */
index 0e2895c8b27019775bc2cf76ce23a5749d54dd86..5c3b67c86aefcfd0c761adecff64bd73e6ce28dc 100644 (file)
@@ -88,6 +88,8 @@ extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
                                           const struct in6_addr *addr,
                                           int anycast);
 
+extern int                     ip6_dst_hoplimit(struct dst_entry *dst);
+
 /*
  *     support functions for ND
  *
index 6b5391ab83462437eff92f4a18bb6e733871b53a..86332417b4028de0397c54e24ba58ede6094c3f5 100644 (file)
@@ -464,9 +464,7 @@ route_done:
        else
                hlimit = np->hop_limit;
        if (hlimit < 0)
-               hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-       if (hlimit < 0)
-               hlimit = ipv6_get_hoplimit(dst->dev);
+               hlimit = ip6_dst_hoplimit(dst);
 
        tclass = np->tclass;
        if (tclass < 0)
@@ -560,9 +558,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
        else
                hlimit = np->hop_limit;
        if (hlimit < 0)
-               hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-       if (hlimit < 0)
-               hlimit = ipv6_get_hoplimit(dst->dev);
+               hlimit = ip6_dst_hoplimit(dst);
 
        tclass = np->tclass;
        if (tclass < 0)
index ed6482667a256f803df1f3dbd804158bf5b02792..2a4f08c8a02da9c233c6f6bfbf31829842086d48 100644 (file)
@@ -237,9 +237,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
        if (np)
                hlimit = np->hop_limit;
        if (hlimit < 0)
-               hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-       if (hlimit < 0)
-               hlimit = ipv6_get_hoplimit(dst->dev);
+               hlimit = ip6_dst_hoplimit(dst);
 
        tclass = -1;
        if (np)
index c11c76cab371607194acbaaaff43f1f0f3370b7b..8e29fb1d1df6a57a1b6eaab0a5a1ffc0e596f6b3 100644 (file)
@@ -904,9 +904,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
                dst = sk_dst_get(sk);
                if (dst) {
                        if (val < 0)
-                               val = dst_metric(dst, RTAX_HOPLIMIT);
-                       if (val < 0)
-                               val = ipv6_get_hoplimit(dst->dev);
+                               val = ip6_dst_hoplimit(dst);
                        dst_release(dst);
                }
                if (val < 0)
index a9e4235157a2039df8d6a8cde866280e155ce092..548d0763f4d3ce5817e62982997f920944b0dae2 100644 (file)
@@ -885,9 +885,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                else
                        hlimit = np->hop_limit;
                if (hlimit < 0)
-                       hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-               if (hlimit < 0)
-                       hlimit = ipv6_get_hoplimit(dst->dev);
+                       hlimit = ip6_dst_hoplimit(dst);
        }
 
        if (tclass < 0) {
index a4b5aee0f68a03a1750232bd57e4b5173864cf47..aa3f08718e4421a9c7780c7af7afea93d36c5fa0 100644 (file)
@@ -1034,15 +1034,17 @@ static int ipv6_get_mtu(struct net_device *dev)
        return mtu;
 }
 
-int ipv6_get_hoplimit(struct net_device *dev)
-{
-       int hoplimit = ipv6_devconf.hop_limit;
-       struct inet6_dev *idev;
-
-       idev = in6_dev_get(dev);
-       if (idev) {
-               hoplimit = idev->cnf.hop_limit;
-               in6_dev_put(idev);
+int ip6_dst_hoplimit(struct dst_entry *dst)
+{
+       int hoplimit = dst_metric(dst, RTAX_HOPLIMIT);
+       if (hoplimit < 0) {
+               struct net_device *dev = dst->dev;
+               struct inet6_dev *idev = in6_dev_get(dev);
+               if (idev) {
+                       hoplimit = idev->cnf.hop_limit;
+                       in6_dev_put(idev);
+               } else
+                       hoplimit = ipv6_devconf.hop_limit;
        }
        return hoplimit;
 }
index 5f5d1218c34e0f9dbc18e2a2c013f6235dddf43b..593d3efadaf91ec7f895740535f6773ba11a537f 100644 (file)
@@ -792,9 +792,7 @@ do_udp_sendmsg:
                else
                        hlimit = np->hop_limit;
                if (hlimit < 0)
-                       hlimit = dst_metric(dst, RTAX_HOPLIMIT);
-               if (hlimit < 0)
-                       hlimit = ipv6_get_hoplimit(dst->dev);
+                       hlimit = ip6_dst_hoplimit(dst);
        }
 
        if (tclass < 0) {