diff options
-rw-r--r-- | transporthandler.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/transporthandler.cpp b/transporthandler.cpp index d7eef14..e112668 100644 --- a/transporthandler.cpp +++ b/transporthandler.cpp @@ -1497,17 +1497,30 @@ RspType<> setLan(uint4_t channelBits, uint4_t, uint8_t parameter, } case LanParam::VLANId: { - uint16_t vlanData; - if (req.unpack(vlanData) != 0 || !req.fullyUnpacked()) + uint12_t vlanData = 0; + uint3_t reserved = 0; + bool vlanEnable = 0; + + if (req.unpack(vlanData) || req.unpack(reserved) || + req.unpack(vlanEnable) || !req.fullyUnpacked()) { return responseReqDataLenInvalid(); } - if ((vlanData & VLAN_ENABLE_FLAG) == 0) + + if (reserved) + { + return responseInvalidFieldRequest(); + } + + uint16_t vlan = static_cast<uint16_t>(vlanData); + + if (!vlanEnable) { - lastDisabledVlan[channel] = vlanData & VLAN_VALUE_MASK; - vlanData = 0; + lastDisabledVlan[channel] = vlan; + vlan = 0; } - channelCall<reconfigureVLAN>(channel, vlanData & VLAN_VALUE_MASK); + channelCall<reconfigureVLAN>(channel, vlan); + return responseSuccess(); } case LanParam::CiphersuiteSupport: |