]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/IPv4Address.hs
Added the most_sig_bit_different function to IPv4Address.
[hath.git] / src / IPv4Address.hs
index 6cfed3a7e9ecf54845254620c6b810d9ccc04a5f..31ad7bd43965a56f7d243ab932ddbb4dc79dac33 100644 (file)
@@ -1,95 +1,96 @@
-module IPv4Address where
+module IPv4Address
+( ipv4address_from_octets,
+  IPv4Address(None),
+  max_octet1,
+  max_octet2,
+  max_octet3,
+  max_octet4,
+  min_octet1,
+  min_octet2,
+  min_octet3,
+  min_octet4,
+  most_sig_bit_different,
+  octet1,
+  octet2,
+  octet3,
+  octet4
+)
+  where
 
-import Bit
+import qualified Bit as B
+import Maskbits
 import Octet
 
-type Maskbits = Int
+data IPv4Address = None | IPv4Address { octet1 :: Octet,
+                                        octet2 :: Octet,
+                                        octet3 :: Octet,
+                                        octet4 :: Octet }
+                 deriving (Eq)
 
-data IPv4Address = IPv4Address { octet1 :: Octet,
-                                 octet2 :: Octet,
-                                 octet3 :: Octet,
-                                 octet4 :: Octet }
-                 deriving (Eq, Show)
 
+instance Show IPv4Address where
+    show IPv4Address.None = "None"
+    show addr = concat [(show oct1) ++ ".",
+                        (show oct2) ++ ".",
+                        (show oct3) ++ ".",
+                        (show oct4)]
+        where
+          oct1 = (octet1 addr)
+          oct2 = (octet2 addr)
+          oct3 = (octet3 addr)
+          oct4 = (octet4 addr)
 
-default_ipv4address :: IPv4Address
-default_ipv4address = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet)
 
-
-ipv4address_from_string :: String -> IPv4Address
-ipv4address_from_string s
-    | length s < 32 = default_ipv4address
-    | otherwise = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 a8) (Octet a9 a10 a11 a12 a13 a14 a15 a16)(Octet a17 a18 a19 a20 a21 a22 a23 a24) (Octet a25 a26 a27 a28 a29 a30 a31 a32)
-    where
-      a1  = bit_from_char (s !! 0)
-      a2  = bit_from_char (s !! 1)
-      a3  = bit_from_char (s !! 2)
-      a4  = bit_from_char (s !! 3)
-      a5  = bit_from_char (s !! 4)
-      a6  = bit_from_char (s !! 5)
-      a7  = bit_from_char (s !! 6)
-      a8  = bit_from_char (s !! 7)
-      a9  = bit_from_char (s !! 8)
-      a10 = bit_from_char (s !! 9)
-      a11 = bit_from_char (s !! 10)
-      a12 = bit_from_char (s !! 11)
-      a13 = bit_from_char (s !! 12)
-      a14 = bit_from_char (s !! 13)
-      a15 = bit_from_char (s !! 14)
-      a16 = bit_from_char (s !! 15)
-      a17 = bit_from_char (s !! 16)
-      a18 = bit_from_char (s !! 17)
-      a19 = bit_from_char (s !! 18)
-      a20 = bit_from_char (s !! 19)
-      a21 = bit_from_char (s !! 20)
-      a22 = bit_from_char (s !! 21)
-      a23 = bit_from_char (s !! 22)
-      a24 = bit_from_char (s !! 23)
-      a25 = bit_from_char (s !! 24)
-      a26 = bit_from_char (s !! 25)
-      a27 = bit_from_char (s !! 26)
-      a28 = bit_from_char (s !! 27)
-      a29 = bit_from_char (s !! 28)
-      a30 = bit_from_char (s !! 29)
-      a31 = bit_from_char (s !! 30)
-      a32 = bit_from_char (s !! 31)
+-- We don't export our constructor so this function is the only
+-- way to construct an address from octets. As a result, we can
+-- return IPv4Address.None in response to being passed one of more
+-- Octet.None octets.
+ipv4address_from_octets :: Octet -> Octet -> Octet -> Octet -> IPv4Address
+ipv4address_from_octets oct1 oct2 oct3 oct4
+    | or [oct1 == Octet.None,
+          oct2 == Octet.None,
+          oct3 == Octet.None,
+          oct4 == Octet.None] = IPv4Address.None
+    | otherwise = IPv4Address oct1 oct2 oct3 oct4
 
 
 min_address :: IPv4Address -> Maskbits -> IPv4Address
+min_address IPv4Address.None _ = IPv4Address.None
+min_address _ Maskbits.None = IPv4Address.None
 min_address addr mask
-    | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
-    | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 Zero)
-    | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 Zero Zero)
-    | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 Zero Zero Zero)
-    | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 Zero Zero Zero Zero)
-    | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 Zero Zero Zero Zero Zero)
-    | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 Zero Zero Zero Zero Zero Zero)
-    | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 Zero Zero Zero Zero Zero Zero Zero)
-    | mask == 24 = IPv4Address oct1 oct2 oct3 (min_octet)
-    | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 Zero) (min_octet)
-    | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 Zero Zero) (min_octet)
-    | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 Zero Zero Zero) (min_octet)
-    | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 Zero Zero Zero Zero) (min_octet)
-    | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 Zero Zero Zero Zero Zero) (min_octet)
-    | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 Zero Zero Zero Zero Zero Zero) (min_octet)
-    | mask == 17 = IPv4Address oct1 oct2 (Octet a17 Zero Zero Zero Zero Zero Zero Zero) (min_octet)
-    | mask == 16 = IPv4Address oct1 oct2 (min_octet) (min_octet)
-    | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 Zero) (min_octet) (min_octet)
-    | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 Zero Zero) (min_octet) (min_octet)
-    | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 Zero Zero Zero) (min_octet) (min_octet)
-    | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 Zero Zero Zero Zero) (min_octet) (min_octet)
-    | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 Zero Zero Zero Zero Zero) (min_octet) (min_octet)
-    | mask == 10 = IPv4Address oct1 (Octet a9 a10 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet)
-    | mask == 9 = IPv4Address oct1 (Octet a9 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet)
-    | mask == 8 = IPv4Address oct1 (min_octet) (min_octet) (min_octet)
-    | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 Zero Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 3 = IPv4Address (Octet a1 a2 a3 Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 2 = IPv4Address (Octet a1 a2 Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 1 = IPv4Address (Octet a1 Zero Zero Zero Zero Zero Zero Zero) (min_octet) (min_octet) (min_octet)
-    | mask == 0 = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet)
+    | mask == ThirtyTwo = IPv4Address oct1 oct2 oct3 oct4
+    | mask == ThirtyOne = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 B.Zero)
+    | mask == Thirty = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 B.Zero B.Zero)
+    | mask == TwentyNine = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 B.Zero B.Zero B.Zero)
+    | mask == TwentyEight = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 B.Zero B.Zero B.Zero B.Zero)
+    | mask == TwentySeven = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 B.Zero B.Zero B.Zero B.Zero B.Zero)
+    | mask == TwentySix = IPv4Address oct1 oct2 oct3 (Octet a25 a26 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero)
+    | mask == TwentyFive = IPv4Address oct1 oct2 oct3 (Octet a25 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero)
+    | mask == TwentyFour = IPv4Address oct1 oct2 oct3 (min_octet)
+    | mask == TwentyThree = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 B.Zero) (min_octet)
+    | mask == TwentyTwo = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 B.Zero B.Zero) (min_octet)
+    | mask == TwentyOne = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 B.Zero B.Zero B.Zero) (min_octet)
+    | mask == Twenty = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 B.Zero B.Zero B.Zero B.Zero) (min_octet)
+    | mask == Nineteen = IPv4Address oct1 oct2 (Octet a17 a18 a19 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet)
+    | mask == Eighteen = IPv4Address oct1 oct2 (Octet a17 a18 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet)
+    | mask == Seventeen = IPv4Address oct1 oct2 (Octet a17 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet)
+    | mask == Sixteen = IPv4Address oct1 oct2 (min_octet) (min_octet)
+    | mask == Fifteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 B.Zero) (min_octet) (min_octet)
+    | mask == Fourteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Thirteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 B.Zero B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Twelve = IPv4Address oct1 (Octet a9 a10 a11 a12 B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Eleven = IPv4Address oct1 (Octet a9 a10 a11 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Ten = IPv4Address oct1 (Octet a9 a10 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Nine = IPv4Address oct1 (Octet a9 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet)
+    | mask == Eight = IPv4Address oct1 (min_octet) (min_octet) (min_octet)
+    | mask == Seven = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Six = IPv4Address (Octet a1 a2 a3 a4 a5 a6 B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Five = IPv4Address (Octet a1 a2 a3 a4 a5 B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Four = IPv4Address (Octet a1 a2 a3 a4 B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Three = IPv4Address (Octet a1 a2 a3 B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Two = IPv4Address (Octet a1 a2 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == One = IPv4Address (Octet a1 B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero B.Zero) (min_octet) (min_octet) (min_octet)
+    | mask == Zero = IPv4Address (min_octet) (min_octet) (min_octet) (min_octet)
     | otherwise = addr
     where
       a1  = (b1 oct1)
@@ -128,40 +129,42 @@ min_address addr mask
 
 
 max_address :: IPv4Address -> Maskbits -> IPv4Address
+max_address IPv4Address.None _ = IPv4Address.None
+max_address _ Maskbits.None = IPv4Address.None
 max_address addr mask
-    | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
-    | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 One)
-    | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 One One)
-    | mask == 29 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 One One One)
-    | mask == 28 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 One One One One)
-    | mask == 27 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 One One One One One)
-    | mask == 26 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 One One One One One One)
-    | mask == 25 = IPv4Address oct1 oct2 oct3 (Octet a25 One One One One One One One)
-    | mask == 24 = IPv4Address oct1 oct2 oct3 (max_octet)
-    | mask == 23 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 One) (max_octet)
-    | mask == 22 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 One One) (max_octet)
-    | mask == 21 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 One One One) (max_octet)
-    | mask == 20 = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 One One One One) (max_octet)
-    | mask == 19 = IPv4Address oct1 oct2 (Octet a17 a18 a19 One One One One One) (max_octet)
-    | mask == 18 = IPv4Address oct1 oct2 (Octet a17 a18 One One One One One One) (max_octet)
-    | mask == 17 = IPv4Address oct1 oct2 (Octet a17 One One One One One One One) (max_octet)
-    | mask == 16 = IPv4Address oct1 oct2 (max_octet) (max_octet)
-    | mask == 15 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 One) (max_octet) (max_octet)
-    | mask == 14 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 One One) (max_octet) (max_octet)
-    | mask == 13 = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 One One One) (max_octet) (max_octet)
-    | mask == 12 = IPv4Address oct1 (Octet a9 a10 a11 a12 One One One One) (max_octet) (max_octet)
-    | mask == 11 = IPv4Address oct1 (Octet a9 a10 a11 One One One One One) (max_octet) (max_octet)
-    | mask == 10 = IPv4Address oct1 (Octet a9 a10 One One One One One One) (max_octet) (max_octet)
-    | mask == 9 = IPv4Address oct1 (Octet a9 One One One One One One One) (max_octet) (max_octet)
-    | mask == 8 = IPv4Address oct1 (max_octet) (max_octet) (max_octet)
-    | mask == 7 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 One) (max_octet) (max_octet) (max_octet)
-    | mask == 6 = IPv4Address (Octet a1 a2 a3 a4 a5 a6 One One) (max_octet) (max_octet) (max_octet)
-    | mask == 5 = IPv4Address (Octet a1 a2 a3 a4 a5 One One One) (max_octet) (max_octet) (max_octet)
-    | mask == 4 = IPv4Address (Octet a1 a2 a3 a4 One One One One) (max_octet) (max_octet) (max_octet)
-    | mask == 3 = IPv4Address (Octet a1 a2 a3 One One One One One) (max_octet) (max_octet) (max_octet)
-    | mask == 2 = IPv4Address (Octet a1 a2 One One One One One One) (max_octet) (max_octet) (max_octet)
-    | mask == 1 = IPv4Address (Octet a1 One One One One One One One) (max_octet) (max_octet) (max_octet)
-    | mask == 0 = IPv4Address (max_octet) (max_octet) (max_octet) (max_octet)
+    | mask == ThirtyTwo = IPv4Address oct1 oct2 oct3 oct4
+    | mask == ThirtyOne = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 B.One)
+    | mask == Thirty = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 B.One B.One)
+    | mask == TwentyNine = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 B.One B.One B.One)
+    | mask == TwentyEight = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 B.One B.One B.One B.One)
+    | mask == TwentySeven = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 B.One B.One B.One B.One B.One)
+    | mask == TwentySix = IPv4Address oct1 oct2 oct3 (Octet a25 a26 B.One B.One B.One B.One B.One B.One)
+    | mask == TwentyFive = IPv4Address oct1 oct2 oct3 (Octet a25 B.One B.One B.One B.One B.One B.One B.One)
+    | mask == TwentyFour = IPv4Address oct1 oct2 oct3 (max_octet)
+    | mask == TwentyThree = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 a23 B.One) (max_octet)
+    | mask == TwentyTwo = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 a22 B.One B.One) (max_octet)
+    | mask == TwentyOne = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 a21 B.One B.One B.One) (max_octet)
+    | mask == Twenty = IPv4Address oct1 oct2 (Octet a17 a18 a19 a20 B.One B.One B.One B.One) (max_octet)
+    | mask == Nineteen = IPv4Address oct1 oct2 (Octet a17 a18 a19 B.One B.One B.One B.One B.One) (max_octet)
+    | mask == Eighteen = IPv4Address oct1 oct2 (Octet a17 a18 B.One B.One B.One B.One B.One B.One) (max_octet)
+    | mask == Seventeen = IPv4Address oct1 oct2 (Octet a17 B.One B.One B.One B.One B.One B.One B.One) (max_octet)
+    | mask == Sixteen = IPv4Address oct1 oct2 (max_octet) (max_octet)
+    | mask == Fifteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 a15 B.One) (max_octet) (max_octet)
+    | mask == Fourteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 a14 B.One B.One) (max_octet) (max_octet)
+    | mask == Thirteen = IPv4Address oct1 (Octet a9 a10 a11 a12 a13 B.One B.One B.One) (max_octet) (max_octet)
+    | mask == Twelve = IPv4Address oct1 (Octet a9 a10 a11 a12 B.One B.One B.One B.One) (max_octet) (max_octet)
+    | mask == Eleven = IPv4Address oct1 (Octet a9 a10 a11 B.One B.One B.One B.One B.One) (max_octet) (max_octet)
+    | mask == Ten = IPv4Address oct1 (Octet a9 a10 B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet)
+    | mask == Nine = IPv4Address oct1 (Octet a9 B.One B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet)
+    | mask == Eight = IPv4Address oct1 (max_octet) (max_octet) (max_octet)
+    | mask == Seven = IPv4Address (Octet a1 a2 a3 a4 a5 a6 a7 B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Six = IPv4Address (Octet a1 a2 a3 a4 a5 a6 B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Five = IPv4Address (Octet a1 a2 a3 a4 a5 B.One B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Four = IPv4Address (Octet a1 a2 a3 a4 B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Three = IPv4Address (Octet a1 a2 a3 B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Two = IPv4Address (Octet a1 a2 B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == One = IPv4Address (Octet a1 B.One B.One B.One B.One B.One B.One B.One) (max_octet) (max_octet) (max_octet)
+    | mask == Zero = IPv4Address (max_octet) (max_octet) (max_octet) (max_octet)
     | otherwise = addr
     where
       a1  = (b1 oct1)
@@ -222,3 +225,117 @@ max_octet3 addr mask = octet3 (max_address addr mask)
 
 max_octet4 :: IPv4Address -> Maskbits -> Octet
 max_octet4 addr mask = octet4 (max_address addr mask)
+
+
+-- Given two addresses, find the number of the most significant bit
+-- where they differ. If the addresses are the same, return
+-- Maskbits.Zero.
+most_sig_bit_different :: IPv4Address -> IPv4Address -> Maskbits
+most_sig_bit_different addr1 addr2
+  | addr1 == addr2 = Maskbits.Zero
+  | m1  /= n1  = Maskbits.One
+  | m2  /= n2  = Two
+  | m3  /= n3  = Three
+  | m4  /= n4  = Four
+  | m5  /= n5  = Five
+  | m6  /= n6  = Six
+  | m7  /= n7  = Seven
+  | m8  /= n8  = Eight
+  | m9  /= n9  = Nine
+  | m10 /= n10 = Ten
+  | m11 /= n11 = Eleven
+  | m12 /= n12 = Twelve
+  | m13 /= n13 = Thirteen
+  | m14 /= n14 = Fourteen
+  | m15 /= n15 = Fifteen
+  | m16 /= n16 = Sixteen
+  | m17 /= n17 = Seventeen
+  | m18 /= n18 = Eighteen
+  | m19 /= n19 = Nineteen
+  | m20 /= n20 = Twenty
+  | m21 /= n21 = TwentyOne
+  | m22 /= n22 = TwentyTwo
+  | m23 /= n23 = TwentyThree
+  | m24 /= n24 = TwentyFour
+  | m25 /= n25 = TwentyFive
+  | m26 /= n26 = TwentySix
+  | m27 /= n27 = TwentySeven
+  | m28 /= n28 = TwentyEight
+  | m29 /= n29 = TwentyNine
+  | m30 /= n30 = Thirty
+  | m31 /= n31 = ThirtyOne
+  | m32 /= n32 = ThirtyTwo
+  | otherwise  = Maskbits.Zero
+  where
+    m1  = (b1 oct1a)
+    m2  = (b2 oct1a)
+    m3  = (b3 oct1a)
+    m4  = (b4 oct1a)
+    m5  = (b5 oct1a)
+    m6  = (b6 oct1a)
+    m7  = (b7 oct1a)
+    m8  = (b8 oct1a)
+    m9  = (b1 oct2a)
+    m10 = (b2 oct2a)
+    m11 = (b3 oct2a)
+    m12 = (b4 oct2a)
+    m13 = (b5 oct2a)
+    m14 = (b6 oct2a)
+    m15 = (b7 oct2a)
+    m16 = (b8 oct2a)
+    m17 = (b1 oct3a)
+    m18 = (b2 oct3a)
+    m19 = (b3 oct3a)
+    m20 = (b4 oct3a)
+    m21 = (b5 oct3a)
+    m22 = (b6 oct3a)
+    m23 = (b7 oct3a)
+    m24 = (b8 oct3a)
+    m25 = (b1 oct4a)
+    m26 = (b2 oct4a)
+    m27 = (b3 oct4a)
+    m28 = (b4 oct4a)
+    m29 = (b5 oct4a)
+    m30 = (b6 oct4a)
+    m31 = (b7 oct4a)
+    m32 = (b8 oct4a)
+    oct1a = (octet1 addr1)
+    oct2a = (octet2 addr1)
+    oct3a = (octet3 addr1)
+    oct4a = (octet4 addr1)
+    n1  = (b1 oct1b)
+    n2  = (b2 oct1b)
+    n3  = (b3 oct1b)
+    n4  = (b4 oct1b)
+    n5  = (b5 oct1b)
+    n6  = (b6 oct1b)
+    n7  = (b7 oct1b)
+    n8  = (b8 oct1b)
+    n9  = (b1 oct2b)
+    n10 = (b2 oct2b)
+    n11 = (b3 oct2b)
+    n12 = (b4 oct2b)
+    n13 = (b5 oct2b)
+    n14 = (b6 oct2b)
+    n15 = (b7 oct2b)
+    n16 = (b8 oct2b)
+    n17 = (b1 oct3b)
+    n18 = (b2 oct3b)
+    n19 = (b3 oct3b)
+    n20 = (b4 oct3b)
+    n21 = (b5 oct3b)
+    n22 = (b6 oct3b)
+    n23 = (b7 oct3b)
+    n24 = (b8 oct3b)
+    n25 = (b1 oct4b)
+    n26 = (b2 oct4b)
+    n27 = (b3 oct4b)
+    n28 = (b4 oct4b)
+    n29 = (b5 oct4b)
+    n30 = (b6 oct4b)
+    n31 = (b7 oct4b)
+    n32 = (b8 oct4b)
+    oct1b = (octet1 addr2)
+    oct2b = (octet2 addr2)
+    oct3b = (octet3 addr2)
+    oct4b = (octet4 addr2)