working commit
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
void network4(const char* network, int prefix) {
|
||||||
|
struct in_addr inaddr;
|
||||||
|
// Convert from human view to network bytes
|
||||||
|
if (inet_pton(AF_INET, network, &inaddr) == 0) {
|
||||||
|
printf("Invalid IP address\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Convert from network bytes to local
|
||||||
|
uint32_t ip = ntohl(inaddr.s_addr);
|
||||||
|
|
||||||
|
// Calculate mask and net
|
||||||
|
uint32_t mask = (prefix == 0) ? 0 : (~0U << (32 - prefix));
|
||||||
|
uint32_t net = ip & mask;
|
||||||
|
uint32_t fip = net + 1;
|
||||||
|
|
||||||
|
// Convert net address bytes to network order
|
||||||
|
struct in_addr net_addr;
|
||||||
|
net_addr.s_addr = htonl(net);
|
||||||
|
// Convert mask bytes to network order
|
||||||
|
struct in_addr mask_addr;
|
||||||
|
mask_addr.s_addr = htonl(mask);
|
||||||
|
// Convert mask bytes to network order
|
||||||
|
struct in_addr fip_addr;
|
||||||
|
fip_addr.s_addr = htonl(fip);
|
||||||
|
|
||||||
|
printf("IP: %s/%d\n", network, prefix);
|
||||||
|
printf("Netmask: %s\n", inet_ntoa(mask_addr));
|
||||||
|
printf("Network: %s\n", inet_ntoa(net_addr));
|
||||||
|
printf("First: %s\n", inet_ntoa(fip_addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
network4("192.168.1.154", 26);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
#include <format>
|
||||||
|
#include <expected>
|
||||||
|
#include <string>
|
||||||
|
#include <ostream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
std::expected<std::string, std::string> network6(std::string network, int prefix) {
|
||||||
|
struct in6_addr addr;
|
||||||
|
unsigned char mask[16] = {0};
|
||||||
|
if (inet_pton(AF_INET6, network.data(), &addr) != 1) {
|
||||||
|
return std::unexpected(std::format("Invalid network address {}", network));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < prefix; i++) {
|
||||||
|
mask[i / 8] |= (1 << (7 - (i % 8)));
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
addr.s6_addr[i] &= mask[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t *host_part = (uint64_t *)&addr.s6_addr[8];
|
||||||
|
uint64_t hostnum = be64toh(*host_part);
|
||||||
|
hostnum += 2;
|
||||||
|
*host_part = htobe64(hostnum);
|
||||||
|
|
||||||
|
char buffer[INET6_ADDRSTRLEN] = {'\0'};
|
||||||
|
inet_ntop(AF_INET6, &addr, buffer, INET6_ADDRSTRLEN);
|
||||||
|
|
||||||
|
return std::string(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::expected<std::string, std::string> network4(std::string network, int prefix) {
|
||||||
|
struct in_addr inaddr;
|
||||||
|
if (inet_pton(AF_INET, network.data(), &inaddr) != 1) {
|
||||||
|
return std::unexpected(std::format("Invalid network address {}", network));
|
||||||
|
}
|
||||||
|
uint32_t ip = ntohl(inaddr.s_addr);
|
||||||
|
uint32_t mask = (prefix == 0) ? 0 : (~0U << (32 - prefix));
|
||||||
|
uint32_t fip = (ip & mask) + 1;
|
||||||
|
struct in_addr ip_addr;
|
||||||
|
ip_addr.s_addr = htonl(ip);
|
||||||
|
|
||||||
|
return std::string(inet_ntoa(ip_addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
auto net4Res = network4("192.168.1.154", 26);
|
||||||
|
if (!net4Res) {
|
||||||
|
std::cerr << net4Res.error() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::cout << net4Res.value() << std::endl;
|
||||||
|
|
||||||
|
auto net6Res = network6("2001:db8:abcd:1234::0", 64);
|
||||||
|
if (!net6Res) {
|
||||||
|
std::cerr << net6Res.error() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::cout << net6Res.value() << std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ std::expected<void, std::string> Router::AddRoute(std::string address, uint64_t
|
|||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
sin = (struct sockaddr_in*)&rt.rt_dst;
|
sin = (struct sockaddr_in*)&rt.rt_dst;
|
||||||
sin->sin_family = AF_INET;
|
sin->sin_family = AF_INET;
|
||||||
if (inet_pton(AF_INET, address.data(), &sin->sin_addr) != 1){
|
if (inet_pton(AF_INET, address.data(), &sin->sin_addr) != 1) {
|
||||||
int errnoCopy = errno;
|
int errnoCopy = errno;
|
||||||
std::string error = std::strerror(errnoCopy);
|
std::string error = std::strerror(errnoCopy);
|
||||||
return std::unexpected(std::format("Incorrect address {}, error: {}", address, error));
|
return std::unexpected(std::format("Incorrect address {}, error: {}", address, error));
|
||||||
|
|||||||
Reference in New Issue
Block a user