From 36676a1604de8b5868d4d9b154342a8349b50035 Mon Sep 17 00:00:00 2001 From: Maciej Date: Sat, 26 Mar 2022 10:35:52 +0100 Subject: [PATCH] AK: Add IPv4Address::netmask_from_cidr --- AK/IPv4Address.h | 7 +++++++ Tests/AK/TestIPv4Address.cpp | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/AK/IPv4Address.h b/AK/IPv4Address.h index 8f72f8d3a0..d52996a9c9 100644 --- a/AK/IPv4Address.h +++ b/AK/IPv4Address.h @@ -119,6 +119,13 @@ public: return IPv4Address(a, b, c, d); } + static constexpr IPv4Address netmask_from_cidr(int cidr) + { + VERIFY(cidr >= 0 && cidr <= 32); + u32 value = 0xffffffffull << (32 - cidr); + return IPv4Address((value & 0xff000000) >> 24, (value & 0xff0000) >> 16, (value & 0xff00) >> 8, (value & 0xff)); + } + constexpr in_addr_t to_in_addr_t() const { return m_data; } constexpr u32 to_u32() const { return m_data; } diff --git a/Tests/AK/TestIPv4Address.cpp b/Tests/AK/TestIPv4Address.cpp index 4f3055ebd4..094b1a7253 100644 --- a/Tests/AK/TestIPv4Address.cpp +++ b/Tests/AK/TestIPv4Address.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, the SerenityOS developers. + * Copyright (c) 2020-2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ @@ -151,3 +151,16 @@ TEST_CASE(should_compare) EXPECT(addr_a != addr_b); EXPECT(addr_a == addr_a); } + +TEST_CASE(netmask_from_cidr) +{ + EXPECT(IPv4Address::netmask_from_cidr(24) == IPv4Address(255, 255, 255, 0)); + + EXPECT(IPv4Address::netmask_from_cidr(0) == IPv4Address(0, 0, 0, 0)); + EXPECT(IPv4Address::netmask_from_cidr(32) == IPv4Address(255, 255, 255, 255)); + + EXPECT(IPv4Address::netmask_from_cidr(28) == IPv4Address(255, 255, 255, 240)); + EXPECT(IPv4Address::netmask_from_cidr(22) == IPv4Address(255, 255, 252, 0)); + EXPECT(IPv4Address::netmask_from_cidr(14) == IPv4Address(255, 252, 0, 0)); + EXPECT(IPv4Address::netmask_from_cidr(6) == IPv4Address(252, 0, 0, 0)); +}