Fix cc issue in setLan cmd for MAC addr parametr.

Issue: set lan command for MAC address parameter returns invalid
completion code for invalid MAC address.

Fix: added proper conditional check.

Tested:

Note:
While setting the mac addr using  "ipmitool lan set 1 macaddr <mac_addr>"
internaly tool valiadtes the completion code and shows generic error.
Previouly the completion code is 0XFF(unspecified error) and now it
returns 0xCC(Invalid data field in request).

// setting mac addr to 00:00:00:00:00:00(invalid)
ipmitool lan set 1 macaddr "00:00:00:00:00:00"
Setting LAN MAC Address to 00:00:00:00:00:00
LAN Parameter Data does not match!  Write may have failed.

// setting mac addr to FF:FF:FF:FF:FF:FF(invalid)
ipmitool lan set 1 macaddr "FF:FF:FF:FF:FF:FF"
Setting LAN MAC Address to ff:ff:ff:ff:ff:ff
LAN Parameter Data does not match!  Write may have failed.

// setting mac addr to "2a:6c:72:42:f3:a4"(valid)
ipmitool lan set 1 macaddr "2a:6c:72:42:f3:a4"
Setting LAN MAC Address to 2a:6c:72:42:f3:a4

Signed-off-by: Rajashekar Gade Reddy <raja.sekhar.reddy.gade@linux.intel.com>
Change-Id: I4de54e68a7bb5ff2c64f515e40d06c59535825e5
diff --git a/transporthandler.cpp b/transporthandler.cpp
index c8dccb3..d7eef14 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -1313,6 +1313,30 @@
 {
     return response(ccParamNotSupported);
 }
+/**
+ * @brief is MAC address valid.
+ *
+ * This function checks whether the MAC address is valid or not.
+ *
+ * @param[in] mac - MAC address.
+ * @return true if MAC address is valid else retun false.
+ **/
+bool isValidMACAddress(const ether_addr& mac)
+{
+    // check if mac address is empty
+    if (equal(mac, ether_addr{}))
+    {
+        return false;
+    }
+    // we accept only unicast MAC addresses and  same thing has been checked in
+    // phosphor-network layer. If the least significant bit of the first octet
+    // is set to 1, it is multicast MAC else it is unicast MAC address.
+    if (mac.ether_addr_octet[0] & 1)
+    {
+        return false;
+    }
+    return true;
+}
 
 RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter,
                  message::Payload& req)
@@ -1426,6 +1450,11 @@
                 return responseReqDataLenInvalid();
             }
             copyInto(mac, bytes);
+
+            if (!isValidMACAddress(mac))
+            {
+                return responseInvalidFieldRequest();
+            }
             channelCall<setMACProperty>(channel, mac);
             return responseSuccess();
         }