aboutsummaryrefslogtreecommitdiffstats
path: root/global-functions.rsc
diff options
context:
space:
mode:
Diffstat (limited to 'global-functions.rsc')
-rw-r--r--global-functions.rsc31
1 files changed, 31 insertions, 0 deletions
diff --git a/global-functions.rsc b/global-functions.rsc
index 5c98a20..5ede654 100644
--- a/global-functions.rsc
+++ b/global-functions.rsc
@@ -62,6 +62,7 @@
:global MIN;
:global MkDir;
:global NetMask4;
+:global NetMask6;
:global NotificationFunctions;
:global ParseDate;
:global ParseKeyValueStore;
@@ -998,6 +999,36 @@
:return ((255.255.255.255 << (32 - $CIDR)) & 255.255.255.255);
}
+# return an IPv6 netmask for CIDR
+:set NetMask6 do={
+ :local FuncName $0;
+ :local CIDR [ :tostr $1 ];
+
+ :global IfThenElse;
+ :global MAX;
+ :global MIN;
+
+ :global NetMask6Cache;
+
+ :if ([ :typeof ($NetMask6Cache->$CIDR) ] = "ip6") do={
+ :return ($NetMask6Cache->$CIDR);
+ }
+
+ :if ([ :typeof $NetMask6Cache ] = "nothing") do={
+ :set NetMask6Cache ({});
+ }
+
+ :local Mask "";
+ :for I from=0 to=7 do={
+ :set Mask ($Mask . \
+ [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - (16 * $I)) 0 ] 16 ] ])) ] . \
+ [ $IfThenElse ($I < 7) ":" ]);
+ }
+ :set Mask [ :toip6 $Mask ];
+ :set ($NetMask6Cache->$CIDR) $Mask;
+ :return $Mask;
+}
+
# prepare NotificationFunctions array
:if ([ :typeof $NotificationFunctions ] != "array") do={
:set NotificationFunctions ({});