in packetbeat/pb/event.go [223:317]
func (f *Fields) ComputeValues(localIPs []net.IP, internalNetworks []string) error {
var flow flowhash.Flow
// network.bytes
if f.Source != nil {
flow.SourceIP = net.ParseIP(f.Source.IP)
flow.SourcePort = uint16(f.Source.Port)
f.Network.Bytes += f.Source.Bytes
}
if f.Destination != nil {
flow.DestinationIP = net.ParseIP(f.Destination.IP)
flow.DestinationPort = uint16(f.Destination.Port)
f.Network.Bytes += f.Destination.Bytes
}
// network.community_id
switch f.Network.Transport {
case "udp":
flow.Protocol = 17
case "tcp":
flow.Protocol = 6
case "icmp":
flow.Protocol = 1
case "ipv6-icmp":
flow.Protocol = 58
}
flow.ICMP.Type = f.ICMPType
flow.ICMP.Code = f.ICMPCode
if flow.Protocol > 0 && len(flow.SourceIP) > 0 && len(flow.DestinationIP) > 0 {
f.Network.CommunityID = flowhash.CommunityID.Hash(flow)
}
// network.type
if f.Network.Type == "" {
if len(flow.SourceIP) > 0 {
if flow.SourceIP.To4() != nil {
f.Network.Type = "ipv4"
} else {
f.Network.Type = "ipv6"
}
} else if len(flow.DestinationIP) > 0 {
if flow.DestinationIP.To4() != nil {
f.Network.Type = "ipv4"
} else {
f.Network.Type = "ipv6"
}
}
}
// network.direction
if f.Network.Direction == "" {
direction := hostBasedDirection(flow.SourceIP, flow.DestinationIP, localIPs)
if len(internalNetworks) > 0 && direction == Unknown {
var err error
direction, err = perimeterBasedDirection(flow.SourceIP, flow.DestinationIP, internalNetworks)
if err != nil {
return err
}
}
f.Network.Direction = direction
}
// process (dest process will take priority)
if f.DestinationProcess != nil {
f.Process = f.DestinationProcess
} else if f.SourceProcess != nil {
f.Process = f.SourceProcess
}
// event.duration
if f.Event.Duration == -1 && !f.Event.Start.IsZero() && !f.Event.End.IsZero() {
if elapsed := f.Event.End.Sub(f.Event.Start); elapsed >= 0 {
f.Event.Duration = elapsed
}
}
// event.dataset
if f.Event.Dataset == "" {
f.Event.Dataset = f.Network.Protocol
}
// client
if f.Client == nil && f.Source != nil {
client := ecs.Client(*f.Source)
f.Client = &client
}
// server
if f.Server == nil && f.Destination != nil {
server := ecs.Server(*f.Destination)
f.Server = &server
}
return nil
}