Repository: secdev/scapy

Issue:
usb layer forces raw payload instead of allowing custom layers
### Brief description

in the guess_payload_class() methon of usb.py if the payload can not be determined, it returns a raw_layer type. it should return super(USBpcap,self).guess_payload_class(payload) to allow custom layers to exist below the usb layer. 

### Scapy version

4f42d252

### Python version

3.9.5

### Operating system

windows 11

### Additional environment information

_No response_

### How to reproduce

```
from scapy.all import PcapReader,Packet,bind_layers,ByteField,PadField
from scapy.layers.usb import USBpcap

class DAP_CMD(Packet):
    name = "DapCMD "
    fields_desc= [
      ByteField("cmd",0),
      #PadField("dummy", align=64, padwith=0)
    ]

bind_layers(USBpcap,DAP_CMD, endpoint=0x2)    

    
p = b'\x1b\x00\xa0\t\xd6\xe2\x88\xb6\xff\xff\x00\x00\x00\x00\t\x00\x00\x01\x00\x0b\x00\x02\x01@\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

pak = USBpcap(p)
pak.show()```

### Actual result

###[ USBpcap URB ]### 
  headerLen = 27
  res       = 0
  irpId     = 0xffffb688e2d609a0
  usbd_status= Success
  function  = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
  info      = 0x0
  bus       = 1
  device    = 11
  endpoint  = 0x2
  transfer  = Interrupt
  dataLength= 64
###[ Raw ]###
     load      = '\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

### Expected result

###[ USBpcap URB ]### 
  headerLen = 27
  res       = 0
  irpId     = 0xffffb688e2d609a0
  usbd_status= Success
  function  = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER
  info      = 0x0
  bus       = 1
  device    = 11
  endpoint  = 0x2
  transfer  = Interrupt
  dataLength= 64
###[ DapCMD  ]###
     cmd       = 0
###[ Raw ]###
        load      = '\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

### Related resources

_No response_


Discussion:
Hi, thanks for issue :)
If you have a proposal, then I would be more than happy to review your Pull Request containing this change :)

Resolving patch:
diff --git a/scapy/layers/usb.py b/scapy/layers/usb.py
--- a/scapy/layers/usb.py
+++ b/scapy/layers/usb.py
@@ -113,14 +113,14 @@ def post_build(self, p, pay):
     def guess_payload_class(self, payload):
         if self.headerLen == 27:
             # No Transfer layer
-            return conf.raw_layer
+            return super(USBpcap, self).guess_payload_class(payload)
         if self.transfer == 0:
             return USBpcapTransferIsochronous
         elif self.transfer == 1:
             return USBpcapTransferInterrupt
         elif self.transfer == 2:
             return USBpcapTransferControl
-        return conf.raw_layer
+        return super(USBpcap, self).guess_payload_class(payload)
 
 
 class USBpcapTransferIsochronous(Packet):


Test patch: