dscp.go 908 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package common
  2. import (
  3. "fmt"
  4. "github.com/metacubex/mihomo/common/utils"
  5. C "github.com/metacubex/mihomo/constant"
  6. )
  7. type DSCP struct {
  8. *Base
  9. ranges utils.IntRanges[uint8]
  10. payload string
  11. adapter string
  12. }
  13. func (d *DSCP) RuleType() C.RuleType {
  14. return C.DSCP
  15. }
  16. func (d *DSCP) Match(metadata *C.Metadata) (bool, string) {
  17. return d.ranges.Check(metadata.DSCP), d.adapter
  18. }
  19. func (d *DSCP) Adapter() string {
  20. return d.adapter
  21. }
  22. func (d *DSCP) Payload() string {
  23. return d.payload
  24. }
  25. func NewDSCP(dscp string, adapter string) (*DSCP, error) {
  26. ranges, err := utils.NewUnsignedRanges[uint8](dscp)
  27. if err != nil {
  28. return nil, fmt.Errorf("parse DSCP rule fail: %w", err)
  29. }
  30. for _, r := range ranges {
  31. if r.End() > 63 {
  32. return nil, fmt.Errorf("DSCP couldn't be negative or exceed 63")
  33. }
  34. }
  35. return &DSCP{
  36. Base: &Base{},
  37. payload: dscp,
  38. ranges: ranges,
  39. adapter: adapter,
  40. }, nil
  41. }