package icmp import ( "bytes" "encoding/binary" "net" "time" "golang.org/x/net/icmp" ) func netAddrToIPAddr(a net.Addr) *net.IPAddr { switch v := a.(type) { case *net.UDPAddr: return &net.IPAddr{IP: v.IP, Zone: v.Zone} case *net.IPAddr: return v } return nil } func (pkt *Packet) BuildEchoRequestMessage(icmptype Type) ([]byte, error) { if pkt.Nbytes < 40 { pkt.Nbytes = 40 } bs := bytes.Repeat([]byte{1}, pkt.Nbytes) pkt.SendTime = time.Now() binary.BigEndian.PutUint64(bs, uint64(pkt.SendTime.UnixNano())) binary.BigEndian.PutUint64(bs[8:], uint64(pkt.Seq)) binary.BigEndian.PutUint64(bs[16:], uint64(pkt.ID)) copy(bs[24:], pkt.UUID[:]) body := &icmp.Echo{ ID: pkt.ID % 65535, Seq: pkt.Seq % 65536, Data: bs, } msg := &icmp.Message{ Type: icmptype, Code: 0, Body: body, } msgBytes, err := msg.Marshal(nil) if err != nil { return nil, err } return msgBytes, nil }