From patchwork Wed Jan 16 05:43:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Ott X-Patchwork-Id: 212393 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 A1CD22C0099 for ; Wed, 16 Jan 2013 16:44:24 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754018Ab3APFoA (ORCPT ); Wed, 16 Jan 2013 00:44:00 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:52449 "EHLO out5-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753610Ab3APFn7 (ORCPT ); Wed, 16 Jan 2013 00:43:59 -0500 Received: from compute6.internal (compute6.nyi.mail.srv.osa [10.202.2.46]) by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id A257020B35; Wed, 16 Jan 2013 00:43:58 -0500 (EST) Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160]) by compute6.internal (MEProxy); Wed, 16 Jan 2013 00:43:58 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=signal11.us; h= from:to:cc:subject:date:message-id:in-reply-to:references; s= mesmtp; bh=pNw0jjBeshA4SDjQVluI9nxWt0A=; b=URpCanMMgtFiXMtPXJg7h PnMj3jnG5hHiADUpu2spEXgw0ja5mZcgGE1+CVb3nICFW+l5tuA4C5PZ99tmT5X9 230fUxxyOoZ/1loVCt5gY3WhuSa7eEJqGZ7c1sTJgBcqridwr1QtIHAuLLNKzMBn gjploJRsxn76r9aa40qp3o= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=from:to:cc:subject:date:message-id :in-reply-to:references; s=smtpout; bh=pNw0jjBeshA4SDjQVluI9nxWt 0A=; b=WPstzoDlpLVPBYvu8BlOq+kFiJ35qJiX2TiMiFbqqDrV1qzsdNGgdlVrA hBpbc3H41Lllbfi7Ttz6AjaNEblSUT6gxqZGInmXzbfzO4RaIL9JqGOS+wf0QI9J dLDNCI3OUBaTZnJDTfRFZkfcowVm5gKxD8lAqJgrkkwsU3hrX8= X-Sasl-enc: jYYSiQkMuxo+RenjafUIIAR6S3htV7mL6QoKAnHr8euu 1358315038 Received: from ato.hsd1.fl.comcast.net. (unknown [68.62.240.236]) by mail.messagingengine.com (Postfix) with ESMTPA id D62478E07F4; Wed, 16 Jan 2013 00:43:57 -0500 (EST) From: Alan Ott To: Alexander Smirnov , Dmitry Eremin-Solenikov , "David S. Miller" Cc: linux-zigbee-devel@lists.sourceforge.net, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Tony Cheneau , Eric Dumazet , Alan Ott Subject: [PATCH 2/2] 6lowpan: Handle uncompressed IPv6 packets over 6LoWPAN Date: Wed, 16 Jan 2013 00:43:57 -0500 Message-Id: <1358315037-10043-3-git-send-email-alan@signal11.us> X-Mailer: git-send-email 1.7.11.2 In-Reply-To: <1358315037-10043-1-git-send-email-alan@signal11.us> References: <1358315037-10043-1-git-send-email-alan@signal11.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Handle the reception of uncompressed packets (dispatch type = IPv6). Signed-off-by: Alan Ott --- net/ieee802154/6lowpan.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c index 1714cfa..43bd1c0 100644 --- a/net/ieee802154/6lowpan.c +++ b/net/ieee802154/6lowpan.c @@ -1147,19 +1147,42 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, goto drop; /* check that it's our buffer */ - switch (skb->data[0] & 0xe0) { - case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */ - case LOWPAN_DISPATCH_FRAG1: /* first fragment header */ - case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */ - local_skb = skb_clone(skb, GFP_ATOMIC); + if (skb->data[0] == LOWPAN_DISPATCH_IPV6) { + /* Copy the packet so that the IPv6 header is + * properly aligned. + */ + local_skb = skb_copy_expand(skb, NET_SKB_PAD - 1, + skb_tailroom(skb), GFP_ATOMIC); if (!local_skb) goto drop; - lowpan_process_data(local_skb); + local_skb->protocol = htons(ETH_P_IPV6); + local_skb->pkt_type = PACKET_HOST; + + /* Pull off the 1-byte of 6lowpan header. */ + skb_pull(local_skb, 1); + skb_reset_network_header(local_skb); + skb_set_transport_header(local_skb, sizeof(struct ipv6hdr)); + + lowpan_give_skb_to_devices(local_skb); + + kfree_skb(local_skb); kfree_skb(skb); - break; - default: - break; + } else { + switch (skb->data[0] & 0xe0) { + case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */ + case LOWPAN_DISPATCH_FRAG1: /* first fragment header */ + case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */ + local_skb = skb_clone(skb, GFP_ATOMIC); + if (!local_skb) + goto drop; + lowpan_process_data(local_skb); + + kfree_skb(skb); + break; + default: + break; + } } return NET_RX_SUCCESS;