func createMirrorTimeServer(clientIP string) *timeServer {
	t := timeServer{clientPort: mirroringClientPort, clientIP: clientIP}
	t.listener = sharedMirrorListener()
	return &t
}
creates a mirror listener
package nighthawk
import (
	"bytes"
	"encoding/binary"
	"fmt"
	"log"
	"net"
	"time"
)
var (
	mirrorUDPListener *udpListener
)
const (
	AIRTUNES_PACKET       = 0x80
	AIRTUNES_TIMING_QUERY = 0xd2
	TIMESTAMP_EPOCH       = 0x83aa7e80 << 32  
	mirroringClientPort   = 7010
	mirroringServerPort   = 7011
)
type timeServer struct {
	listener    *udpListener
	queryCount  int
	clockOffset uint64
	startTime   uint64
	latency     uint32
	clientPort  int
	clientIP    string
	running     bool
}
type ntpTime struct {
	Seconds  uint32
	Fraction uint32
}
type msg struct {
	LiVnMode       byte  
	Stratum        byte
	Poll           byte
	Precision      byte
	RootDelay      uint32
	RootDispersion uint32
	ReferenceId    uint32
	ReferenceTime  ntpTime
	OriginTime     ntpTime
	ReceiveTime    ntpTime
	TransmitTime   ntpTime
}
type timingPacket struct {
	ident       uint8
	command     uint8
	fixed       uint16
	zero        uint32
	timestamp_1 uint64
	timestamp_2 uint64
	timestamp_3 uint64
}
func createTimeServer(clientPort int, clientIP string) *timeServer {
	t := timeServer{clientPort: clientPort, clientIP: clientIP}
	t.listener = createUDPListener()
	go t.listener.start(func(b []byte, size int, addr *net.Addr) {
		log.Println("NTP packet!")
	})
	return &t
}