Add IPv6 support

Split IPv4 and IPv6 calculations into different JS files to make them easier to understand.

IDE decided to format HTML code and I left it as-is.
This commit is contained in:
Yehuda Katz 2021-12-08 00:13:30 -05:00
parent 8329d4add7
commit 5088bbe600
No known key found for this signature in database
GPG Key ID: 6AFEF232927278DD
5 changed files with 750 additions and 513 deletions

44
calculations.js Normal file
View File

@ -0,0 +1,44 @@
function inet_ntoa(mode, addrint) {
var fn = "inet_ntoa_" + mode;
return window[fn](addrint);
}
function inet_aton(mode, addrint) {
var fn = "inet_aton_" + mode;
return window[fn](addrint);
}
function network_address(mode, addrint) {
var fn = "network_address_" + mode;
return window[fn](addrint);
}
function subnet_addresses(mode, addrint) {
var fn = "subnet_addresses_" + mode;
return window[fn](addrint);
}
function subnet_first_address_useable(mode, addrint) {
var fn = "subnet_first_address_useable_" + mode;
return window[fn](addrint);
}
function subnet_last_address_useable(mode, addrint) {
var fn = "subnet_last_address_useable_" + mode;
return window[fn](addrint);
}
function subnet_last_address(mode, subnet, mask) {
var fn = "subnet_last_address_" + mode;
return window[fn](mode, subnet, mask);
}
function subnet_netmask(mode, addrint) {
var fn = "subnet_netmask_" + mode;
return window[fn](addrint);
}
function num_hosts(mode, useableFirst, useableLast) {
var fn = "num_hosts_" + mode;
return window[fn](useableFirst, useableLast);
}

60
calculations_4.js Normal file
View File

@ -0,0 +1,60 @@
function inet_ntoa_4(addrint) {
return (
((addrint >> 24) & 0xff) +
"." +
((addrint >> 16) & 0xff) +
"." +
((addrint >> 8) & 0xff) +
"." +
(addrint & 0xff)
);
};
function inet_aton_4(addrstr) {
var re = /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/;
var res = re.exec(addrstr);
if (res === null) {
return null;
}
for (var i = 1; i <= 4; i++) {
if (res[i] < 0 || res[i] > 255) {
return null;
}
}
return (res[1] << 24) | (res[2] << 16) | (res[3] << 8) | res[4];
}
function network_address_4(ip, mask) {
var maskbits = 0;
for (var i = 31 - mask; i >= 0; i--) {
ip &= ~1 << i;
}
return ip;
}
function subnet_addresses_4(mask) {
return 1 << (32 - mask);
}
function subnet_first_address_useable_4(addrint) {
return addrint + 1;
}
function subnet_last_address_useable_4(addrint) {
return addrint - 1;
}
function subnet_last_address_4(mode, subnet, mask) {
return subnet + subnet_addresses(mode, mask) - 1;
}
function subnet_netmask_4(mask) {
return network_address(4, 0xffffffff, mask);
}
function num_hosts_4(useableFirst, useableLast) {
return 1 + useableLast - useableFirst;
}

79
calculations_6.js Normal file
View File

@ -0,0 +1,79 @@
function inet_ntoa_6(addrint) {
return "" +
((addrint >> 112n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 96n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 80n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 64n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 48n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 32n) & BigInt(0xffff)).toString(16) +
":" +
((addrint >> 16n) & BigInt(0xffff)).toString(16) +
":" +
(addrint & BigInt(0xffff)).toString(16);
}
function inet_aton_6(addrstr) {
var re =
/^([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})\:([0-9a-f]{1,4})$/;
var res = re.exec(addrstr);
if (res === null) {
return null;
}
for (var i = 1; i <= 8; i++) {
if (res[i] < 0 || res[i] > 0xffff) {
return null;
}
}
var r1 = BigInt(parseInt(res[1], 16)) << 112n;
var r2 = BigInt(parseInt(res[2], 16)) << 96n;
var r3 = BigInt(parseInt(res[3], 16)) << 80n;
var r4 = BigInt(parseInt(res[4], 16)) << 64n;
var r5 = BigInt(parseInt(res[5], 16)) << 48n;
var r6 = BigInt(parseInt(res[6], 16)) << 32n;
var r7 = BigInt(parseInt(res[7], 16)) << 16n;
var r8 = BigInt(parseInt(res[8], 16));
var rt = r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8;
return rt;
}
function network_address_6(ip, mask) {
var maskbits = 0;
for (var i = 128 - mask; i >= 0; i--) {
ip &= ~1 << i;
}
return ip;
}
function subnet_addresses_6(mask) {
return 1n << (128n - BigInt(mask));
}
function subnet_first_address_useable_6(addrint) {
return addrint + 1n;
}
function subnet_last_address_useable_6(addrint) {
return addrint - 1n;
}
function subnet_last_address_6(mode, subnet, mask) {
return subnet + subnet_addresses(mode, mask) - 1n;
}
function subnet_netmask_6(mask) {
return undefined;
}
function num_hosts_6(useableFirst, useableLast) {
return 1n + useableLast - useableFirst;
}

View File

@ -1,5 +1,5 @@
<?
for ($i=0;$i<=32; $i++) {
<?php
for ($i=0;$i<=128; $i++) {
$str = '/'.$i;
$font = 2;

File diff suppressed because it is too large Load Diff