/
flags.go
58 lines (52 loc) · 1.34 KB
/
flags.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package phys
import (
"flag"
"fmt"
"github.com/songgao/water"
)
type Flags struct {
PcapDevice *string
EnableTap *bool
EthernetFraming *string
}
func RegisterFlags() *Flags {
f := &Flags{}
maybeAddPcapDeviceFlag(f)
f.EnableTap = flag.Bool("enable_tap", false, "Bridge the server to a tap device.")
f.EthernetFraming = flag.String("ethernet_framing", "auto", `Framing to use when sending Ethernet packets. Valid values are "auto", "802.2", "802.3raw", "snap" and "eth-ii".`)
return f
}
func (f *Flags) EthernetStream(captureNonIPX bool) (DuplexEthernetStream, error) {
if *f.EnableTap {
return NewTap(water.Config{})
}
return openPcapHandle(f, captureNonIPX)
}
func (f *Flags) makeFramer() (Framer, error) {
framerName := *f.EthernetFraming
if framerName == "auto" {
return &automaticFramer{
fallback: Framer802_2,
}, nil
}
for _, framer := range allFramers {
if framerName == framer.Name() {
return framer, nil
}
}
return nil, fmt.Errorf("unknown Ethernet framing %q", framerName)
}
func (f *Flags) MakePhys(captureNonIPX bool) (*Phys, error) {
stream, err := f.EthernetStream(captureNonIPX)
if err != nil {
return nil, err
} else if stream != nil {
framer, err := f.makeFramer()
if err != nil {
return nil, err
}
return NewPhys(stream, framer), nil
}
// Physical capture not enabled.
return nil, nil
}