Skip to content

Commit 71c5c4f

Browse files
committed
net: wasip2: refactor, support TCP connect
1 parent d255350 commit 71c5c4f

File tree

2 files changed

+61
-53
lines changed

2 files changed

+61
-53
lines changed

netdev_wasip2.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ type wasip2Socket interface {
6161
Close() error
6262
Listen(backlog int) error
6363
Bind(globalNetwork instancenetwork.Network, ip network.IPSocketAddress) error
64+
Connect(globalNetwork instancenetwork.Network, host string, ip network.IPSocketAddress) error
6465
Accept() (wasip2Socket, *network.IPSocketAddress, error)
6566
}
6667

@@ -154,8 +155,13 @@ func (n *wasip2Netdev) Bind(sockfd int, ip netip.AddrPort) error {
154155
}
155156

156157
func (n *wasip2Netdev) Connect(sockfd int, host string, ip netip.AddrPort) error {
157-
fmt.Println("wasip2 TODO Connect", sockfd, host, ip) ///
158-
return errors.New("wasip2 TODO Connect")
158+
sock, ok := n.fds[sockfd]
159+
if !ok {
160+
fmt.Println("wasip2: invalid socket fd") ///
161+
return errors.New("wasip2: invalid socket fd")
162+
}
163+
164+
return sock.Connect(n.net, host, TinygoToWasiAddr(ip))
159165
}
160166

161167
func (n *wasip2Netdev) Listen(sockfd int, backlog int) error {

tcp_wasip2.go

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,40 +16,27 @@ import (
1616
tcpcreatesocket "internal/wasi/sockets/v0.2.0/tcp-create-socket"
1717
)
1818

19+
type wasip2TcpSocket struct {
20+
tcpcreatesocket.TCPSocket
21+
tcp.Pollable
22+
*streams.InputStream
23+
*streams.OutputStream
24+
}
25+
1926
func createTCPSocket(af network.IPAddressFamily) (wasip2Socket, error) {
2027
res := tcpcreatesocket.CreateTCPSocket(af)
2128
if res.IsErr() {
2229
return nil, fmt.Errorf("failed to create TCP socket: %s", res.Err().String())
2330
}
2431

2532
sock := res.OK()
26-
return tcpServerSocket{
27-
TCPSocket: sock,
33+
return &wasip2TcpSocket{
34+
TCPSocket: *sock,
2835
Pollable: sock.Subscribe(),
2936
}, nil
3037
}
3138

32-
type tcpServerSocket struct {
33-
*tcpcreatesocket.TCPSocket
34-
tcp.Pollable
35-
}
36-
37-
func (s tcpServerSocket) Recv(buf []byte, flags int, deadline time.Time) (int, error) {
38-
fmt.Println("TODO server Recv") ///
39-
return 0, nil
40-
}
41-
42-
func (s tcpServerSocket) Send(buf []byte, flags int, deadline time.Time) (int, error) {
43-
fmt.Println("TODO server Send") ///
44-
return 0, nil
45-
}
46-
47-
func (s tcpServerSocket) Close() error {
48-
fmt.Println("TODO server Close") ///
49-
return nil
50-
}
51-
52-
func (s tcpServerSocket) Bind(globalNetwork instancenetwork.Network, addr network.IPSocketAddress) error {
39+
func (s *wasip2TcpSocket) Bind(globalNetwork instancenetwork.Network, addr network.IPSocketAddress) error {
5340
res := s.StartBind(globalNetwork, addr)
5441
if res.IsErr() {
5542
return fmt.Errorf("failed to start binding socket: %s", res.Err().String())
@@ -63,7 +50,7 @@ func (s tcpServerSocket) Bind(globalNetwork instancenetwork.Network, addr networ
6350
return nil
6451
}
6552

66-
func (s tcpServerSocket) Listen(backlog int) error {
53+
func (s *wasip2TcpSocket) Listen(backlog int) error {
6754
res := s.StartListen()
6855
if res.IsErr() {
6956
return fmt.Errorf("failed to start listening on socket: %s", res.Err().String())
@@ -77,7 +64,7 @@ func (s tcpServerSocket) Listen(backlog int) error {
7764
return nil
7865
}
7966

80-
func (s tcpServerSocket) Accept() (wasip2Socket, *network.IPSocketAddress, error) {
67+
func (s *wasip2TcpSocket) Accept() (wasip2Socket, *network.IPSocketAddress, error) {
8168
var clientSocket *tcpcreatesocket.TCPSocket
8269
var inStream *streams.InputStream
8370
var outStream *streams.OutputStream
@@ -112,26 +99,45 @@ func (s tcpServerSocket) Accept() (wasip2Socket, *network.IPSocketAddress, error
11299
return nil, nil, fmt.Errorf("failed to get remote address: %s", raddrRes.Err().String())
113100
}
114101

115-
sock := tcpSocket{
116-
TCPSocket: clientSocket,
102+
return &wasip2TcpSocket{
103+
TCPSocket: *clientSocket,
104+
Pollable: clientSocket.Subscribe(),
117105
InputStream: inStream,
118106
OutputStream: outStream,
107+
}, raddrRes.OK(), nil
108+
}
109+
110+
func (s *wasip2TcpSocket) Connect(globalNetwork instancenetwork.Network, host string, ip network.IPSocketAddress) error {
111+
res := s.StartConnect(globalNetwork, ip)
112+
if res.IsErr() {
113+
return fmt.Errorf("failed to start connecting socket: %s", res.Err().String())
119114
}
120115

121-
return sock, raddrRes.OK(), nil
122-
}
116+
for {
117+
connRes := s.FinishConnect()
118+
if connRes.IsOK() {
119+
s.InputStream, s.OutputStream = &connRes.OK().F0, &connRes.OK().F1
120+
return nil
121+
}
123122

124-
type tcpSocket struct {
125-
*tcpcreatesocket.TCPSocket
126-
*streams.InputStream
127-
*streams.OutputStream
123+
if *connRes.Err() == network.ErrorCodeWouldBlock {
124+
s.Block()
125+
continue
126+
}
127+
128+
return fmt.Errorf("failed to finish connecting socket: %s", connRes.Err().String())
129+
}
128130
}
129131

130-
func (c tcpSocket) Send(buf []byte, flags int, deadline time.Time) (int, error) {
132+
func (c wasip2TcpSocket) Send(buf []byte, flags int, deadline time.Time) (int, error) {
131133
if flags != 0 {
132134
fmt.Println("wasip2 TCP send flags TODO:", flags) ///
133135
}
134136

137+
if c.OutputStream == nil {
138+
return -1, fmt.Errorf("send called on a socket without open streams")
139+
}
140+
135141
res := c.BlockingWriteAndFlush(cm.ToList([]uint8(buf)))
136142
if res.IsErr() {
137143
return -1, fmt.Errorf("failed to write to output stream: %s", res.Err().String())
@@ -140,11 +146,15 @@ func (c tcpSocket) Send(buf []byte, flags int, deadline time.Time) (int, error)
140146
return len(buf), nil
141147
}
142148

143-
func (c tcpSocket) Recv(buf []byte, flags int, deadline time.Time) (int, error) {
149+
func (c wasip2TcpSocket) Recv(buf []byte, flags int, deadline time.Time) (int, error) {
144150
if flags != 0 {
145151
fmt.Println("wasip2 TCP recv flags TODO:", flags) ///
146152
}
147153

154+
if c.InputStream == nil {
155+
return -1, fmt.Errorf("recv called on a socket without open streams")
156+
}
157+
148158
res := c.BlockingRead(uint64(len(buf)))
149159
if res.IsErr() {
150160
return -1, fmt.Errorf("failed to read from input stream: %s", res.Err().String())
@@ -153,28 +163,20 @@ func (c tcpSocket) Recv(buf []byte, flags int, deadline time.Time) (int, error)
153163
return copy(buf, res.OK().Slice()), nil
154164
}
155165

156-
func (c tcpSocket) Close() error {
166+
func (c wasip2TcpSocket) Close() error {
157167
res := c.TCPSocket.Shutdown(tcp.ShutdownTypeBoth)
158168
if res.IsErr() {
159169
return fmt.Errorf("failed to shutdown client socket: %s", res.Err().String())
160170
}
161171

162-
c.InputStream.ResourceDrop()
163-
c.OutputStream.ResourceDrop()
172+
if c.InputStream != nil {
173+
c.InputStream.ResourceDrop()
174+
}
175+
if c.OutputStream != nil {
176+
c.OutputStream.ResourceDrop()
177+
}
178+
c.Pollable.ResourceDrop()
164179
c.TCPSocket.ResourceDrop()
165180

166181
return nil
167182
}
168-
169-
func (s tcpSocket) Bind(globalNetwork instancenetwork.Network, addr network.IPSocketAddress) error {
170-
fmt.Println("TODO client Bind") ///
171-
return nil
172-
}
173-
func (s tcpSocket) Listen(backlog int) error {
174-
fmt.Println("TODO client Listen") ///
175-
return nil
176-
}
177-
func (s tcpSocket) Accept() (wasip2Socket, *network.IPSocketAddress, error) {
178-
fmt.Println("TODO client Accept") ///
179-
return nil, nil, nil
180-
}

0 commit comments

Comments
 (0)