Skip to content

Commit 7404571

Browse files
author
BiffoBear
committed
Refactor to move UDP header read from socket_available to udp_read
1 parent 4962a92 commit 7404571

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

adafruit_wiznet5k/adafruit_wiznet5k.py

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ def __init__(
242242
self.src_port = 0
243243
self._dns = b"\x00\x00\x00\x00"
244244
# udp related
245-
self.udp_datasize = [0] * self.max_sockets
246245
self.udp_from_ip = [b"\x00\x00\x00\x00"] * self.max_sockets
247246
self.udp_from_port = [0] * self.max_sockets
248247

@@ -513,22 +512,27 @@ def socket_available(self, socket_num: int, sock_type: int = _SNMR_TCP) -> int:
513512
self._sock_num_in_range(socket_num)
514513

515514
number_of_bytes = self._get_rx_rcv_size(socket_num)
516-
517-
if sock_type == _SNMR_TCP:
518-
return number_of_bytes
519-
if number_of_bytes > 0:
520-
if self.udp_datasize[socket_num]:
521-
return self.udp_datasize[socket_num]
522-
# parse the udp rx packet
523-
# read the first 8 header bytes
524-
udp_bytes, self._pbuff[:8] = self.socket_read(socket_num, 8)
525-
if udp_bytes > 0:
526-
self.udp_from_ip[socket_num] = self._pbuff[:4]
527-
self.udp_from_port[socket_num] = (self._pbuff[4] << 8) + self._pbuff[5]
528-
self.udp_datasize[socket_num] = (self._pbuff[6] << 8) + self._pbuff[7]
529-
udp_bytes = self.udp_datasize[socket_num]
530-
return udp_bytes
531-
return 0
515+
if self.read_snsr(socket_num) == SNMR_UDP:
516+
number_of_bytes -= 8 # Subtract UDP header from packet size.
517+
if number_of_bytes < 0:
518+
raise ValueError("Negative number of bytes found on socket.")
519+
return number_of_bytes
520+
521+
# if sock_type == _SNMR_TCP:
522+
# return number_of_bytes
523+
# if number_of_bytes > 0:
524+
# if self.udp_datasize[socket_num]:
525+
# return self.udp_datasize[socket_num]
526+
# # parse the udp rx packet
527+
# # read the first 8 header bytes
528+
# udp_bytes, self._pbuff[:8] = self.socket_read(socket_num, 8)
529+
# if udp_bytes > 0:
530+
# self.udp_from_ip[socket_num] = self._pbuff[:4]
531+
# self.udp_from_port[socket_num] = (self._pbuff[4] << 8) + self._pbuff[5]
532+
# self.udp_datasize[socket_num] = (self._pbuff[6] << 8) + self._pbuff[7]
533+
# udp_bytes = self.udp_datasize[socket_num]
534+
# return udp_bytes
535+
# return 0
532536

533537
def socket_status(self, socket_num: int) -> int:
534538
"""
@@ -590,8 +594,6 @@ def socket_connect(
590594
)
591595
if self.socket_status(socket_num) == SNSR_SOCK_CLOSED:
592596
raise ConnectionError("Failed to establish connection.")
593-
elif conn_mode == SNMR_UDP:
594-
self.udp_datasize[socket_num] = 0
595597
return 1
596598

597599
def get_socket(self, *, reserve_socket=False) -> int:
@@ -805,7 +807,7 @@ def socket_read(self, socket_num: int, length: int) -> Tuple[int, bytes]:
805807
:param int socket_num: The socket to read data from.
806808
:param int length: The number of bytes to read from the socket.
807809
808-
:return Tuple[int, bytes]: If the read was successful then the first
810+
:returns Tuple[int, bytes]: If the read was successful then the first
809811
item of the tuple is the length of the data and the second is the data.
810812
If the read was unsuccessful then 0, b"" is returned.
811813
@@ -858,16 +860,24 @@ def read_udp(self, socket_num: int, length: int) -> Tuple[int, bytes]:
858860
"""
859861
self._sock_num_in_range(socket_num)
860862
bytes_on_socket, bytes_read = 0, b""
861-
if self.udp_datasize[socket_num] > 0:
862-
if self.udp_datasize[socket_num] <= length:
863+
# Parse the UDP Rx packet.
864+
_, self._pbuff[:8] = self.socket_read(socket_num, 8)
865+
try:
866+
self.udp_from_ip[socket_num] = self._pbuff[:4]
867+
self.udp_from_port[socket_num] = int.from_bytes(self._pbuff[4:6], "big")
868+
udp_data_bytes = int.from_bytes(self._pbuff[6:8], "big")
869+
except IndexError as err:
870+
raise IndexError("Invalid UDP packet header.") from err
871+
# Read the UDP packet data.
872+
if udp_data_bytes:
873+
if udp_data_bytes <= length:
863874
bytes_on_socket, bytes_read = self.socket_read(
864-
socket_num, self.udp_datasize[socket_num]
875+
socket_num, udp_data_bytes
865876
)
866877
else:
867878
bytes_on_socket, bytes_read = self.socket_read(socket_num, length)
868879
# just consume the rest, it is lost to the higher layers
869-
self.socket_read(socket_num, self.udp_datasize[socket_num] - length)
870-
self.udp_datasize[socket_num] = 0
880+
self.socket_read(socket_num, udp_data_bytes - length)
871881
return bytes_on_socket, bytes_read
872882

873883
def socket_write(

0 commit comments

Comments
 (0)