in ptp/ptp4u/server/server.go [160:207]
func (s *Server) startEventListener() {
var err error
log.Infof("Binding on %s %d", s.Config.IP, ptp.PortEvent)
eventConn, err := net.ListenUDP("udp", &net.UDPAddr{IP: s.Config.IP, Port: ptp.PortEvent})
if err != nil {
log.Fatalf("Listening error: %s", err)
}
defer eventConn.Close()
// get connection file descriptor
s.eFd, err = timestamp.ConnFd(eventConn)
if err != nil {
log.Fatalf("Getting event connection FD: %s", err)
}
// Enable RX timestamps. Delay requests need to be timestamped by ptp4u on receipt
switch s.Config.TimestampType {
case timestamp.HWTIMESTAMP:
if err := timestamp.EnableHWTimestamps(s.eFd, s.Config.Interface); err != nil {
log.Fatalf("Cannot enable hardware RX timestamps: %v", err)
}
case timestamp.SWTIMESTAMP:
if err := timestamp.EnableSWTimestamps(s.eFd); err != nil {
log.Fatalf("Cannot enable software RX timestamps: %v", err)
}
default:
log.Fatalf("Unrecognized timestamp type: %s", s.Config.TimestampType)
}
err = unix.SetNonblock(s.eFd, false)
if err != nil {
log.Fatalf("Failed to set socket to blocking: %s", err)
}
// Call wg.Add(1) ONLY once
// If ANY goroutine finishes no matter how many of them we run
// wg.Done will unblock
var wg sync.WaitGroup
wg.Add(1)
for i := 0; i < s.Config.RecvWorkers; i++ {
go func() {
defer wg.Done()
s.handleEventMessages(eventConn)
}()
}
wg.Wait()
}