122122W5100_MAX_SOCK_NUM = const (0x04 )
123123SOCKET_INVALID = const (255 )
124124
125- # UDP socket struct.
126- UDP_SOCK = {"bytes_remaining" : 0 , "remote_ip" : 0 , "remote_port" : 0 }
127125
128126# Source ports in use
129127SRC_PORTS = [0 ] * W5200_W5500_MAX_SOCK_NUM
130128
131129
132- class WIZNET5K : # pylint: disable=too-many-public-methods
130+ class WIZNET5K : # pylint: disable=too-many-public-methods, too-many-instance-attributes
133131 """Interface for WIZNET5K module.
134132
135133 :param ~busio.SPI spi_bus: The SPI bus the Wiznet module is connected to.
@@ -181,7 +179,11 @@ def __init__(
181179 # Set MAC address
182180 self .mac_address = mac
183181 self .src_port = 0
184- self ._dns = 0
182+ self ._dns = (0 , 0 , 0 , 0 )
183+ # udp related
184+ self .udp_datasize = [0 ] * self .max_sockets
185+ self .udp_from_ip = [b"\x00 \x00 \x00 \x00 " ] * self .max_sockets
186+ self .udp_from_port = [0 ] * self .max_sockets
185187
186188 # First, wait link status is on
187189 # to avoid the code during DHCP, socket listen, connect ...
@@ -495,11 +497,6 @@ def write(self, addr, callback, data):
495497 bus_device .write (bytes ([data [i ]])) # pylint: disable=no-member
496498
497499 # Socket-Register API
498- def udp_remaining (self ):
499- """Returns amount of bytes remaining in a udp socket."""
500- if self ._debug :
501- print ("* UDP Bytes Remaining: " , UDP_SOCK ["bytes_remaining" ])
502- return UDP_SOCK ["bytes_remaining" ]
503500
504501 def socket_available (self , socket_num , sock_type = SNMR_TCP ):
505502 """Returns the amount of bytes to be read from the socket.
@@ -520,16 +517,16 @@ def socket_available(self, socket_num, sock_type=SNMR_TCP):
520517 if sock_type == SNMR_TCP :
521518 return res
522519 if res > 0 :
523- if UDP_SOCK [ "bytes_remaining" ]:
524- return UDP_SOCK [ "bytes_remaining" ]
520+ if self . udp_datasize [ socket_num ]:
521+ return self . udp_datasize [ socket_num ]
525522 # parse the udp rx packet
526523 # read the first 8 header bytes
527524 ret , self ._pbuff = self .socket_read (socket_num , 8 )
528525 if ret > 0 :
529- UDP_SOCK [ "remote_ip" ] = self ._pbuff [:4 ]
530- UDP_SOCK [ "remote_port" ] = (self ._pbuff [4 ] << 8 ) + self ._pbuff [5 ]
531- UDP_SOCK [ "bytes_remaining" ] = (self ._pbuff [6 ] << 8 ) + self ._pbuff [7 ]
532- ret = UDP_SOCK [ "bytes_remaining" ]
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+ ret = self . udp_datasize [ socket_num ]
533530 return ret
534531 return 0
535532
@@ -573,7 +570,7 @@ def socket_connect(self, socket_num, dest, port, conn_mode=SNMR_TCP):
573570 if self .socket_status (socket_num )[0 ] == SNSR_SOCK_CLOSED :
574571 raise RuntimeError ("Failed to establish connection." )
575572 elif conn_mode == SNMR_UDP :
576- UDP_SOCK [ "bytes_remaining" ] = 0
573+ self . udp_datasize [ socket_num ] = 0
577574 return 1
578575
579576 def _send_socket_cmd (self , socket , cmd ):
@@ -765,14 +762,15 @@ def socket_read(self, socket_num, length):
765762 return ret , resp
766763
767764 def read_udp (self , socket_num , length ):
768- """Read UDP socket's remaining bytes."""
769- if UDP_SOCK [ "bytes_remaining" ] > 0 :
770- if UDP_SOCK [ "bytes_remaining" ] <= length :
771- ret , resp = self .socket_read (socket_num , UDP_SOCK [ "bytes_remaining" ])
765+ """Read UDP socket's current message bytes."""
766+ if self . udp_datasize [ socket_num ] > 0 :
767+ if self . udp_datasize [ socket_num ] <= length :
768+ ret , resp = self .socket_read (socket_num , self . udp_datasize [ socket_num ])
772769 else :
773770 ret , resp = self .socket_read (socket_num , length )
774- if ret > 0 :
775- UDP_SOCK ["bytes_remaining" ] -= ret
771+ # just consume the rest, it is lost to the higher layers
772+ self .socket_read (socket_num , self .udp_datasize [socket_num ] - length )
773+ self .udp_datasize [socket_num ] = 0
776774 return ret , resp
777775 return - 1
778776
0 commit comments