2017-04-03 14:48:55

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH 1/3] Bluetooth: 6lowpan: Remove unnecessary peer lookup

From: Luiz Augusto von Dentz <[email protected]>

During chan_recv_cb there is already a peer lookup which can be passed
to recv_pkt directly instead of the channel.

Signed-off-by: Luiz Augusto von Dentz <[email protected]>
---
net/bluetooth/6lowpan.c | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index b39da8d..2063e96 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -269,27 +269,20 @@ static int give_skb_to_upper(struct sk_buff *skb, struct net_device *dev)
}

static int iphc_decompress(struct sk_buff *skb, struct net_device *netdev,
- struct l2cap_chan *chan)
+ struct lowpan_peer *peer)
{
const u8 *saddr;
struct lowpan_btle_dev *dev;
- struct lowpan_peer *peer;

dev = lowpan_btle_dev(netdev);

- rcu_read_lock();
- peer = __peer_lookup_chan(dev, chan);
- rcu_read_unlock();
- if (!peer)
- return -EINVAL;
-
saddr = peer->lladdr;

return lowpan_header_decompress(skb, netdev, netdev->dev_addr, saddr);
}

static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
- struct l2cap_chan *chan)
+ struct lowpan_peer *peer)
{
struct sk_buff *local_skb;
int ret;
@@ -342,7 +335,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,

local_skb->dev = dev;

- ret = iphc_decompress(local_skb, dev, chan);
+ ret = iphc_decompress(local_skb, dev, peer);
if (ret < 0) {
kfree_skb(local_skb);
goto drop;
@@ -388,7 +381,7 @@ static int chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
if (!dev || !dev->netdev)
return -ENOENT;

- err = recv_pkt(skb, dev->netdev, chan);
+ err = recv_pkt(skb, dev->netdev, peer);
if (err) {
BT_DBG("recv pkt %d", err);
err = -EAGAIN;
--
2.9.3



2017-04-05 13:47:15

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH 1/3] Bluetooth: 6lowpan: Remove unnecessary peer lookup

Hi Luiz,

> During chan_recv_cb there is already a peer lookup which can be passed
> to recv_pkt directly instead of the channel.
>
> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
> ---
> net/bluetooth/6lowpan.c | 15 ++++-----------
> 1 file changed, 4 insertions(+), 11 deletions(-)

all 3 patches have been applied to bluetooth-next tree.

Regards

Marcel


2017-04-05 12:24:16

by Jukka Rissanen

[permalink] [raw]
Subject: Re: [PATCH 3/3] Bluetooth: L2CAP: Don't return -EAGAIN if out of credits

Hi Luiz,

On Mon, 2017-04-03 at 17:48 +0300, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> Just keep queueing them into TX queue since the caller might just
> have
> to do the same and there is no impact in adding another packet to the
> TX queue even if there aren't any credits to transmit them.
>
> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
> ---
>  net/bluetooth/l2cap_core.c | 3 ---
>  1 file changed, 3 deletions(-)
>
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index fc7f321..3a202b0 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -2458,9 +2458,6 @@ int l2cap_chan_send(struct l2cap_chan *chan,
> struct msghdr *msg, size_t len)
>   if (len > chan->omtu)
>   return -EMSGSIZE;
>  
> - if (!chan->tx_credits)
> - return -EAGAIN;
> -
>   __skb_queue_head_init(&seg_queue);
>  
>   err = l2cap_segment_le_sdu(chan, &seg_queue, msg,
> len);


Acked-by: Jukka Rissanen <[email protected]>


Cheers,
Jukka


2017-04-05 12:23:42

by Jukka Rissanen

[permalink] [raw]
Subject: Re: [PATCH 2/3] Bluetooth: 6lowpan: Print errors during recv_pkt

Hi Luiz,

On Mon, 2017-04-03 at 17:48 +0300, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> This makes should make it more clear why a packet is being dropped.
>
> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
> ---
>  net/bluetooth/6lowpan.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
> index 2063e96..5b91e85 100644
> --- a/net/bluetooth/6lowpan.c
> +++ b/net/bluetooth/6lowpan.c
> @@ -337,6 +337,7 @@ static int recv_pkt(struct sk_buff *skb, struct
> net_device *dev,
>  
>   ret = iphc_decompress(local_skb, dev, peer);
>   if (ret < 0) {
> + BT_DBG("iphc_decompress failed: %d", ret);
>   kfree_skb(local_skb);
>   goto drop;
>   }
> @@ -356,6 +357,7 @@ static int recv_pkt(struct sk_buff *skb, struct
> net_device *dev,
>   consume_skb(local_skb);
>   consume_skb(skb);
>   } else {
> + BT_DBG("unknown packet type");
>   goto drop;
>   }
>  

Acked-by: Jukka Rissanen <[email protected]>


Cheers,
Jukka


2017-04-05 12:23:12

by Jukka Rissanen

[permalink] [raw]
Subject: Re: [PATCH 1/3] Bluetooth: 6lowpan: Remove unnecessary peer lookup

Hi Luiz,

On Mon, 2017-04-03 at 17:48 +0300, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> During chan_recv_cb there is already a peer lookup which can be
> passed
> to recv_pkt directly instead of the channel.
>
> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
> ---
>  net/bluetooth/6lowpan.c | 15 ++++-----------
>  1 file changed, 4 insertions(+), 11 deletions(-)
>
> diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
> index b39da8d..2063e96 100644
> --- a/net/bluetooth/6lowpan.c
> +++ b/net/bluetooth/6lowpan.c
> @@ -269,27 +269,20 @@ static int give_skb_to_upper(struct sk_buff
> *skb, struct net_device *dev)
>  }
>  
>  static int iphc_decompress(struct sk_buff *skb, struct net_device
> *netdev,
> -    struct l2cap_chan *chan)
> +    struct lowpan_peer *peer)
>  {
>   const u8 *saddr;
>   struct lowpan_btle_dev *dev;
> - struct lowpan_peer *peer;
>  
>   dev = lowpan_btle_dev(netdev);
>  
> - rcu_read_lock();
> - peer = __peer_lookup_chan(dev, chan);
> - rcu_read_unlock();
> - if (!peer)
> - return -EINVAL;
> -
>   saddr = peer->lladdr;
>  
>   return lowpan_header_decompress(skb, netdev, netdev-
> >dev_addr, saddr);
>  }
>  
>  static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
> -     struct l2cap_chan *chan)
> +     struct lowpan_peer *peer)
>  {
>   struct sk_buff *local_skb;
>   int ret;
> @@ -342,7 +335,7 @@ static int recv_pkt(struct sk_buff *skb, struct
> net_device *dev,
>  
>   local_skb->dev = dev;
>  
> - ret = iphc_decompress(local_skb, dev, chan);
> + ret = iphc_decompress(local_skb, dev, peer);
>   if (ret < 0) {
>   kfree_skb(local_skb);
>   goto drop;
> @@ -388,7 +381,7 @@ static int chan_recv_cb(struct l2cap_chan *chan,
> struct sk_buff *skb)
>   if (!dev || !dev->netdev)
>   return -ENOENT;
>  
> - err = recv_pkt(skb, dev->netdev, chan);
> + err = recv_pkt(skb, dev->netdev, peer);
>   if (err) {
>   BT_DBG("recv pkt %d", err);
>   err = -EAGAIN;


Acked-by: Jukka Rissanen <[email protected]>


Cheers,
Jukka



2017-04-03 14:48:57

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH 3/3] Bluetooth: L2CAP: Don't return -EAGAIN if out of credits

From: Luiz Augusto von Dentz <[email protected]>

Just keep queueing them into TX queue since the caller might just have
to do the same and there is no impact in adding another packet to the
TX queue even if there aren't any credits to transmit them.

Signed-off-by: Luiz Augusto von Dentz <[email protected]>
---
net/bluetooth/l2cap_core.c | 3 ---
1 file changed, 3 deletions(-)

diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index fc7f321..3a202b0 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -2458,9 +2458,6 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len)
if (len > chan->omtu)
return -EMSGSIZE;

- if (!chan->tx_credits)
- return -EAGAIN;
-
__skb_queue_head_init(&seg_queue);

err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len);
--
2.9.3


2017-04-03 14:48:56

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH 2/3] Bluetooth: 6lowpan: Print errors during recv_pkt

From: Luiz Augusto von Dentz <[email protected]>

This makes should make it more clear why a packet is being dropped.

Signed-off-by: Luiz Augusto von Dentz <[email protected]>
---
net/bluetooth/6lowpan.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index 2063e96..5b91e85 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -337,6 +337,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,

ret = iphc_decompress(local_skb, dev, peer);
if (ret < 0) {
+ BT_DBG("iphc_decompress failed: %d", ret);
kfree_skb(local_skb);
goto drop;
}
@@ -356,6 +357,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,
consume_skb(local_skb);
consume_skb(skb);
} else {
+ BT_DBG("unknown packet type");
goto drop;
}

--
2.9.3