From patchwork Tue May 21 18:18:21 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jorge Boncompte [DTI2]" X-Patchwork-Id: 245379 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 E8F702C00CC for ; Wed, 22 May 2013 04:24:03 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755515Ab3EUSX7 (ORCPT ); Tue, 21 May 2013 14:23:59 -0400 Received: from averroes.dti2.net ([81.24.162.8]:62347 "EHLO alcalazamora.dti2.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755259Ab3EUSX5 (ORCPT ); Tue, 21 May 2013 14:23:57 -0400 X-Greylist: delayed 312 seconds by postgrey-1.27 at vger.kernel.org; Tue, 21 May 2013 14:23:56 EDT X-MDAV-Result: clean X-MDAV-Processed: alcalazamora.dti2.net, Tue, 21 May 2013 20:18:38 +0200 Received: from nikopol.intranet.dti2.net ([81.24.160.13]) (authenticated user jorge@dti2.net) by alcalazamora.dti2.net (alcalazamora.dti2.net [81.24.162.8]) (MDaemon PRO v13.0.5) with ESMTP id md50028690998.msg; Tue, 21 May 2013 20:18:37 +0200 X-Authenticated-Sender: jorge@dti2.net X-MDRemoteIP: 81.24.160.13 X-Return-Path: prvs=185372d096=jorge@dti2.net X-Envelope-From: jorge@dti2.net From: "Jorge Boncompte [DTI2]" To: netdev@vger.kernel.org, linux-ppp@vger.kernel.org Cc: "Jorge Boncompte [DTI2]" Subject: [RFC PATCH v2 1/4] ppp: adds new error for decompressors to signal that packet must be dropped Date: Tue, 21 May 2013 20:18:21 +0200 Message-Id: <1369160304-31967-1-git-send-email-jorge@dti2.net> X-Mailer: git-send-email 1.7.10.4 Reply-To: jorge@dti2.net Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Jorge Boncompte [DTI2]" Currently decompressors can't signal the generic PPP layer to silently drop a packet without notifying the PPP daemon or the other party. Signed-off-by: Jorge Boncompte [DTI2] --- drivers/net/ppp/ppp_generic.c | 12 ++++++++++++ include/linux/ppp-comp.h | 6 ++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index 72ff14b..7d26825 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -1729,6 +1729,10 @@ ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) skb = ppp_decompress_frame(ppp, skb); + /* Packet dropped */ + if (skb == NULL) + goto err; + if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) goto err; @@ -1888,6 +1892,13 @@ ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, skb->len + 2, ns->data, obuff_size); if (len < 0) { + /* Drop the packet and continue */ + if (len == DECOMP_DROPERROR) { + kfree_skb(ns); + kfree_skb(skb); + skb = NULL; + goto out; + } /* Pass the compressed frame to pppd as an error indication. */ if (len == DECOMP_FATALERROR) @@ -1909,6 +1920,7 @@ ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) skb->len + 2); } +out: return skb; err: diff --git a/include/linux/ppp-comp.h b/include/linux/ppp-comp.h index 4ea1d37..12a8ce8 100644 --- a/include/linux/ppp-comp.h +++ b/include/linux/ppp-comp.h @@ -89,8 +89,9 @@ struct compressor { /* * The return value from decompress routine is the length of the * decompressed packet if successful, otherwise DECOMP_ERROR - * or DECOMP_FATALERROR if an error occurred. - * + * or DECOMP_FATALERROR if an error occurred but don't want the + * PPP generic layer to drop the packet. + * * We need to make this distinction so that we can disable certain * useful functionality, namely sending a CCP reset-request as a result * of an error detected after decompression. This is to avoid infringing @@ -100,6 +101,7 @@ struct compressor { #define DECOMP_ERROR -1 /* error detected before decomp. */ #define DECOMP_FATALERROR -2 /* error detected after decomp. */ +#define DECOMP_DROPERROR -3 /* error detected, drop packet. */ extern int ppp_register_compressor(struct compressor *); extern void ppp_unregister_compressor(struct compressor *);