From 08f5d3220a03dc7fd00d63a9c307513a19afabce Mon Sep 17 00:00:00 2001 From: Hizenberg Date: Sat, 29 Jun 2024 23:36:13 +0530 Subject: [PATCH] ipmath done --- .gitignore | 5 + Networking-Concepts/CMakeLists.txt | 12 ++ Networking-Concepts/ip_math/CMakeLists.txt | 13 ++ Networking-Concepts/ip_math/ip_math.c | 182 +++++++++++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 .gitignore create mode 100644 Networking-Concepts/CMakeLists.txt create mode 100644 Networking-Concepts/ip_math/CMakeLists.txt create mode 100644 Networking-Concepts/ip_math/ip_math.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f218f66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*vsidx +*.opendb +.vs +out +CMakePresets.json \ No newline at end of file diff --git a/Networking-Concepts/CMakeLists.txt b/Networking-Concepts/CMakeLists.txt new file mode 100644 index 0000000..7f89807 --- /dev/null +++ b/Networking-Concepts/CMakeLists.txt @@ -0,0 +1,12 @@ +# CMakeList.txt : CMake project for Networking-Concepts, include source and define +# project specific logic here. +# +cmake_minimum_required (VERSION 3.8) + +project(Networking_Concept VERSION 1.0.0 LANGUAGES C CXX) + +set(CMAKE_C_STANDARD 17) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS OFF) + +add_subdirectory(ip_math) diff --git a/Networking-Concepts/ip_math/CMakeLists.txt b/Networking-Concepts/ip_math/CMakeLists.txt new file mode 100644 index 0000000..4312789 --- /dev/null +++ b/Networking-Concepts/ip_math/CMakeLists.txt @@ -0,0 +1,13 @@ +set(IPMATH_SRC "ip_math.c") + +set(IPMATH_EXE "ipMath") + +add_executable(${IPMATH_EXE} + ${IPMATH_SRC}) + + +#Linking library +set(MATH_LIB m) + +target_link_libraries(${IPMATH_EXE} PUBLIC + ${MATH_LIB}) \ No newline at end of file diff --git a/Networking-Concepts/ip_math/ip_math.c b/Networking-Concepts/ip_math/ip_math.c new file mode 100644 index 0000000..a6f92db --- /dev/null +++ b/Networking-Concepts/ip_math/ip_math.c @@ -0,0 +1,182 @@ +#include +#include +#include +#include + +#define PREFIX_LEN 15 /* Max IPv4 len in A.B.C.D format */ +#define MAX_MASK_LEN 32 /* MASK Maximum value */ +#define COMPLEMENT(num) (num = num ^ 0xFFFFFFFF) +#define SET_BIT(val, pos) (val = val | (1 << pos)) + +unsigned int get_network_mask(char mask) { + + unsigned int network_mask = 0x00000000; + unsigned char pos = 31; + while (mask) { + SET_BIT(network_mask, pos); + --mask, --pos; + } + return network_mask; + +} + +void get_abcd_ip_format(unsigned int ip_addr, char* output_buffer) { + + sprintf(output_buffer, "%d.%d.%d.%d", + ((ip_addr & 0xFF000000) >> 24), + ((ip_addr & 0xFF0000) >> 16), + ((ip_addr & 0xFF00) >> 8), + (ip_addr & 0xFF)); + +} + +unsigned int get_ip_integer_equivalent(char* address) { + + unsigned char ipbytes[4]; + + sscanf(address, "%hhu.%hhu.%hhu.%hhu", ipbytes + 3, + ipbytes + 2, + ipbytes + 1, + ipbytes); + + return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24; + +} + +void get_network_id(char* ip_addr, char mask, char* output_buffer) { + + unsigned int network_mask = get_network_mask(mask); + unsigned int network_ip = get_ip_integer_equivalent(ip_addr); + unsigned int network_id = network_ip & network_mask; + + get_abcd_ip_format(network_id, output_buffer); + +} + +void get_broadcast_address(char* ip_addr, char mask, char* output_buffer) { + + unsigned int network_mask = get_network_mask(mask); + unsigned int network_ip = get_ip_integer_equivalent(ip_addr); + unsigned int network_id = network_ip & network_mask; + unsigned int broadcast_addr = network_id | COMPLEMENT(network_mask); + + get_abcd_ip_format(broadcast_addr, output_buffer); + +} + +unsigned int get_subnet_cardinality(char mask) { + + return (pow(2, MAX_MASK_LEN - mask) - 2); + +} + +/* +* Return 0: if true else return -1 +*/ +int check_ip_subnet_membership(char* network_id, char mask, char* check_ip) { + + unsigned int nw_ip = get_ip_integer_equivalent(network_id); + unsigned int ip = get_ip_integer_equivalent(check_ip); + unsigned network_mask = get_network_mask(mask); + unsigned int chk_ip_network = ip & network_mask; + + if (chk_ip_network == nw_ip) + return 0; + else + return -1; + +} + + +int main() { + + + /*Q1. Get broadcast address*/ + { + char output_buffer[PREFIX_LEN + 1] = { 0 }; + get_broadcast_address("192.168.1.2", 24, output_buffer); + if (strcmp("192.168.1.255", output_buffer)) { + error(-1, 0, "Broadcast address test1 failed"); + } + } + + + /*Q2. Get IP integer equivalent*/ + { + unsigned int ip = get_ip_integer_equivalent("192.168.1.2"); + if (!(ip == 0xC0A80102)) { + error(-1, 0, "Integer equivalent test1 failed"); + } + + ip = get_ip_integer_equivalent("10.11.12.13"); + if (!(ip == 0x0A0B0C0D)) { + error(-1, 0, "Integer equivalent test1 failed"); + } + printf("Get IP Integer equivalent test Passed\n"); + } + + + /*Q3. Get A.B.C.D IP Format*/ + { + char output_buffer[PREFIX_LEN + 1] = { 0 }; + get_abcd_ip_format(0xC0A80102, output_buffer); + if (strcmp(output_buffer, "192.168.1.2")) { + error(-1, 0, "Get A.B.C.D IP format test1 failed"); + } + + get_abcd_ip_format(0x0A0B0C0D, output_buffer); + if (strcmp(output_buffer, "10.11.12.13")) { + error(-1, 0, "Get A.B.C.D IP format test2 failed"); + } + printf("Get A.B.C.D ip format test passed\n"); + + } + + + /*Q4. Get network ID*/ + { + char output_buffer[PREFIX_LEN + 1] = { 0 }; + get_network_id("192.168.1.2", 24, output_buffer); + if (strcmp(output_buffer, "192.168.1.0")) { + error(-1, 0, "Get Network_ID test1 failed"); + } + + get_network_id("10.11.12.13", 16, output_buffer); + if (strcmp(output_buffer, "10.11.0.0")) { + error(-1, 0, "Get Network_ID test2 failed"); + } + printf("Get Network_ID Test passed\n"); + + } + + + /*Q5. Get subnet cardinality*/ + { + unsigned int cardinality = get_subnet_cardinality(24); + if (!(cardinality == 254)){ + error(-1, 0, "Subnet Cardinality Test1 failed"); + } + + cardinality = get_subnet_cardinality(30); + if (!(cardinality == 2)) { + error(-1, 0, "Subnet Cardinality Test2 failed"); + } + printf("Subnet cardinality test passed\n"); + } + + + /*Q6. Check IP Subnet Membership */ + { + if (check_ip_subnet_membership("192.168.1.0", 24, "192.168.1.10")) { + error(-1, 0, "IP Subnet Membership test1 failed"); + } + + if (check_ip_subnet_membership("172.1.0.0", 16, "172.1.1.10")) { + error(-1, 0, "IP Subnet Membership test1 failed"); + } + + printf("Check ip subnet membership test passed\n"); + } + + return 0; +} \ No newline at end of file