summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuryakanth Sekar <suryakanth.sekar@linux.intel.com>2019-08-08 14:30:19 +0530
committerTom Joseph <tomjoseph@in.ibm.com>2019-08-28 09:52:47 +0000
commit0a327e1ce11fb6ef083bffcbb5426e3d10542753 (patch)
tree0e7085e0776db45a2e8ad285aa3183740cbaf213
parente405440f87a4748a7ec116eb3ec44693ede8cf79 (diff)
downloadphosphor-host-ipmid-0a327e1ce11fb6ef083bffcbb5426e3d10542753.tar.gz
phosphor-host-ipmid-0a327e1ce11fb6ef083bffcbb5426e3d10542753.zip
Added VLAN ID checking condition in Set LAN config
According to the VLAN 802.1VLAN spec, VLAN ID should be 1-4095 Unit test: Verified VLAN ID 1-4095 is allowed and CC returns for 0 & > 4095 Signed-off-by: Suryakanth Sekar <suryakanth.sekar@linux.intel.com> Change-Id: I54bbc94c814c98dda11f8241fa31bfe0e5bbb150
-rw-r--r--transporthandler.cpp13
-rw-r--r--transporthandler.hpp3
2 files changed, 15 insertions, 1 deletions
diff --git a/transporthandler.cpp b/transporthandler.cpp
index 8795c1a..acff251 100644
--- a/transporthandler.cpp
+++ b/transporthandler.cpp
@@ -416,7 +416,6 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
ipmi_context_t context)
{
ipmi_ret_t rc = IPMI_CC_OK;
- *data_len = 0;
char ipaddr[INET_ADDRSTRLEN];
char netmask[INET_ADDRSTRLEN];
@@ -425,6 +424,9 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
auto reqptr = reinterpret_cast<const set_lan_t*>(request);
sdbusplus::bus::bus bus(ipmid_get_sd_bus_connection());
+ size_t reqLen = *data_len;
+ *data_len = 0;
+
// channel number is the lower nibble
int channel = reqptr->channel & CHANNEL_MASK;
auto ethdevice = ipmi::getChannelName(channel);
@@ -499,12 +501,21 @@ ipmi_ret_t ipmi_transport_set_lan(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
case LanParam::VLAN:
{
+ if (reqLen != lanParamVLANSize)
+ {
+ return IPMI_CC_REQ_DATA_LEN_INVALID;
+ }
+
uint16_t vlan{};
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.
vlan = le16toh(vlan);
+ if (vlan == 0 || vlan > maxValidVLANIDValue)
+ {
+ return IPMI_CC_INVALID_FIELD_REQUEST;
+ }
channelConf->vlanID = vlan;
}
break;
diff --git a/transporthandler.hpp b/transporthandler.hpp
index 04d4673..5896082 100644
--- a/transporthandler.hpp
+++ b/transporthandler.hpp
@@ -79,6 +79,8 @@ enum class LanParam : uint8_t
IPV6_NEIGHBOR_TIMING_CONFIGURATION = 80,
};
+// Data length of parameters
+constexpr size_t lanParamVLANSize = 4;
constexpr uint8_t SET_COMPLETE = 0;
constexpr uint8_t SET_IN_PROGRESS = 1;
constexpr uint8_t SET_COMMIT_WRITE = 2; // Optional
@@ -136,3 +138,4 @@ void commitNetworkChanges();
* @param[in] channel: channel number.
*/
void applyChanges(int channel);
+constexpr uint16_t maxValidVLANIDValue = 4095;
OpenPOWER on IntegriCloud