diff --git a/transporthandler.cpp b/transporthandler.cpp
index 1222d5a..43c88bb 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -176,12 +176,12 @@
                     auto ipsrc = dhcpEnabled ? ipmi::network::IPOrigin::DHCP
                                              : ipmi::network::IPOrigin::STATIC;
 
-                    memcpy(data, &ipsrc, ipmi::network::IPSRC_SIZE_BYTE);
+                    std::memcpy(data, &ipsrc, ipmi::network::IPSRC_SIZE_BYTE);
                 }
                 else if (channelConf->lan_set_in_progress == SET_IN_PROGRESS)
                 {
-                    memcpy(data, &(channelConf->ipsrc),
-                           ipmi::network::IPSRC_SIZE_BYTE);
+                    std::memcpy(data, &(channelConf->ipsrc),
+                                ipmi::network::IPSRC_SIZE_BYTE);
                 }
             }
             break;
@@ -211,7 +211,8 @@
                     {
                         // nothing to do
                     }
-                    memcpy(data, &mask, ipmi::network::IPV4_ADDRESS_SIZE_BYTE);
+                    std::memcpy(data, &mask,
+                                ipmi::network::IPV4_ADDRESS_SIZE_BYTE);
                 }
                 else if (channelConf->lan_set_in_progress == SET_IN_PROGRESS)
                 {
@@ -312,12 +313,12 @@
                         // nothing to do
                     }
 
-                    memcpy(data, &vlanID, ipmi::network::VLAN_SIZE_BYTE);
+                    std::memcpy(data, &vlanID, ipmi::network::VLAN_SIZE_BYTE);
                 }
                 else if (channelConf->lan_set_in_progress == SET_IN_PROGRESS)
                 {
-                    memcpy(data, &(channelConf->vlanID),
-                           ipmi::network::VLAN_SIZE_BYTE);
+                    std::memcpy(data, &(channelConf->vlanID),
+                                ipmi::network::VLAN_SIZE_BYTE);
                 }
             }
             break;
@@ -422,9 +423,9 @@
     {
         case LAN_PARM_IP:
         {
-            snprintf(ipaddr, INET_ADDRSTRLEN, ipmi::network::IP_ADDRESS_FORMAT,
-                     reqptr->data[0], reqptr->data[1], reqptr->data[2],
-                     reqptr->data[3]);
+            std::snprintf(ipaddr, INET_ADDRSTRLEN,
+                          ipmi::network::IP_ADDRESS_FORMAT, reqptr->data[0],
+                          reqptr->data[1], reqptr->data[2], reqptr->data[3]);
 
             channelConf->ipaddr.assign(ipaddr);
         }
@@ -433,7 +434,7 @@
         case LAN_PARM_IPSRC:
         {
             uint8_t ipsrc{};
-            memcpy(&ipsrc, reqptr->data, ipmi::network::IPSRC_SIZE_BYTE);
+            std::memcpy(&ipsrc, reqptr->data, ipmi::network::IPSRC_SIZE_BYTE);
             channelConf->ipsrc = static_cast<ipmi::network::IPOrigin>(ipsrc);
         }
         break;
@@ -442,9 +443,9 @@
         {
             char mac[SIZE_MAC];
 
-            snprintf(mac, SIZE_MAC, ipmi::network::MAC_ADDRESS_FORMAT,
-                     reqptr->data[0], reqptr->data[1], reqptr->data[2],
-                     reqptr->data[3], reqptr->data[4], reqptr->data[5]);
+            std::snprintf(mac, SIZE_MAC, ipmi::network::MAC_ADDRESS_FORMAT,
+                          reqptr->data[0], reqptr->data[1], reqptr->data[2],
+                          reqptr->data[3], reqptr->data[4], reqptr->data[5]);
 
             auto macObjectInfo =
                 ipmi::getDbusObject(bus, ipmi::network::MAC_INTERFACE,
@@ -460,18 +461,18 @@
 
         case LAN_PARM_SUBNET:
         {
-            snprintf(netmask, INET_ADDRSTRLEN, ipmi::network::IP_ADDRESS_FORMAT,
-                     reqptr->data[0], reqptr->data[1], reqptr->data[2],
-                     reqptr->data[3]);
+            std::snprintf(netmask, INET_ADDRSTRLEN,
+                          ipmi::network::IP_ADDRESS_FORMAT, reqptr->data[0],
+                          reqptr->data[1], reqptr->data[2], reqptr->data[3]);
             channelConf->netmask.assign(netmask);
         }
         break;
 
         case LAN_PARM_GATEWAY:
         {
-            snprintf(gateway, INET_ADDRSTRLEN, ipmi::network::IP_ADDRESS_FORMAT,
-                     reqptr->data[0], reqptr->data[1], reqptr->data[2],
-                     reqptr->data[3]);
+            std::snprintf(gateway, INET_ADDRSTRLEN,
+                          ipmi::network::IP_ADDRESS_FORMAT, reqptr->data[0],
+                          reqptr->data[1], reqptr->data[2], reqptr->data[3]);
             channelConf->gateway.assign(gateway);
         }
         break;
@@ -479,7 +480,7 @@
         case LAN_PARM_VLAN:
         {
             uint16_t vlan{};
-            memcpy(&vlan, reqptr->data, ipmi::network::VLAN_SIZE_BYTE);
+            std::memcpy(&vlan, reqptr->data, ipmi::network::VLAN_SIZE_BYTE);
             // We are not storing the enable bit
             // We assume that ipmitool always send enable
             // bit as 1.
@@ -553,7 +554,7 @@
     {
         // Only current revision was requested
         *data_len = sizeof(current_revision);
-        memcpy(response, &current_revision, *data_len);
+        std::memcpy(response, &current_revision, *data_len);
         return IPMI_CC_OK;
     }
 
@@ -584,19 +585,19 @@
     {
         uint8_t buf[] = {current_revision, channelConf->lan_set_in_progress};
         *data_len = sizeof(buf);
-        memcpy(response, &buf, *data_len);
+        std::memcpy(response, &buf, *data_len);
     }
     else if (reqptr->parameter == LAN_PARM_AUTHSUPPORT)
     {
         uint8_t buf[] = {current_revision, 0x04};
         *data_len = sizeof(buf);
-        memcpy(response, &buf, *data_len);
+        std::memcpy(response, &buf, *data_len);
     }
     else if (reqptr->parameter == LAN_PARM_AUTHENABLES)
     {
         uint8_t buf[] = {current_revision, 0x04, 0x04, 0x04, 0x04, 0x04};
         *data_len = sizeof(buf);
-        memcpy(response, &buf, *data_len);
+        std::memcpy(response, &buf, *data_len);
     }
     else if ((reqptr->parameter == LAN_PARM_IP) ||
              (reqptr->parameter == LAN_PARM_SUBNET) ||
@@ -606,7 +607,7 @@
         uint8_t buf[ipmi::network::MAC_ADDRESS_SIZE_BYTE + 1] = {};
 
         *data_len = sizeof(current_revision);
-        memcpy(buf, &current_revision, *data_len);
+        std::memcpy(buf, &current_revision, *data_len);
 
         if (getNetworkData(reqptr->parameter, &buf[1], channel) == IPMI_CC_OK)
         {
@@ -618,7 +619,7 @@
             {
                 *data_len = ipmi::network::IPV4_ADDRESS_SIZE_BYTE + 1;
             }
-            memcpy(response, &buf, *data_len);
+            std::memcpy(response, &buf, *data_len);
         }
         else
         {
@@ -630,22 +631,22 @@
         uint8_t buf[ipmi::network::VLAN_SIZE_BYTE + 1] = {};
 
         *data_len = sizeof(current_revision);
-        memcpy(buf, &current_revision, *data_len);
+        std::memcpy(buf, &current_revision, *data_len);
         if (getNetworkData(reqptr->parameter, &buf[1], channel) == IPMI_CC_OK)
         {
             *data_len = sizeof(buf);
-            memcpy(response, &buf, *data_len);
+            std::memcpy(response, &buf, *data_len);
         }
     }
     else if (reqptr->parameter == LAN_PARM_IPSRC)
     {
         uint8_t buff[ipmi::network::IPSRC_SIZE_BYTE + 1] = {};
         *data_len = sizeof(current_revision);
-        memcpy(buff, &current_revision, *data_len);
+        std::memcpy(buff, &current_revision, *data_len);
         if (getNetworkData(reqptr->parameter, &buff[1], channel) == IPMI_CC_OK)
         {
             *data_len = sizeof(buff);
-            memcpy(response, &buff, *data_len);
+            std::memcpy(response, &buff, *data_len);
         }
     }
     else if (reqptr->parameter == CIPHER_SUITE_COUNT)
