code: func sendARP(iface *net.Interface, m *arpMessage) error {
  	fd, err := syscall.Socket(syscall.AF_PACKET, syscall.SOCK_DGRAM, int(htons(syscall.ETH_P_ARP)))
  	if err != nil {
  		return fmt.Errorf("failed to get raw socket: %v", err)
  	}
  	defer syscall.Close(fd)
  
  	if err := syscall.BindToDevice(fd, iface.Name); err != nil {
  		return fmt.Errorf("failed to bind to device: %v", err)
  	}
  
  	ll := syscall.SockaddrLinklayer{
  		Protocol: htons(syscall.ETH_P_ARP),
  		Ifindex:  iface.Index,
  		Pkttype:  0, // syscall.PACKET_HOST
  		Hatype:   m.hardwareType,
  		Halen:    m.hardwareAddressLength,
  	}
  	target := ethernetBroadcast
  	if m.opcode == opARPReply {
  		target = m.targetHardwareAddress
  	}
  	for i := 0; i < len(target); i++ {
  		ll.Addr[i] = target[i]
  	}
  
  	b, err := m.bytes()
  	if err != nil {
  		return fmt.Errorf("failed to convert ARP message: %v", err)
  	}
  
  	if err := syscall.Bind(fd, &ll); err != nil {
  		return fmt.Errorf("failed to bind: %v", err)
  	}
  	if err := syscall.Sendto(fd, b, 0, &ll); err != nil {
  		return fmt.Errorf("failed to send: %v", err)
  	}
  
  	return nil
  }
docs: // sendARP sends the given ARP message via the specified interface.