úÎŒí‡'2      !"#$%&'()*+,-./01None162IThe abstract data type to express an IPv6 address. To create this, use   . Or use 2  "2001:DB8::1" :: , for example. Also,  "2001:DB8::1"/ can be used as literal with OverloadedStrings.)read "2001:db8:00:00:00:00:00:01" :: IPv6 2001:db8::1$read "2001:db8:11e:c00::101" :: IPv62001:db8:11e:c00::101/read "2001:db8:11e:c00:aa:bb:192.0.2.1" :: IPv62001:db8:11e:c00:aa:bb:c000:201"read "2001:db8::192.0.2.1" :: IPv62001:db8::c000:201 read "0::ffff:192.0.2.1" :: IPv6::ffff:192.0.2.1read "0::0:c000:201" :: IPv6 ::192.0.2.1read "::0.0.0.1" :: IPv6::1IThe abstract data type to express an IPv4 address. To create this, use   . Or use 2  "192.0.2.1" :: , for example. Also,  "192.0.2.1"/ can be used as literal with OverloadedStrings.read "192.0.2.1" :: IPv4 192.0.2.1A unified IP data for  and 6. To create this, use the data constructors. Or use 2  "192.0.2.1" :: , for example. Also,  "192.0.2.1"/ can be used as literal with OverloadedStrings.;(read "192.0.2.1" :: IP) == IPv4 (read "192.0.2.1" :: IPv4)True](read "2001:db8:00:00:00:00:00:01" :: IP) == IPv6 (read "2001:db8:00:00:00:00:00:01" :: IPv6)True31Show an IPv4 address in the dot-decimal notation.4hShow an IPv6 address in the most appropriate notation, based on recommended representation proposed by  "http://tools.ietf.org/html/rfc5952RFC 5952.U/The implementation is completely compatible with the current implementation of the  inet_ntop function in glibc./ The   function takes a list of 5 and returns .toIPv4 [192,0,2,1] 192.0.2.1 The   function takes a list of 5 and returns .!toIPv6 [0x2001,0xDB8,0,0,0,0,0,1] 2001:db8::1 The   function takes a list of 5: where each member repserents a single byte and returns .4toIPv6b [0x20,0x01,0xD,0xB8,0,0,0,0,0,0,0,0,0,0,0,1] 2001:db8::1 The   function converts  to a list of 5.fromIPv4 (toIPv4 [192,0,2,1]) [192,0,2,1] The   function converts  to a list of 5.,fromIPv6 (toIPv6 [0x2001,0xDB8,0,0,0,0,0,1])[8193,3512,0,0,0,0,0,1]The  function converts  to a list of 5. where each member represents a single byte.@fromIPv6b (toIPv6b [0x20,0x01,0xD,0xB8,0,0,0,0,0,0,0,0,0,0,0,1])%[32,1,13,184,0,0,0,0,0,0,0,0,0,0,0,1]The  function converts 6 to .The  function converts  to 6.The  function converts 7 to .The  function converts  to 7.-Convert IPv4 address to IPv4-embedded-in-IPv68WEquality over IP addresses. Correctly compare IPv4 and IPv4-embedded-in-IPv6 addresses.V(read "2001:db8:00:00:00:00:00:01" :: IP) == (read "2001:db8:00:00:00:00:00:01" :: IP)TrueV(read "2001:db8:00:00:00:00:00:01" :: IP) == (read "2001:db8:00:00:00:00:00:05" :: IP)False4(read "127.0.0.1" :: IP) == (read "127.0.0.1" :: IP)True3(read "127.0.0.1" :: IP) == (read "10.0.0.1" :: IP)False;(read "::ffff:127.0.0.1" :: IP) == (read "127.0.0.1" :: IP)True;(read "::ffff:127.0.0.1" :: IP) == (read "127.0.0.9" :: IP)False;(read "::ffff:127.0.0.1" :: IP) >= (read "127.0.0.1" :: IP)True;(read "::ffff:127.0.0.1" :: IP) <= (read "127.0.0.1" :: IP)True(9:;<34 =>?@ABCDEFGHIJNone3KLMNOPQNone16;=B½¼The Addr range consists of an address, a contiguous mask, and mask length. The contiguous mask and the mask length are essentially same information but contained for pre calculation.To create this, use  makeAddrRange or 2 "192.0.2.0/24" ::   . Also, "192.0.2.0/24"/ can be used as literal with OverloadedStrings.%read "192.0.2.1/24" :: AddrRange IPv4 192.0.2.0/246read "2001:db8:00:00:00:00:00:01/48" :: AddrRange IPv6 2001:db8::/48The " function returns an address from .The  function returns a contiguous  mask from .The % function returns a mask length from .A unified data for   and  . To create this, use 2 "192.0.2.0/24" ::  . Also, "192.0.2.0/24"/ can be used as literal with OverloadedStrings.U(read "192.0.2.1/24" :: IPRange) == IPv4Range (read "192.0.2.0/24" :: AddrRange IPv4)Truew(read "2001:db8:00:00:00:00:00:01/48" :: IPRange) == IPv6Range (read "2001:db8:00:00:00:00:00:01/48" :: AddrRange IPv6)TrueRSTUVWXNone`'toIPv4 [127,0,2,1] `masked` intToMask 7 126.0.0.0The  function takes an 3 and a contiguous mask and returned a masked . The   function takes an 5¸ representing the number of bits to be set in the returned contiguous mask. When this integer is positive the bits will be starting from the MSB and from the LSB otherwise.intToMask 16 :: IPv4 255.255.0.0intToMask (-16) :: IPv4 0.0.255.255intToMask 16 :: IPv6ffff::intToMask (-16) :: IPv6::ffff!The >:> operator takes two  . It returns Y if the first  contains the second . Otherwise, it returns Z.FmakeAddrRange ("127.0.2.1" :: IPv4) 8 >:> makeAddrRange "127.0.2.1" 24TrueFmakeAddrRange ("127.0.2.1" :: IPv4) 24 >:> makeAddrRange "127.0.2.1" 8FalseKmakeAddrRange ("2001:DB8::1" :: IPv6) 16 >:> makeAddrRange "2001:DB8::1" 32TrueKmakeAddrRange ("2001:DB8::1" :: IPv6) 32 >:> makeAddrRange "2001:DB8::1" 16False"The  toMatchedTo function take an  address and an , and returns Y# if the range contains the address.@("127.0.2.0" :: IPv4) `isMatchedTo` makeAddrRange "127.0.2.1" 24True@("127.0.2.0" :: IPv4) `isMatchedTo` makeAddrRange "127.0.2.1" 32FalseD("2001:DB8::1" :: IPv6) `isMatchedTo` makeAddrRange "2001:DB8::1" 32TrueD("2001:DB8::" :: IPv6) `isMatchedTo` makeAddrRange "2001:DB8::1" 128False#The # functions takes an Y address and a mask length. It creates a bit mask from the mask length and masks the  address, then returns  made of them.$makeAddrRange (toIPv4 [127,0,2,1]) 8 127.0.0.0/83makeAddrRange (toIPv6 [0x2001,0xDB8,0,0,0,0,0,1]) 82000::/8$1Convert IPv4 range to IPV4-embedded-in-IPV6 range%The unmakeAddrRange functions take a 5 and returns the network address and a mask length./addrRangePair ("127.0.0.0/8" :: AddrRange IPv4) (127.0.0.0,8),addrRangePair ("2000::/8" :: AddrRange IPv6) (2000::,8) !"#$% None`h  None`è#  !"#$%#   #!"%$None6† &¤The Tree structure for IP routing table based on TRIE with one way branching removed. This is an abstract data type, so you cannot touch its inside. Please use + or - , instead.'!A class to contain IPv4 and IPv6.(The ( function takes 5 and returns an '* address whose only n-th bit is set.)The ) function takes an ' address and an test bit ' address and returns Y. is the bit is unset, otherwise returns Z.*The *, function returns an empty IP routing table.*(empty :: IPRTable IPv4 ()) == fromList []True+The +( function inserts a value with a key of  to & and returns a new &.P(insert ("127.0.0.1" :: AddrRange IPv4) () empty) == fromList [("127.0.0.1",())]True,The ,& function deletes a value by a key of  from & and returns a new &.Odelete "127.0.0.1" (insert "127.0.0.1" () empty) == (empty :: IPRTable IPv4 ())True-The - function looks up & with a key of  . If a routing information in &* matches the key, its value is returned.\let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]let rt = fromList $ zip v4 v4lookup "127.0.0.1" rtNothinglookup "133.3.0.1" rtNothinglookup "133.4.0.0" rtJust 133.4.0.0/16lookup "133.4.0.1" rtJust 133.4.0.0/16lookup "133.5.16.0" rtJust 133.5.16.0/24lookup "133.5.16.1" rtJust 133.5.16.0/24.The . function looks up & with a key of  . If a routing information in &4 matches the key, both key and value are returned.:set -XOverloadedStrings[let rt = fromList ([("192.168.0.0/24", 1), ("10.10.0.0/16", 2)] :: [(AddrRange IPv4, Int)])lookupKeyValue "127.0.0.1" rtNothinglookupKeyValue "192.168.0.1" rtJust (192.168.0.0/24,1)lookupKeyValue "10.10.0.1" rtJust (10.10.0.0/16,2)/The / function looks up & with a key of /. If the key matches routing informations in &, they are returned.\let v4 = ["133.4.0.0/16","133.5.0.0/16","133.5.16.0/24","133.5.23.0/24"] :: [AddrRange IPv4]&let rt = fromList $ zip v4 $ repeat ()4findMatch "133.4.0.0/15" rt :: [(AddrRange IPv4,())]K[(133.4.0.0/16,()),(133.5.0.0/16,()),(133.5.16.0/24,()),(133.5.23.0/24,())]0The 0D function creates a new IP routing table from a list of a pair of IPrange and value.1The 1& function creates a list of a pair of & and value from an IP routing table.&[\')(]^_`a*+bcde,f-.g/01h&[\'()None†Á &'()*+,-./01 '()&*+,-./01i        !"#$%&'()*+,-./0123456789:;<=>?@AB@ACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd=>e=>fghijklmnopqrstu$iproute-1.7.3-9lY0eFaak1892op1fkxUlgData.IP.InternalData.IPData.IP.RouteTable Data.IP.Addr Data.IP.Mask Data.IP.Range Data.IP.OpData.IP.RouteTable.InternalIPv6IP6IPv4IP4IPipv4ipv6toIPv4toIPv6toIPv6bfromIPv4fromIPv6 fromIPv6bfromHostAddress toHostAddressfromHostAddress6toHostAddress6 ipv4ToIPv6 AddrRangeaddrmaskmlenIPRange IPv4Range IPv6Range ipv4range ipv6rangeAddrmasked intToMask>:> isMatchedTo makeAddrRangeipv4RangeToIPv6 addrRangePairIPRTableRoutable intToTBitisZeroemptyinsertdeletelookuplookupKeyValue findMatchfromListtoListbase Text.ReadreadshowIPv4showIPv6ghc-prim GHC.TypesInt&network-2.6.3.2-Elf6Dxkfz0iKjb1zv5eBTPNetwork.Socket.Types HostAddress HostAddress6$fEqIPIPv6AddrIPv4Addr ip6ToInteger integerToIP6parseIP parseIPv4 parseIPv6digip4ip4' skipSpaceshexcolon2formatip6ip6' ip4Embedded fixByteOrdermaskIPv4maskIPv6shift128 shiftL128 shiftR128 fromIP6Addr toIP6Addr parseIPRangeparseIPv4RangeparseIPv6Rangeip4range maskedIPv4ip6range maskedIPv6TrueFalseNilNode intToTBitIPv4 intToTBitIPv6intToTBitsWord32intToTBitsIPv4intToTBitsIPv6linkglue keyToTestBitisLeftnodesearchfoldt