1 | 1 | | package tunnel |
2 | 2 | | |
3 | 3 | | import ( |
4 | | - | "errors" |
5 | 4 | | "io" |
6 | 5 | | "net" |
7 | 6 | | "sync" |
| skipped 46 lines |
54 | 53 | | pc = newSymmetricNATPacketConn(pc, metadata) |
55 | 54 | | |
56 | 55 | | log.Infof("[UDP] %s <-> %s", metadata.SourceAddress(), metadata.DestinationAddress()) |
57 | | - | if err = pipePacket(uc, pc, remote); err != nil { |
58 | | - | log.Debugf("[UDP] %s <-> %s: %v", metadata.SourceAddress(), metadata.DestinationAddress(), err) |
59 | | - | } |
| 56 | + | pipePacket(uc, pc, remote) |
60 | 57 | | } |
61 | 58 | | |
62 | | - | func pipePacket(origin net.PacketConn, remote net.PacketConn, to net.Addr) error { |
| 59 | + | func pipePacket(origin, remote net.PacketConn, to net.Addr) { |
63 | 60 | | wg := sync.WaitGroup{} |
64 | 61 | | wg.Add(2) |
65 | | - | |
66 | | - | var leftErr, rightErr error |
67 | 62 | | |
68 | 63 | | go func() { |
69 | 64 | | defer wg.Done() |
70 | 65 | | if err := copyPacketData(remote, origin, to, _udpSessionTimeout); err != nil { |
71 | | - | leftErr = errors.Join(leftErr, err) |
| 66 | + | log.Debugf("[UDP] copy data for origin->remote: %v", err) |
72 | 67 | | } |
73 | 68 | | }() |
74 | 69 | | |
75 | 70 | | go func() { |
76 | 71 | | defer wg.Done() |
77 | 72 | | if err := copyPacketData(origin, remote, nil, _udpSessionTimeout); err != nil { |
78 | | - | rightErr = errors.Join(rightErr, err) |
| 73 | + | log.Debugf("[UDP] copy data for remote->origin: %v", err) |
79 | 74 | | } |
80 | 75 | | }() |
81 | 76 | | |
82 | 77 | | wg.Wait() |
83 | | - | return errors.Join(leftErr, rightErr) |
84 | 78 | | } |
85 | 79 | | |
86 | | - | func copyPacketData(dst net.PacketConn, src net.PacketConn, to net.Addr, timeout time.Duration) error { |
| 80 | + | func copyPacketData(dst, src net.PacketConn, to net.Addr, timeout time.Duration) error { |
87 | 81 | | buf := pool.Get(pool.MaxSegmentSize) |
88 | 82 | | defer pool.Put(buf) |
89 | 83 | | |
| skipped 45 lines |