@@ -20,8 +20,10 @@ import (
2020)
2121
2222const (
23- pathTCPTab = "/proc/net/tcp"
23+ pathTCP4Tab = "/proc/net/tcp"
24+ pathTCP6Tab = "/proc/net/tcp6"
2425 ipv4StrLen = 8
26+ ipv6StrLen = 32
2527)
2628
2729type 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+
123142func 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
194215func 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
0 commit comments