diff options
author | Nagaraju Goruganti <ngorugan@in.ibm.com> | 2017-10-03 08:43:08 -0500 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2017-10-11 23:16:31 +0000 |
commit | 66b974d2d679ece3aa67032bbc13ac166702cede (patch) | |
tree | 4c31f2c253a8b2d289aad27970a31e0a13611d03 /ethernet_interface.cpp | |
parent | c9645fe5c874930445bca6ba51ac9daee916c99b (diff) | |
download | phosphor-networkd-66b974d2d679ece3aa67032bbc13ac166702cede.tar.gz phosphor-networkd-66b974d2d679ece3aa67032bbc13ac166702cede.zip |
IP Address use case validation
-validates IPAddress/gateway using inet_pton api.
-validates prefix length for ipv4/ipv6.
-if dhcp is enabled, it won't allow to set ip/gateway.
Resolves openbmc/openbmc#1671
Change-Id: I76c1d9d11dfb59002eb1310d87e94ee622714a4a
Signed-off-by: Nagaraju Goruganti <ngorugan@in.ibm.com>
Diffstat (limited to 'ethernet_interface.cpp')
-rw-r--r-- | ethernet_interface.cpp | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/ethernet_interface.cpp b/ethernet_interface.cpp index ffaac74..5a7c61c 100644 --- a/ethernet_interface.cpp +++ b/ethernet_interface.cpp @@ -33,6 +33,7 @@ namespace network using namespace phosphor::logging; using namespace sdbusplus::xyz::openbmc_project::Common::Error; +using Argument = xyz::openbmc_project::Common::InvalidArgument; EthernetInterface::EthernetInterface(sdbusplus::bus::bus& bus, const std::string& objPath, @@ -78,7 +79,7 @@ void EthernetInterface::createIPAddressObjects() { origin = IP::AddressOrigin::DHCP; } - else if (isLinkLocal(addr.ipaddress)) + else if (isLinkLocalIP(addr.ipaddress)) { origin = IP::AddressOrigin::LinkLocal; } @@ -113,12 +114,42 @@ void EthernetInterface::iP(IP::Protocol protType, if (dHCPEnabled()) { log<level::INFO>("DHCP enabled on the interface"), - entry("INTERFACE=%s",interfaceName().c_str()); - return; + entry("INTERFACE=%s", interfaceName().c_str()); + dHCPEnabled(false); } + IP::AddressOrigin origin = IP::AddressOrigin::Static; + int addressFamily = (protType == IP::Protocol::IPv4) ? AF_INET : AF_INET6; + + if (!isValidIP(addressFamily, ipaddress)) + { + log<level::ERR>("Not a valid IP address"), + entry("ADDRESS=%s", ipaddress.c_str()); + elog<InvalidArgument>(Argument::ARGUMENT_NAME("ipaddress"), + Argument::ARGUMENT_VALUE(ipaddress.c_str())); + } + + if (!gateway.empty() && (!isValidIP(addressFamily, gateway))) + { + log<level::ERR>("Not a valid Gateway"), + entry("GATEWAY=%s", gateway.c_str()); + elog<InvalidArgument>(Argument::ARGUMENT_NAME("gateway"), + Argument::ARGUMENT_VALUE(gateway.c_str())); + } + + if (!isValidPrefix(addressFamily, prefixLength)) + { + log<level::ERR>("PrefixLength is not correct "), + entry("PREFIXLENGTH=%d", gateway.c_str()); + elog<InvalidArgument>(Argument::ARGUMENT_NAME("prefixLength"), + Argument::ARGUMENT_VALUE(std::to_string( + prefixLength).c_str())); + return; + } + + std::string objectPath = generateObjectPath(protType, ipaddress, prefixLength, |