Add FCS to ethernet frame for ARP 92/232992/4 submit/tizen/20200518.041915
authorYu <jiung.yu@samsung.com>
Mon, 11 May 2020 06:55:28 +0000 (15:55 +0900)
committerYu <jiung.yu@samsung.com>
Tue, 12 May 2020 01:08:07 +0000 (10:08 +0900)
Change-Id: I0354c4bd187709ca60b8f0edef763ca91186e96e
Signed-off-by: Yu Jiung <jiung.yu@samsung.com>
packaging/inm-manager.spec
src/CMakeLists.txt
src/inm-util.c

index e155ed3373d6d19595f5a96e26366ff0cdd4ef38..7d6a1fa90cca8c3a93c30a486ba61549f976b31c 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       inm-manager
 Summary:    INM(Intelligent Network Monitoring) daemon
-Version:    0.0.29
+Version:    0.0.30
 Release:    1
 Group:      Network & Connectivity/Other
 License:    Apache-2.0
@@ -22,6 +22,7 @@ BuildRequires:  pkgconfig(libnl-3.0)
 BuildRequires:  pkgconfig(libnl-genl-3.0)
 BuildRequires:  pkgconfig(libnl-route-3.0)
 BuildRequires:  pkgconfig(libcares)
+BuildRequires:  pkgconfig(zlib)
 BuildRequires:  python
 BuildRequires:  python-xml
 Requires:       security-config
index 2b571bdf8452bc41f0e1ce24ada28d3d8098b4ec..e86ac8616157109030a31abb5cf9fb4d3a93007a 100644 (file)
@@ -30,6 +30,7 @@ PKG_CHECK_MODULES(inm_pkgs REQUIRED
        vconf
        libcurl
        libcares
+       zlib
        )
 
 IF(BUILD_GCOV)
index 9ff9d6005798da1a7b7ae4858515ed04263c1dc6..fa93dccfa75ec5e4a65654934b55c6ca31c112a0 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/if_ether.h>
 #include <linux/if_arp.h>
 #include <net/ethernet.h>
+#include <zlib.h>
 
 #include <arpa/inet.h>
 
@@ -66,7 +67,8 @@
 #include "inm-manager-log.h"
 #include "inm-error-analysis.h"
 
-#define ARP_PACKET_SIZE 60
+#define ARP_FRAME_SIZE 64
+#define ETHERNET_FCS_SIZE 4
 
 #ifndef MAC_FMT
 #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
@@ -131,13 +133,13 @@ static void __init_ll_addr(struct sockaddr_ll *ll_addr)
 static void __arp_sock_io_in(GIOChannel *source, inm_util_arp_data_s *arp_data)
 {
        arp_message_s *ah = NULL;
-       gchar buf[ARP_PACKET_SIZE] = {0, };
+       gchar buf[ARP_FRAME_SIZE] = {0, };
        gchar *ptr = NULL;
        gsize bytes_read = 0;
        GError *error = NULL;
 
        INM_LOGI("Read channel");
-       if (g_io_channel_read_chars(source, buf, ARP_PACKET_SIZE,
+       if (g_io_channel_read_chars(source, buf, ARP_FRAME_SIZE,
                                &bytes_read, &error) != G_IO_STATUS_NORMAL) {
                if (error) {
                        INM_LOGE("Failure received arp packet[%d]:[%s]",
@@ -294,6 +296,27 @@ static void __set_defend_arp(unsigned char *hw_addr, unsigned char *ip_addr, arp
        return;
 }
 
+static void __set_ethernet_fcs(guchar *p_frame)
+{
+       uint32_t eth_frame_fcs;
+       int pos;
+
+       if (!p_frame) {
+               return;
+       }
+
+       for (pos = 8; pos < ARP_FRAME_SIZE; pos += 8) {
+               eth_frame_fcs = crc32(0, Z_NULL, 0);
+               eth_frame_fcs = crc32(eth_frame_fcs, (const unsigned char *)p_frame, pos);
+       }
+
+       eth_frame_fcs = crc32(0, Z_NULL, 0);
+       eth_frame_fcs = crc32(eth_frame_fcs, (const unsigned char *)p_frame,
+                       (ARP_FRAME_SIZE - ETHERNET_FCS_SIZE));
+       memcpy(p_frame + (ARP_FRAME_SIZE - ETHERNET_FCS_SIZE),
+                       &eth_frame_fcs, sizeof(uint32_t));
+}
+
 int util_recover_arp_sock(inm_util_arp_data_s *arp_data)
 {
        __INM_FUNC_ENTER__;
@@ -308,7 +331,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[64] = {0,};
+       guchar buf[ARP_FRAME_SIZE] = {0,};
        guchar *pos = NULL;
        gint ret = 0;
        char err_str[128] = {0,};
@@ -331,7 +354,7 @@ gboolean util_send_arp(gpointer user_data)
                return FALSE;
 
        if (!IS_ZERO_IP(arp_data->target_ip_addr))
-               memcpy(arp_data->ipaddr, arp_data->target_ip_addr, 4);
+               memcpy(arp_data->ipaddr, arp_data->target_ip_addr, IP_ALEN);
        /* tweak
        arp_data->ipaddr[3] = 120;
         */
@@ -345,6 +368,8 @@ gboolean util_send_arp(gpointer user_data)
        memcpy(ll_addr.sll_addr, arp_data->hwaddr, ETH_ALEN);
        ll_addr.sll_ifindex = arp_data->ifindex;
 
+       __set_ethernet_fcs(buf);
+
        ret = sendto(arp_data->sock, buf, sizeof(buf), 0,
                (struct sockaddr *) &(ll_addr),
                sizeof(struct sockaddr_ll));