|
|
@@ -919,6 +919,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
|
int ulen = len;
|
|
|
int hlimit = -1;
|
|
|
int tclass = -1;
|
|
|
+ int dontfrag = -1;
|
|
|
int corkreq = up->corkflag || msg->msg_flags&MSG_MORE;
|
|
|
int err;
|
|
|
int connected = 0;
|
|
|
@@ -1049,7 +1050,8 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
|
memset(opt, 0, sizeof(struct ipv6_txoptions));
|
|
|
opt->tot_len = sizeof(*opt);
|
|
|
|
|
|
- err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit, &tclass);
|
|
|
+ err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit,
|
|
|
+ &tclass, &dontfrag);
|
|
|
if (err < 0) {
|
|
|
fl6_sock_release(flowlabel);
|
|
|
return err;
|
|
|
@@ -1120,6 +1122,9 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
|
if (tclass < 0)
|
|
|
tclass = np->tclass;
|
|
|
|
|
|
+ if (dontfrag < 0)
|
|
|
+ dontfrag = np->dontfrag;
|
|
|
+
|
|
|
if (msg->msg_flags&MSG_CONFIRM)
|
|
|
goto do_confirm;
|
|
|
back_from_confirm:
|
|
|
@@ -1143,7 +1148,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|
|
err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen,
|
|
|
sizeof(struct udphdr), hlimit, tclass, opt, &fl,
|
|
|
(struct rt6_info*)dst,
|
|
|
- corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);
|
|
|
+ corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags, dontfrag);
|
|
|
if (err)
|
|
|
udp_v6_flush_pending_frames(sk);
|
|
|
else if (!corkreq)
|