From patchwork Thu Jun 9 11:22:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 632727 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 3rQNFH3CsJz9t3Z for ; Thu, 9 Jun 2016 21:22:27 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=HDi7reiG; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752516AbcFILWY (ORCPT ); Thu, 9 Jun 2016 07:22:24 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:34130 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751316AbcFILWW (ORCPT ); Thu, 9 Jun 2016 07:22:22 -0400 Received: by mail-pf0-f194.google.com with SMTP id 66so915341pfy.1; Thu, 09 Jun 2016 04:22:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=wCAdDtYsn1lOxEf5FrNNNqasTXvXTmFhlch38WaO2e8=; b=HDi7reiG9vPnnLXIHQejYWqFTmmUP+xFW1iHpXgktqmyp4UM14mluI8XWxitM1HI4o 39AxMjqXQRS2eaXuxmBCtq14Ub7yBJOWDWS1/cv4zVoyI38ot0vBU7zQ4M3/x98+ENCq qi0ImlGJDMqiwDc9ym15nvybdNMHg7kkBoPXE8jNzgmz1VT7lUV43nn7sm/JtobTZuhM iIFkRztvWKjMOL4WbpXJbkK9IRoIROh3A5ysePBtjVW6HnHVk+oNWPT4N5LEniteQYGi JgDXKpwgdHhTo7fKx7TEIR/AziLubzOMc0eFTBWboIEiqtf5eBiOSNC8bbs3+GbrxXA8 IAGg== 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=wCAdDtYsn1lOxEf5FrNNNqasTXvXTmFhlch38WaO2e8=; b=WFXH9Am3+cNuQqjk/1MzLd5gKzApfqi/o3ZW0U+M/cRi1nJubXyR43p5ZT55UZrD/7 iIqXARmj+Lg5htWZ+nq7f8TLX2k00EolySvAHhmkSNfof0ugIFtTrfK1gM8ZJWZAA+dk cgH3bdtGVtkJoHp8fBg2kTiMZg20wN/ht6odojflLQXSszVUENyrtGnydHL52GQS7FI8 MpxGG9iZfgs3Nm2aerM59h1PYfoPhsEBVYHXqk2m3D73ea97Dj4jR5X0onRFaN1DV/mo o0ZlmEyczS8kxBzIKwWeBETkhovC5bCJMhS3v3QHSaFjFPofSE6x3U4VLwj8qVpE9lXi zHHQ== X-Gm-Message-State: ALyK8tLNywjalV1V13jdxi0QbcBWvfcSeUkwT2NiWAh5FBKPxEHT7zwz1UPk9ULr7OA5Pw== X-Received: by 10.98.91.7 with SMTP id p7mr4345136pfb.8.1465471341388; Thu, 09 Jun 2016 04:22:21 -0700 (PDT) Received: from localhost (138.128.208.20.16clouds.com. [138.128.208.20]) by smtp.gmail.com with ESMTPSA id 14sm9297561pfu.83.2016.06.09.04.22.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Jun 2016 04:22:20 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Vlad Yasevich , daniel@iogearbox.net, davem@davemloft.net, eric.dumazet@gmail.com Subject: [PATCHv3 net-next] sctp: sctp should change socket state when shutdown is received Date: Thu, 9 Jun 2016 19:22:16 +0800 Message-Id: <4ad023d07da2c81ea9f5014e48f0aa34b50b64eb.1465471336.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Now sctp doesn't change socket state upon shutdown reception. It changes just the assoc state, even though it's a TCP-style socket. For some cases, if we really need to check sk->sk_state, it's necessary to fix this issue, at least when we use ss or netstat to dump, we can get a more exact information. As an improvement, we will change sk->sk_state when we change asoc->state to SHUTDOWN_RECEIVED, and also do it in sctp_shutdown to keep consistent with sctp_close. Signed-off-by: Xin Long --- net/sctp/sm_sideeffect.c | 4 +++- net/sctp/socket.c | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index aa37122..12d4519 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -806,8 +806,10 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, /* Set the RCV_SHUTDOWN flag when a SHUTDOWN is received. */ if (sctp_state(asoc, SHUTDOWN_RECEIVED) && - sctp_sstate(sk, ESTABLISHED)) + sctp_sstate(sk, ESTABLISHED)) { + sk->sk_state = SCTP_SS_CLOSING; sk->sk_shutdown |= RCV_SHUTDOWN; + } } if (sctp_state(asoc, COOKIE_WAIT)) { diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 67154b8..80d860a 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -4193,6 +4193,7 @@ static void sctp_shutdown(struct sock *sk, int how) return; if (how & SEND_SHUTDOWN) { + sk->sk_state = SCTP_SS_CLOSING; ep = sctp_sk(sk)->ep; if (!list_empty(&ep->asocs)) { asoc = list_entry(ep->asocs.next, @@ -7564,10 +7565,12 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, /* If the association on the newsk is already closed before accept() * is called, set RCV_SHUTDOWN flag. */ - if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) + if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) { + newsk->sk_state = SCTP_SS_CLOSING; newsk->sk_shutdown |= RCV_SHUTDOWN; + } else + newsk->sk_state = SCTP_SS_ESTABLISHED; - newsk->sk_state = SCTP_SS_ESTABLISHED; release_sock(newsk); }