summaryrefslogtreecommitdiff
path: root/utilities/tcpinfo_unix.go
blob: b0b5252ab79507210cef469217c734425830ec83 (plain)
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
59
60
61
62
//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd
// +build darwin dragonfly freebsd linux netbsd openbsd

package utilities

import (
	"fmt"
	"net"

	"golang.org/x/sys/unix"
)

func GetTCPInfo(connection net.Conn) (*unix.TCPInfo, error) {
	tcpConn, ok := connection.(*net.TCPConn)
	if !ok {
		return nil, fmt.Errorf("connection is not a net.TCPConn")
	}
	rawConn, err := tcpConn.SyscallConn()
	if err != nil {
		return nil, err
	}

	var info *unix.TCPInfo = nil
	rawConn.Control(func(fd uintptr) {
		info, err = unix.GetsockoptTCPInfo(int(fd), unix.SOL_TCP, unix.TCP_INFO)
	})
	return info, err
}

func PrintTCPInfo(info *unix.TCPInfo) {
	fmt.Printf("TCPInfo: \n")
	fmt.Printf("	State: %v\n", info.State)
	fmt.Printf("	Ca_state: %v\n", info.Ca_state)
	fmt.Printf("	Retransmits: %v\n", info.Retransmits)
	fmt.Printf("	Probes: %v\n", info.Probes)
	fmt.Printf("	Backoff: %v\n", info.Backoff)
	fmt.Printf("	Options: %v\n", info.Options)
	fmt.Printf("	Rto: %v\n", info.Rto)
	fmt.Printf("	Ato: %v\n", info.Ato)
	fmt.Printf("	Snd_mss: %v\n", info.Snd_mss)
	fmt.Printf("	Rcv_mss: %v\n", info.Rcv_mss)
	fmt.Printf("	Unacked: %v\n", info.Unacked)
	fmt.Printf("	Sacked: %v\n", info.Sacked)
	fmt.Printf("	Lost: %v\n", info.Lost)
	fmt.Printf("	Retrans: %v\n", info.Retrans)
	fmt.Printf("	Fackets: %v\n", info.Fackets)
	fmt.Printf("	Last_data_sent: %v\n", info.Last_data_sent)
	fmt.Printf("	Last_ack_sent: %v\n", info.Last_ack_sent)
	fmt.Printf("	Last_data_recv: %v\n", info.Last_data_recv)
	fmt.Printf("	Last_ack_recv: %v\n", info.Last_ack_recv)
	fmt.Printf("	Pmtu: %v\n", info.Pmtu)
	fmt.Printf("	Rcv_ssthresh: %v\n", info.Rcv_ssthresh)
	fmt.Printf("	Rtt: %v\n", info.Rtt)
	fmt.Printf("	Rttvar: %v\n", info.Rttvar)
	fmt.Printf("	Snd_ssthresh: %v\n", info.Snd_ssthresh)
	fmt.Printf("	Snd_cwnd: %v\n", info.Snd_cwnd)
	fmt.Printf("	Advmss: %v\n", info.Advmss)
	fmt.Printf("	Reordering: %v\n", info.Reordering)
	fmt.Printf("	Rcv_rtt: %v\n", info.Rcv_rtt)
	fmt.Printf("	Rcv_space: %v\n", info.Rcv_space)
	fmt.Printf("	Total_retrans: %v\n", info.Total_retrans)
}