<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AIP%2Fdoc</id>
	<title>Module:IP/doc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AIP%2Fdoc"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:IP/doc&amp;action=history"/>
	<updated>2026-06-07T03:40:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:IP/doc&amp;diff=136509&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: change source to syntaxhighlight</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:IP/doc&amp;diff=136509&amp;oldid=prev"/>
		<updated>2020-07-07T13:25:10Z</updated>

		<summary type="html">&lt;p&gt;change source to syntaxhighlight&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Module rating|protected}}&lt;br /&gt;
{{used in system}}&lt;br /&gt;
Module:IP is a library for working with IP addresses and subnets. It can handle both [[IPv4]] and [[IPv6]]. The library exports four classes, [[#IPAddress|IPAddress]], [[#Subnet|Subnet]], [[#IPv4Collection|IPv4Collection]], and [[#IPv6Collection|IPv6Collection]].&lt;br /&gt;
&lt;br /&gt;
== Loading the library ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local IP = require(&amp;#039;Module:IP&amp;#039;)&lt;br /&gt;
local IPAddress = IP.IPAddress&lt;br /&gt;
local Subnet = IP.Subnet&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IPAddress ==&lt;br /&gt;
&lt;br /&gt;
The IPAddress class is used to work with single IP addresses. To create a new IPAddress object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local ipAddress = IPAddress.new(ipString)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ipString variable can be a valid IPv4 or IPv6 address.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local ipv4Address = IPAddress.new(&amp;#039;1.2.3.4&amp;#039;)&lt;br /&gt;
local ipv6Address = IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPAddress objects can be compared with relational operators:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Equality&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) == IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) -- true&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) == IPAddress.new(&amp;#039;1.2.3.5&amp;#039;) -- false&lt;br /&gt;
&lt;br /&gt;
-- Less than / greater than&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) &amp;lt; IPAddress.new(&amp;#039;1.2.3.5&amp;#039;)  -- true&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) &amp;gt; IPAddress.new(&amp;#039;1.2.3.5&amp;#039;)  -- false&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) &amp;lt;= IPAddress.new(&amp;#039;1.2.3.5&amp;#039;) -- true&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) &amp;lt;= IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use tostring on them (this is equivalent to using [[#getIP|getIP]]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
tostring(IPAddress.new(&amp;#039;1.2.3.4&amp;#039;))                -- &amp;quot;1.2.3.4&amp;quot;&lt;br /&gt;
tostring(IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;)) -- &amp;quot;2001:db8::ff00:12:3456&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Expanded IPv6 addresses are abbreviated:&lt;br /&gt;
tostring(IPAddress.new(&amp;#039;2001:db8:0:0:0:0:0:0&amp;#039;))   -- &amp;quot;2001:db8::&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also concatenate them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) .. &amp;#039; foo&amp;#039;                   -- &amp;quot;1.2.3.4 foo&amp;quot;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;) .. IPAddress.new(&amp;#039;5.6.7.8&amp;#039;) -- &amp;quot;1.2.3.45.6.7.8&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPAddress objects have several methods, outlined below.&lt;br /&gt;
&lt;br /&gt;
=== getIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:getIP()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a string representation of the IP address. IPv6 addresses are abbreviated if possible.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):getIP()                -- &amp;quot;1.2.3.4&amp;quot;&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):getIP() -- &amp;quot;2001:db8::ff00:12:3456&amp;quot;&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8:0:0:0:0:0:0&amp;#039;):getIP()   -- &amp;quot;2001:db8::&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getVersion ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:getVersion()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the version of the IP protocol being used. This is &amp;quot;IPv4&amp;quot; for IPv4 addresses, and &amp;quot;IPv6&amp;quot; for IPv6 addresses.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):getVersion()                -- &amp;quot;IPv4&amp;quot;&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):getVersion() -- &amp;quot;IPv6&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== isIPv4 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:isIPv4()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the IP address is an IPv4 address, and false otherwise.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):isIPv4()                -- true&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):isIPv4() -- false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== isIPv6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:isIPv6()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the IP address is an IPv6 address, and false otherwise.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):isIPv6()                -- false&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):isIPv6() -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== isInSubnet ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:isInSubnet(subnet)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the IP address is in the subnet &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt;, and false otherwise. &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt; may be a [[#Subnet|Subnet object]] or a [[CIDR]] string.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):isInSubnet(&amp;#039;1.2.3.0/24&amp;#039;)                             -- true&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):isInSubnet(&amp;#039;1.2.4.0/24&amp;#039;)                             -- false&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):isInSubnet(Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;))                 -- true&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):isInSubnet(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;) -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getSubnet ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:getSubnet(bitLength)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a Subnet object for the subnet with a bit length of &amp;lt;var&amp;gt;bitLength&amp;lt;/var&amp;gt; which contains the current IP. The &amp;lt;var&amp;gt;bitLength&amp;lt;/var&amp;gt; parameter must be an integer between 0 and 32 for IPv4 addresses, or an integer between 0 and 128 for IPv6 addresses.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):getSubnet(24) -- Equivalent to Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getNextIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:getNextIP()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a new IPAddress object equivalent to the current IP address incremented by one. The IPv4 address &amp;quot;255.255.255.255&amp;quot; rolls around to &amp;quot;0.0.0.0&amp;quot;, and the IPv6 address &amp;quot;ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff&amp;quot; rolls around to &amp;quot;::&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):getNextIP()                -- Equivalent to IPAddress.new(&amp;#039;1.2.3.5&amp;#039;)&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):getNextIP() -- Equivalent to IPAddress.new(&amp;#039;2001:db8::ff00:12:3457&amp;#039;)&lt;br /&gt;
IPAddress.new(&amp;#039;255.255.255.255&amp;#039;):getNextIP()        -- Equivalent to IPAddress.new(&amp;#039;0.0.0.0&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getPreviousIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ipAddress:getPreviousIP()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a new IPAddress object equivalent to the current IP address decremented by one. The IPv4 address &amp;quot;0.0.0.0&amp;quot; rolls around to &amp;quot;255.255.255.255&amp;quot;, and the IPv6 address &amp;quot;::&amp;quot; rolls around to &amp;quot;ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
IPAddress.new(&amp;#039;1.2.3.4&amp;#039;):getPreviousIP()                -- Equivalent to IPAddress.new(&amp;#039;1.2.3.3&amp;#039;)&lt;br /&gt;
IPAddress.new(&amp;#039;2001:db8::ff00:12:3456&amp;#039;):getPreviousIP() -- Equivalent to IPAddress.new(&amp;#039;2001:db8::ff00:12:3455&amp;#039;)&lt;br /&gt;
IPAddress.new(&amp;#039;0.0.0.0&amp;#039;):getPreviousIP()                -- Equivalent to IPAddress.new(&amp;#039;255.255.255.255&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Subnet ==&lt;br /&gt;
&lt;br /&gt;
The Subnet class is used to work with [[subnetwork]]s of IPv4 or IPv6 addresses. To create a new Subnet object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local subnet = Subnet.new(cidrString)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;var&amp;gt;cidrString&amp;lt;/var&amp;gt; must be a valid IPv4 or IPv6 [[CIDR]] string.&lt;br /&gt;
&lt;br /&gt;
Subnet objects can be compared for equality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;) == Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;)                           -- true&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;) == Subnet.new(&amp;#039;1.2.3.0/25&amp;#039;)                           -- false&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;) == Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;)              -- false&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;) == Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;) -- true&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8:0:0:0:0:0:0/112&amp;#039;) == Subnet.new(&amp;#039;2001:db8::/112&amp;#039;)         -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use tostring on them (this is equivalent to [[#getCIDR|getCIDR]]):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
tostring(Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;))               -- &amp;quot;1.2.3.0/24&amp;quot;&lt;br /&gt;
tostring(Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;))  -- &amp;quot;2001:db8::ff00:12:0/112&amp;quot;&lt;br /&gt;
tostring(Subnet.new(&amp;#039;2001:db8:0:0:0:0:0:0/112&amp;#039;)) -- &amp;quot;2001:db8::/112&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also concatenate them:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;) .. &amp;#039; foo&amp;#039;                   -- &amp;quot;1.2.3.0/24 foo&amp;quot;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;) .. Subnet.new(&amp;#039;4.5.6.0/24&amp;#039;) -- &amp;quot;1.2.3.0/244.5.6.0/24&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subnet objects have several methods, outlined below.&lt;br /&gt;
&lt;br /&gt;
=== getPrefix ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:getPrefix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an IPAddress object for the lowest IP address in the subnet.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):getPrefix()              -- Equivalent to IPAddress.new(&amp;#039;1.2.3.0&amp;#039;)&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):getPrefix() -- Equivalent to IPAddress.new(&amp;#039;2001:db8::ff00:12:0&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getHighestIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:getHighestIP()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an IPAddress object for the highest IP address in the subnet.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):getHighestIP()              -- Equivalent to IPAddress.new(&amp;#039;1.2.3.255&amp;#039;)&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):getHighestIP() -- Equivalent to IPAddress.new(&amp;#039;2001:db8::ff00:12:ffff&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getBitLength ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:getBitLength()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the bit length of the subnet. This is an integer between 0 and 32 for IPv4 addresses, or an integer between 0 and 128 for IPv6 addresses.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):getBitLength()              -- 24&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):getBitLength() -- 112&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getCIDR ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:getCIDR()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a [[CIDR]] string representation of the subnet.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):getCIDR()               -- &amp;quot;1.2.3.0/24&amp;quot;&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):getCIDR()  -- &amp;quot;2001:db8::ff00:12:0/112&amp;quot;&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8:0:0:0:0:0:0/112&amp;#039;):getCIDR() -- &amp;quot;2001:db8::/112&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getVersion ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:getVersion()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the version of the IP protocol being used. This is &amp;quot;IPv4&amp;quot; for IPv4 addresses, and &amp;quot;IPv6&amp;quot; for IPv6 addresses.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):getVersion()              -- &amp;quot;IPv4&amp;quot;&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):getVersion() -- &amp;quot;IPv6&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== isIPv4 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:isIPv4()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the subnet is using IPv4, and false otherwise.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):isIPv4()              -- true&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):isIPv4() -- false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== isIPv6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:isIPv6()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the subnet is using IPv6, and false otherwise.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):isIPv6()              -- false&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):isIPv6() -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== containsIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:containsIP(ip)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the subnet contains the IP address &amp;lt;var&amp;gt;ip&amp;lt;/var&amp;gt;, and false otherwise. &amp;lt;var&amp;gt;ip&amp;lt;/var&amp;gt; can be an IP address string, or an IPAddress object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):containsIP(&amp;#039;1.2.3.4&amp;#039;)                             -- true&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):containsIP(&amp;#039;1.2.4.4&amp;#039;)                             -- false&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):containsIP(IPAddress.new(&amp;#039;1.2.3.4&amp;#039;))              -- true&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):containsIP(&amp;#039;2001:db8::ff00:12:3456&amp;#039;) -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== overlapsSubnet ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:overlapsSubnet(subnet)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the current subnet overlaps with &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt;, and false otherwise. &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt; can be a CIDR string or a subnet object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):overlapsSubnet(&amp;#039;1.2.0.0/16&amp;#039;)                         -- true&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):overlapsSubnet(&amp;#039;1.2.12.0/22&amp;#039;)                        -- false&lt;br /&gt;
Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;):overlapsSubnet(Subnet.new(&amp;#039;1.2.0.0/16&amp;#039;))             -- true&lt;br /&gt;
Subnet.new(&amp;#039;2001:db8::ff00:12:0/112&amp;#039;):overlapsSubnet(&amp;#039;2001:db8::ff00:0:0/96&amp;#039;) -- true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== walk ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
subnet:walk()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The walk method iterates over all of the IPAddress objects in the subnet.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
for ipAddress in Subnet.new(&amp;#039;192.168.0.0/30&amp;#039;):walk() do&lt;br /&gt;
	mw.log(tostring(ipAddress))&lt;br /&gt;
end&lt;br /&gt;
-- 192.168.0.0&lt;br /&gt;
-- 192.168.0.1&lt;br /&gt;
-- 192.168.0.2&lt;br /&gt;
-- 192.168.0.3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IPv4Collection ==&lt;br /&gt;
&lt;br /&gt;
The IPv4Collection class is used to work with several different IPv4 addresses and IPv4 subnets. To create a new IPv4Collection object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local collection = IPv4Collection.new()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPv4Collection objects have several methods, outlined below.&lt;br /&gt;
&lt;br /&gt;
=== getVersion ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:getVersion()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the string &amp;quot;IPv4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== addIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addIP(ip)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adds an IP to the collection. The IP can be either a string or an [[#IPAddress|IPAddress]] object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addIP(&amp;#039;1.2.3.4&amp;#039;)&lt;br /&gt;
collection:addIP(IPAddress.new(&amp;#039;1.2.3.4&amp;#039;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is chainable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addIP(&amp;#039;1.2.3.4&amp;#039;):addIP(&amp;#039;5.6.7.8&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== addSubnet ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addSubnet(subnet)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adds a subnet to the collection. The subnet can be either a [[CIDR]] string or a [[#Subnet|Subnet]] object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addSubnet(&amp;#039;1.2.3.0/24&amp;#039;)&lt;br /&gt;
collection:addSubnet(Subnet.new(&amp;#039;1.2.3.0/24&amp;#039;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is chainable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addSubnet(&amp;#039;1.2.0.0/24&amp;#039;):addSubnet(&amp;#039;1.2.1.0/24&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== addFromString ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addFromString(str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Extracts any IPv4 addresses and IPv4 CIDR subnets from &amp;lt;var&amp;gt;str&amp;lt;/var&amp;gt; and adds them to the collection. Any text that is not an IPv4 address or CIDR subnet is ignored.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addFromString(&amp;#039;Add some IPs and subnets: 1.2.3.4 1.2.3.5 2001:0::f foo 1.2.4.0/24&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is chainable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addFromString(&amp;#039;foo 1.2.3.4&amp;#039;):addFromString(&amp;#039;bar 5.6.7.8&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== containsIP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:containsIP(ip)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true if the collection contains the specified IP; otherwise returns false. The &amp;lt;var&amp;gt;ip&amp;lt;/var&amp;gt; parameter can be a string or an [[#IPAddress|IPAddress]] object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:containsIP(&amp;#039;1.2.3.4&amp;#039;)&lt;br /&gt;
collection:containsIP(IPAddress.new(&amp;#039;1.2.3.4&amp;#039;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== getRanges ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:getRanges()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns a sorted array of IP pairs equivalent to the collection. Each IP pair is an array representing a contiguous range of IP addresses from pair[1] to pair[2] inclusive. pair[1] and pair[2] are [[#IPAddress|IPAddress]] objects.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addSubnet(&amp;#039;1.2.0.0/24&amp;#039;)&lt;br /&gt;
collection:addSubnet(&amp;#039;1.2.1.0/24&amp;#039;)&lt;br /&gt;
collection:addSubnet(&amp;#039;1.2.10.0/24&amp;#039;)&lt;br /&gt;
mw.logObject(collection:getRanges())&lt;br /&gt;
-- Logs the following:&lt;br /&gt;
-- table#1 {&lt;br /&gt;
--   table#2 {&lt;br /&gt;
--     1.2.0.0,&lt;br /&gt;
--     1.2.1.255,&lt;br /&gt;
--   },&lt;br /&gt;
--   table#3 {&lt;br /&gt;
--     1.2.10.0,&lt;br /&gt;
--     1.2.10.255,&lt;br /&gt;
--   },&lt;br /&gt;
-- } &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== overlapsSubnet ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:overlapsSubnet(subnet)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns true, obj if &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt; overlaps this collection, where obj is the first [[#IPAddress|IPAddress]] or [[#Subnet|Subnet]] object overlapping the subnet. Otherwise, returns false. &amp;lt;var&amp;gt;subnet&amp;lt;/var&amp;gt; can be a CIDR string or a [[#Subnet|Subnet]] object.&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
collection:addIP(&amp;#039;1.2.3.4&amp;#039;)&lt;br /&gt;
collection:overlapsSubnet(&amp;#039;1.2.3.0/24&amp;#039;) -- true, IPAddress.new(&amp;#039;1.2.3.4&amp;#039;)&lt;br /&gt;
collection:overlapsSubnet(&amp;#039;1.2.4.0/24&amp;#039;) -- false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IPv6Collection ==&lt;br /&gt;
&lt;br /&gt;
The IPv6Collection class is used to work with several different IPv6 addresses and IPv6 subnets. IPv6Collection objects are directly analogous to [[#IPv4Collection|IPv4Collection]] objects: they contain the same methods and work the same way, but all IP addresses and subnets added to it must be IPv6, not IPv4.&lt;br /&gt;
&lt;br /&gt;
To create a new IPv6Collection object:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local collection = IPv6Collection.new()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|sandbox | |&lt;br /&gt;
&amp;lt;!-- Categories below this line, please; interwikis at Wikidata --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>