in ntp/responder/server/server.go [136:177]
func (s *Server) startListener(conn *net.UDPConn) {
s.Checker.IncListeners()
defer s.Checker.DecListeners()
// get connection file descriptor
connFd, err := timestamp.ConnFd(conn)
if err != nil {
log.Fatalf("Getting event connection FD: %s", err)
}
// Allow reading of kernel timestamps via socket
if err := timestamp.EnableSWTimestampsRx(connFd); err != nil {
log.Fatalf("enabling timestamp error: %s", err)
}
err = unix.SetNonblock(connFd, false)
if err != nil {
log.Fatalf("Failed to set socket to blocking: %s", err)
}
buf := make([]byte, timestamp.PayloadSizeBytes)
oob := make([]byte, timestamp.ControlSizeBytes)
for {
request := new(ntp.Packet)
// read kernel timestamp from incoming packet
bbuf, clisa, rxTS, err := timestamp.ReadPacketWithRXTimestampBuf(connFd, buf, oob)
if err != nil {
log.Errorf("Failed to read packet on %s: %v", conn.LocalAddr(), err)
s.Stats.IncReadError()
continue
}
if err := request.UnmarshalBinary(buf[:bbuf]); err != nil {
log.Errorf("failed to parse ntp packet: %s", err)
s.Stats.IncReadError()
continue
}
s.Stats.IncRequests()
s.tasks <- task{connFd: connFd, addr: clisa, received: rxTS, request: request, stats: s.Stats}
}
}