Fill source IP address for ARP request when there's specified target 80/233880/1
authorYu <jiung.yu@samsung.com>
Wed, 20 May 2020 04:23:15 +0000 (13:23 +0900)
committerYu <jiung.yu@samsung.com>
Wed, 20 May 2020 04:23:27 +0000 (13:23 +0900)
Change-Id: Ie9edd7bff9629fe027bc56555132e15b59644d86
Signed-off-by: Yu Jiung <jiung.yu@samsung.com>
packaging/inm-manager.spec
src/inm-util.c

index 7d6a1fa90cca8c3a93c30a486ba61549f976b31c..666b1bcaf5ced9fc9783f0fff125fbdc7287669b 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       inm-manager
 Summary:    INM(Intelligent Network Monitoring) daemon
-Version:    0.0.30
+Version:    0.0.31
 Release:    1
 Group:      Network & Connectivity/Other
 License:    Apache-2.0
index fa93dccfa75ec5e4a65654934b55c6ca31c112a0..b748c49cd18ea87aed2ee1fd90ddb95459e2b2b7 100644 (file)
@@ -287,7 +287,7 @@ static void __set_defend_arp(unsigned char *hw_addr, unsigned char *ip_addr, arp
         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);
@@ -296,6 +296,12 @@ static void __set_defend_arp(unsigned char *hw_addr, unsigned char *ip_addr, arp
        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;
@@ -332,6 +338,7 @@ gboolean util_send_arp(gpointer user_data)
        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,};
@@ -349,12 +356,14 @@ gboolean util_send_arp(gpointer user_data)
        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;
         */
@@ -364,6 +373,10 @@ gboolean util_send_arp(gpointer user_data)
        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;