diff options
Diffstat (limited to 'net/ipv6/udp.c')
-rw-r--r-- | net/ipv6/udp.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 599e1ba6d1ce..3ed57eced376 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -450,15 +450,16 @@ try_again: | |||
450 | sin6->sin6_family = AF_INET6; | 450 | sin6->sin6_family = AF_INET6; |
451 | sin6->sin6_port = udp_hdr(skb)->source; | 451 | sin6->sin6_port = udp_hdr(skb)->source; |
452 | sin6->sin6_flowinfo = 0; | 452 | sin6->sin6_flowinfo = 0; |
453 | sin6->sin6_scope_id = 0; | ||
454 | 453 | ||
455 | if (is_udp4) | 454 | if (is_udp4) { |
456 | ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, | 455 | ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr, |
457 | &sin6->sin6_addr); | 456 | &sin6->sin6_addr); |
458 | else { | 457 | sin6->sin6_scope_id = 0; |
458 | } else { | ||
459 | sin6->sin6_addr = ipv6_hdr(skb)->saddr; | 459 | sin6->sin6_addr = ipv6_hdr(skb)->saddr; |
460 | if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) | 460 | sin6->sin6_scope_id = |
461 | sin6->sin6_scope_id = IP6CB(skb)->iif; | 461 | ipv6_iface_scope_id(&sin6->sin6_addr, |
462 | IP6CB(skb)->iif); | ||
462 | } | 463 | } |
463 | 464 | ||
464 | } | 465 | } |
@@ -1118,7 +1119,7 @@ do_udp_sendmsg: | |||
1118 | 1119 | ||
1119 | if (addr_len >= sizeof(struct sockaddr_in6) && | 1120 | if (addr_len >= sizeof(struct sockaddr_in6) && |
1120 | sin6->sin6_scope_id && | 1121 | sin6->sin6_scope_id && |
1121 | ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL) | 1122 | __ipv6_addr_needs_scope_id(__ipv6_addr_type(daddr))) |
1122 | fl6.flowi6_oif = sin6->sin6_scope_id; | 1123 | fl6.flowi6_oif = sin6->sin6_scope_id; |
1123 | } else { | 1124 | } else { |
1124 | if (sk->sk_state != TCP_ESTABLISHED) | 1125 | if (sk->sk_state != TCP_ESTABLISHED) |