diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_ethernet_interface.cpp b/src/ibm/hypervisor-network-mgr-src/hyp_ethernet_interface.cpp index b4171e3e7..da8dfa66e 100644 --- a/src/ibm/hypervisor-network-mgr-src/hyp_ethernet_interface.cpp +++ b/src/ibm/hypervisor-network-mgr-src/hyp_ethernet_interface.cpp @@ -495,33 +495,57 @@ ObjectPath HypEthInterface::ip(HypIP::Protocol protType, std::string ipaddress, HypIP::AddressOrigin origin = HypIP::AddressOrigin::Static; - if (!isValidIP(AF_INET, ipaddress) && !isValidIP(AF_INET6, ipaddress)) + InAddrAny addr; + try { - log("Not a valid IP address"), - entry("ADDRESS=%s", ipaddress.c_str()); - elog(Argument::ARGUMENT_NAME("Address"), - Argument::ARGUMENT_VALUE(ipaddress.c_str())); - return sdbusplus::message::details::string_path_wrapper(); + switch (protType) + { + case HypIP::Protocol::IPv4: + addr = ToAddr{}(ipaddress); + break; + case HypIP::Protocol::IPv6: + addr = ToAddr{}(ipaddress); + break; + default: + throw std::logic_error("Exhausted protocols"); + } } - - if (!isValidIP(AF_INET, gateway) && !isValidIP(AF_INET6, gateway)) + catch (const std::exception& e) { - log("Not a valid gateway"), - entry("ADDRESS=%s", gateway.c_str()); - elog(Argument::ARGUMENT_NAME("Gateway"), + auto msg = fmt::format("Invalid IP `{}`: {}\n", ipaddress, e.what()); + log(msg.c_str(), entry("ADDRESS=%s", ipaddress.c_str())); + elog(Argument::ARGUMENT_NAME("ipaddress"), Argument::ARGUMENT_VALUE(ipaddress.c_str())); - return sdbusplus::message::details::string_path_wrapper(); } - - if (!isValidPrefix(AF_INET, prefixLength) && - !isValidPrefix(AF_INET6, prefixLength)) + IfAddr ifaddr; + try + { + ifaddr = {addr, prefixLength}; + } + catch (const std::exception& e) { - log("Prefix length is not correct "), - entry("PREFIXLENGTH=%" PRIu8, prefixLength); + auto msg = fmt::format("Invalid prefix length `{}`: {}\n", prefixLength, + e.what()); + log(msg.c_str(), + entry("PREFIXLENGTH=%" PRIu8, prefixLength)); elog( Argument::ARGUMENT_NAME("prefixLength"), Argument::ARGUMENT_VALUE(std::to_string(prefixLength).c_str())); - return sdbusplus::message::details::string_path_wrapper(); + } + + try + { + if (!gateway.empty()) + { + gateway = std::to_string(ToAddr{}(gateway)); + } + } + catch (const std::exception& e) + { + auto msg = fmt::format("Invalid v4 GW `{}`: {}", gateway, e.what()); + log(msg.c_str(), entry("GATEWAY=%s", gateway.c_str())); + elog(Argument::ARGUMENT_NAME("GATEWAY"), + Argument::ARGUMENT_VALUE(gateway.c_str())); } const std::string intfLabel = getIntfLabel(); diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.cpp b/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.cpp index c9ea1bd0c..3508ddf52 100644 --- a/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.cpp +++ b/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.cpp @@ -206,6 +206,29 @@ void HypIPAddress::resetBaseBiosTableAttrs() updateBaseBiosTable(mapDbusToBiosAttr("prefixLength"), 0); } +InAddrAny HypIPAddress::getIpAddress(std::string ip) +{ + try + { + switch (HypIP::type()) + { + case HypIP::Protocol::IPv4: + return ToAddr{}(HypIP::address()); + case HypIP::Protocol::IPv6: + return ToAddr{}(HypIP::address()); + default: + throw std::logic_error("Exhausted protocols"); + } + } + catch (const std::exception& e) + { + auto msg = fmt::format("Invalid IP `{}`: {}\n", ip, e.what()); + log(msg.c_str(), entry("ADDRESS=%s", ip.c_str())); + elog(Argument::ARGUMENT_NAME("ipaddress"), + Argument::ARGUMENT_VALUE(ip.c_str())); + } +} + std::string HypIPAddress::address(std::string ipAddress) { std::string ip = HypIP::address(); @@ -214,14 +237,7 @@ std::string HypIPAddress::address(std::string ipAddress) return ip; } - int addressFamily = - (HypIP::type() == HypIP::Protocol::IPv4) ? AF_INET : AF_INET6; - if (!isValidIP(addressFamily, ipAddress)) - { - log("Not a valid IP address"), - entry("ADDRESS=%s", ipAddress.c_str()); - elog(NotAllowedArgument::REASON("Invalid Ip")); - } + InAddrAny addr = getIpAddress(ipAddress); ipAddress = HypIP::address(ipAddress); @@ -251,14 +267,23 @@ uint8_t HypIPAddress::prefixLength(uint8_t value) { return length; } - int addressFamily = - (HypIP::type() == HypIP::Protocol::IPv4) ? AF_INET : AF_INET6; - if (!isValidPrefix(addressFamily, value)) + + InAddrAny addr = getIpAddress(HypIP::address()); + IfAddr ifaddr; + try { - log("PrefixLength is not correct "), - entry("PREFIXLENGTH=%" PRIu8, value); - elog(NotAllowedArgument::REASON("Invalid Prefixlength")); + ifaddr = {addr, value}; } + catch (const std::exception& e) + { + auto msg = + fmt::format("Invalid prefix length `{}`: {}\n", value, e.what()); + log(msg.c_str(), entry("PREFIXLENGTH=%" PRIu8, value)); + elog( + Argument::ARGUMENT_NAME("prefixLength"), + Argument::ARGUMENT_VALUE(std::to_string(value).c_str())); + } + value = HypIP::prefixLength(value); // update parent biosTableAttrs @@ -286,13 +311,20 @@ std::string HypIPAddress::gateway(std::string gateway) // value is already existing return gw; } - int addressFamily = - (HypIP::type() == IP::Protocol::IPv4) ? AF_INET : AF_INET6; - if (!isValidIP(addressFamily, gateway)) + + try + { + if (!gateway.empty()) + { + gateway = std::to_string(ToAddr{}(gateway)); + } + } + catch (const std::exception& e) { - log("Not a valid gateway"), - entry("ADDRESS=%s", gateway.c_str()); - elog(NotAllowedArgument::REASON("Invalid Gateway")); + auto msg = fmt::format("Invalid v4 GW `{}`: {}", gateway, e.what()); + log(msg.c_str(), entry("GATEWAY=%s", gateway.c_str())); + elog(Argument::ARGUMENT_NAME("GATEWAY"), + Argument::ARGUMENT_VALUE(gateway.c_str())); } gateway = HypIP::gateway(gateway); diff --git a/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.hpp b/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.hpp index 3a4c6bb56..12e667a22 100644 --- a/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.hpp +++ b/src/ibm/hypervisor-network-mgr-src/hyp_ip_interface.hpp @@ -120,6 +120,12 @@ class HypIPAddress : public HypIPIfaces */ bool enabled(bool value) override; + /** @brief Method to convert ip address to InAddrAny type + * @param[in] ip - ip address of type string + * @returns ip address of type InAddrAny + */ + InAddrAny getIpAddress(std::string ip); + using HypEnableIntf::enabled; using HypIP::address; diff --git a/test/ibm/hypervisor-network-mgr-test/mock_hyp_ethernet_interface.hpp b/test/ibm/hypervisor-network-mgr-test/mock_hyp_ethernet_interface.hpp index 783d8cbfa..aceecd435 100644 --- a/test/ibm/hypervisor-network-mgr-test/mock_hyp_ethernet_interface.hpp +++ b/test/ibm/hypervisor-network-mgr-test/mock_hyp_ethernet_interface.hpp @@ -53,22 +53,48 @@ class MockHypEthernetInterface : public HypEthInterface HypIP::AddressOrigin origin = HypIP::AddressOrigin::Static; - if (!isValidIP(AF_INET, ipaddress) && !isValidIP(AF_INET6, ipaddress)) + InAddrAny addr; + try { - // Not a valid IP address - return false; + switch (protType) + { + case HypIP::Protocol::IPv4: + addr = ToAddr{}(ipaddress); + break; + case HypIP::Protocol::IPv6: + addr = ToAddr{}(ipaddress); + break; + default: + return false; + } + } + catch (const std::exception& e) + { + // Invalid ip address } - if (!isValidIP(AF_INET, gateway) && !isValidIP(AF_INET6, gateway)) + IfAddr ifaddr; + try + { + ifaddr = {addr, prefixLength}; + } + catch (const std::exception& e) { - // Not a valid gateway + // Invalid prefix length return false; } - if (!isValidPrefix(AF_INET, prefixLength) && - !isValidPrefix(AF_INET6, prefixLength)) + std::string gw; + try + { + if (!gateway.empty()) + { + gw = std::to_string(ToAddr{}(gateway)); + } + } + catch (const std::exception& e) { - // PrefixLength is not correct + // Invalid gateway return false; } @@ -89,7 +115,7 @@ class MockHypEthernetInterface : public HypEthInterface addrs[intfLabel] = std::make_unique( bus, (objPath).c_str(), *this, protType, ipaddress, origin, - prefixLength, gateway, "if0"); + prefixLength, gw, "if0"); return true; }