From dae3ec5cba5c686e57e27a28e03e5cf514e56053 Mon Sep 17 00:00:00 2001 From: graynode Date: Thu, 23 Oct 2025 16:14:33 -0400 Subject: [PATCH 1/3] Fixed bug where it's possible for tx_credit to goe negative --- bumble/rfcomm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bumble/rfcomm.py b/bumble/rfcomm.py index 0983c773..afb6e21f 100644 --- a/bumble/rfcomm.py +++ b/bumble/rfcomm.py @@ -671,7 +671,7 @@ class DLC(utils.EventEmitter): def process_tx(self) -> None: # Send anything we can (or an empty frame if we need to send rx credits) rx_credits_needed = self.rx_credits_needed() - while (self.tx_buffer and self.tx_credits > 0) or rx_credits_needed > 0: + while (self.tx_buffer and self.tx_credits > 0) or (rx_credits_needed > 0 and self.tx_credit > 0): # Get the next chunk, up to MTU size if rx_credits_needed > 0: chunk = bytes([rx_credits_needed]) + self.tx_buffer[: self.mtu - 1] From 9601c7f2874ac03cb521bc9a7a8956705428e372 Mon Sep 17 00:00:00 2001 From: graynode Date: Fri, 24 Oct 2025 09:30:45 -0400 Subject: [PATCH 2/3] fixed formatting issue --- bumble/rfcomm.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bumble/rfcomm.py b/bumble/rfcomm.py index afb6e21f..18eea065 100644 --- a/bumble/rfcomm.py +++ b/bumble/rfcomm.py @@ -671,7 +671,9 @@ class DLC(utils.EventEmitter): def process_tx(self) -> None: # Send anything we can (or an empty frame if we need to send rx credits) rx_credits_needed = self.rx_credits_needed() - while (self.tx_buffer and self.tx_credits > 0) or (rx_credits_needed > 0 and self.tx_credit > 0): + while (self.tx_buffer and self.tx_credits > 0) or ( + rx_credits_needed > 0 and self.tx_credit > 0 + ): # Get the next chunk, up to MTU size if rx_credits_needed > 0: chunk = bytes([rx_credits_needed]) + self.tx_buffer[: self.mtu - 1] From 4b25b3581dc9f8cb6aed6a3490ae292d4d8d8cd4 Mon Sep 17 00:00:00 2001 From: graynode Date: Fri, 24 Oct 2025 10:09:02 -0400 Subject: [PATCH 3/3] updated per PR input --- bumble/rfcomm.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/bumble/rfcomm.py b/bumble/rfcomm.py index 18eea065..fba2e0f8 100644 --- a/bumble/rfcomm.py +++ b/bumble/rfcomm.py @@ -671,15 +671,17 @@ class DLC(utils.EventEmitter): def process_tx(self) -> None: # Send anything we can (or an empty frame if we need to send rx credits) rx_credits_needed = self.rx_credits_needed() - while (self.tx_buffer and self.tx_credits > 0) or ( - rx_credits_needed > 0 and self.tx_credit > 0 - ): + while (self.tx_buffer and self.tx_credits > 0) or rx_credits_needed > 0: # Get the next chunk, up to MTU size if rx_credits_needed > 0: - chunk = bytes([rx_credits_needed]) + self.tx_buffer[: self.mtu - 1] - self.tx_buffer = self.tx_buffer[len(chunk) - 1 :] + chunk = bytes([rx_credits_needed]) self.rx_credits += rx_credits_needed - tx_credit_spent = len(chunk) > 1 + if self.tx_buffer and self.tx_credits > 0: + chunk += self.tx_buffer[: self.mtu - 1] + self.tx_buffer = self.tx_buffer[len(chunk) - 1 :] + tx_credit_spent = True + else: + tx_credit_spent = False else: chunk = self.tx_buffer[: self.mtu] self.tx_buffer = self.tx_buffer[len(chunk) :]