#include "suricata-common.h"
#include "util-cidr.h"
+#include "util-unittest.h"
/** \brief turn 32 bit mask into CIDR
* \retval cidr cidr value or -1 if the netmask can't be expressed as cidr
*/
+
+#if (defined(__s390__) || defined(__s390x__) || defined(__zarch__))
+
+int CIDRFromMask(uint32_t netmask)
+{
+ netmask = ntohl(netmask);
+ if (netmask == 0) {
+ return 0;
+ }
+ int p = 0;
+ bool seen_1 = false;
+ while (netmask > 0) {
+ if (netmask & 1) {
+ seen_1 = true;
+ p++;
+ } else {
+ if (seen_1) {
+ return -1;
+ }
+ }
+ netmask >>= 1;
+ }
+ return p;
+}
+
+#else
+
int CIDRFromMask(uint32_t netmask)
{
if (netmask == 0) {
return lead_1;
}
+#endif
+
uint32_t CIDRGet(int cidr)
{
if (cidr <= 0 || cidr > 32)
in6->s6_addr[i] = in6->s6_addr[i] >> 1;
}
}
+
+#ifdef UNITTESTS
+
+static int CIDRFromMaskTest01(void)
+{
+ struct in_addr in;
+ int v = inet_pton(AF_INET, "255.255.255.0", &in);
+
+ FAIL_IF(v <= 0);
+ FAIL_IF_NOT(24 == CIDRFromMask(in.s_addr));
+
+ PASS;
+}
+
+static int CIDRFromMaskTest02(void)
+{
+ struct in_addr in;
+ int v = inet_pton(AF_INET, "255.255.0.42", &in);
+
+ FAIL_IF(v <= 0);
+ FAIL_IF_NOT(-1 == CIDRFromMask(in.s_addr));
+
+ PASS;
+}
+
+static int CIDRFromMaskTest03(void)
+{
+ struct in_addr in;
+ int v = inet_pton(AF_INET, "0.0.0.0", &in);
+
+ FAIL_IF(v <= 0);
+ FAIL_IF_NOT(0 == CIDRFromMask(in.s_addr));
+
+ PASS;
+}
+
+static int CIDRFromMaskTest04(void)
+{
+ struct in_addr in;
+ int v = inet_pton(AF_INET, "255.255.255.255", &in);
+
+ FAIL_IF(v <= 0);
+ FAIL_IF_NOT(32 == CIDRFromMask(in.s_addr));
+
+ PASS;
+}
+
+#endif /* UNITTESTS */
+
+void UtilCIDRTests(void)
+{
+#ifdef UNITTESTS
+ UtRegisterTest("CIDRFromMaskTest01", CIDRFromMaskTest01);
+ UtRegisterTest("CIDRFromMaskTest02", CIDRFromMaskTest02);
+ UtRegisterTest("CIDRFromMaskTest03", CIDRFromMaskTest03);
+ UtRegisterTest("CIDRFromMaskTest04", CIDRFromMaskTest04);
+#endif /* UNITTESTS */
+}