From patchwork Thu Mar 2 13:23:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 734606 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 3vYtXp56nqz9s7m for ; Fri, 3 Mar 2017 00:32:42 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dtr/Qh9a"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753126AbdCBNck (ORCPT ); Thu, 2 Mar 2017 08:32:40 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:35545 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752957AbdCBNcf (ORCPT ); Thu, 2 Mar 2017 08:32:35 -0500 Received: by mail-lf0-f66.google.com with SMTP id z127so5751309lfa.2; Thu, 02 Mar 2017 05:32:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=NDMDUPdTIFa36MJvqtdgRW3GdA2But3K/wLe9rNy5yY=; b=dtr/Qh9aYCVQwiY1voHA2RjY/6mUbXM9vg8xhjSyOZog+8i1/IrUzn4CE4op2hhyCj Tp+6q6chShKPsXoWDBPb3+5NzwRAGdRt802UaT06KCkzAGYHAATx9vBjNNKzkyoRQPj7 tUnb+mG8FzIC3Pori7rtuBpffN+x7FWRsSml1ymgOVSUxuq5wFG2TJ3wQGRuT9FIpXEk lSit+6ZT2kaheOnuKAAikDv4XZYi0rzJ0K8uwc8v5BhwgSKB2tCygIl0+6R9SAREsklX 1k2mye2UU3S6ldjQg8Bhq+aq6fHNCwjRYjretJ8S6YLGMfNxrl8VhrdRxDZ5dtZknvVA OR8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=NDMDUPdTIFa36MJvqtdgRW3GdA2But3K/wLe9rNy5yY=; b=f8j4Wy7wqbVdziWFNiFDDSwkn8xmWOJgbIi1sKrkLx8l+Bm4OnLrYxXXlV6X41MxIh wwIpVK5ZuwYXACPwF8enfN3KlM+o72PCYxObuPp0meljcLdddXlDaPmuIAjtHVt09mT4 2OTX9xGMia73KgDpftRwWgpvI4Xqlgnt2Yss6xkGvl4NPMTRIOfsfdNPEQJcE3hiY8d+ iuWw/oVgEOYnyIkr65j+XjVru+nhI1mlgjMEc4o83tzzyrOWsPTmaoRIEFtBm6GbONze Z79rvwuq6Z/VXDZdVOsR1TlXDNRhGHZalQ5uhBlBmgOrHQDU6SeMz6C07u2RtiAA6sEU DOOg== X-Gm-Message-State: AMke39mC1W0hJZw5smJDqYgHmYxiVcNZAXcyDvv0irv8VBJrxu316P6qVPXmePhwefy7Xw== X-Received: by 10.46.22.75 with SMTP id 11mr5069731ljw.118.1488461027385; Thu, 02 Mar 2017 05:23:47 -0800 (PST) Received: from localhost.localdomain (85-76-69-169-nat.elisa-mobile.fi. [85.76.69.169]) by smtp.gmail.com with ESMTPSA id b72sm1700349lfb.24.2017.03.02.05.23.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Mar 2017 05:23:46 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Cc: patrik.flykt@linux.intel.com, aar@pengutronix.de, jukka.rissanen@linux.intel.com, linux-wpan@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH v6 6/6] 6lowpan: Fix IID format for Bluetooth Date: Thu, 2 Mar 2017 15:23:35 +0200 Message-Id: <20170302132335.21192-7-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170302132335.21192-1-luiz.dentz@gmail.com> References: <20170302132335.21192-1-luiz.dentz@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Luiz Augusto von Dentz According to RFC 7668 U/L bit shall not be used: https://wiki.tools.ietf.org/html/rfc7668#section-3.2.2 [Page 10]: In the figure, letter 'b' represents a bit from the Bluetooth device address, copied as is without any changes on any bit. This means that no bit in the IID indicates whether the underlying Bluetooth device address is public or random. |0 1|1 3|3 4|4 6| |0 5|6 1|2 7|8 3| +----------------+----------------+----------------+----------------+ |bbbbbbbbbbbbbbbb|bbbbbbbb11111111|11111110bbbbbbbb|bbbbbbbbbbbbbbbb| +----------------+----------------+----------------+----------------+ Because of this the code cannot figure out the address type from the IP address anymore thus it makes no sense to use peer_lookup_ba as it needs the peer address type. Signed-off-by: Luiz Augusto von Dentz Reviewed-by: Stefan Schmidt Acked-by: Jukka Rissanen --- include/net/6lowpan.h | 4 --- include/net/addrconf.h | 7 ++++- net/bluetooth/6lowpan.c | 79 ++++++++----------------------------------------- 3 files changed, 18 insertions(+), 72 deletions(-) diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h index c5792cb..a713780 100644 --- a/include/net/6lowpan.h +++ b/include/net/6lowpan.h @@ -211,10 +211,6 @@ static inline void lowpan_iphc_uncompress_eui48_lladdr(struct in6_addr *ipaddr, ipaddr->s6_addr[11] = 0xFF; ipaddr->s6_addr[12] = 0xFE; memcpy(&ipaddr->s6_addr[13], lladdr + 3, 3); - /* second bit-flip (Universe/Local) - * is done according RFC2464 - */ - ipaddr->s6_addr[8] ^= 0x02; } #ifdef DEBUG diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 17c6fd8..3931fd2 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -129,7 +129,12 @@ static inline int addrconf_ifid_eui48(u8 *eui, struct net_device *dev) } else { eui[3] = 0xFF; eui[4] = 0xFE; - eui[0] ^= 2; + + /* + * According to RFC 7668 U/L bit shall not be toggled. + */ + if (dev->type != ARPHRD_6LOWPAN) + eui[0] ^= 2; } return 0; } diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c index 0b68cfc..ec89c55 100644 --- a/net/bluetooth/6lowpan.c +++ b/net/bluetooth/6lowpan.c @@ -398,37 +398,6 @@ static int chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) return err; } -static u8 get_addr_type_from_eui64(u8 byte) -{ - /* Is universal(0) or local(1) bit */ - return ((byte & 0x02) ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC); -} - -static void copy_to_bdaddr(struct in6_addr *ip6_daddr, bdaddr_t *addr) -{ - u8 *eui64 = ip6_daddr->s6_addr + 8; - - addr->b[0] = eui64[7]; - addr->b[1] = eui64[6]; - addr->b[2] = eui64[5]; - addr->b[3] = eui64[2]; - addr->b[4] = eui64[1]; - addr->b[5] = eui64[0]; -} - -static void convert_dest_bdaddr(struct in6_addr *ip6_daddr, - bdaddr_t *addr, u8 *addr_type) -{ - copy_to_bdaddr(ip6_daddr, addr); - - /* We need to toggle the U/L bit that we got from IPv6 address - * so that we get the proper address and type of the BD address. - */ - addr->b[5] ^= 0x02; - - *addr_type = get_addr_type_from_eui64(addr->b[5]); -} - static int setup_header(struct sk_buff *skb, struct net_device *netdev, bdaddr_t *peer_addr, u8 *peer_addr_type) { @@ -436,8 +405,7 @@ static int setup_header(struct sk_buff *skb, struct net_device *netdev, struct ipv6hdr *hdr; struct lowpan_btle_dev *dev; struct lowpan_peer *peer; - bdaddr_t addr, *any = BDADDR_ANY; - u8 *daddr = any->b; + u8 *daddr; int err, status = 0; hdr = ipv6_hdr(skb); @@ -448,34 +416,24 @@ static int setup_header(struct sk_buff *skb, struct net_device *netdev, if (ipv6_addr_is_multicast(&ipv6_daddr)) { lowpan_cb(skb)->chan = NULL; + daddr = NULL; } else { - u8 addr_type; + BT_DBG("dest IP %pI6c", &ipv6_daddr); - /* Get destination BT device from skb. - * If there is no such peer then discard the packet. + /* The packet might be sent to 6lowpan interface + * because of routing (either via default route + * or user set route) so get peer according to + * the destination address. */ - convert_dest_bdaddr(&ipv6_daddr, &addr, &addr_type); - - BT_DBG("dest addr %pMR type %d IP %pI6c", &addr, - addr_type, &ipv6_daddr); - - peer = peer_lookup_ba(dev, &addr, addr_type); + peer = peer_lookup_dst(dev, &ipv6_daddr, skb); if (!peer) { - /* The packet might be sent to 6lowpan interface - * because of routing (either via default route - * or user set route) so get peer according to - * the destination address. - */ - peer = peer_lookup_dst(dev, &ipv6_daddr, skb); - if (!peer) { - BT_DBG("no such peer %pMR found", &addr); - return -ENOENT; - } + BT_DBG("no such peer"); + return -ENOENT; } daddr = peer->lladdr; - *peer_addr = addr; - *peer_addr_type = addr_type; + peer_addr = &peer->chan->dst; + *peer_addr_type = peer->chan->dst_type; lowpan_cb(skb)->chan = peer->chan; status = 1; @@ -717,14 +675,6 @@ static struct l2cap_chan *chan_create(void) return chan; } -static void set_ip_addr_bits(u8 addr_type, u8 *addr) -{ - if (addr_type == BDADDR_LE_PUBLIC) - *addr |= 0x02; - else - *addr &= ~0x02; -} - static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan, struct lowpan_btle_dev *dev) { @@ -741,11 +691,6 @@ static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan, lowpan_iphc_uncompress_eui48_lladdr(&peer->peer_addr, peer->lladdr); - /* IPv6 address needs to have the U/L bit set properly so toggle - * it back here. - */ - set_ip_addr_bits(chan->dst_type, (u8 *)&peer->peer_addr.s6_addr + 8); - spin_lock(&devices_lock); INIT_LIST_HEAD(&peer->list); peer_add(dev, peer);