@@ -20,8 +20,10 @@ import (
20
20
)
21
21
22
22
const (
23
- pathTCPTab = "/proc/net/tcp"
23
+ pathTCP4Tab = "/proc/net/tcp"
24
+ pathTCP6Tab = "/proc/net/tcp6"
24
25
ipv4StrLen = 8
26
+ ipv6StrLen = 32
25
27
)
26
28
27
29
type procFd struct {
@@ -120,6 +122,23 @@ func parseIPv4(s string) (net.IP, error) {
120
122
return ip , nil
121
123
}
122
124
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
+
123
142
func parseAddr (s string ) (* sockAddr , error ) {
124
143
fields := strings .Split (s , ":" )
125
144
if len (fields ) < 2 {
@@ -130,6 +149,8 @@ func parseAddr(s string) (*sockAddr, error) {
130
149
switch len (fields [0 ]) {
131
150
case ipv4StrLen :
132
151
ip , err = parseIPv4 (fields [0 ])
152
+ case ipv6StrLen :
153
+ ip , err = parseIPv6 (fields [0 ])
133
154
default :
134
155
log .Fatal ("Badly formatted connection address:" , s )
135
156
}
@@ -192,21 +213,26 @@ func parseSocktab(r io.Reader, accept AcceptFn) ([]sockTabEntry, error) {
192
213
// tcpSocks returns a slice of active TCP sockets containing only those
193
214
// elements that satisfy the accept function
194
215
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
+ }
202
226
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 ... )
207
232
208
- extractProcInfo (tabs )
209
- return tabs , nil
233
+ }
234
+ extractProcInfo (allTabs )
235
+ return allTabs , nil
210
236
}
211
237
212
238
// GetConnInode returns the Linux inode number of a TCP connection
0 commit comments