From patchwork Wed Feb 17 21:58:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wei Wang X-Patchwork-Id: 584365 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id ECCD0140081 for ; Thu, 18 Feb 2016 08:59:29 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=vHWM0bKz; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161581AbcBQV7Z (ORCPT ); Wed, 17 Feb 2016 16:59:25 -0500 Received: from mail-pa0-f54.google.com ([209.85.220.54]:33854 "EHLO mail-pa0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161234AbcBQV7Y (ORCPT ); Wed, 17 Feb 2016 16:59:24 -0500 Received: by mail-pa0-f54.google.com with SMTP id fy10so18129990pac.1 for ; Wed, 17 Feb 2016 13:59:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=xGjnwXvrAStWvy7dKooy7HIYSSEtIjUyomTTJwYcZ3o=; b=vHWM0bKz9dzAcY8kIq5htvKPfpMn6r0wKhHJtrba9F10woVaXvXVJU/bgePQL6ctgT Op0w/R9Fhv932DTK3S7UmWGPW+W1bTgaK4488E+16vZbEd5EIflPIt5A1YozEBlc3XZo oHwQdR2NAOuEcx5HdD8AxmfhwjAVbQvBftUxXM7vMT7qLk0xvaT7nqwJAkwBC+8RNth2 Ra6edbqI1iNsDYL23+TRpPNjwuIegc7CAZVLDTyoas7bkNDtAwYRNxFMPaWnJ3MPna3t DQKG4ar5UwawdkntV/TW7VHctdwAnFFlHdbBCIJ9RhZJksJ/6uZyOcx6fAZAkcaEzRsf 552A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=xGjnwXvrAStWvy7dKooy7HIYSSEtIjUyomTTJwYcZ3o=; b=ExjIa4QCmV7fIaiFzANW2P/zaUi6D18R7NYhorC32kkqeIzbGfqR0lalxnA4Ts1UBn IL0tGyboJsV6a3DLwwEH7qXwo3geDYs/NAApv6aJ1RU+kHm2EV4oCsJvfiVyG2zzKIBR TG8JkHKhcJqRurJ55IUa7Bh8tPQ439GO4wg5B5nZoyDKIL2pia3pOapctqYVlO8twu5/ IJrL3ofd22FM+Uc3lzLmH0LRMCA2F7SdHicKYJzrUTKk+UoRpU1V0OZYqlg2nG3/ef5o kcYvB3XygyUhhy4HNXv6z9yq4pbwui7/T4v1qoRUJPlzlKJliKN9EWR2yV95bU0qtm+J IADQ== X-Gm-Message-State: AG10YOQkJcDYCKNglCM6Q8GIpkPPvEt30sJoUVU86YswdQAGtOwQpYbjKHaZP5Oo/4QScQ== X-Received: by 10.66.139.166 with SMTP id qz6mr5364695pab.3.1455746363986; Wed, 17 Feb 2016 13:59:23 -0800 (PST) Received: from localhost ([2620:0:1000:3002:f011:46d1:65a:3568]) by smtp.gmail.com with ESMTPSA id z3sm4898926par.17.2016.02.17.13.59.23 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 17 Feb 2016 13:59:23 -0800 (PST) From: Wei Wang To: netdev@vger.kernel.org, "David S . Miller" Cc: Eric Dumazet , Wei Wang Subject: [PATCH net-next] ipv6: pass up EMSGSIZE msg for UDP socket in Ipv6 Date: Wed, 17 Feb 2016 13:58:22 -0800 Message-Id: <1455746302-53543-1-git-send-email-tracywwnj@gmail.com> X-Mailer: git-send-email 2.7.0.rc3.207.g0ac5344 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Wei Wang In ipv4, when the machine receives a ICMP_FRAG_NEEDED message, the connected UDP socket will get EMSGSIZE message on its next read from the socket. However, this is not the case for ipv6. This fix modifies the udp err handler in Ipv6 for ICMP6_PKT_TOOBIG to make it similar to ipv4 behavior. That is when the machine gets an ICMP6_PKT_TOOBIG message, the connected UDP socket will get EMSGSIZE message on its next read from the socket. Signed-off-by: Wei Wang Acked-by: Eric Dumazet --- net/ipv6/udp.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 22e28a4..a0da656 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -590,6 +590,7 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt, const struct in6_addr *daddr = &hdr->daddr; struct udphdr *uh = (struct udphdr *)(skb->data+offset); struct sock *sk; + int harderr; int err; struct net *net = dev_net(skb->dev); @@ -601,26 +602,27 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt, return; } + harderr = icmpv6_err_convert(type, code, &err); + np = inet6_sk(sk); + if (type == ICMPV6_PKT_TOOBIG) { if (!ip6_sk_accept_pmtu(sk)) goto out; ip6_sk_update_pmtu(skb, sk, info); + if (np->pmtudisc != IPV6_PMTUDISC_DONT) + harderr = 1; } if (type == NDISC_REDIRECT) { ip6_sk_redirect(skb, sk); goto out; } - np = inet6_sk(sk); - - if (!icmpv6_err_convert(type, code, &err) && !np->recverr) - goto out; - - if (sk->sk_state != TCP_ESTABLISHED && !np->recverr) - goto out; - - if (np->recverr) + if (!np->recverr) { + if (!harderr || sk->sk_state != TCP_ESTABLISHED) + goto out; + } else { ipv6_icmp_error(sk, skb, err, uh->dest, ntohl(info), (u8 *)(uh+1)); + } sk->sk_err = err; sk->sk_error_report(sk);