@chainsafe/netmask
Version:
Typescript implementation of netmask filtering
85 lines • 2.03 kB
JavaScript
import { IPv4Len, IPv6Len } from "./ip.js";
export function allFF(a, from, to) {
let i = 0;
for (const e of a) {
if (i < from)
continue;
if (i > to)
break;
if (e !== 0xff)
return false;
i++;
}
return true;
}
export function deepEqual(a, b, from, to) {
let i = 0;
for (const e of a) {
if (i < from)
continue;
if (i > to)
break;
if (e !== b[i])
return false;
i++;
}
return true;
}
/***
* Returns long ip format
*/
export function ipToString(ip) {
switch (ip.length) {
case IPv4Len: {
return ip.join(".");
}
case IPv6Len: {
const result = [];
for (let i = 0; i < ip.length; i++) {
if (i % 2 === 0) {
result.push(ip[i].toString(16).padStart(2, "0") +
ip[i + 1].toString(16).padStart(2, "0"));
}
}
return result.join(":");
}
default: {
throw new Error("Invalid ip length");
}
}
}
/**
* If mask is a sequence of 1 bits followed by 0 bits, return number of 1 bits else -1
*/
export function simpleMaskLength(mask) {
let ones = 0;
// eslint-disable-next-line prefer-const
for (let [index, byte] of mask.entries()) {
if (byte === 0xff) {
ones += 8;
continue;
}
while ((byte & 0x80) != 0) {
ones++;
byte = byte << 1;
}
if ((byte & 0x80) != 0) {
return -1;
}
for (let i = index + 1; i < mask.length; i++) {
if (mask[i] != 0) {
return -1;
}
}
break;
}
return ones;
}
export function maskToHex(mask) {
let hex = "0x";
for (const byte of mask) {
hex += (byte >> 4).toString(16) + (byte & 0x0f).toString(16);
}
return hex;
}
//# sourceMappingURL=util.js.map