dtls.go 684 B

12345678910111213141516171819202122232425262728293031
  1. package sniff
  2. import (
  3. "context"
  4. "os"
  5. "github.com/sagernet/sing-box/adapter"
  6. C "github.com/sagernet/sing-box/constant"
  7. )
  8. func DTLSRecord(ctx context.Context, packet []byte) (*adapter.InboundContext, error) {
  9. const fixedHeaderSize = 13
  10. if len(packet) < fixedHeaderSize {
  11. return nil, os.ErrInvalid
  12. }
  13. contentType := packet[0]
  14. switch contentType {
  15. case 20, 21, 22, 23, 25:
  16. default:
  17. return nil, os.ErrInvalid
  18. }
  19. versionMajor := packet[1]
  20. if versionMajor != 0xfe {
  21. return nil, os.ErrInvalid
  22. }
  23. versionMinor := packet[2]
  24. if versionMinor != 0xff && versionMinor != 0xfd {
  25. return nil, os.ErrInvalid
  26. }
  27. return &adapter.InboundContext{Protocol: C.ProtocolDTLS}, nil
  28. }