func pkt(ip [4]byte) []byte { h := ipv4.Header{ Version: 4, Len: 20, TotalLen: 20 + 10, // 20 bytes for IP, 10 for ICMP TTL: 64, Protocol: 1, // ICMP Dst: net.IPv4(ip[0], ip[1], ip[2], ip[3]), // ID, Src and Checksum will be set for us by the kernel } icmp := []byte{ 8, // type: echo request 0, // code: not used by echo request 0, // checksum (16 bit), we fill in below 0, 0, // identifier (16 bit). zero allowed. 0, 0, // sequence number (16 bit). zero allowed. 0, 0xC0, // Optional data. ping puts time packet sent here 0xDE, } cs := csum(icmp) icmp[2] = byte(cs) icmp[3] = byte(cs >> 8) out, err := h.Marshal() if err != nil { glog.Error(err) } return append(out, icmp...) }