|
@@ -810,7 +810,7 @@ static int __ip_append_data(struct sock *sk,
|
|
|
int copy;
|
|
|
int err;
|
|
|
int offset = 0;
|
|
|
- unsigned int maxfraglen, fragheaderlen;
|
|
|
+ unsigned int maxfraglen, fragheaderlen, maxnonfragsize;
|
|
|
int csummode = CHECKSUM_NONE;
|
|
|
struct rtable *rt = (struct rtable *)cork->dst;
|
|
|
|
|
@@ -823,8 +823,10 @@ static int __ip_append_data(struct sock *sk,
|
|
|
|
|
|
fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
|
|
|
maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
|
|
|
+ maxnonfragsize = (inet->pmtudisc >= IP_PMTUDISC_DO) ?
|
|
|
+ mtu : 0xFFFF;
|
|
|
|
|
|
- if (cork->length + length > 0xFFFF - fragheaderlen) {
|
|
|
+ if (cork->length + length > maxnonfragsize - fragheaderlen) {
|
|
|
ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport,
|
|
|
mtu-exthdrlen);
|
|
|
return -EMSGSIZE;
|
|
@@ -1122,7 +1124,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
|
|
|
int mtu;
|
|
|
int len;
|
|
|
int err;
|
|
|
- unsigned int maxfraglen, fragheaderlen, fraggap;
|
|
|
+ unsigned int maxfraglen, fragheaderlen, fraggap, maxnonfragsize;
|
|
|
|
|
|
if (inet->hdrincl)
|
|
|
return -EPERM;
|
|
@@ -1146,8 +1148,10 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
|
|
|
|
|
|
fragheaderlen = sizeof(struct iphdr) + (opt ? opt->optlen : 0);
|
|
|
maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen;
|
|
|
+ maxnonfragsize = (inet->pmtudisc >= IP_PMTUDISC_DO) ?
|
|
|
+ mtu : 0xFFFF;
|
|
|
|
|
|
- if (cork->length + size > 0xFFFF - fragheaderlen) {
|
|
|
+ if (cork->length + size > maxnonfragsize - fragheaderlen) {
|
|
|
ip_local_error(sk, EMSGSIZE, fl4->daddr, inet->inet_dport, mtu);
|
|
|
return -EMSGSIZE;
|
|
|
}
|