MCPcopy
hub / github.com/google/gopacket / Run

Function Run

dumpcommand/tcpdump.go:35–119  ·  view source on GitHub ↗
(src gopacket.PacketDataSource)

Source from the content-addressed store, hash-verified

33)
34
35func Run(src gopacket.PacketDataSource) {
36 if !flag.Parsed() {
37 log.Fatalln("Run called without flags.Parse() being called")
38 }
39 var dec gopacket.Decoder
40 var ok bool
41 if dec, ok = gopacket.DecodersByLayerName[*decoder]; !ok {
42 log.Fatalln("No decoder named", *decoder)
43 }
44 source := gopacket.NewPacketSource(src, dec)
45 source.Lazy = *lazy
46 source.NoCopy = true
47 source.DecodeStreamsAsDatagrams = true
48 fmt.Fprintln(os.Stderr, "Starting to read packets")
49 count := 0
50 bytes := int64(0)
51 start := time.Now()
52 errors := 0
53 truncated := 0
54 layertypes := map[gopacket.LayerType]int{}
55 defragger := ip4defrag.NewIPv4Defragmenter()
56
57 for packet := range source.Packets() {
58 count++
59 bytes += int64(len(packet.Data()))
60
61 // defrag the IPv4 packet if required
62 if *defrag {
63 ip4Layer := packet.Layer(layers.LayerTypeIPv4)
64 if ip4Layer == nil {
65 continue
66 }
67 ip4 := ip4Layer.(*layers.IPv4)
68 l := ip4.Length
69
70 newip4, err := defragger.DefragIPv4(ip4)
71 if err != nil {
72 log.Fatalln("Error while de-fragmenting", err)
73 } else if newip4 == nil {
74 continue // packet fragment, we don't have whole packet yet.
75 }
76 if newip4.Length != l {
77 fmt.Printf("Decoding re-assembled packet: %s\n", newip4.NextLayerType())
78 pb, ok := packet.(gopacket.PacketBuilder)
79 if !ok {
80 panic("Not a PacketBuilder")
81 }
82 nextDecoder := newip4.NextLayerType()
83 nextDecoder.Decode(newip4.Payload, pb)
84 }
85 }
86
87 if *dump {
88 fmt.Println(packet.Dump())
89 } else if *print {
90 fmt.Println(packet)
91 }
92 if !*lazy || *print || *dump { // if we've already decoded all layers...

Callers 2

mainFunction · 0.92
mainFunction · 0.92

Calls 15

PacketsMethod · 0.95
DefragIPv4Method · 0.95
NewPacketSourceFunction · 0.92
NewIPv4DefragmenterFunction · 0.92
PrintfMethod · 0.80
DataMethod · 0.65
LayerMethod · 0.65
NextLayerTypeMethod · 0.65
DecodeMethod · 0.65
DumpMethod · 0.65
LayersMethod · 0.65
LayerTypeMethod · 0.65

Tested by

no test coverage detected