aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fw-addr-lists.rsc8
-rw-r--r--global-functions.rsc31
-rw-r--r--mod/ipcalc.rsc23
3 files changed, 52 insertions, 10 deletions
diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc
index 26e041a..c85cc8b 100644
--- a/fw-addr-lists.rsc
+++ b/fw-addr-lists.rsc
@@ -26,8 +26,8 @@
:global LogPrint;
:global LogPrintOnce;
:global LogPrintVerbose;
- :global MIN;
:global NetMask4;
+ :global NetMask6;
:global ScriptLock;
:global WaitFullyConnected;
@@ -130,13 +130,13 @@
}
:if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={
:local Net $Address;
- :local Cidr 64;
+ :local CIDR 128;
:local Slash [ :find $Address "/" ];
:if ([ :typeof $Slash ] = "num") do={
:set Net [ :toip6 [ :pick $Address 0 $Slash ] ]
- :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ];
+ :set CIDR [ :pick $Address ($Slash + 1) [ :len $Address ] ];
}
- :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr);
+ :set Address (([ :toip6 $Net ] & [ $NetMask6 $CIDR ]) . "/" . $CIDR);
:set Branch [ $GetBranch $Address ];
:set ($IPv6Addresses->$Branch->$Address) $TimeOut;
:error true;
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 ({});
diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc
index fecf6f2..d65d472 100644
--- a/mod/ipcalc.rsc
+++ b/mod/ipcalc.rsc
@@ -36,21 +36,32 @@
:local Input [ :tostr $1 ];
:global NetMask4;
+ :global NetMask6;
- :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ];
+ :local Address [ :pick $Input 0 [ :find $Input "/" ] ];
:local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ];
- :local Mask [ $NetMask4 $Bits ];
+ :local Mask;
+ :local One;
+ :if ([ :typeof [ :toip $Address ] ] = "ip") do={
+ :set Address [ :toip $Address ];
+ :set Mask [ $NetMask4 $Bits ];
+ :set One 0.0.0.1;
+ } else={
+ :set Address [ :toip6 $Address ];
+ :set Mask [ $NetMask6 $Bits ];
+ :set One ::1;
+ }
- :local Return {
+ :local Return ({
"address"=$Address;
"netmask"=$Mask;
"networkaddress"=($Address & $Mask);
"networkbits"=$Bits;
"network"=(($Address & $Mask) . "/" . $Bits);
- "hostmin"=(($Address & $Mask) | 0.0.0.1);
- "hostmax"=(($Address | ~$Mask) ^ 0.0.0.1);
+ "hostmin"=(($Address & $Mask) | $One);
+ "hostmax"=(($Address | ~$Mask) ^ $One);
"broadcast"=($Address | ~$Mask);
- }
+ });
:return $Return;
}