on the same link in the case where the address turns
out to be already in use by another host. */
- memset(ah->arp_sip, 0x00, 4);
+ memset(ah->arp_sip, 0x00, IP_ALEN);
//memcpy(ah->arp_sip, ip_conflict_mons.ipaddr, 4);
memset(ah->arp_tha, 0x00, ETH_ALEN);
return;
}
+
+static void __set_source_ip_addr(unsigned char *ip_addr, arp_message_s *ah)
+{
+ memcpy(ah->arp_sip, ip_addr, IP_ALEN);
+}
+
static void __set_ethernet_fcs(guchar *p_frame)
{
uint32_t eth_frame_fcs;
inm_util_arp_data_s *arp_data = (inm_util_arp_data_s *)user_data;
struct sockaddr_ll ll_addr;
guchar buf[ARP_FRAME_SIZE] = {0,};
+ unsigned char local_ipaddr[IP_ALEN];
guchar *pos = NULL;
gint ret = 0;
char err_str[128] = {0,};
ret = __get_iface_info(arp_data->if_name,
&(arp_data->ifindex),
arp_data->hwaddr,
- arp_data->ipaddr);
+ local_ipaddr);
if (ret != 0)
return FALSE;
if (!IS_ZERO_IP(arp_data->target_ip_addr))
memcpy(arp_data->ipaddr, arp_data->target_ip_addr, IP_ALEN);
+ else
+ memcpy(arp_data->ipaddr, local_ipaddr, IP_ALEN);
/* tweak
arp_data->ipaddr[3] = 120;
*/
pos = buf + ETH_HLEN;
__set_defend_arp(arp_data->hwaddr, arp_data->ipaddr, (arp_message_s *)pos);
+ /* ARP has for specified target */
+ if (!IS_ZERO_IP(arp_data->target_ip_addr) && !IS_ZERO_IP(local_ipaddr))
+ __set_source_ip_addr(local_ipaddr, (arp_message_s *)pos);
+
/* Construct the destination address */
memcpy(ll_addr.sll_addr, arp_data->hwaddr, ETH_ALEN);
ll_addr.sll_ifindex = arp_data->ifindex;