@@ -340,7 +340,7 @@ def shutdown(self):
340
340
self ._far = None
341
341
342
342
343
- class USBIPClient :
343
+ class USBIPServerClient :
344
344
"""connections to the usbip clients, wrap the socket to provide more context"""
345
345
def __init__ (self , connection : socket .socket , address : tuple [str , int ], size : int = 0 ) -> None :
346
346
"""local variables"""
@@ -436,7 +436,7 @@ def __init__(self, host: str, port: int):
436
436
self .urb_queue : dict [int , Any ] = {} # pending read URBs, queued by seq #
437
437
self .usb_devices : MockUSBDevice = MockUSBDevice (devices = []) # to keep mypy & others happy
438
438
self ._wakeup : Optional [SocketPair ] = SocketPair ()
439
- self ._clients : list [USBIPClient ] = []
439
+ self ._clients : list [USBIPServerClient ] = []
440
440
self .setup ()
441
441
if self .host and self .port :
442
442
self .event .clear ()
@@ -452,6 +452,11 @@ def __init__(self, host: str, port: int):
452
452
else :
453
453
LOGGER .info ("MockUSBIP server not started" )
454
454
455
+ @property
456
+ def has_clients (self ) -> bool :
457
+ """return the clients we have (for testing)"""
458
+ return bool (self ._clients )
459
+
455
460
def setup (self ):
456
461
"""setup our instance"""
457
462
data_path : str = os .path .join (os .path .dirname (os .path .abspath (__file__ )), 'usbip_packets.json' )
@@ -462,14 +467,21 @@ def setup(self):
462
467
self .usb_devices = MockUSBDevice (parser .devices )
463
468
self .usb_devices .setup () # now we have binary for the USB devices we can emulate
464
469
470
+ def wakeup (self ):
471
+ """send a wakeup packet"""
472
+ if self ._wakeup :
473
+ self ._wakeup .wakeup ()
474
+
465
475
def shutdown (self ):
466
476
"""shutdown the USBIP server thread"""
467
477
if self .thread and self .event .is_set ():
468
478
self .logger .info ("clear event, wait for thread to recognize exit condition" )
469
479
self .event .clear () # -> 0, thread will exit loop if we aren't blocking on accept()
470
480
if self .server_socket :
471
- if not self . _is_windows : # in linux-land, need to shut down as well
481
+ try :
472
482
self .server_socket .shutdown (socket .SHUT_RDWR )
483
+ except OSError : # if socket isn't bound yet, an exception is generated
484
+ pass
473
485
self .server_socket .close () # if we are waiting for accept(), should unblock
474
486
475
487
self .logger .info ("waiting for event to signal (0->1)" )
@@ -522,7 +534,7 @@ def generate_mock_response(self, usb: MockDevice, request: CMD_SUBMIT) -> bytes:
522
534
self .logger .info ("generate_mock_response()" )
523
535
return response + ret_submit .pack () # send the read values back immediately
524
536
525
- def mock_urb_responses (self , client : USBIPClient , message : bytes ) -> bytes :
537
+ def mock_urb_responses (self , client : USBIPServerClient , message : bytes ) -> bytes :
526
538
"""return URB packets"""
527
539
urb_header : HEADER_BASIC = HEADER_BASIC .unpack (message )
528
540
if urb_header .command == BasicCommands .CMD_UNLINK : # de-queue a read request
@@ -604,7 +616,7 @@ def mock_urb_responses(self, client: USBIPClient, message: bytes) -> bytes:
604
616
client .busid = bytes ()
605
617
return failure .pack ()
606
618
607
- def mock_response (self , client : USBIPClient , message : bytes ) -> None :
619
+ def mock_response (self , client : USBIPServerClient , message : bytes ) -> None :
608
620
"""use the lsusb devices to mock a response"""
609
621
busid : str = client .busid .strip (b'\0 ' ).decode ('utf-8' ) if client .is_attached else 'None'
610
622
self .logger .info (f"{ busid = } , { message .hex ()= } " )
@@ -654,15 +666,17 @@ def mock_response(self, client: USBIPClient, message: bytes) -> None:
654
666
client .busid = path .busid
655
667
self .logger .info (f"OP_REP_IMPORT: { data .hex ()} " )
656
668
return
669
+
670
+ self .logger .warning ("no response" )
657
671
return
658
672
659
- def wait_for_message (self , conn : Optional [USBIPClient ] = None ) -> tuple [USBIPClient , bytes ]:
673
+ def wait_for_message (self , conn : Optional [USBIPServerClient ] = None ) -> tuple [USBIPServerClient , bytes ]:
660
674
"""wait for a response (or a shutdown)"""
661
675
self .logger .info (f"wait_for_message({ conn = } ), { self ._clients = } " )
662
676
if self ._wakeup is None or self .server_socket is None :
663
- raise ValueError ("neither the wakeup or server socket can be emptied !" )
677
+ raise ValueError ("neither the wakeup or server socket can be empty !" )
664
678
665
- rlist : list [socket .socket | USBIPClient ] = [self ._wakeup .listener , self .server_socket ]
679
+ rlist : list [socket .socket | USBIPServerClient ] = [self ._wakeup .listener , self .server_socket ]
666
680
if conn :
667
681
if conn not in self ._clients :
668
682
self ._clients .append (conn )
@@ -677,17 +691,17 @@ def wait_for_message(self, conn: Optional[USBIPClient] = None) -> tuple[USBIPCli
677
691
read_sockets , _ , _ = select .select (rlist , [], [])
678
692
for socket_read in read_sockets :
679
693
if socket_read == self ._wakeup .listener : # time to bail
680
- self .logger .info ("[usbip-server] Wakeup!" )
694
+ self .logger .info ("Wakeup!" )
681
695
raise OrderlyExit ("wakeup!" )
682
696
elif socket_read == self .server_socket : # someone is knocking
683
697
self .logger .info (f"wait_for_message(): accept() { self .server_socket = } " )
684
698
new_conn , address = self .server_socket .accept () # accept new connection
685
- client : USBIPClient = USBIPClient (connection = new_conn , address = address )
699
+ client : USBIPServerClient = USBIPServerClient (connection = new_conn , address = address )
686
700
self ._clients .append (client )
687
701
rlist .append (client )
688
702
self .logger .info (f"client @{ address } connected { self ._clients = } " )
689
703
continue
690
- elif isinstance (socket_read , USBIPClient ):
704
+ elif isinstance (socket_read , USBIPServerClient ):
691
705
# should be a USBClient instance
692
706
message : bytes = socket_read .recv (socket_read .size )
693
707
self .logger .info (f"wait_for_message: { message .hex ()= } " )
@@ -700,9 +714,9 @@ def wait_for_message(self, conn: Optional[USBIPClient] = None) -> tuple[USBIPCli
700
714
except OSError as os_error :
701
715
self .logger .error (f"wait_for_message: OSError: { str (os_error )} " )
702
716
703
- raise OrderlyExit ("wait_for_message(), event set!" )
717
+ raise OrderlyExit ("event set!" )
704
718
705
- def read_message (self , client : Optional [USBIPClient ] = None ) -> tuple [USBIPClient , bytes ]:
719
+ def read_message (self , client : Optional [USBIPServerClient ] = None ) -> tuple [USBIPServerClient , bytes ]:
706
720
"""read a single message from the socket"""
707
721
client , message = self .wait_for_message (client )
708
722
if client .is_attached and message : # reading URBs
0 commit comments