NFC: Stop sending LLCP frames when tx queues are getting too deep
When the tx pending queues and/or the socket tx queue is getting too deep, we have to let userspace know. We won't be queueing any more frames until the congestion is fixed. Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
Родитель
6e950fd214
Коммит
dd2bf43ffc
|
@ -528,6 +528,23 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
|
|||
if (local == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
/* Remote is ready but has not acknowledged our frames */
|
||||
if((sock->remote_ready &&
|
||||
skb_queue_len(&sock->tx_pending_queue) >= sock->rw &&
|
||||
skb_queue_len(&sock->tx_queue) >= 2 * sock->rw)) {
|
||||
pr_err("Pending queue is full %d frames\n",
|
||||
skb_queue_len(&sock->tx_pending_queue));
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
/* Remote is not ready and we've been queueing enough frames */
|
||||
if ((!sock->remote_ready &&
|
||||
skb_queue_len(&sock->tx_queue) >= 2 * sock->rw)) {
|
||||
pr_err("Tx queue is full %d frames\n",
|
||||
skb_queue_len(&sock->tx_queue));
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
msg_data = kzalloc(len, GFP_KERNEL);
|
||||
if (msg_data == NULL)
|
||||
return -ENOMEM;
|
||||
|
|
Загрузка…
Ссылка в новой задаче