Skip to content

Commit 2900ae1

Browse files
author
BiffoBear
committed
Refactor DHCP receive as full packet always returned. Add support for 6100 UDP headers.
1 parent 7404571 commit 2900ae1

File tree

2 files changed

+39
-38
lines changed

2 files changed

+39
-38
lines changed

adafruit_wiznet5k/adafruit_wiznet5k.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -860,24 +860,19 @@ def read_udp(self, socket_num: int, length: int) -> Tuple[int, bytes]:
860860
"""
861861
self._sock_num_in_range(socket_num)
862862
bytes_on_socket, bytes_read = 0, b""
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
863+
# Parse the UDP packet header.
864+
header_length, self._pbuff[:8] = self.socket_read(socket_num, 8)
865+
if header_length != 8:
866+
raise ValueError("Invalid UDP header.")
867+
data_length = self._chip_parse_udp_header(socket_num)
871868
# Read the UDP packet data.
872-
if udp_data_bytes:
873-
if udp_data_bytes <= length:
874-
bytes_on_socket, bytes_read = self.socket_read(
875-
socket_num, udp_data_bytes
876-
)
869+
if data_length:
870+
if data_length <= length:
871+
bytes_on_socket, bytes_read = self.socket_read(socket_num, data_length)
877872
else:
878873
bytes_on_socket, bytes_read = self.socket_read(socket_num, length)
879874
# just consume the rest, it is lost to the higher layers
880-
self.socket_read(socket_num, udp_data_bytes - length)
875+
self.socket_read(socket_num, data_length - length)
881876
return bytes_on_socket, bytes_read
882877

883878
def socket_write(
@@ -1340,3 +1335,21 @@ def _chip_socket_write(
13401335
self._write(dst_addr, 0x00, buffer[split_point:bytes_to_write])
13411336
else:
13421337
self._write(dst_addr, 0x00, buffer[:bytes_to_write])
1338+
1339+
def _chip_parse_udp_header(self, socket_num) -> int:
1340+
"""
1341+
Parse chip specific UDP header data for IPv4 packets.
1342+
1343+
Sets the source IPv4 address and port number and returns the UDP data length.
1344+
1345+
:return int: The UDP data length.
1346+
"""
1347+
if self._chip_type in ("w5100s", "w5500"):
1348+
self.udp_from_ip[socket_num] = self._pbuff[:4]
1349+
self.udp_from_port[socket_num] = int.from_bytes(self._pbuff[4:6], "big")
1350+
return int.from_bytes(self._pbuff[6:], "big")
1351+
if self._chip_type == "w6100":
1352+
self.udp_from_ip[socket_num] = self._pbuff[3:7]
1353+
self.udp_from_port[socket_num] = int.from_bytes(self._pbuff[6:], "big")
1354+
return int.from_bytes(self._pbuff[:2], "big") & 0x07FF
1355+
raise ValueError("Unsupported chip type.")

adafruit_wiznet5k/adafruit_wiznet5k_dhcp.py

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -295,30 +295,18 @@ def _receive_dhcp_response(self, timeout: float) -> int:
295295
:returns int: The number of bytes stored in the global buffer.
296296
"""
297297
debug_msg("Receiving a DHCP response.", self._debug)
298-
# DHCP returns the query plus additional data. The query length is 236 bytes.
299-
minimum_packet_length = 236
300-
buffer = bytearray(b"")
301-
bytes_read = 0
302-
debug_msg("+ Beginning to receive…", self._debug)
303-
while bytes_read < minimum_packet_length and time.monotonic() < timeout:
304-
if self._eth.socket_available(self._wiz_sock, _SNMR_UDP):
305-
x = self._eth.read_udp(self._wiz_sock, _BUFF_LENGTH - bytes_read)[1]
306-
buffer.extend(x)
307-
bytes_read = len(buffer)
308-
debug_msg("+ Bytes read so far {}".format(bytes_read), self._debug)
309-
debug_msg(x, self._debug)
310-
if bytes_read == _BUFF_LENGTH:
311-
break
312-
debug_msg("Received {} bytes".format(bytes_read), self._debug)
313-
if bytes_read < minimum_packet_length:
314-
bytes_read = 0
315-
else:
316-
_BUFF[:bytes_read] = buffer
317-
_BUFF[bytes_read:] = bytearray(_BUFF_LENGTH - bytes_read)
318-
del buffer
319-
gc.collect()
320-
debug_msg(_BUFF[:bytes_read], self._debug)
321-
return bytes_read
298+
while time.monotonic() < timeout:
299+
# DHCP returns the query plus additional data. The query length is 236 bytes.
300+
if self._eth.socket_available(self._wiz_sock, _SNMR_UDP) > 236:
301+
bytes_count, bytes_read = self._eth.read_udp(
302+
self._wiz_sock, _BUFF_LENGTH
303+
)
304+
_BUFF[:bytes_count] = bytes_read
305+
debug_msg("Received {} bytes".format(bytes_count), self._debug)
306+
del bytes_read
307+
gc.collect()
308+
return bytes_count
309+
raise TimeoutError("No DHCP response received.")
322310

323311
def _process_messaging_states(self, *, message_type: int):
324312
"""

0 commit comments

Comments
 (0)