@@ -63,6 +63,7 @@ var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
6363var enableSNTP = flag .Bool ("sntp" , false , "enables a simple SNTP server on port 123" )
6464var networkDevice = flag .Int ("dev" , - 1 , "index of the network device to use, overrides device prompt" )
6565var blockprofile = flag .Int ("blockprofile" , 0 , "number of block profiles to include" )
66+ var playbackFile = flag .String ("playback" , "" , "" )
6667
6768func main () {
6869 flag .Parse ()
@@ -244,21 +245,25 @@ func main() {
244245 if err != nil {
245246 panic ("failed to obtain sniffer source: " + err .Error ())
246247 }
248+
249+ if * playbackFile != "" {
250+ source , err = pcap .OpenOffline (* playbackFile )
251+ if err != nil {
252+ panic ("failed to obtain sniffer source: " + err .Error ())
253+ }
254+ }
255+
247256 boardIps := make ([]net.IP , 0 )
248257 for _ , board := range info .Addresses .Boards {
249258 boardIps = append (boardIps , board )
250259 }
251- err = source .SetBPFFilter (getFilter (boardIps , info .Addresses .Backend , info .Ports .UDP , info .Ports .TcpClient , info .Ports .TcpServer ))
260+ filter := getFilter (boardIps , info .Addresses .Backend , info .Ports .UDP )
261+ trace .Warn ().Str ("filter" , filter ).Msg ("filter" )
262+ err = source .SetBPFFilter (filter )
252263 if err != nil {
253264 panic ("failed to compile bpf filter" )
254265 }
255- go func () {
256- sniffer := sniffer .New (source , & layers .LayerTypeEthernet , trace .Logger )
257- for {
258- errChan := transp .HandleSniffer (sniffer )
259- trace .Error ().Stack ().Err (<- errChan ).Msg ("sniffer crashed, restarting..." )
260- }
261- }()
266+ go transp .HandleSniffer (sniffer .New (source , & layers .LayerTypeEthernet , trace .Logger ))
262267
263268 // <--- http server --->
264269 podDataHandle , err := h .HandleDataJSON ("podData.json" , pod_data .GetDataOnlyPodData (podData ))
@@ -534,15 +539,11 @@ func getOps(units utils.Units) data.ConversionDescriptor {
534539 return output
535540}
536541
537- func getFilter (boardAddrs []net.IP , backendAddr net.IP , udpPort uint16 , tcpClientPort uint16 , tcpServerPort uint16 ) string {
542+ func getFilter (boardAddrs []net.IP , backendAddr net.IP , udpPort uint16 ) string {
538543 ipipFilter := getIPIPfilter ()
539- udpFilter := getUDPFilter (boardAddrs , udpPort )
540- tcpFilter := getTCPFilter (boardAddrs , tcpServerPort , tcpClientPort )
541- // noBackend := "not host 192.168.0.9"
542-
543- // filter := fmt.Sprintf("((%s) or (%s) or (%s)) and (%s)", ipipFilter, udpFilter, tcpFilter, noBackend)
544+ udpFilter := getUDPFilter (boardAddrs , backendAddr , udpPort )
544545
545- filter := fmt .Sprintf ("(%s) or (%s) or (%s) " , ipipFilter , udpFilter , tcpFilter )
546+ filter := fmt .Sprintf ("(%s) or (%s)" , ipipFilter , udpFilter )
546547
547548 trace .Trace ().Any ("addrs" , boardAddrs ).Str ("filter" , filter ).Msg ("new filter" )
548549 return filter
@@ -552,35 +553,13 @@ func getIPIPfilter() string {
552553 return "ip[9] == 4"
553554}
554555
555- func getUDPFilter (addrs []net.IP , port uint16 ) string {
556+ func getUDPFilter (addrs []net.IP , backendAddr net. IP , port uint16 ) string {
556557 udpPort := fmt .Sprintf ("udp port %d" , port )
557558 udpAddrs := common .Map (addrs , func (addr net.IP ) string {
558559 return fmt .Sprintf ("(src host %s)" , addr )
559560 })
560561
561562 udpAddrsStr := strings .Join (udpAddrs , " or " )
562563
563- return fmt .Sprintf ("(%s) and (%s)" , udpPort , udpAddrsStr )
564- }
565-
566- func getTCPFilter (addrs []net.IP , serverPort uint16 , clientPort uint16 ) string {
567- ports := fmt .Sprintf ("tcp port %d or %d" , serverPort , clientPort )
568- notSynFinRst := "tcp[tcpflags] & (tcp-fin | tcp-syn | tcp-rst) == 0"
569- notJustAck := "tcp[tcpflags] | tcp-ack != 16"
570- nonZeroPayload := "tcp[tcpflags] & tcp-push != 0"
571-
572- srcAddresses := common .Map (addrs , func (addr net.IP ) string {
573- return fmt .Sprintf ("(src host %s)" , addr )
574- })
575-
576- srcAddressesStr := strings .Join (srcAddresses , " or " )
577-
578- dstAddresses := common .Map (addrs , func (addr net.IP ) string {
579- return fmt .Sprintf ("(dst host %s)" , addr )
580- })
581-
582- dstAddressesStr := strings .Join (dstAddresses , " or " )
583-
584- filter := fmt .Sprintf ("(%s) and (%s) and (%s) and (%s) and (%s) and (%s)" , ports , notSynFinRst , notJustAck , nonZeroPayload , srcAddressesStr , dstAddressesStr )
585- return filter
564+ return fmt .Sprintf ("(%s) and (%s) and (dst host %s)" , udpPort , udpAddrsStr , backendAddr )
586565}
0 commit comments