pkg/exporter/bpfutil/format.go (75 lines of code) (raw):
package bpfutil
import (
"encoding/binary"
"fmt"
"net"
"strings"
"syscall"
)
// GetAddrStr get string format ip address,default in ipv4
func GetAddrStr(proto uint16, addr [16]uint8) string {
switch proto {
case syscall.ETH_P_IPV6:
return net.IP(addr[:]).String()
default:
return net.IP(addr[:4]).String()
}
}
func GetV4AddrStr(addr uint32) string {
var bytes [4]byte
bytes[0] = byte(addr & 0xff)
bytes[1] = byte(addr >> 8 & 0xff)
bytes[2] = byte(addr >> 16 & 0xff)
bytes[3] = byte(addr >> 24 & 0xff)
return fmt.Sprintf("%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3])
}
func Htons(i uint16) uint16 {
data := make([]byte, 2)
binary.BigEndian.PutUint16(data, i)
return binary.LittleEndian.Uint16(data)
}
/*
enum {
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING,
TCP_NEW_SYN_RECV,
TCP_MAX_STATES
};
*/
func GetSkcStateStr(state uint8) string {
switch state {
case 1:
return "TCP_ESTABLISHED"
case 2:
return "TCP_SYN_SENT"
case 3:
return "TCP_SYN_RECV"
case 10:
return "TCP_LISTEN"
default:
return "TCP_OTHER"
}
}
// GetProtoStr get proto sting, default IP
func GetProtoStr(proto uint8) string {
switch proto {
case syscall.IPPROTO_TCP:
return "TCP"
case syscall.IPPROTO_UDP:
return "UDP"
case syscall.IPPROTO_ICMP:
return "ICMP"
case syscall.IPPROTO_ICMPV6:
return "ICMP6"
default:
return "IP"
}
}
func GetHumanTimes(ns uint64) string {
if ns > 1000*1000 {
return fmt.Sprintf("%d ms", ns/(1000*1000))
} else if ns > 1000 {
return fmt.Sprintf("%d us", ns/1000)
}
return fmt.Sprintf("%d ns", ns)
}
func GetCommString(comm [20]int8) string {
buf := make([]byte, 20)
for idx := range comm {
buf[idx] = byte(comm[idx])
}
return strings.TrimSpace(string(buf))
}
func GetTCPState(_ uint8) string {
return "UNKNOW"
}