IPv6/IPv4 conversion
authorStefan Vogel <sv@exept.de>
Tue, 16 Jul 2013 09:34:26 +0200
changeset 3058 d7ca7f4c7d77
parent 3057 ac2356ba61ca
child 3059 8be3c1e8dc05
IPv6/IPv4 conversion
IPv6SocketAddress.st
--- a/IPv6SocketAddress.st	Tue Jul 16 09:34:25 2013 +0200
+++ b/IPv6SocketAddress.st	Tue Jul 16 09:34:26 2013 +0200
@@ -207,6 +207,27 @@
     ^ self unsignedLongAt:25 bigEndian:false.
 ! !
 
+!IPv6SocketAddress methodsFor:'converting'!
+
+asIPv4SocketAddress
+    "convert a IPv4 addresse mapped to IPv6 into real IPv4 IPSocketAddress"
+
+    self isMappedIPv4 ifFalse:[
+        ConversionError raiseErrorString:'Trying to convert a non-mappable IPv6 address'.
+    ].
+
+    ^ IPSocketAddress hostAddress:(self copyFrom:21 to:24) port:self port.
+
+    "
+        (self addressString:'0:0:0:0:0:ffff::') asIPv4SocketAddress
+        (IPSocketAddress localHost port:80) asIPv6SocketAddress asIPv4SocketAddress
+    "
+!
+
+asIPv6SocketAddress
+    ^ self
+! !
+
 !IPv6SocketAddress methodsFor:'printing & storing'!
 
 printAddressOn:aStream
@@ -316,6 +337,17 @@
     "
 !
 
+isMappedIPv4
+    "answer true, if this is a mapped IPv4 address"
+
+    ^ (self at:9) == 0 
+        and:[self sameContentsFrom:9 to:20 as:#[0 0 0 0 0 0 0 0 0 0 16rff 16rff] startingAt:1]
+
+    "
+        (self addressString:'0:0:0:0:0:ffff::') isMappedIPv4
+    "
+!
+
 isMulticast
     "answer true, if this address is a multicast address ff::/8"
 
@@ -332,10 +364,10 @@
 !IPv6SocketAddress class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/IPv6SocketAddress.st,v 1.17 2013-07-11 15:02:10 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/IPv6SocketAddress.st,v 1.18 2013-07-16 07:34:26 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic2/IPv6SocketAddress.st,v 1.17 2013-07-11 15:02:10 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/IPv6SocketAddress.st,v 1.18 2013-07-16 07:34:26 stefan Exp $'
 ! !