1 | 1 | | package tunnel |
2 | 2 | | |
3 | 3 | | import ( |
| 4 | + | "errors" |
4 | 5 | | "io" |
5 | 6 | | "net" |
6 | 7 | | "sync" |
| skipped 50 lines |
57 | 58 | | pc = newSymmetricNATPacketConn(pc, metadata) |
58 | 59 | | |
59 | 60 | | log.Infof("[UDP] %s <-> %s", metadata.SourceAddress(), metadata.DestinationAddress()) |
60 | | - | relayPacket(uc, pc, remote) |
| 61 | + | if err = relayPacket(uc, pc, remote); err != nil { |
| 62 | + | log.Warnf("[TCP] %s <-> %s: %v", metadata.SourceAddress(), metadata.DestinationAddress(), err) |
| 63 | + | } |
61 | 64 | | } |
62 | 65 | | |
63 | | - | func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) { |
| 66 | + | func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) error { |
64 | 67 | | wg := sync.WaitGroup{} |
65 | 68 | | wg.Add(2) |
66 | 69 | | |
| 70 | + | var leftErr, rightErr error |
| 71 | + | |
67 | 72 | | go func() { |
68 | 73 | | defer wg.Done() |
69 | 74 | | if err := copyPacketBuffer(right, left, to, _udpSessionTimeout); err != nil { |
70 | | - | log.Warnf("[UDP] %v", err) |
| 75 | + | leftErr = errors.Join(leftErr, err) |
71 | 76 | | } |
72 | 77 | | }() |
73 | 78 | | |
74 | 79 | | go func() { |
75 | 80 | | defer wg.Done() |
76 | 81 | | if err := copyPacketBuffer(left, right, nil, _udpSessionTimeout); err != nil { |
77 | | - | log.Warnf("[UDP] %v", err) |
| 82 | + | rightErr = errors.Join(rightErr, err) |
78 | 83 | | } |
79 | 84 | | }() |
80 | 85 | | |
81 | 86 | | wg.Wait() |
| 87 | + | return errors.Join(leftErr, rightErr) |
82 | 88 | | } |
83 | 89 | | |
84 | 90 | | func copyPacketBuffer(dst net.PacketConn, src net.PacketConn, to net.Addr, timeout time.Duration) error { |
| skipped 48 lines |