瀏覽代碼

[IPV6]: Optimize hop-limit determination.

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>
YOSHIFUJI Hideaki 17 年之前
父節點
當前提交
6b75d09081
共有 8 個文件被更改,包括 19 次插入29 次删除
  1. 0 2
      include/net/addrconf.h
  2. 2 0
      include/net/ip6_route.h
  3. 2 6
      net/ipv6/icmp.c
  4. 1 3
      net/ipv6/ip6_output.c
  5. 1 3
      net/ipv6/ipv6_sockglue.c
  6. 1 3
      net/ipv6/raw.c
  7. 11 9
      net/ipv6/route.c
  8. 1 3
      net/ipv6/udp.c

+ 0 - 2
include/net/addrconf.h

@@ -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 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)
  *	anycast prototypes (anycast.c)
  */
  */

+ 2 - 0
include/net/ip6_route.h

@@ -88,6 +88,8 @@ extern struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
 					   const struct in6_addr *addr,
 					   const struct in6_addr *addr,
 					   int anycast);
 					   int anycast);
 
 
+extern int			ip6_dst_hoplimit(struct dst_entry *dst);
+
 /*
 /*
  *	support functions for ND
  *	support functions for ND
  *
  *

+ 2 - 6
net/ipv6/icmp.c

@@ -464,9 +464,7 @@ route_done:
 	else
 	else
 		hlimit = np->hop_limit;
 		hlimit = np->hop_limit;
 	if (hlimit < 0)
 	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;
 	tclass = np->tclass;
 	if (tclass < 0)
 	if (tclass < 0)
@@ -560,9 +558,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
 	else
 	else
 		hlimit = np->hop_limit;
 		hlimit = np->hop_limit;
 	if (hlimit < 0)
 	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;
 	tclass = np->tclass;
 	if (tclass < 0)
 	if (tclass < 0)

+ 1 - 3
net/ipv6/ip6_output.c

@@ -237,9 +237,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
 	if (np)
 	if (np)
 		hlimit = np->hop_limit;
 		hlimit = np->hop_limit;
 	if (hlimit < 0)
 	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;
 	tclass = -1;
 	if (np)
 	if (np)

+ 1 - 3
net/ipv6/ipv6_sockglue.c

@@ -904,9 +904,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
 		dst = sk_dst_get(sk);
 		dst = sk_dst_get(sk);
 		if (dst) {
 		if (dst) {
 			if (val < 0)
 			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);
 			dst_release(dst);
 		}
 		}
 		if (val < 0)
 		if (val < 0)

+ 1 - 3
net/ipv6/raw.c

@@ -885,9 +885,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
 		else
 		else
 			hlimit = np->hop_limit;
 			hlimit = np->hop_limit;
 		if (hlimit < 0)
 		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) {
 	if (tclass < 0) {

+ 11 - 9
net/ipv6/route.c

@@ -1034,15 +1034,17 @@ static int ipv6_get_mtu(struct net_device *dev)
 	return mtu;
 	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;
 	return hoplimit;
 }
 }

+ 1 - 3
net/ipv6/udp.c

@@ -792,9 +792,7 @@ do_udp_sendmsg:
 		else
 		else
 			hlimit = np->hop_limit;
 			hlimit = np->hop_limit;
 		if (hlimit < 0)
 		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) {
 	if (tclass < 0) {