From patchwork Tue Apr 24 10:51:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: alex.bluesman.smirnov@gmail.com X-Patchwork-Id: 154651 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 0620BB6FF2 for ; Tue, 24 Apr 2012 20:51:52 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753150Ab2DXKvt (ORCPT ); Tue, 24 Apr 2012 06:51:49 -0400 Received: from mail-bk0-f46.google.com ([209.85.214.46]:55776 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752408Ab2DXKvj (ORCPT ); Tue, 24 Apr 2012 06:51:39 -0400 Received: by bkuw12 with SMTP id w12so313874bku.19 for ; Tue, 24 Apr 2012 03:51:38 -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:x-mailer:in-reply-to:references; bh=tFUNKt5RCUs9+pimxi41rb91SW5MBDlZSijlcbs2u74=; b=g/ZulSka7iUXuk8/hPb7BmauqhFLlF4MKqTXvGh94RWv8GWD6hb4UdI4fXKasCNuce Td52cUhq2TnqxnrvVK3NhTwWwhInj0aM4Pv2Mx+excEljd+H18NUPdWMqIvQuhEpyRuO oteBIYQOqfvR2d0pt+6I/PnJbRqtNJ74OGn/wnwss86BlBB9phPLVrJ9fiAFVjukREl4 52A/ZRVr/St1jCr5QDq4nN3l52KRXX/eZsLCkO3kIQBQuDv+KJ2+nFITfaC5gGD2HTSw OMSzeCvBDziCPSQ3vKX/TQr5LPjb9rzKWtaKxYKOehBTzcohT/xgn9X/R/ElRKn9NtXu wMoQ== Received: by 10.204.153.215 with SMTP id l23mr6148668bkw.11.1335264698594; Tue, 24 Apr 2012 03:51:38 -0700 (PDT) Received: from localhost.localdomain ([91.213.169.4]) by mx.google.com with ESMTPS id s20sm30528929bks.2.2012.04.24.03.51.37 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 24 Apr 2012 03:51:38 -0700 (PDT) From: Alexander Smirnov To: netdev@vger.kernel.org Cc: davem@davemloft.net, linux-zigbee-devel@lists.sourceforge.net, Alexander Smirnov Subject: [PATCH 2/5] 6lowpan: move frame allocation code to a separate function Date: Tue, 24 Apr 2012 14:51:08 +0400 Message-Id: <1335264671-27127-3-git-send-email-alex.bluesman.smirnov@gmail.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1335264671-27127-1-git-send-email-alex.bluesman.smirnov@gmail.com> References: <1335264671-27127-1-git-send-email-alex.bluesman.smirnov@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Separate frame allocation routine from data processing function. This makes code more human readable and easier to understand. Signed-off-by: Alexander Smirnov --- net/ieee802154/6lowpan.c | 81 +++++++++++++++++++++++++++------------------- 1 files changed, 48 insertions(+), 33 deletions(-) diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 7ce508f..d440233 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c @@ -650,6 +650,53 @@ static void lowpan_fragment_timer_expired(unsigned long entry_addr) kfree(entry); } +static struct lowpan_fragment * +lowpan_alloc_new_frame(struct sk_buff *skb, u8 iphc0, u8 len, u8 tag) +{ + struct lowpan_fragment *frame; + + frame = kzalloc(sizeof(struct lowpan_fragment), + GFP_ATOMIC); + if (!frame) + goto frame_err; + + INIT_LIST_HEAD(&frame->list); + + frame->length = (iphc0 & 7) | (len << 3); + frame->tag = tag; + + /* allocate buffer for frame assembling */ + frame->skb = alloc_skb(frame->length + + sizeof(struct ipv6hdr), GFP_ATOMIC); + + if (!frame->skb) + goto skb_err; + + frame->skb->priority = skb->priority; + frame->skb->dev = skb->dev; + + /* reserve headroom for uncompressed ipv6 header */ + skb_reserve(frame->skb, sizeof(struct ipv6hdr)); + skb_put(frame->skb, frame->length); + + init_timer(&frame->timer); + /* time out is the same as for ipv6 - 60 sec */ + frame->timer.expires = jiffies + LOWPAN_FRAG_TIMEOUT; + frame->timer.data = (unsigned long)frame; + frame->timer.function = lowpan_fragment_timer_expired; + + add_timer(&frame->timer); + + list_add_tail(&frame->list, &lowpan_fragments); + + return frame; + +skb_err: + kfree(frame); +frame_err: + return NULL; +} + static int lowpan_process_data(struct sk_buff *skb) { @@ -692,41 +739,9 @@ lowpan_process_data(struct sk_buff *skb) /* alloc new frame structure */ if (!found) { - frame = kzalloc(sizeof(struct lowpan_fragment), - GFP_ATOMIC); + frame = lowpan_alloc_new_frame(skb, iphc0, len, tag); if (!frame) goto unlock_and_drop; - - INIT_LIST_HEAD(&frame->list); - - frame->length = (iphc0 & 7) | (len << 3); - frame->tag = tag; - - /* allocate buffer for frame assembling */ - frame->skb = alloc_skb(frame->length + - sizeof(struct ipv6hdr), GFP_ATOMIC); - - if (!frame->skb) { - kfree(frame); - goto unlock_and_drop; - } - - frame->skb->priority = skb->priority; - frame->skb->dev = skb->dev; - - /* reserve headroom for uncompressed ipv6 header */ - skb_reserve(frame->skb, sizeof(struct ipv6hdr)); - skb_put(frame->skb, frame->length); - - init_timer(&frame->timer); - /* time out is the same as for ipv6 - 60 sec */ - frame->timer.expires = jiffies + LOWPAN_FRAG_TIMEOUT; - frame->timer.data = (unsigned long)frame; - frame->timer.function = lowpan_fragment_timer_expired; - - add_timer(&frame->timer); - - list_add_tail(&frame->list, &lowpan_fragments); } if ((iphc0 & LOWPAN_DISPATCH_MASK) == LOWPAN_DISPATCH_FRAG1)