diff options
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 23 | 
1 files changed, 19 insertions, 4 deletions
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 1eafcfc95e81..352690e2ab82 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c  | |||
| @@ -978,12 +978,27 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
| 978 | break; | 978 | break; | 
| 979 | 979 | ||
| 980 | case IPV6_UNICAST_HOPS: | 980 | case IPV6_UNICAST_HOPS: | 
| 981 | val = np->hop_limit; | ||
| 982 | break; | ||
| 983 | |||
| 984 | case IPV6_MULTICAST_HOPS: | 981 | case IPV6_MULTICAST_HOPS: | 
| 985 | val = np->mcast_hops; | 982 | { | 
| 983 | struct dst_entry *dst; | ||
| 984 | |||
| 985 | if (optname == IPV6_UNICAST_HOPS) | ||
| 986 | val = np->hop_limit; | ||
| 987 | else | ||
| 988 | val = np->mcast_hops; | ||
| 989 | |||
| 990 | dst = sk_dst_get(sk); | ||
| 991 | if (dst) { | ||
| 992 | if (val < 0) | ||
| 993 | val = dst_metric(dst, RTAX_HOPLIMIT); | ||
| 994 | if (val < 0) | ||
| 995 | val = ipv6_get_hoplimit(dst->dev); | ||
| 996 | dst_release(dst); | ||
| 997 | } | ||
| 998 | if (val < 0) | ||
| 999 | val = ipv6_devconf.hop_limit; | ||
| 986 | break; | 1000 | break; | 
| 1001 | } | ||
| 987 | 1002 | ||
| 988 | case IPV6_MULTICAST_LOOP: | 1003 | case IPV6_MULTICAST_LOOP: | 
| 989 | val = np->mc_loop; | 1004 | val = np->mc_loop; | 
