func main()

in cmd/ziffy/main.go [52:152]


func main() {
	c := &node.Config{}

	var messageType string
	var nsCFThreshold int

	flag.Usage = func() {
		fmt.Fprint(flag.CommandLine.Output(), doc)
		flag.PrintDefaults()
	}

	flag.StringVar(&c.LogLevel, "loglevel", "info", "set a log level. Can be: trace, debug, info, warning, error")
	flag.StringVar(&c.Mode, "mode", "receiver", "set the mode. Can be either sender or receiver")
	flag.StringVar(&c.Device, "if", "eth0", "network interface to use")
	flag.IntVar(&c.HopMax, "maxhop", 7, "max number of hops (used by sender)")
	flag.IntVar(&c.HopMin, "minhop", 1, "min number of hops (used by sender)")
	flag.DurationVar(&c.IcmpTimeout, "icmptime", 1*time.Second, "max timeout to wait for icmp packets (used by sender)")
	flag.StringVar(&c.DestinationAddress, "addr", "", "IP address of receiver (used by sender)")
	flag.IntVar(&c.DestinationPort, "dp", ptp.PortEvent, "destination port to send packets to")
	flag.IntVar(&c.SourcePort, "sp", 32768, "the base source port to start probing (used by sender)")
	flag.IntVar(&c.PortCount, "portcount", 1, "port count to be used for probing each target ip (used by sender)")
	flag.StringVar(&messageType, "type", "sync", "set the message type. Can be 'sync' (default), 'delay_req' or 'signaling' (used by sender)")
	flag.StringVar(&c.CsvFile, "csv", "", "csv output file path (used by sender)")
	flag.BoolVar(&c.ContReached, "continue", false, "continue incrementing hop count after destination host responds (used by sender)")
	flag.IntVar(&c.IPCount, "ipcount", 0, "number of additional IPs targeted in the same /64 prefix as destination to increase hashing entropy (used by sender)")
	flag.IntVar(&c.DSCP, "dscp", 0, "DSCP for PTP packets, valid values are between 0-63 (used by sender)")
	flag.DurationVar(&c.LLDPWaitTime, "lldptime", 5*time.Second, "max timeout to wait for LLDP packets (used by sender)")
	flag.IntVar(&c.QueueCap, "qcap", 10000, "ICMP queue capacity (used by sender)")
	flag.DurationVar(&c.IcmpReplyTime, "replytime", 1*time.Second, "waiting time for late icmp packets (used by sender)")
	flag.IntVar(&nsCFThreshold, "cfthreshold", 250, "CorrectionField threshold (CF difference < abs(CFThreshold) => switch not TC) (used by sender)")
	flag.IntVar(&c.PTPRecvHandlers, "maxhandlers", 10000, "maximum number of simultaneous goroutines used to handle PTP packets (used by receiver)")

	flag.Parse()

	log.Debugf("\nLogLevel = %v\nMode = %v\nDestinationAddress = %v\nDestinationPort = %v\nSourcePort = %v\n",
		c.LogLevel, c.Mode, c.DestinationAddress, c.DestinationPort, c.SourcePort)

	if c.DSCP < 0 || c.DSCP > 63 {
		log.Fatalf("unsupported DSCP value %v", c.DSCP)
	}

	if c.IcmpTimeout < 100*time.Millisecond {
		log.Warnf("setting timeout < 100ms for ICMP replies may lead to inaccurate results")
	}

	switch messageType {
	case "delay_req":
		c.MessageType = ptp.MessageDelayReq
	case "sync":
		c.MessageType = ptp.MessageSync
	case "signaling":
		c.MessageType = ptp.MessageSignaling
	default:
		log.Fatalf("unsupported message type %q", messageType)
	}

	switch c.LogLevel {
	case "trace":
		log.SetLevel(log.TraceLevel)
	case "debug":
		log.SetLevel(log.DebugLevel)
	case "info":
		log.SetLevel(log.InfoLevel)
	case "warning":
		log.SetLevel(log.WarnLevel)
	case "error":
		log.SetLevel(log.ErrorLevel)
	default:
		log.Fatalf("unrecognized log level: %v", c.LogLevel)
	}

	switch c.Mode {
	case "receiver":
		log.Infof("RECEIVER")

		r := node.Receiver{
			Config: c,
		}
		if err := r.Start(); err != nil {
			log.Errorf("receiver start failed: %v", err)
		}
	case "sender":
		log.Infof("SENDER")

		s := node.Sender{
			Config: c,
		}

		info, err := s.Start()
		if err != nil {
			log.Errorf("sender start failed: %v", err)
		}

		node.PrettyPrint(info, ptp.NewCorrection(float64(nsCFThreshold)))
		if s.Config.CsvFile != "" {
			node.CsvPrint(info, s.Config.CsvFile, ptp.NewCorrection(float64(nsCFThreshold)))
		}
	default:
		log.Errorf("--mode must be sender or receiver")
	}
}