@ -972,6 +972,11 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,
return - EFAULT ;
switch ( optname ) {
case IPV6_HDRINCL :
if ( sk - > sk_type ! = SOCK_RAW )
return - EINVAL ;
inet_sk ( sk ) - > hdrincl = ! ! val ;
return 0 ;
case IPV6_CHECKSUM :
if ( inet_sk ( sk ) - > inet_num = = IPPROTO_ICMPV6 & &
level = = IPPROTO_IPV6 ) {
@ -1016,7 +1021,8 @@ static int rawv6_setsockopt(struct sock *sk, int level, int optname,
return - EOPNOTSUPP ;
return rawv6_seticmpfilter ( sk , level , optname , optval , optlen ) ;
case SOL_IPV6 :
if ( optname = = IPV6_CHECKSUM )
if ( optname = = IPV6_CHECKSUM | |
optname = = IPV6_HDRINCL )
break ;
default :
return ipv6_setsockopt ( sk , level , optname , optval , optlen ) ;
@ -1037,7 +1043,8 @@ static int compat_rawv6_setsockopt(struct sock *sk, int level, int optname,
return - EOPNOTSUPP ;
return rawv6_seticmpfilter ( sk , level , optname , optval , optlen ) ;
case SOL_IPV6 :
if ( optname = = IPV6_CHECKSUM )
if ( optname = = IPV6_CHECKSUM | |
optname = = IPV6_HDRINCL )
break ;
default :
return compat_ipv6_setsockopt ( sk , level , optname ,
@ -1057,6 +1064,9 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname,
return - EFAULT ;
switch ( optname ) {
case IPV6_HDRINCL :
val = inet_sk ( sk ) - > hdrincl ;
break ;
case IPV6_CHECKSUM :
/*
* We allow getsockopt ( ) for IPPROTO_IPV6 - level
@ -1094,7 +1104,8 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
return - EOPNOTSUPP ;
return rawv6_geticmpfilter ( sk , level , optname , optval , optlen ) ;
case SOL_IPV6 :
if ( optname = = IPV6_CHECKSUM )
if ( optname = = IPV6_CHECKSUM | |
optname = = IPV6_HDRINCL )
break ;
default :
return ipv6_getsockopt ( sk , level , optname , optval , optlen ) ;
@ -1115,7 +1126,8 @@ static int compat_rawv6_getsockopt(struct sock *sk, int level, int optname,
return - EOPNOTSUPP ;
return rawv6_geticmpfilter ( sk , level , optname , optval , optlen ) ;
case SOL_IPV6 :
if ( optname = = IPV6_CHECKSUM )
if ( optname = = IPV6_CHECKSUM | |
optname = = IPV6_HDRINCL )
break ;
default :
return compat_ipv6_getsockopt ( sk , level , optname ,