github.com/sagernet/sing-box@v1.9.0-rc.20/route/rule_item_port.go (about) 1 package route 2 3 import ( 4 "strings" 5 6 "github.com/sagernet/sing-box/adapter" 7 F "github.com/sagernet/sing/common/format" 8 ) 9 10 var _ RuleItem = (*PortItem)(nil) 11 12 type PortItem struct { 13 ports []uint16 14 portMap map[uint16]bool 15 isSource bool 16 } 17 18 func NewPortItem(isSource bool, ports []uint16) *PortItem { 19 portMap := make(map[uint16]bool) 20 for _, port := range ports { 21 portMap[port] = true 22 } 23 return &PortItem{ 24 ports: ports, 25 portMap: portMap, 26 isSource: isSource, 27 } 28 } 29 30 func (r *PortItem) Match(metadata *adapter.InboundContext) bool { 31 if r.isSource { 32 return r.portMap[metadata.Source.Port] 33 } else { 34 return r.portMap[metadata.Destination.Port] 35 } 36 } 37 38 func (r *PortItem) String() string { 39 var description string 40 if r.isSource { 41 description = "source_port=" 42 } else { 43 description = "port=" 44 } 45 pLen := len(r.ports) 46 if pLen == 1 { 47 description += F.ToString(r.ports[0]) 48 } else { 49 description += "[" + strings.Join(F.MapToString(r.ports), " ") + "]" 50 } 51 return description 52 }