in main.go [185:251]
func main() {
defer util.Run()()
var handle *pcap.Handle
var err error
flag.Parse()
//labels validation
if *fwdPerc > 100 || *fwdPerc < 0 {
err = fmt.Errorf("Flag percentage is not between 0 and 100. Value: %f.", *fwdPerc)
} else if *fwdBy != "" && *fwdBy != "header" && *fwdBy != "remoteaddr" {
err = fmt.Errorf("Flag percentage-by (%s) is not valid.", *fwdBy)
} else if *fwdBy == "header" && *fwdHeader == "" {
err = fmt.Errorf("Flag percentage-by is set to header, but percentage-by-header is empty.")
} else if *reqPort > 65535 || *reqPort < 0 {
err = fmt.Errorf("Flag filter-request-port is not between 0 and 65535. Value: %f.", *fwdPerc)
}
if err != nil {
log.Fatal(err)
}
// Set up pcap packet capture
log.Printf("Starting capture on interface vxlan0")
handle, err = pcap.OpenLive("vxlan0", 8951, true, pcap.BlockForever)
if err != nil {
log.Fatal(err)
}
// Set up BPF filter
BPFFilter := fmt.Sprintf("%s%d", "tcp and dst port ", *reqPort)
if err := handle.SetBPFFilter(BPFFilter); err != nil {
log.Fatal(err)
}
// Set up assembly
streamFactory := &httpStreamFactory{}
streamPool := tcpassembly.NewStreamPool(streamFactory)
assembler := tcpassembly.NewAssembler(streamPool)
log.Println("reading in packets")
// Read in packets, pass to assembler.
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
packets := packetSource.Packets()
ticker := time.Tick(time.Minute)
//Open a TCP Client, for NLB Health Checks only
go openTCPClient()
for {
select {
case packet := <-packets:
// A nil packet indicates the end of a pcap file.
if packet == nil {
return
}
if packet.NetworkLayer() == nil || packet.TransportLayer() == nil || packet.TransportLayer().LayerType() != layers.LayerTypeTCP {
log.Println("Unusable packet")
continue
}
tcp := packet.TransportLayer().(*layers.TCP)
assembler.AssembleWithTimestamp(packet.NetworkLayer().NetworkFlow(), tcp, packet.Metadata().Timestamp)
case <-ticker:
// Every minute, flush connections that haven't seen activity in the past 1 minute.
assembler.FlushOlderThan(time.Now().Add(time.Minute * -1))
}
}
}