@@ -19,6 +19,7 @@ type interConn struct {
19
19
quicConn quic.Connection // small udp packet can be sent with Datagram directly
20
20
streams []quic.Stream // other packets can be sent via steam, it offer mux, reliability, fragmentation and ordering
21
21
readChannel chan readResult
22
+ reader buf.MultiBufferContainer
22
23
done * done.Instance
23
24
local net.Addr
24
25
remote net.Addr
@@ -34,6 +35,7 @@ func NewConnInitReader(ctx context.Context, quicConn quic.Connection, done *done
34
35
ctx : ctx ,
35
36
quicConn : quicConn ,
36
37
readChannel : make (chan readResult ),
38
+ reader : buf.MultiBufferContainer {},
37
39
done : done ,
38
40
local : quicConn .LocalAddr (),
39
41
remote : remote ,
@@ -81,13 +83,18 @@ func (c *interConn) acceptStreams() {
81
83
}
82
84
83
85
func (c * interConn ) Read (b []byte ) (int , error ) {
86
+ if c .reader .MultiBuffer .Len () > 0 {
87
+ return c .reader .Read (b )
88
+ }
84
89
received := <- c .readChannel
85
90
if received .err != nil {
86
91
return 0 , received .err
87
92
}
88
- nBytes := copy (b , received .buffer [:])
89
- errors .LogInfo (c .ctx , "Read copy " , nBytes )
90
- return nBytes , nil
93
+ buffer := buf .New ()
94
+ buffer .Write (received .buffer )
95
+ c .reader .MultiBuffer = append (c .reader .MultiBuffer , buffer )
96
+ errors .LogInfo (c .ctx , "Read copy " , len (received .buffer ))
97
+ return c .reader .Read (b )
91
98
}
92
99
93
100
func (c * interConn ) WriteMultiBuffer (mb buf.MultiBuffer ) error {
@@ -98,6 +105,23 @@ func (c *interConn) WriteMultiBuffer(mb buf.MultiBuffer) error {
98
105
}
99
106
100
107
func (c * interConn ) Write (b []byte ) (int , error ) {
108
+ if len (b ) > 1240 { // TODO: why quic-go increase internal MTU causing packet loss?
109
+ if len (c .streams ) < MaxIncomingStreams {
110
+ stream , err := c .quicConn .OpenStream ()
111
+ errors .LogInfo (c .ctx , "Write OpenStream " , err )
112
+ if err == nil {
113
+ c .streams = append (c .streams , stream )
114
+ } else {
115
+ errors .LogInfoInner (c .ctx , err , "failed to openStream: " )
116
+ }
117
+ }
118
+ currentStream ++ ;
119
+ if currentStream > len (c .streams ) - 1 {
120
+ currentStream = 0 ;
121
+ }
122
+ errors .LogInfo (c .ctx , "Write stream " , len (b ), currentStream , len (c .streams ))
123
+ return c .streams [currentStream ].Write (b )
124
+ }
101
125
var err = c .quicConn .SendDatagram (b )
102
126
errors .LogInfo (c .ctx , "Write SendDatagram " , len (b ), err )
103
127
if _ , ok := err .(* quic.DatagramTooLargeError ); ok {
0 commit comments