router.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package route
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing-box/log"
  7. N "github.com/sagernet/sing/common/network"
  8. )
  9. var _ adapter.Router = (*Router)(nil)
  10. type Router struct {
  11. logger log.Logger
  12. defaultOutbound adapter.Outbound
  13. outboundByTag map[string]adapter.Outbound
  14. }
  15. func NewRouter(logger log.Logger) *Router {
  16. return &Router{
  17. logger: logger,
  18. outboundByTag: make(map[string]adapter.Outbound),
  19. }
  20. }
  21. func (r *Router) AddOutbound(outbound adapter.Outbound) {
  22. if outbound.Tag() != "" {
  23. r.outboundByTag[outbound.Tag()] = outbound
  24. }
  25. if r.defaultOutbound == nil {
  26. r.defaultOutbound = outbound
  27. }
  28. }
  29. func (r *Router) DefaultOutbound() adapter.Outbound {
  30. if r.defaultOutbound == nil {
  31. panic("missing default outbound")
  32. }
  33. return r.defaultOutbound
  34. }
  35. func (r *Router) Outbound(tag string) (adapter.Outbound, bool) {
  36. outbound, loaded := r.outboundByTag[tag]
  37. return outbound, loaded
  38. }
  39. func (r *Router) RouteConnection(ctx context.Context, conn net.Conn, metadata adapter.InboundContext) error {
  40. r.logger.WithContext(ctx).Debug("no match")
  41. r.logger.WithContext(ctx).Debug("route connection to default outbound")
  42. return r.defaultOutbound.NewConnection(ctx, conn, metadata.Destination)
  43. }
  44. func (r *Router) RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata adapter.InboundContext) error {
  45. r.logger.WithContext(ctx).Debug("no match")
  46. r.logger.WithContext(ctx).Debug("route packet connection to default outbound")
  47. return r.defaultOutbound.NewPacketConnection(ctx, conn, metadata.Destination)
  48. }