122
122
W5100_MAX_SOCK_NUM = const (0x04 )
123
123
SOCKET_INVALID = const (255 )
124
124
125
- # UDP socket struct.
126
- UDP_SOCK = {"bytes_remaining" : 0 , "remote_ip" : 0 , "remote_port" : 0 }
127
125
128
126
# Source ports in use
129
127
SRC_PORTS = [0 ] * W5200_W5500_MAX_SOCK_NUM
130
128
131
129
132
- class WIZNET5K : # pylint: disable=too-many-public-methods
130
+ class WIZNET5K : # pylint: disable=too-many-public-methods, too-many-instance-attributes
133
131
"""Interface for WIZNET5K module.
134
132
135
133
:param ~busio.SPI spi_bus: The SPI bus the Wiznet module is connected to.
@@ -181,7 +179,11 @@ def __init__(
181
179
# Set MAC address
182
180
self .mac_address = mac
183
181
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
185
187
186
188
# First, wait link status is on
187
189
# to avoid the code during DHCP, socket listen, connect ...
@@ -495,11 +497,6 @@ def write(self, addr, callback, data):
495
497
bus_device .write (bytes ([data [i ]])) # pylint: disable=no-member
496
498
497
499
# 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" ]
503
500
504
501
def socket_available (self , socket_num , sock_type = SNMR_TCP ):
505
502
"""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):
520
517
if sock_type == SNMR_TCP :
521
518
return res
522
519
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 ]
525
522
# parse the udp rx packet
526
523
# read the first 8 header bytes
527
524
ret , self ._pbuff = self .socket_read (socket_num , 8 )
528
525
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 ]
533
530
return ret
534
531
return 0
535
532
@@ -573,7 +570,7 @@ def socket_connect(self, socket_num, dest, port, conn_mode=SNMR_TCP):
573
570
if self .socket_status (socket_num )[0 ] == SNSR_SOCK_CLOSED :
574
571
raise RuntimeError ("Failed to establish connection." )
575
572
elif conn_mode == SNMR_UDP :
576
- UDP_SOCK [ "bytes_remaining" ] = 0
573
+ self . udp_datasize [ socket_num ] = 0
577
574
return 1
578
575
579
576
def _send_socket_cmd (self , socket , cmd ):
@@ -765,14 +762,15 @@ def socket_read(self, socket_num, length):
765
762
return ret , resp
766
763
767
764
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 ])
772
769
else :
773
770
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
776
774
return ret , resp
777
775
return - 1
778
776
0 commit comments