Bluetooth: 6lowpan: search for destination address in all peers [Linux 4.9.187]

This Linux kernel change "Bluetooth: 6lowpan: search for destination address in all peers" is included in the Linux 4.9.187 release. This change is authored by Josua Mayer <josua.mayer [at] jm0.eu> on Sat Jul 6 17:54:46 2019 +0200. The commit for this change in Linux stable tree is 09c3d40 (patch) which is from upstream commit b188b03. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream b188b03.

Bluetooth: 6lowpan: search for destination address in all peers

[ Upstream commit b188b03270b7f8568fc714101ce82fbf5e811c5a ]

Handle overlooked case where the target address is assigned to a peer
and neither route nor gateway exist.

For one peer, no checks are performed to see if it is meant to receive
packets for a given address.

As soon as there is a second peer however, checks are performed
to deal with routes and gateways for handling complex setups with
multiple hops to a target address.
This logic assumed that no route and no gateway imply that the
destination address can not be reached, which is false in case of a
direct peer.

Acked-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Tested-by: Michael Scott <mike@foundries.io>
Signed-off-by: Josua Mayer <josua.mayer@jm0.eu>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 14 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 net/bluetooth/6lowpan.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index de7b82e..21096c8 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -187,10 +187,16 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,
    }

    if (!rt) {
-       nexthop = &lowpan_cb(skb)->gw;
-
-       if (ipv6_addr_any(nexthop))
-           return NULL;
+       if (ipv6_addr_any(&lowpan_cb(skb)->gw)) {
+           /* There is neither route nor gateway,
+            * probably the destination is a direct peer.
+            */
+           nexthop = daddr;
+       } else {
+           /* There is a known gateway
+            */
+           nexthop = &lowpan_cb(skb)->gw;
+       }
    } else {
        nexthop = rt6_nexthop(rt, daddr);

Leave a Reply

Your email address will not be published. Required fields are marked *