Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7b6b0a5 authored by Jukka Rissanen's avatar Jukka Rissanen Committed by Johan Hedberg
Browse files

Bluetooth: 6lowpan: Return EAGAIN error also for multicast packets



Make sure that we are able to return EAGAIN from l2cap_chan_send()
even for multicast packets. The error code was ignored unncessarily.

Signed-off-by: default avatarJukka Rissanen <jukka.rissanen@linux.intel.com>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent a7807d73
Loading
Loading
Loading
Loading
+5 −11
Original line number Diff line number Diff line
@@ -509,20 +509,15 @@ static int header_create(struct sk_buff *skb, struct net_device *netdev,

/* Packet to BT LE device */
static int send_pkt(struct l2cap_chan *chan, struct sk_buff *skb,
		    struct net_device *netdev, bool is_mcast)
		    struct net_device *netdev)
{
	struct msghdr msg;
	struct kvec iv;
	int err;

	/* Remember the skb so that we can send EAGAIN to the caller if
	 * we run out of credits. This is not done for multicast packets
	 * because we generate mcast packet in this module and are not
	 * really able to remember the skb after this packet is sent.
	 * we run out of credits.
	 */
	if (is_mcast)
		chan->data = NULL;
	else
	chan->data = skb;

	memset(&msg, 0, sizeof(msg));
@@ -575,7 +570,7 @@ static void send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
			       netdev->name,
			       &pentry->chan->dst, pentry->chan->dst_type,
			       &pentry->peer_addr, pentry->chan);
			send_pkt(pentry->chan, local_skb, netdev, true);
			send_pkt(pentry->chan, local_skb, netdev);

			kfree_skb(local_skb);
		}
@@ -617,8 +612,7 @@ static netdev_tx_t bt_xmit(struct sk_buff *skb, struct net_device *netdev)
			BT_DBG("xmit %s to %pMR type %d IP %pI6c chan %p",
			       netdev->name, &addr, addr_type,
			       &lowpan_cb(skb)->addr, lowpan_cb(skb)->chan);
			err = send_pkt(lowpan_cb(skb)->chan, skb, netdev,
				       false);
			err = send_pkt(lowpan_cb(skb)->chan, skb, netdev);
		} else {
			err = -ENOENT;
		}