diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 2aa294be0c79..0feaee38bc37 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -395,6 +395,28 @@ sticky_done: | |||
395 | break; | 395 | break; |
396 | } | 396 | } |
397 | 397 | ||
398 | case IPV6_PKTINFO: | ||
399 | { | ||
400 | struct in6_pktinfo pkt; | ||
401 | |||
402 | if (optlen == 0) | ||
403 | goto e_inval; | ||
404 | else if (optlen < sizeof(struct in6_pktinfo) || optval == NULL) | ||
405 | goto e_inval; | ||
406 | |||
407 | if (copy_from_user(&pkt, optval, optlen)) { | ||
408 | retv = -EFAULT; | ||
409 | break; | ||
410 | } | ||
411 | if (sk->sk_bound_dev_if && pkt.ipi6_ifindex != sk->sk_bound_dev_if) | ||
412 | goto e_inval; | ||
413 | |||
414 | np->sticky_pktinfo.ipi6_ifindex = pkt.ipi6_ifindex; | ||
415 | ipv6_addr_copy(&np->sticky_pktinfo.ipi6_addr, &pkt.ipi6_addr); | ||
416 | retv = 0; | ||
417 | break; | ||
418 | } | ||
419 | |||
398 | case IPV6_2292PKTOPTIONS: | 420 | case IPV6_2292PKTOPTIONS: |
399 | { | 421 | { |
400 | struct ipv6_txoptions *opt = NULL; | 422 | struct ipv6_txoptions *opt = NULL; |