in pkg/tcp_metrics/parser/parse.go [152:204]
func decode(rawIDM *inetdiag.RawInetDiagMsg, attributes [][]byte) (*Snapshot, error) {
var err error
result := Snapshot{}
if rawIDM != nil {
result.InetDiagMsg, err = rawIDM.Parse()
if err != nil {
fmt.Println("Error decoding RawIDM:", err)
return nil, err
}
}
for t, raw := range attributes {
if raw == nil {
continue
}
rta := RouteAttrValue(raw)
ok := false
switch t {
case inetdiag.INET_DIAG_MEMINFO:
result.MemInfo, ok = rta.toMemInfo()
case inetdiag.INET_DIAG_INFO:
result.TCPInfo, ok = rta.toLinuxTCPInfo()
case inetdiag.INET_DIAG_VEGASINFO:
result.VegasInfo, ok = rta.toVegasInfo()
case inetdiag.INET_DIAG_CONG:
result.CongestionAlgorithm, ok = rta.CongestionAlgorithm()
case inetdiag.INET_DIAG_TOS:
result.TOS, ok = rta.toTOS()
case inetdiag.INET_DIAG_TCLASS:
result.TClass, ok = rta.toTCLASS()
case inetdiag.INET_DIAG_SKMEMINFO:
result.SocketMem, ok = rta.toSockMemInfo()
case inetdiag.INET_DIAG_SHUTDOWN:
result.Shutdown, ok = rta.toShutdown()
case inetdiag.INET_DIAG_DCTCPINFO:
result.DCTCPInfo, ok = rta.toDCTCPInfo()
case inetdiag.INET_DIAG_PROTOCOL:
result.Protocol, ok = rta.toProtocol()
case inetdiag.INET_DIAG_MARK:
result.Mark, ok = rta.toMark()
case inetdiag.INET_DIAG_BBRINFO:
result.BBRInfo, ok = rta.toBBRInfo()
case inetdiag.INET_DIAG_CLASS_ID:
result.ClassID, ok = rta.toClassID()
}
bit := uint32(1) << uint8(t-1)
result.Observed |= bit
if !ok {
result.NotFullyParsed |= bit
}
}
return &result, nil
}