Skip to content

Commit bc47af1

Browse files
authored
Automatically connect to os TUN device without constructing a device entry (#439)
* Automatically connect to os TUN device without constructing a device entry
1 parent d8bb278 commit bc47af1

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

ios/discover.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func checkEntry(ctx context.Context, device DeviceEntry, interfaceName string, e
6565

6666
func tryHandshake(ip6 net.IP, port int, interfaceName string, device DeviceEntry, result chan<- string) {
6767
addr := fmt.Sprintf("%s%%%s", ip6.String(), interfaceName)
68-
s, err := NewWithAddrPort(addr, port, device)
68+
s, err := NewWithAddrPortDevice(addr, port, device)
6969
udid := device.Properties.SerialNumber
7070
if err != nil {
7171
slog.Error("failed to connect to remote service discovery", "error", err, "address", addr)

ios/rsd.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"io"
7+
"net"
78
"strconv"
89

910
"github.com/danielpaulus/go-ios/ios/http"
@@ -159,25 +160,39 @@ func (r RsdHandshakeResponse) GetServices() map[string]RsdServiceEntry {
159160
return r.Services
160161
}
161162

162-
// NewWithAddr creates a new RsdService with the given address and port 58783 using a HTTP2 based XPC connection.
163-
func NewWithAddr(addr string, d DeviceEntry) (RsdService, error) {
164-
return NewWithAddrPort(addr, port, d)
163+
// NewWithAddrPort creates a new RsdService with the given address and port 58783 using a HTTP2 based XPC connection,
164+
// connecting to an operating system level TUN device.
165+
func NewWithAddrPort(addr string, port int) (RsdService, error) {
166+
conn, err := connectTUN(addr, port)
167+
if err != nil {
168+
return RsdService{}, fmt.Errorf("NewWithAddrPort: failed to connect to device: %w", err)
169+
}
170+
return newRsdServiceFromTcpConn(conn)
171+
}
172+
173+
// NewWithAddrDevice creates a new RsdService with the given address and port 58783 using a HTTP2 based XPC connection.
174+
func NewWithAddrDevice(addr string, d DeviceEntry) (RsdService, error) {
175+
return NewWithAddrPortDevice(addr, port, d)
165176
}
166177

167-
// NewWithAddrPort creates a new RsdService with the given address and port using a HTTP2 based XPC connection.
168-
func NewWithAddrPort(addr string, port int, d DeviceEntry) (RsdService, error) {
178+
// NewWithAddrPortDevice creates a new RsdService with the given address and port using a HTTP2 based XPC connection.
179+
func NewWithAddrPortDevice(addr string, port int, d DeviceEntry) (RsdService, error) {
169180
conn, err := ConnectTUNDevice(addr, port, d)
170181
if err != nil {
171-
return RsdService{}, fmt.Errorf("NewWithAddrPort: failed to connect to device: %w", err)
182+
return RsdService{}, fmt.Errorf("NewWithAddrPortTUNDevice: failed to connect to device: %w", err)
172183
}
184+
return newRsdServiceFromTcpConn(conn)
185+
}
186+
187+
func newRsdServiceFromTcpConn(conn *net.TCPConn) (RsdService, error) {
173188
h, err := http.NewHttpConnection(conn)
174189
if err != nil {
175-
return RsdService{}, fmt.Errorf("NewWithAddrPort: failed to connect to http2: %w", err)
190+
return RsdService{}, fmt.Errorf("newRsdServiceFromTcpConn: failed to connect to http2: %w", err)
176191
}
177192

178193
x, err := CreateXpcConnection(h)
179194
if err != nil {
180-
return RsdService{}, fmt.Errorf("NewWithAddrPort: failed to create xpc connection: %w", err)
195+
return RsdService{}, fmt.Errorf("newRsdServiceFromTcpConn: failed to create xpc connection: %w", err)
181196
}
182197

183198
return RsdService{

ios/tunnel/tunnel.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func ManualPairAndConnectToTunnel(ctx context.Context, device ios.DeviceEntry, p
8989
}
9090

9191
func getUntrustedTunnelServicePort(addr string, device ios.DeviceEntry) (int, error) {
92-
rsdService, err := ios.NewWithAddr(addr, device)
92+
rsdService, err := ios.NewWithAddrDevice(addr, device)
9393
if err != nil {
9494
return 0, fmt.Errorf("getUntrustedTunnelServicePort: failed to connect to RSD service: %w", err)
9595
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2109,7 +2109,7 @@ func startTunnel(ctx context.Context, recordsPath string, tunnelInfoPort int, us
21092109
}
21102110

21112111
func deviceWithRsdProvider(device ios.DeviceEntry, udid string, address string, rsdPort int) ios.DeviceEntry {
2112-
rsdService, err := ios.NewWithAddrPort(address, rsdPort, device)
2112+
rsdService, err := ios.NewWithAddrPortDevice(address, rsdPort, device)
21132113
exitIfError("could not connect to RSD", err)
21142114
defer rsdService.Close()
21152115
rsdProvider, err := rsdService.Handshake()

0 commit comments

Comments
 (0)