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>
diff --git a/util.cpp b/util.cpp
index 48b5fcb..31bdd65 100644
--- a/util.cpp
+++ b/util.cpp
@@ -202,12 +202,39 @@
return networkString;
}
-bool isLinkLocal(const std::string& address)
+bool isLinkLocalIP(const std::string& address)
{
- std::string linklocal = "fe80";
- return std::mismatch(linklocal.begin(), linklocal.end(),
- address.begin()).first == linklocal.end() ?
- true : false;
+ return address.find(IPV4_PREFIX) == 0 || address.find(IPV6_PREFIX) == 0;
+}
+
+bool isValidIP(int addressFamily, const std::string& address)
+{
+ unsigned char buf[sizeof(struct in6_addr)];
+
+ return inet_pton(addressFamily, address.c_str(), buf) > 0;
+}
+
+bool isValidPrefix(int addressFamily, uint8_t prefixLength)
+{
+ if (addressFamily == AF_INET)
+ {
+ if (prefixLength < IPV4_MIN_PREFIX_LENGTH ||
+ prefixLength > IPV4_MAX_PREFIX_LENGTH)
+ {
+ return false;
+ }
+ }
+
+ if (addressFamily == AF_INET6)
+ {
+ if (prefixLength < IPV4_MIN_PREFIX_LENGTH ||
+ prefixLength > IPV6_MAX_PREFIX_LENGTH)
+ {
+ return false;
+ }
+ }
+
+ return true;
}
IntfAddrMap getInterfaceAddrs()