From patchwork Wed Jun 7 21:07:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Andersson X-Patchwork-Id: 772692 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 3wjh3K6VDgz9sDF for ; Thu, 8 Jun 2017 07:07:57 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="RGYKLT5v"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751958AbdFGVHt (ORCPT ); Wed, 7 Jun 2017 17:07:49 -0400 Received: from mail-pg0-f41.google.com ([74.125.83.41]:36585 "EHLO mail-pg0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751889AbdFGVHq (ORCPT ); Wed, 7 Jun 2017 17:07:46 -0400 Received: by mail-pg0-f41.google.com with SMTP id a70so9078386pge.3 for ; Wed, 07 Jun 2017 14:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=trZPSTIv0LkvQ3VvBzlArdmueRgUpcWdE8yr6CsIiZA=; b=RGYKLT5v1iCLeK5TqJ4HRK4CKE/NzsOpR20bxdJledk+XEyoO5CsXHFsjIiPdEB/l0 6ip6+0x6XiUYaTwB17uWTnXomwbwK3Q/8CcPVttpDxVTooobgOv+wcUYjvMYpzSvW3DA Y3ah7dtvYk+rXB3awYMPNVQDO6GGw4321ekbE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=trZPSTIv0LkvQ3VvBzlArdmueRgUpcWdE8yr6CsIiZA=; b=nuc+VusOTh9EfI0pYJL7EdkrrXbmu9uYsFl9RcA6u7o6dRPCchQUiKv1kU75PlbEqI eCLO4ZxXJVFAH0M+bBHL5zN3pwOQftKgURSFbTjSbY03obm8klOFjRxYna0gVT/PwccY L89Eble9+GO4xpk55WC1jQ4DWFe90tUNhYpI9ZM7VQaraPQUOvyaKc0S6HCLX6LVMQXL 3Xhl0VocbAb5Pvr0AN7bg23jYkjljYRCIuSkQabBasCt2+McTlE4OIFUq4sesglKxLbn YvQECHGpjl2doDmwViRkehxwGDbVfVtzj+qvKYPbXJaSUuD6mQzJNlGn5+1WaeRDpu9g 6NTw== X-Gm-Message-State: AODbwcBgIAppQ/+dLvBZWWJlWUbHTQFuQu/yAT3ETcDdChPs4AAp3BTh O0TY5sNsa2bQotG3 X-Received: by 10.84.213.129 with SMTP id g1mr27567122pli.202.1496869665585; Wed, 07 Jun 2017 14:07:45 -0700 (PDT) Received: from localhost.localdomain (ip68-111-217-79.sd.sd.cox.net. [68.111.217.79]) by smtp.gmail.com with ESMTPSA id s131sm6564392pgs.6.2017.06.07.14.07.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 07 Jun 2017 14:07:45 -0700 (PDT) From: Bjorn Andersson To: "David S. Miller" Cc: Arun Kumar Neelakantam , netdev@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Courtney Cavin Subject: [RESEND PATCH 2/4] net: qrtr: Inject BYE on remote termination Date: Wed, 7 Jun 2017 14:07:37 -0700 Message-Id: <20170607210739.27263-3-bjorn.andersson@linaro.org> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20170607210739.27263-1-bjorn.andersson@linaro.org> References: <20170607210739.27263-1-bjorn.andersson@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Per the QMUX protocol specification a terminating node can send a BYE control message to signal that the link is going down, upon receiving this all information about remote services should be discarded and local clients should be notified. In the event that the link was brought down abruptly the router is supposed to act like a BYE message has arrived. As there is no harm in receiving an extra BYE from the remote this patch implements the latter by injecting a BYE when the link to the remote is unregistered. The name service will receive the BYE and can implement the notification to the local clients. Cc: Courtney Cavin Signed-off-by: Bjorn Andersson --- net/qrtr/qrtr.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 86d35ed50da9..e8cbab23d667 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c @@ -111,6 +111,8 @@ struct qrtr_node { struct list_head item; }; +static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb); + /* Release node resources and free the node. * * Do not call directly, use qrtr_node_release. To be used with @@ -291,6 +293,25 @@ static struct sk_buff *qrtr_alloc_resume_tx(u32 src_node, return skb; } +/* Allocate and construct a BYE message to signal remote termination */ +static struct sk_buff *qrtr_alloc_local_bye(u32 src_node) +{ + const int pkt_len = 20; + struct sk_buff *skb; + __le32 *buf; + + skb = qrtr_alloc_ctrl_packet(QRTR_TYPE_BYE, pkt_len, + src_node, qrtr_local_nid); + if (!skb) + return NULL; + + buf = (__le32 *)skb_put(skb, pkt_len); + memset(buf, 0, pkt_len); + buf[0] = cpu_to_le32(QRTR_TYPE_BYE); + + return skb; +} + static struct qrtr_sock *qrtr_port_lookup(int port); static void qrtr_port_put(struct qrtr_sock *ipc); @@ -382,11 +403,17 @@ EXPORT_SYMBOL_GPL(qrtr_endpoint_register); void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) { struct qrtr_node *node = ep->node; + struct sk_buff *skb; mutex_lock(&node->ep_lock); node->ep = NULL; mutex_unlock(&node->ep_lock); + /* Notify the local controller about the event */ + skb = qrtr_alloc_local_bye(node->nid); + if (skb) + qrtr_local_enqueue(NULL, skb); + qrtr_node_release(node); ep->node = NULL; }