From patchwork Mon Feb 6 11:46:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "D. Starke" X-Patchwork-Id: 53197 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2188843wrn; Mon, 6 Feb 2023 03:54:34 -0800 (PST) X-Google-Smtp-Source: AK7set/4FPMv26lBTBLzORD/VOpyLVEMYdAKmpCHF/xSg7ICY8v+LkfPGuzsgbrk6ikjfUvHlB5s X-Received: by 2002:a17:906:a88e:b0:87a:3aff:cffa with SMTP id ha14-20020a170906a88e00b0087a3affcffamr18672762ejb.27.1675684474116; Mon, 06 Feb 2023 03:54:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675684474; cv=none; d=google.com; s=arc-20160816; b=ZOQxK6ugqH5x+g3fepB6l2MRYLca7jebP6v8RfTxrZva8CjvCMUg4A+ufQoHTzPrgm Jm7PD+2z3QGF0oPtXtJ494IlgG8Tnka6yGPYu0p3DbktTCPhbmlsOC3s3w9XQm6Yezp0 ZEhoOTnLdp9l4BjqAdKIaZ4iD0BarYmQgq5GjG8j2XgcYK9ew2yKx4rfQtQ69BCN2//i bsMzDssFSlkmORsB04ll63s2QW5TfS+ZRVeLwljh0Bki1pv7GpUeiZy7x3dDp/CG88t4 HnYfvzeysazfRyxFadcocH4NocorGCmvQKPCMJVBi6qgePqsENo8XL22+f++nG+kDgpq aJcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dkim-signature; bh=wS7DCQJ3CnjHhUZAXPDyQtVIoeoWJA5RCvr8dQtB6ns=; b=rsVN5LhQeG6sk5C4Fadol7TRdqJVLs/popPRtLyN8PyZkk70muO6080YX4NEQlcu0q ka8Qa+sQhkKkKtj+xY9GDAs61gGUIRpcsrFep0bkBCJ8sebjTb6HzgoNhn/GHiixCxzj yd4LWI6VKmpupkJjpO5cdAh66VuNq6RrmGq4Gry5+CbUdsnBDdAPiX6yJEE+ntJqff96 rYjG82ctA887+uyVh67vn74oAmwn0UD1/3LdaSa3yUVZAOXnJlSCAtOO/Gd0zegYUx+c XmBJceFA7o+DF62dkwyy5oShRDOlz5VltOfIYgm0VMiF93ZnxyYCtUweqp32b0OR72ph MqzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b="e/KSb6r7"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id fq4-20020a1709069d8400b00892bd6aca11si7351580ejc.13.2023.02.06.03.54.11; Mon, 06 Feb 2023 03:54:34 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b="e/KSb6r7"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229630AbjBFLrl (ORCPT + 99 others); Mon, 6 Feb 2023 06:47:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57406 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229628AbjBFLrk (ORCPT ); Mon, 6 Feb 2023 06:47:40 -0500 Received: from mta-64-228.siemens.flowmailer.net (mta-64-228.siemens.flowmailer.net [185.136.64.228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BB4C30E9 for ; Mon, 6 Feb 2023 03:47:37 -0800 (PST) Received: by mta-64-228.siemens.flowmailer.net with ESMTPSA id 2023020611473405ec702c36a2ec9083 for ; Mon, 06 Feb 2023 12:47:34 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc; bh=wS7DCQJ3CnjHhUZAXPDyQtVIoeoWJA5RCvr8dQtB6ns=; b=e/KSb6r7YnuAcqRH1RaUxjgAutpUc7UdxF4/5oW+APJ3S88wqhSV/2O+sRiy7hpIMlqk2a mmt+Ej/38zRQeMdgP/+bUK6dOkodF5vbt4ODti05gn7qKkzZF/QZ+pvxxARhtM91FaBn2KMg drfdyw+BBUIYuE2sGd+I17qat+L98=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v4 1/4] tty: n_gsm: mark unusable ioctl structure fields accordingly Date: Mon, 6 Feb 2023 12:46:03 +0100 Message-Id: <20230206114606.2133-1-daniel.starke@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757082523059925963?= X-GMAIL-MSGID: =?utf-8?q?1757082523059925963?= From: Daniel Starke gsm_config and gsm_netconfig includes unused fields that have been included to allow future extension without changing the structure size. Unfortunately, no checks have been included for these field. The actual value set by old user space code remains undefined. This means that future extensions can not use these fields without breaking old user space code which may set unexpected values. Mark these fields accordingly to avoid breaking code changes. Signed-off-by: Daniel Starke --- include/uapi/linux/gsmmux.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) v3 -> v4: No changes. Link: https://lore.kernel.org/all/20230203145023.6012-1-daniel.starke@siemens.com/ diff --git a/include/uapi/linux/gsmmux.h b/include/uapi/linux/gsmmux.h index cb8693b39cb7..785d6b253f6d 100644 --- a/include/uapi/linux/gsmmux.h +++ b/include/uapi/linux/gsmmux.h @@ -19,8 +19,7 @@ struct gsm_config unsigned int mtu; unsigned int k; unsigned int i; - unsigned int unused[8]; /* Padding for expansion without - breaking stuff */ + unsigned int unused[8]; /* Can not be used */ }; #define GSMIOC_GETCONF _IOR('G', 0, struct gsm_config) @@ -29,9 +28,9 @@ struct gsm_config struct gsm_netconfig { unsigned int adaption; /* Adaption to use in network mode */ unsigned short protocol;/* Protocol to use - only ETH_P_IP supported */ - unsigned short unused2; + unsigned short unused2; /* Can not be used */ char if_name[IFNAMSIZ]; /* interface name format string */ - __u8 unused[28]; /* For future use */ + __u8 unused[28]; /* Can not be used */ }; #define GSMIOC_ENABLE_NET _IOW('G', 2, struct gsm_netconfig) From patchwork Mon Feb 6 11:46:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "D. Starke" X-Patchwork-Id: 53196 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2188761wrn; Mon, 6 Feb 2023 03:54:22 -0800 (PST) X-Google-Smtp-Source: AK7set9KheI+p3ysCKRSXo7Q4mTMpwbG1TRQe6Ueoq4EQyRUt7PjTGifGRBoEqia9WXjQ/UnWLnN X-Received: by 2002:a05:6a00:299a:b0:590:732b:f1b2 with SMTP id cj26-20020a056a00299a00b00590732bf1b2mr20289016pfb.15.1675684462233; Mon, 06 Feb 2023 03:54:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675684462; cv=none; d=google.com; s=arc-20160816; b=OYQ+MakaA34bYOepRMmiIfKVvaA2DZE9zdmD7PmrouVa7JuyCm0Ep1Sf1OFYttrWh0 /6US9AdFNgV16iIaM1QFCPMo7uPCYL46vkQPtk1f33ihpW6G/g55DxDZn6AhRVwZl+77 G3+xCNhODPDul2Kv4nwFNSSVT1pAG2w5b1JNRxCxezKktERE68sU0PoHV0syr1FlOITI xkQZUD8vCKBRkjJniguW3KB5M4ovffzRFcGc0klmY4fFAezjXOJ0OnhVan/P2v3b02QD BOfn2VAu4dqRvmvgslmDK5IhVl5oQyKsSQ8v6OvZgdIaTW1sxZCu3SpuHmo4fCANhaTS p53Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=NQDga2t8E/BpR22JLP/9XaUUUYMhOqxgRevy0Bi5poA=; b=I7UY/5G42zyBNOcNeDCZdKDLfcYwaw4euXDwm7OxDJJtKzBozst2FtOZoXM+iBHtdJ rzjAj+Adsq6re/Sp05z7RSHimxREvgFZ1KiUk7sph9D55Urh0u2RcVNPgKUGCm7v8XfM WT45RHQZe5aENtVJRszsufnSphQ2x1ORJaoSCaAOlwxflLlbVf2innxZstPeinOKi3Fl 6vWIkGPEpRLnc/PnnpADaMtQRo1dzj/8927jASxmRXicfYKfRcZOeGKir+8/NLhgjyF0 vZyZICp4hZOOty9kA4n8fAm7HB0QIHJjqPpdmT8wmkc7/AL6uiDSaGRp8askDQdsNLRs Cu6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=n3iZDZoZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z67-20020a626546000000b005a6115dcad3si318496pfb.188.2023.02.06.03.54.09; Mon, 06 Feb 2023 03:54:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=n3iZDZoZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229832AbjBFLro (ORCPT + 99 others); Mon, 6 Feb 2023 06:47:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229797AbjBFLrk (ORCPT ); Mon, 6 Feb 2023 06:47:40 -0500 Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F39222035 for ; Mon, 6 Feb 2023 03:47:37 -0800 (PST) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 2023020611473544b9941544201b54ac for ; Mon, 06 Feb 2023 12:47:35 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=NQDga2t8E/BpR22JLP/9XaUUUYMhOqxgRevy0Bi5poA=; b=n3iZDZoZyZZlDwYPFjivjyWBPQdOqU9Ab+vyUhDE/nh9reqxZZGChuoB/ckc13U3HBvGsb mdMyHvHLTQRAANcCwx4xmOKW9/mCXQnvGjh/gMbVq22lI7fLb0Dy4/mCYg3F3h190BpBMAhl nxcbPdZly2HbxOWoYYZ89l9KwZ1JI=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v4 2/4] tty: n_gsm: add keep alive support Date: Mon, 6 Feb 2023 12:46:04 +0100 Message-Id: <20230206114606.2133-2-daniel.starke@siemens.com> In-Reply-To: <20230206114606.2133-1-daniel.starke@siemens.com> References: <20230206114606.2133-1-daniel.starke@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757082510517749666?= X-GMAIL-MSGID: =?utf-8?q?1757082510517749666?= From: Daniel Starke n_gsm is based on the 3GPP 07.010 and its newer version is the 3GPP 27.010. See https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=1516 The changes from 07.010 to 27.010 are non-functional. Therefore, I refer to the newer 27.010 here. Chapters 5.4.6.3.4 and 5.1.8.1.3 describe the test command which can be used to test the mux connection between both sides. Currently, no algorithm is implemented to make use of this command. This requires that each multiplexed upper layer protocol supervises the underlying muxer connection to handle possible connection losses. Introduce an ioctl commands and functions to optionally enable keep alive handling via the test command as described in chapter 5.4.6.3.4. A single incrementing octet is being used to distinguish between multiple retries. Retry count and interval are taken from the general parameters N2 and T2. Note that support for the test command is mandatory and already present in the muxer implementation since the very first version. Also note that the previous ioctl structure gsm_config cannot be extended due to missing checks against zero of the field "unused". Signed-off-by: Daniel Starke --- drivers/tty/n_gsm.c | 107 +++++++++++++++++++++++++++++++++++- include/uapi/linux/gsmmux.h | 10 ++++ 2 files changed, 115 insertions(+), 2 deletions(-) v3 -> v4: Changed gsm_config_ext() to perform the reserved fields check before taking the keep-alive parameter as recommended in the review. Link: https://lore.kernel.org/all/Y+DVqtfBRytURnov@kroah.com/ diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 5783801d6524..c94df9cd282f 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -318,6 +318,11 @@ struct gsm_mux { struct gsm_control *pending_cmd;/* Our current pending command */ spinlock_t control_lock; /* Protects the pending command */ + /* Keep-alive */ + struct timer_list ka_timer; /* Keep-alive response timer */ + u8 ka_num; /* Keep-alive match pattern */ + int ka_retries; /* Keep-alive retry counter */ + /* Configuration */ int adaption; /* 1 or 2 supported */ u8 ftype; /* UI or UIH */ @@ -325,6 +330,7 @@ struct gsm_mux { unsigned int t3; /* Power wake-up timer in seconds. */ int n2; /* Retry count */ u8 k; /* Window size */ + u32 keep_alive; /* Control channel keep-alive in ms */ /* Statistics (not currently exposed) */ unsigned long bad_fcs; @@ -1897,11 +1903,13 @@ static void gsm_control_response(struct gsm_mux *gsm, unsigned int command, const u8 *data, int clen) { struct gsm_control *ctrl; + struct gsm_dlci *dlci; unsigned long flags; spin_lock_irqsave(&gsm->control_lock, flags); ctrl = gsm->pending_cmd; + dlci = gsm->dlci[0]; command |= 1; /* Does the reply match our command */ if (ctrl != NULL && (command == ctrl->cmd || command == CMD_NSC)) { @@ -1916,6 +1924,54 @@ static void gsm_control_response(struct gsm_mux *gsm, unsigned int command, /* Or did we receive the PN response to our PN command */ } else if (command == CMD_PN) { gsm_control_negotiation(gsm, 0, data, clen); + /* Or did we receive the TEST response to our TEST command */ + } else if (command == CMD_TEST && clen == 1 && *data == gsm->ka_num) { + gsm->ka_retries = -1; /* trigger new keep-alive message */ + if (dlci && !dlci->dead) + mod_timer(&gsm->ka_timer, + jiffies + gsm->keep_alive * HZ / 100); + } + spin_unlock_irqrestore(&gsm->control_lock, flags); +} + +/** + * gsm_control_keep_alive - check timeout or start keep-alive + * @t: timer contained in our gsm object + * + * Called off the keep-alive timer expiry signaling that our link + * partner is not responding anymore. Link will be closed. + * This is also called to startup our timer. + */ + +static void gsm_control_keep_alive(struct timer_list *t) +{ + struct gsm_mux *gsm = from_timer(gsm, t, ka_timer); + unsigned long flags; + + spin_lock_irqsave(&gsm->control_lock, flags); + if (gsm->ka_num && gsm->ka_retries == 0) { + /* Keep-alive expired -> close the link */ + if (debug & DBG_ERRORS) + pr_info("%s keep-alive timed out\n", __func__); + spin_unlock_irqrestore(&gsm->control_lock, flags); + if (gsm->dlci[0]) + gsm_dlci_begin_close(gsm->dlci[0]); + return; + } else if (gsm->keep_alive && gsm->dlci[0] && !gsm->dlci[0]->dead) { + if (gsm->ka_retries > 0) { + /* T2 expired for keep-alive -> resend */ + gsm->ka_retries--; + } else { + /* Start keep-alive timer */ + gsm->ka_num++; + if (!gsm->ka_num) + gsm->ka_num++; + gsm->ka_retries = gsm->n2; + } + gsm_control_command(gsm, CMD_TEST, &gsm->ka_num, + sizeof(gsm->ka_num)); + mod_timer(&gsm->ka_timer, + jiffies + gsm->t2 * HZ / 100); } spin_unlock_irqrestore(&gsm->control_lock, flags); } @@ -2061,8 +2117,10 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) /* Ensure that gsmtty_open() can return. */ tty_port_set_initialized(&dlci->port, false); wake_up_interruptible(&dlci->port.open_wait); - } else + } else { + del_timer(&dlci->gsm->ka_timer); dlci->gsm->dead = true; + } /* A DLCI 0 close is a MUX termination so we need to kick that back to userspace somehow */ gsm_dlci_data_kick(dlci); @@ -2078,6 +2136,8 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) static void gsm_dlci_open(struct gsm_dlci *dlci) { + struct gsm_mux *gsm = dlci->gsm; + /* Note that SABM UA .. SABM UA first UA lost can mean that we go open -> open */ del_timer(&dlci->t1); @@ -2087,8 +2147,15 @@ static void gsm_dlci_open(struct gsm_dlci *dlci) if (debug & DBG_ERRORS) pr_debug("DLCI %d goes open.\n", dlci->addr); /* Send current modem state */ - if (dlci->addr) + if (dlci->addr) { gsm_modem_update(dlci, 0); + } else { + /* Start keep-alive control */ + gsm->ka_num = 0; + gsm->ka_retries = -1; + mod_timer(&gsm->ka_timer, + jiffies + gsm->keep_alive * HZ / 100); + } gsm_dlci_data_kick(dlci); wake_up(&dlci->gsm->event); } @@ -2840,6 +2907,7 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc) /* Finish outstanding timers, making sure they are done */ del_timer_sync(&gsm->kick_timer); del_timer_sync(&gsm->t2_timer); + del_timer_sync(&gsm->ka_timer); /* Finish writing to ldisc */ flush_work(&gsm->tx_work); @@ -2987,6 +3055,7 @@ static struct gsm_mux *gsm_alloc_mux(void) INIT_LIST_HEAD(&gsm->tx_data_list); timer_setup(&gsm->kick_timer, gsm_kick_timer, 0); timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0); + timer_setup(&gsm->ka_timer, gsm_control_keep_alive, 0); INIT_WORK(&gsm->tx_work, gsmld_write_task); init_waitqueue_head(&gsm->event); spin_lock_init(&gsm->control_lock); @@ -3003,6 +3072,7 @@ static struct gsm_mux *gsm_alloc_mux(void) gsm->mru = 64; /* Default to encoding 1 so these should be 64 */ gsm->mtu = 64; gsm->dead = true; /* Avoid early tty opens */ + gsm->keep_alive = 0; /* Disabled */ /* Store the instance to the mux array or abort if no space is * available. @@ -3138,6 +3208,29 @@ static int gsm_config(struct gsm_mux *gsm, struct gsm_config *c) return 0; } +static void gsm_copy_config_ext_values(struct gsm_mux *gsm, + struct gsm_config_ext *ce) +{ + memset(ce, 0, sizeof(*ce)); + ce->keep_alive = gsm->keep_alive; +} + +static int gsm_config_ext(struct gsm_mux *gsm, struct gsm_config_ext *ce) +{ + unsigned int i; + + /* + * Check that userspace doesn't put stuff in here to prevent breakages + * in the future. + */ + for (i = 0; i < ARRAY_SIZE(ce->reserved); i++) + if (ce->reserved[i]) + return -EINVAL; + + gsm->keep_alive = ce->keep_alive; + return 0; +} + /** * gsmld_output - write to link * @gsm: our mux @@ -3456,6 +3549,7 @@ static int gsmld_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { struct gsm_config c; + struct gsm_config_ext ce; struct gsm_mux *gsm = tty->disc_data; unsigned int base; @@ -3472,6 +3566,15 @@ static int gsmld_ioctl(struct tty_struct *tty, unsigned int cmd, case GSMIOC_GETFIRST: base = mux_num_to_base(gsm); return put_user(base + 1, (__u32 __user *)arg); + case GSMIOC_GETCONF_EXT: + gsm_copy_config_ext_values(gsm, &ce); + if (copy_to_user((void __user *)arg, &ce, sizeof(ce))) + return -EFAULT; + return 0; + case GSMIOC_SETCONF_EXT: + if (copy_from_user(&ce, (void __user *)arg, sizeof(ce))) + return -EFAULT; + return gsm_config_ext(gsm, &ce); default: return n_tty_ioctl_helper(tty, cmd, arg); } diff --git a/include/uapi/linux/gsmmux.h b/include/uapi/linux/gsmmux.h index 785d6b253f6d..98de2570d79b 100644 --- a/include/uapi/linux/gsmmux.h +++ b/include/uapi/linux/gsmmux.h @@ -39,4 +39,14 @@ struct gsm_netconfig { /* get the base tty number for a configured gsmmux tty */ #define GSMIOC_GETFIRST _IOR('G', 4, __u32) +struct gsm_config_ext { + __u32 keep_alive; /* Control channel keep-alive in 1/100th of a + * second (0 to disable) + */ + __u32 reserved[7]; /* For future use */ +}; + +#define GSMIOC_GETCONF_EXT _IOR('G', 5, struct gsm_config_ext) +#define GSMIOC_SETCONF_EXT _IOW('G', 6, struct gsm_config_ext) + #endif From patchwork Mon Feb 6 11:46:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "D. Starke" X-Patchwork-Id: 53199 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2189126wrn; Mon, 6 Feb 2023 03:55:17 -0800 (PST) X-Google-Smtp-Source: AK7set+E+KLzYGF3yzOwDaHwTHE/tKtFblBworMP9ofC0WlqHFCu1D/ZZckJhL0zv9lTmL6ZFgO4 X-Received: by 2002:a17:907:1c27:b0:84c:e9c4:5751 with SMTP id nc39-20020a1709071c2700b0084ce9c45751mr23767078ejc.74.1675684517006; Mon, 06 Feb 2023 03:55:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675684516; cv=none; d=google.com; s=arc-20160816; b=0rXVFZl3Zqehv25/SFn2sYMIzjhZLGG4DcFKyoQDrpY4qn5CxqGNSfoiKispKP80q0 6NPCFirnOyxdud6tKn4ncyVGqcTeLZULRqgRNp8+r3zHvfDVaS8k/tAw0FgsLHdp5v/5 uezJjkwoeM/T9Pdz2W4aVuh4zvre+d5khpLN48hmFXOTgTa0X7qcRS93ihbezmFDz3VZ beBoWVHwln84WHWXE+LsuzVX0XSa3ZjDVSWAe5SYBLfA2Xa1/eStDcWJ3e4dKGvtUZdu 8St9gdbNTdBfZvQqGxEQ5fCQvCqM5h/478yjQlCGMTsmVo6qfbiEXOWMG1JXQw2cvuCw y0Tg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=HhS7+5mD6CUlGIqfQ082PHM7C4tTeQJNXTgjkyBnukA=; b=gi9+3WYrRp8dVvKN19NtDQne6NdcUbd28RzXcyMJ4flLjsiTrSUx8LPs8cYLT/E5Tb G8wYRE6eo+RN3HGqWoVyUQnr38HoBK8ue9V2YuYSjDBeiSxvtZBlbMSrIpN5x7hRhzab 31K+FHnYpQGWUkd5aJl89d0yLNEC7axjjSytyVbmiv/MeMQAdmZQRYjLIYI2qY/B0qi5 tvK/luAe12apkroabDcn8BgDi3Iyzxv7IwGYC07U3Goy04n5sqo0QK3owlcM+xBxZwuM kXsp0YKFok8UNd9J+di9nstvdPpvz+J9JgIYUELURg2U71tOnIhMTe+C/U2jo/tGblXk bwyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=DarpiACR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id eu21-20020a170907299500b008927124ffcasi10893143ejc.777.2023.02.06.03.54.53; Mon, 06 Feb 2023 03:55:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=DarpiACR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229806AbjBFLs7 (ORCPT + 99 others); Mon, 6 Feb 2023 06:48:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59046 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229811AbjBFLsv (ORCPT ); Mon, 6 Feb 2023 06:48:51 -0500 X-Greylist: delayed 61 seconds by postgrey-1.37 at lindbergh.monkeyblade.net; Mon, 06 Feb 2023 03:48:42 PST Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net [185.136.65.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 109F130C6 for ; Mon, 6 Feb 2023 03:48:40 -0800 (PST) Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 202302061147373eb31dba550380a485 for ; Mon, 06 Feb 2023 12:47:37 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=HhS7+5mD6CUlGIqfQ082PHM7C4tTeQJNXTgjkyBnukA=; b=DarpiACRIUtayO5szqOMAQ3wagw2Waz1V8ShxwyFHmgvPLWqfdpqkjntvsngoy2ayfnuTU Qfjn9Eo4bqynRXFqhT8ASr2F2gWuR5w4NIUfFuWs945rVEqfsIroiT7CawARGiUQO5q5vYSR Pg8MOkvl/RCrUujMYv4AeF3wK1wwA=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v4 3/4] tty: n_gsm: add RING/CD control support Date: Mon, 6 Feb 2023 12:46:05 +0100 Message-Id: <20230206114606.2133-3-daniel.starke@siemens.com> In-Reply-To: <20230206114606.2133-1-daniel.starke@siemens.com> References: <20230206114606.2133-1-daniel.starke@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757082567959943739?= X-GMAIL-MSGID: =?utf-8?q?1757082567959943739?= From: Daniel Starke The status lines ring and carrier detect are used by the modem to signal incoming calls (RING) or an established connection (CD). This is implemented as physical lines on a standard RS232 connection. However, the muxer protocol encodes these status lines as modem bits IC and DV. These incoming lines are masked by tty driver (see tty_io.c) and cannot be set by a user application. Allow setting RING via TIOCM_OUT1 and CD via TIOCM_OUT2 to allow implementation of a modem or modem emulator. Signed-off-by: Daniel Starke --- drivers/tty/n_gsm.c | 5 +++++ 1 file changed, 5 insertions(+) v3 -> v4: No changes. Link: https://lore.kernel.org/all/20230203145023.6012-3-daniel.starke@siemens.com/ diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index c94df9cd282f..79efbfd27171 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -546,6 +546,11 @@ static u8 gsm_encode_modem(const struct gsm_dlci *dlci) modembits |= MDM_IC; if (dlci->modem_tx & TIOCM_CD || dlci->gsm->initiator) modembits |= MDM_DV; + /* special mappings for passive side to operate as UE */ + if (dlci->modem_tx & TIOCM_OUT1) + modembits |= MDM_IC; + if (dlci->modem_tx & TIOCM_OUT2) + modembits |= MDM_DV; return modembits; } From patchwork Mon Feb 6 11:46:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "D. Starke" X-Patchwork-Id: 53198 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2188921wrn; Mon, 6 Feb 2023 03:54:45 -0800 (PST) X-Google-Smtp-Source: AK7set9e3vSAlVa3073VRezTctDfuKUQCaKTLObxry5dONTAN4FDqg0Zd1aHm4dhfLgeeiS6s0b3 X-Received: by 2002:a17:906:6886:b0:887:8f6:c1d7 with SMTP id n6-20020a170906688600b0088708f6c1d7mr18025559ejr.38.1675684485644; Mon, 06 Feb 2023 03:54:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675684485; cv=none; d=google.com; s=arc-20160816; b=UfGeZ7tmI19R3Sr7BHK3xZDRp34I8RoAuQJ7uwyiVqSwYtvulJVSg7M4CuMKu5ZRz6 jDeaV3cs3fp1Wc+MaRZ56EJYRORJOmpvedPgWsa6UvkYu71N+SpQcijoBOfNuGVFbF2K l9o2YBc+ojt0Wll10mAxYt698SF/pRjLaiFaF3FrVAWQVuXb1Lt8Wkspi7RPotTz7LwR Frk70UH9lHHu8XWSoxA9M1t+nfxsNZjSiURl4d4IHORqZlFAI+QgCME3/65lywNThLI0 3/x7BHQpeYv98Vmc9u8KSY6xhw9r3xQfvn7ryyXX3+Mk5Md68WL1ew+hOCcBX37UGbsm iGSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=domF8YVtcGEgafqQbH+2EimrKfYiC4Tyhq8j6uN7Cl8=; b=itEn/6hOBLtfG5poItCvQGWzGlWn6M2KUiVEjZ595cgdUufL0tYo/wLD96cNM2mIey 3Cfyzf7jc2pH0oz065B/SV/Fbiec4iBXNfSlUY57WWAwYSveQ1GevSzZ0/IblJFExRZ7 bSbS4Kfl8CZmI5AWV+0QFnC3SbwEk0UOpT27hLVSH86ACNi990tuh236f4YhZ6IaEIKT 5yymjbwo/5fqTWKPGdsfwjGkH6r4px3BMlRcQiEmFr7u0dNISLBJr8cgsaQ+e/jb9jv3 GWnrxAylmr8ljIrhh4P6eiCSFELX9D8a40bCsvQpZXvlq6OZqZkwZWYGRnfBGFBud3di 5sfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=G3QSpwrV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j17-20020a05640211d100b004a24e51305esi16478375edw.111.2023.02.06.03.54.22; Mon, 06 Feb 2023 03:54:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@siemens.com header.s=fm1 header.b=G3QSpwrV; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=siemens.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229868AbjBFLrs (ORCPT + 99 others); Mon, 6 Feb 2023 06:47:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229942AbjBFLrl (ORCPT ); Mon, 6 Feb 2023 06:47:41 -0500 Received: from mta-65-225.siemens.flowmailer.net (mta-65-225.siemens.flowmailer.net [185.136.65.225]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 80777B760 for ; Mon, 6 Feb 2023 03:47:40 -0800 (PST) Received: by mta-65-225.siemens.flowmailer.net with ESMTPSA id 20230206114738d5142321c9338b5a31 for ; Mon, 06 Feb 2023 12:47:38 +0100 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=fm1; d=siemens.com; i=daniel.starke@siemens.com; h=Date:From:Subject:To:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding:Cc:References:In-Reply-To; bh=domF8YVtcGEgafqQbH+2EimrKfYiC4Tyhq8j6uN7Cl8=; b=G3QSpwrViFPBEsQfV/TVUPLvxOREDjSYVk8g7XNjwMOmS4oV6KNiEwVvsfZsBCgyiW56aI pbynbUEVI3mVskAoKL3/KN7nBaGKLCmYoNAFVF4xuRGDKcajeJb9xH7iVaa3Clpt3Cn5QClk G1ONb7BIHH1A0kZ8FppdC2N0XBmFU=; From: "D. Starke" To: linux-serial@vger.kernel.org, gregkh@linuxfoundation.org, jirislaby@kernel.org, ilpo.jarvinen@linux.intel.com Cc: linux-kernel@vger.kernel.org, Daniel Starke Subject: [PATCH v4 4/4] tty: n_gsm: add TIOCMIWAIT support Date: Mon, 6 Feb 2023 12:46:06 +0100 Message-Id: <20230206114606.2133-4-daniel.starke@siemens.com> In-Reply-To: <20230206114606.2133-1-daniel.starke@siemens.com> References: <20230206114606.2133-1-daniel.starke@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-314044:519-21489:flowmailer X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757082534817426310?= X-GMAIL-MSGID: =?utf-8?q?1757082534817426310?= From: Daniel Starke Add support for the TIOCMIWAIT ioctl on the virtual ttys. This enables the user to wait for virtual modem signals like RING. More work is needed to support also TIOCGICOUNT. Signed-off-by: Daniel Starke --- drivers/tty/n_gsm.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) v3 -> v4: No changes. Link: https://lore.kernel.org/all/20230203145023.6012-4-daniel.starke@siemens.com/ diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c index 79efbfd27171..e405d76cb696 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c @@ -1542,6 +1542,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci, if (brk & 0x01) tty_insert_flip_char(&dlci->port, 0, TTY_BREAK); dlci->modem_rx = mlines; + wake_up_interruptible(&dlci->gsm->event); } /** @@ -2129,7 +2130,7 @@ static void gsm_dlci_close(struct gsm_dlci *dlci) /* A DLCI 0 close is a MUX termination so we need to kick that back to userspace somehow */ gsm_dlci_data_kick(dlci); - wake_up(&dlci->gsm->event); + wake_up_all(&dlci->gsm->event); } /** @@ -2339,6 +2340,7 @@ static void gsm_dlci_begin_close(struct gsm_dlci *dlci) dlci->state = DLCI_CLOSING; gsm_command(dlci->gsm, dlci->addr, DISC|PF); mod_timer(&dlci->t1, jiffies + gsm->t1 * HZ / 100); + wake_up_interruptible(&gsm->event); } /** @@ -3878,6 +3880,33 @@ static int gsm_modem_update(struct gsm_dlci *dlci, u8 brk) return -EPROTONOSUPPORT; } +/** + * gsm_wait_modem_change - wait for modem status line change + * @dlci: channel + * @mask: modem status line bits + * + * The function returns if: + * - any given modem status line bit changed + * - the wait event function got interrupted (e.g. by a signal) + * - the underlying DLCI was closed + * - the underlying ldisc device was removed + */ +static int gsm_wait_modem_change(struct gsm_dlci *dlci, u32 mask) +{ + struct gsm_mux *gsm = dlci->gsm; + u32 old = dlci->modem_rx; + int ret; + + ret = wait_event_interruptible(gsm->event, gsm->dead || + dlci->state != DLCI_OPEN || + (old ^ dlci->modem_rx) & mask); + if (gsm->dead) + return -ENODEV; + if (dlci->state != DLCI_OPEN) + return -EL2NSYNC; + return ret; +} + static bool gsm_carrier_raised(struct tty_port *port) { struct gsm_dlci *dlci = container_of(port, struct gsm_dlci, port); @@ -4137,6 +4166,8 @@ static int gsmtty_ioctl(struct tty_struct *tty, gsm_destroy_network(dlci); mutex_unlock(&dlci->mutex); return 0; + case TIOCMIWAIT: + return gsm_wait_modem_change(dlci, (u32)arg); default: return -ENOIOCTLCMD; }