Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit 18c5e2f

Browse files
author
Juanjo
committed
xxx
1 parent 632e458 commit 18c5e2f

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

internal/sockstate/netstat_linux.go

+40-14
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import (
2020
)
2121

2222
const (
23-
pathTCPTab = "/proc/net/tcp"
23+
pathTCP4Tab = "/proc/net/tcp"
24+
pathTCP6Tab = "/proc/net/tcp6"
2425
ipv4StrLen = 8
26+
ipv6StrLen = 32
2527
)
2628

2729
type procFd struct {
@@ -120,6 +122,23 @@ func parseIPv4(s string) (net.IP, error) {
120122
return ip, nil
121123
}
122124

125+
func parseIPv6(s string) (net.IP, error) {
126+
ip := make(net.IP, net.IPv6len)
127+
const grpLen = 4
128+
i, j := 0, 4
129+
for len(s) != 0 {
130+
grp := s[0:8]
131+
u, err := strconv.ParseUint(grp, 16, 32)
132+
binary.LittleEndian.PutUint32(ip[i:j], uint32(u))
133+
if err != nil {
134+
return nil, err
135+
}
136+
i, j = i+grpLen, j+grpLen
137+
s = s[8:]
138+
}
139+
return ip, nil
140+
}
141+
123142
func parseAddr(s string) (*sockAddr, error) {
124143
fields := strings.Split(s, ":")
125144
if len(fields) < 2 {
@@ -130,6 +149,8 @@ func parseAddr(s string) (*sockAddr, error) {
130149
switch len(fields[0]) {
131150
case ipv4StrLen:
132151
ip, err = parseIPv4(fields[0])
152+
case ipv6StrLen:
153+
ip, err = parseIPv6(fields[0])
133154
default:
134155
log.Fatal("Badly formatted connection address:", s)
135156
}
@@ -192,21 +213,26 @@ func parseSocktab(r io.Reader, accept AcceptFn) ([]sockTabEntry, error) {
192213
// tcpSocks returns a slice of active TCP sockets containing only those
193214
// elements that satisfy the accept function
194215
func tcpSocks(accept AcceptFn) ([]sockTabEntry, error) {
195-
f, err := os.Open(pathTCPTab)
196-
defer func() {
197-
_ = f.Close()
198-
}()
199-
if err != nil {
200-
return nil, err
201-
}
216+
paths := [2]string{pathTCP4Tab, pathTCP6Tab}
217+
var allTabs []sockTabEntry
218+
for _, p := range paths {
219+
f, err := os.Open(p)
220+
defer func() {
221+
_ = f.Close()
222+
}()
223+
if err != nil {
224+
return nil, err
225+
}
202226

203-
tabs, err := parseSocktab(f, accept)
204-
if err != nil {
205-
return nil, err
206-
}
227+
t, err := parseSocktab(f, accept)
228+
if err != nil {
229+
return nil, err
230+
}
231+
allTabs = append(allTabs, t...)
207232

208-
extractProcInfo(tabs)
209-
return tabs, nil
233+
}
234+
extractProcInfo(allTabs)
235+
return allTabs, nil
210236
}
211237

212238
// GetConnInode returns the Linux inode number of a TCP connection

server/handler_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ func TestHandlerTimeout(t *testing.T) {
255255
})
256256
require.NoError(err)
257257
}
258+
258259
func TestOkClosedConnection(t *testing.T) {
259260
require := require.New(t)
260261
e := setupMemDB(require)
@@ -281,11 +282,11 @@ func TestOkClosedConnection(t *testing.T) {
281282
0,
282283
)
283284
h.AddNetConnection(&conn)
284-
c2 := newConn(2)
285-
h.NewConnection(c2)
285+
c := newConn(1)
286+
h.NewConnection(c)
286287

287288
q := fmt.Sprintf("SELECT SLEEP(%d)", tcpCheckerSleepTime*4)
288-
err = h.ComQuery(c2, q, func(res *sqltypes.Result) error {
289+
err = h.ComQuery(c, q, func(res *sqltypes.Result) error {
289290
return nil
290291
})
291292
require.NoError(err)

0 commit comments

Comments
 (0)