diff options
Diffstat (limited to 'net/ipv6/datagram.c')
| -rw-r--r-- | net/ipv6/datagram.c | 21 | 
1 files changed, 20 insertions, 1 deletions
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 622dc7939a1..f5076d349b1 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -497,7 +497,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)  int datagram_send_ctl(struct net *net,  		      struct msghdr *msg, struct flowi *fl,  		      struct ipv6_txoptions *opt, -		      int *hlimit, int *tclass) +		      int *hlimit, int *tclass, int *dontfrag)  {  	struct in6_pktinfo *src_info;  	struct cmsghdr *cmsg; @@ -737,6 +737,25 @@ int datagram_send_ctl(struct net *net,  			break;  		    } + +		case IPV6_DONTFRAG: +		    { +			int df; + +			err = -EINVAL; +			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { +				goto exit_f; +			} + +			df = *(int *)CMSG_DATA(cmsg); +			if (df < 0 || df > 1) +				goto exit_f; + +			err = 0; +			*dontfrag = df; + +			break; +		    }  		default:  			LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n",  				       cmsg->cmsg_type);  |