Skip to content

Commit db38fc0

Browse files
committed
Fix gvisor icmp destination
1 parent 8dbb51c commit db38fc0

File tree

6 files changed

+21
-24
lines changed

6 files changed

+21
-24
lines changed

ping/destination.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ping
22

33
import (
4+
"context"
45
"errors"
56
"net/netip"
67
"os"
@@ -16,12 +17,13 @@ import (
1617
var _ tun.DirectRouteDestination = (*Destination)(nil)
1718

1819
type Destination struct {
19-
logger logger.Logger
20+
ctx context.Context
21+
logger logger.ContextLogger
2022
routeContext tun.DirectRouteContext
2123
conn *Conn
2224
}
2325

24-
func ConnectDestination(logger logger.Logger, controlFunc control.Func, address netip.Addr, routeContext tun.DirectRouteContext) (tun.DirectRouteDestination, error) {
26+
func ConnectDestination(ctx context.Context, logger logger.ContextLogger, controlFunc control.Func, address netip.Addr, routeContext tun.DirectRouteContext) (tun.DirectRouteDestination, error) {
2527
var (
2628
conn *Conn
2729
err error
@@ -39,6 +41,7 @@ func ConnectDestination(logger logger.Logger, controlFunc control.Func, address
3941
return nil, err
4042
}
4143
d := &Destination{
44+
ctx: ctx,
4245
logger: logger,
4346
routeContext: routeContext,
4447
conn: conn,
@@ -54,13 +57,13 @@ func (d *Destination) loopRead() {
5457
if err != nil {
5558
buffer.Release()
5659
if !E.IsClosed(err) {
57-
d.logger.Error(E.Cause(err, "receive ICMP echo reply"))
60+
d.logger.ErrorContext(d.ctx, E.Cause(err, "receive ICMP echo reply"))
5861
}
5962
return
6063
}
6164
err = d.routeContext.WritePacket(buffer.Bytes())
6265
if err != nil {
63-
d.logger.Error(E.Cause(err, "write ICMP echo reply"))
66+
d.logger.Error(d.ctx, E.Cause(err, "write ICMP echo reply"))
6467
}
6568
buffer.Release()
6669
}

ping/socket_unix.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/sagernet/sing/common/control"
1313
E "github.com/sagernet/sing/common/exceptions"
1414
M "github.com/sagernet/sing/common/metadata"
15+
1516
"golang.org/x/sys/unix"
1617
)
1718

route_nat.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,14 @@ import (
66

77
"github.com/sagernet/sing-tun/internal/gtcpip/checksum"
88
"github.com/sagernet/sing-tun/internal/gtcpip/header"
9+
"github.com/sagernet/sing/common/buf"
910
)
1011

12+
type DirectRouteDestination interface {
13+
WritePacket(packet *buf.Buffer) error
14+
Close() error
15+
}
16+
1117
type NatMapping struct {
1218
access sync.RWMutex
1319
sessions map[DirectRouteSession]DirectRouteContext

route_nat_gvisor.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ package tun
55
import (
66
"github.com/sagernet/gvisor/pkg/tcpip"
77
"github.com/sagernet/gvisor/pkg/tcpip/header"
8-
stack "github.com/sagernet/gvisor/pkg/tcpip/stack"
8+
"github.com/sagernet/gvisor/pkg/tcpip/stack"
99
"github.com/sagernet/sing/common/buf"
1010
)
1111

12-
type DirectRouteDestination interface {
13-
WritePacket(packet *buf.Buffer) error
14-
WritePacketBuffer(packetBuffer *stack.PacketBuffer) error
15-
Close() error
12+
func icmpWritePacketBuffer(action DirectRouteDestination, packetBuffer *stack.PacketBuffer) error {
13+
packetSlice := packetBuffer.TransportHeader().Slice()
14+
packetSlice = append(packetSlice, packetBuffer.Data().AsRange().ToSlice()...)
15+
return action.WritePacket(buf.As(packetSlice))
1616
}
1717

1818
func (w *NatWriter) RewritePacketBuffer(packetBuffer *stack.PacketBuffer) {

route_nat_non_gvisor.go

Lines changed: 0 additions & 12 deletions
This file was deleted.

stack_gvisor_icmp.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ func (f *ICMPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pa
6262
}
6363
if action != nil {
6464
// TODO: handle error
65-
pkt.IncRef()
66-
_ = action.WritePacketBuffer(pkt)
65+
_ = icmpWritePacketBuffer(action, pkt)
6766
return true
6867
}
6968
icmpHdr.SetType(header.ICMPv4EchoReply)
@@ -120,7 +119,7 @@ func (f *ICMPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pa
120119
if action != nil {
121120
// TODO: handle error
122121
pkt.IncRef()
123-
_ = action.WritePacketBuffer(pkt)
122+
_ = icmpWritePacketBuffer(action, pkt)
124123
return true
125124
}
126125
icmpHdr.SetType(header.ICMPv6EchoReply)

0 commit comments

Comments
 (0)