@@ -860,24 +860,19 @@ def read_udp(self, socket_num: int, length: int) -> Tuple[int, bytes]:
860
860
"""
861
861
self ._sock_num_in_range (socket_num )
862
862
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 )
871
868
# 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 )
877
872
else :
878
873
bytes_on_socket , bytes_read = self .socket_read (socket_num , length )
879
874
# 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 )
881
876
return bytes_on_socket , bytes_read
882
877
883
878
def socket_write (
@@ -1340,3 +1335,21 @@ def _chip_socket_write(
1340
1335
self ._write (dst_addr , 0x00 , buffer [split_point :bytes_to_write ])
1341
1336
else :
1342
1337
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." )
0 commit comments