forked from usnistgov/ndn-dpdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstream.go
58 lines (48 loc) · 1.24 KB
/
stream.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package sockettransport
import "github.com/usnistgov/ndn-dpdk/ndn/tlv"
func streamDecode(received, buf []byte) (rest []byte, n int) {
if len(received) > 0 {
d := tlv.DecodingBuffer(received)
if de, e := d.Element(); e == nil {
return de.After, copy(buf, de.Wire)
}
}
return received, 0
}
type streamReader struct{}
func (streamReader) Read(tr *transport, buf []byte) (n int, e error) {
received, _ := tr.rxBuffer.([]byte)
received, n = streamDecode(received, buf)
if n > 0 {
tr.rxBuffer = received
return n, nil
}
if mtu := tr.MTU(); cap(received) < mtu {
// don't use slices.Grow() because it would cause the underlying buffer to grow indefinitely
received = append(make([]byte, 0, 4*mtu), received...)
}
r, e := tr.conn.Read(received[len(received):cap(received)])
if e != nil {
return 0, e
}
received = received[:len(received)+r]
received, n = streamDecode(received, buf)
tr.rxBuffer = received
return n, nil
}
type tcpImpl struct {
noLocalAddrDialer
localAddrRedialer
streamReader
}
type unixImpl struct {
noLocalAddrDialer
noLocalAddrRedialer
streamReader
}
func init() {
implByNetwork["tcp"] = tcpImpl{}
implByNetwork["tcp4"] = tcpImpl{}
implByNetwork["tcp6"] = tcpImpl{}
implByNetwork["unix"] = unixImpl{}
}