From patchwork Sat Mar 21 19:15:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tilman Schmidt X-Patchwork-Id: 453000 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 4265F14015A for ; Sun, 22 Mar 2015 06:50:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751700AbbCUTuL (ORCPT ); Sat, 21 Mar 2015 15:50:11 -0400 Received: from mail.pxnet.com ([89.1.7.7]:43445 "EHLO mail.pxnet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751720AbbCUTuB (ORCPT ); Sat, 21 Mar 2015 15:50:01 -0400 X-Greylist: delayed 2053 seconds by postgrey-1.27 at vger.kernel.org; Sat, 21 Mar 2015 15:49:57 EDT Received: from xenon.ts.pxnet.com (p5DE8E69B.dip0.t-ipconnect.de [93.232.230.155]) (user=ts author=<> mech=DIGEST-MD5 bits=0) by mail.pxnet.com (8.13.8/8.13.8) with ESMTP id t2LJFX4I026213 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sat, 21 Mar 2015 20:15:37 +0100 Received: by xenon.ts.pxnet.com (Postfix, from userid 1000) id D3164140082; Sat, 21 Mar 2015 20:15:32 +0100 (CET) Message-Id: In-Reply-To: References: From: Tilman Schmidt Subject: [PATCH 3/4] isdn/gigaset: restructure modem response parser (3) To: netdev@vger.kernel.org Cc: David Miller , Hansjoerg Lipp , Karsten Keil , isdn4linux@listserv.isdn4linux.de Date: Sat, 21 Mar 2015 20:15:32 +0100 (CET) X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (mail.pxnet.com [89.1.7.7]); Sat, 21 Mar 2015 20:15:37 +0100 (CET) X-Scanned-By: MIMEDefang 2.70 on 89.1.7.7 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Separate CID detection from main parser loop. Signed-off-by: Tilman Schmidt --- drivers/isdn/gigaset/ev-layer.c | 56 ++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index b2a1fb1..dc6e6a3 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c @@ -389,24 +389,6 @@ zsau_resp[] = {NULL, ZSAU_UNKNOWN} }; -/* retrieve CID from parsed response - * returns 0 if no CID, -1 if invalid CID, or CID value 1..65535 - */ -static int cid_of_response(char *s) -{ - int cid; - int rc; - - if (s[-1] != ';') - return 0; /* no CID separator */ - rc = kstrtoint(s, 10, &cid); - if (rc) - return 0; /* CID not numeric */ - if (cid < 1 || cid > 65535) - return -1; /* CID out of range */ - return cid; -} - /* queue event with CID */ static void add_cid_event(struct cardstate *cs, int cid, int type, void *ptr, int parameter) @@ -451,7 +433,7 @@ void gigaset_handle_modem_response(struct cardstate *cs) unsigned char *argv[MAX_REC_PARAMS + 1]; int params; int i, j; - char *ptr; + char *psep, *ptr; const struct resp_type_t *rt; const struct zsau_resp_t *zr; int curarg; @@ -474,6 +456,18 @@ void gigaset_handle_modem_response(struct cardstate *cs) return; } + /* check for CID */ + psep = strrchr(cs->respdata, ';'); + if (psep && + !kstrtoint(psep + 1, 10, &cid) && + cid >= 1 && cid <= 65535) { + /* valid CID: chop it off */ + *psep = 0; + } else { + /* no valid CID: leave unchanged */ + cid = 0; + } + /* parse line */ argv[0] = cs->respdata; params = 1; @@ -482,29 +476,17 @@ void gigaset_handle_modem_response(struct cardstate *cs) case ';': case ',': case '=': - if (params > MAX_REC_PARAMS) { + cs->respdata[i] = 0; + if (params > MAX_REC_PARAMS) dev_warn(cs->dev, "too many parameters in response\n"); - /* need last parameter (might be CID) */ - params--; - } - argv[params++] = cs->respdata + i + 1; + else + argv[params++] = cs->respdata + i + 1; } - cid = params > 1 ? cid_of_response(argv[params - 1]) : 0; - if (cid < 0) { - gigaset_add_event(cs, &cs->at_state, RSP_INVAL, NULL, 0, NULL); - return; - } - - for (j = 1; j < params; ++j) - argv[j][-1] = 0; - gig_dbg(DEBUG_EVENT, "CMD received: %s", argv[0]); - if (cid) { - --params; - gig_dbg(DEBUG_EVENT, "CID: %s", argv[params]); - } + if (cid) + gig_dbg(DEBUG_EVENT, "CID: %d", cid); gig_dbg(DEBUG_EVENT, "available params: %d", params - 1); for (j = 1; j < params; j++) gig_dbg(DEBUG_EVENT, "param %d: %s", j, argv[j]);