Network Working Group                                       P. Sarolahti
Internet-Draft                                                 HIIT/ICSI
Intended status: Experimental                              March 4, 2010
Expires: September 5, 2010


               Multi-address Interface in the Socket API
               draft-sarolahti-mptcp-af-multipath-01.txt

Abstract

   This document specifies a new address family to be used for sockets
   that are bound to more than one IP address, as motivated by the
   Multipath TCP work in the IETF.  The goal is to use the same set of
   function calls as traditionally, but by new address family make it
   possible for them to express multiple addresses to connect or bind
   to.  The document gives a high-level definition of the behavior of
   the traditional function calls, but a detailed specification of the
   API syntax is not in the scope of this document.

Status of this Memo

   This Internet-Draft is submitted to IETF in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF), its areas, and its working groups.  Note that
   other groups may also distribute working documents as Internet-
   Drafts.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   The list of current Internet-Drafts can be accessed at
   http://www.ietf.org/ietf/1id-abstracts.txt.

   The list of Internet-Draft Shadow Directories can be accessed at
   http://www.ietf.org/shadow.html.

   This Internet-Draft will expire on September 5, 2010.

Copyright Notice

   Copyright (c) 2010 IETF Trust and the persons identified as the
   document authors.  All rights reserved.




Sarolahti               Expires September 5, 2010               [Page 1]


Internet-Draft                AF-Multipath                    March 2010


   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the BSD License.


Table of Contents

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Terminology  . . . . . . . . . . . . . . . . . . . . . . . . .  4
   3.  The Multipath Address Family . . . . . . . . . . . . . . . . .  4
   4.  Behaviour with Different Networking Functions  . . . . . . . .  6
     4.1.  Bind . . . . . . . . . . . . . . . . . . . . . . . . . . .  6
     4.2.  Connect  . . . . . . . . . . . . . . . . . . . . . . . . .  6
     4.3.  Name resolution  . . . . . . . . . . . . . . . . . . . . .  7
     4.4.  Get Local Address / Get Remote Address . . . . . . . . . .  8
   5.  Discussion . . . . . . . . . . . . . . . . . . . . . . . . . .  8
     5.1.  Address Family or Protocol Family? . . . . . . . . . . . .  8
     5.2.  Comparison to Alternative Design Options . . . . . . . . .  9
     5.3.  Open Issues  . . . . . . . . . . . . . . . . . . . . . . . 10
   6.  Security Considerations  . . . . . . . . . . . . . . . . . . . 11
   7.  Acknowledgments  . . . . . . . . . . . . . . . . . . . . . . . 11
   8.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 11
     8.1.  Normative References . . . . . . . . . . . . . . . . . . . 11
     8.2.  Informative References . . . . . . . . . . . . . . . . . . 11
   Appendix A.  Change log  . . . . . . . . . . . . . . . . . . . . . 12
   Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 13



















Sarolahti               Expires September 5, 2010               [Page 2]


Internet-Draft                AF-Multipath                    March 2010


1.  Introduction

   The socket API is designed as a generic protocol-independent
   interface that includes a compact set of operations for network
   applications to communicate to the network.  Despite the small number
   of basic operations, the socket API has proved to be enough powerful
   to carry out various different kinds of tasks, arguably because of
   the generic enough interface definitions.  In addition to Internet
   communication, the socket API is also used, for example, in the Unix
   domain sockets that operate on Unix filenames as communication
   identifiers, and various control tasks between the applications and
   the communication stack, for example in IPsec key management sockets
   [RFC2367], or so called netlink or routing sockets that interact with
   the routing table in the network stack.  The exact semantics of the
   socket API methods are not defined by the API itself, but depend on
   the parameters given when a new socket is created.

   The socket API is designed to expose the addresses used for the
   communication to the applications.  Consistent with the generic
   design of the API, the addresses are passed in a generic type-length
   encoded structure, that is interpreted based on the address family
   given in the beginning of the structure.  In practice, primarily two
   address families are currently used for Internet communication: IPv4
   (also known as AF_INET) or IPv6 (AF_INET6).  Perhaps confusingly,
   traditionally the same constants used to indicate the address family
   are often also used to indicate the protocol family for creating
   socket.  This dependency is discussed in more detail in Section 5.1.

   This document proposes a new way to use the socket API to better
   support protocols that use multiple IP addresses at either end of a
   connection.  The primary motivation for this specification is the
   ongoing work on Multipath TCP (e.g., [I-D.ietf-mptcp-architecture],
   [I-D.ford-mptcp-multiaddressed]), but the same API can be used with
   any other protocol that runs multiple addresses on a single socket.
   One of the design goals in this specification is to enable support
   for multiple addresses in a socket without changing the binary
   function call API at the operation system interface, or the set of
   networking function calls available in the system.  This design also
   aims to maintain unchanged semantics with the previously familiar
   operations to the extent it is possible, while avoiding backwards
   compatibility issues by explicitly using a new address family.

   Using Multipath TCP with a traditional single-homed socket API can be
   problematic, as discussed in the API considerations document
   [I-D.scharf-mptcp-api].  The socket API was designed with an
   assumption that a socket is using just one address, with this address
   being explicitly visible to the applications.  When the API is used
   with a protocol that uses multiple addresses for communication,



Sarolahti               Expires September 5, 2010               [Page 3]


Internet-Draft                AF-Multipath                    March 2010


   defining the semantics of existing function calls that directly refer
   to one IP address becomes problematic, possibly making the existing
   applications behave defectively when using the legacy socket API with
   Multipath TCP.  While the motivation of Multipath TCP to operate on
   unmodified legacy APIs is well understandable, eventually a more
   expressive API is needed to better manage connections using multiple
   addresses at either end.

   This document specifies a new multipath-compatible address family to
   be used with the familiar socket operations, called AF_MULTIPATH.
   This address family is composed as a sequence of one or multiple
   elements that are each structured in the same way as one of the
   existing address families supported by the system, such as AF_INET or
   AF_INET6.  At the same time, this lets the application indicate if it
   supports the use of multiple addresses for the socket, for example
   using multipath TCP.  One advantage of the Multipath Address Family
   is that it supports using different address families, such as IPv4 or
   IPv6, in the same address set, thereby enabling dual-stack
   functionality between both IPv4 and IPv6 interfaces (although we note
   that IPv4 addresses can be expressed as a AF_INET6 structure).

   The AF_MULTIPATH address family could be used also with other
   protocols capable of multihoming, for example SCTP [RFC4960].  It may
   possibly be applicable also to shim-layer approaches to multihoming
   such as SHIM6 [RFC5533] or HIP [RFC5206], although these are based on
   a different philosophy of splitting locators (IP addresses) from the
   host identity.  Different API extensions for multihomed protocols
   have been specified (or are being worked on), for example one using a
   set of socket options [I-D.ietf-shim6-multihome-shim-api], and
   another extending the set of socket operations in the socket API
   [I-D.ietf-tsvwg-sctpsocket].  This document deliberately proposes a
   new approach as an alternative to these, and discusses the benefits
   and disadvantages of different approaches in Section 5.2


2.  Terminology

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in [RFC2119].


3.  The Multipath Address Family

   Multipath address family (AF_MULTIPATH) is composed of a sequence of
   addresses, each expressed using one of the existing address family
   formats supported in the system.  A desirable behavior would be that
   in a system that supports the multipath address family, opening a



Sarolahti               Expires September 5, 2010               [Page 4]


Internet-Draft                AF-Multipath                    March 2010


   socket using one of the traditional single-address families should be
   taken as an indication that multiple addresses should not be used for
   that socket.  However, to allow migration period for legacy
   applications that are not converted to use the new address family,
   but would benefit from multipath communication, an additional option
   switch may be needed to control the behavior on traditional single-
   address families.

   The address family is structured according to the generic sockaddress
   structure as follows.  The fields are given in network byte order.

   o  Length (8 bits)

   o  Address family (=AF_MULTIPATH) (8 bits)

   o  Number of addresses (8 bits)

   o  Address 1

   o  Address 2

   o  ....

   o  Address N

   Each of the address records above takes the generic sockaddress
   format, i.e.:

   o  Length (8 bits)

   o  Address family (8 bits)

   o  Address (...i.e., the rest of sockaddr structure as defined by the
      address family...)

   In a dynamic multipath connection the set of address fields can
   change over time: new addresses may be added and earlier addresses
   can be removed.  This characteristic, that the socket address content
   can change during a connection, differs from traditional behavior.
   However, this just reflects the changed behavior of multipath TCP
   compared to traditional TCP, which uses the same pair of addresses
   through the connection life cycle.

   In today's systems the address family is commonly either AF_INET or
   AF_INET6, although also other address families can exist.  Depending
   on the address family, the address would typically be structured as
   sockaddr_in or sockaddr_in6 structure, with the length set
   appropriately.  Different address families can be combined in a



Sarolahti               Expires September 5, 2010               [Page 5]


Internet-Draft                AF-Multipath                    March 2010


   single AF_MULTIPATH record.


4.  Behaviour with Different Networking Functions

   This section defines the intended behavior of commonly used network
   operations when used with AF_MULTIPATH address family.  The section
   gives a high-level definition of the operations to be applied as
   appropriate in different application environments.

4.1.  Bind

   An AF_MULTIPATH socket can bind to several addresses using a single
   call.  It is possible to use wildcard ("Any") address in some of
   entries of the address set.  Technically, multiple "Any" addresses
   could allow binding several ports to the same socket, although it is
   unclear if there is any viable reason for doing so.  AF_MULTIPATH can
   also contain just one address entry, in which case the behavior is
   similar to traditional single-homed bind.  On return, the function
   call should indicate how many addresses were successfully bound, and
   use failure response to indicate that binding failed to all
   addresses.  "Get Local Address" operation (getsockname in Posix) can
   be used to investigate which addresses were successfully bound.

   Differing from its past use, bind can be called multiple times for
   the same socket, to allow the application dynamically change the set
   of local addresses.  When a subsequent bind call does not include an
   address that is currently in use, it indicates to the protocol that
   this address should not be used anymore in a connection.  When a
   subsequent bind call includes addresses that are not currently in
   use, it indicates that these addresses should be added to the
   connection.  The protocol implementation may change the set of used
   addresses dynamically without a trigger from application.  Before the
   bind call the set of currently used addresses can be obtained using
   the "Get Local Address" (getsockname) call as described in
   Section 4.4.

4.2.  Connect

   An AF_MULTIPATH socket can give multiple addresses to connect,
   assuming the addresses belong to the same host.  The underlying
   protocol may need to activate these connections one at a time, if the
   protocol logic does not permit connecting to multiple addresses
   simultaneously.  On return, the function call should indicate how
   many of the addresses were successfully connected, or an error code.
   It is expected that commonly this call is used together with name
   resolution, as described below.  "Get Remote Address" (getpeername)
   operation can be used to investigate which addresses were



Sarolahti               Expires September 5, 2010               [Page 6]


Internet-Draft                AF-Multipath                    March 2010


   successfully connected to.

   Similarly to bind operation, connect can be called multiple times for
   the same socket, to allow the application dynamically change the set
   of remote addresses.  When a subsequent connect call does not include
   an address that is currently in use, it indicates to the protocol
   that this address should not be used anymore in a connection.  When a
   subsequent bind call includes addresses that are not currently in
   use, it indicates that these addresses should be added to the
   connection (in practice triggering this from application can be
   unusual for remote addresses).  The protocol implementation may
   change the set of used addresses dynamically without a trigger from
   application.  Before the connect call the set of currently used
   addresses can be obtained using the "Get Remote Address"
   (getpeername) call as described in Section 4.4.

   An application may give multiple addresses that seem reachable, but
   belong to different hosts.  The underlying protocol that supports
   AF_MULTIPATH API MUST be able to detect such situation, and prevent
   connections to multiple hosts.  Often there are sufficient protocol
   mechanisms (such as connection tokens in multipath TCP) and other
   protocol state that cause such connections to fail automatically.

4.3.  Name resolution

   In a typical usage of a name resolver, multiple addresses may be
   returned from a name server, and a client cycles through the given
   addresses until connection is successfully established.  This is
   useful, for example, in dual-stack IPv4/IPv6 hosts.  A client may
   need to try connecting separately to IPv6 addresses and IPv4
   addresses, when it is not certain whether IPv6 is supported on the
   path.

   When an AF_MULTIPATH-enabled name resolver is called, it returns the
   available address records as separate entries in a single
   AF_MULTIPATH structure.  This would mean that the call returns a
   single AF_MULTIPATH host entry that may contain multiple addresses as
   specified in the AF_MULTIPATH format.  An application may directly
   place the returned AF_MULTIPATH structure as a parameter of a connect
   call, indicating that a multipath protocol should try these addresses
   as subflows of the multipath connection.  When a name resolver
   receives an AF_MULTIPATH-enabled call in a host that supports both
   IPv6 and IPv4, it is useful to invoke name server queries for both
   IPv6 and IPv4 addresses.  If available, records of both types are
   returned to the application, that can pass them to connect call, in
   attempt to invoke a multipath connection over both IPv4 and IPv6
   paths.  This may be useful feature supporting transition from IPv4 to
   IPv6.



Sarolahti               Expires September 5, 2010               [Page 7]


Internet-Draft                AF-Multipath                    March 2010


   It is not uncommon that a DNS name is associated to multiple hosts,
   for example to perform DNS-based load balancing.  As discussed above
   with the connect call, the underlying protocol implementation should
   be able to prevent connect attempts to separate hosts.

4.4.  Get Local Address / Get Remote Address

   The basic operation of these calls happens as before: they return a
   sockaddress structure either at the local or the remote end.
   AF_MULTIPATH address family is returned if it has been used earlier
   with the same socket.  The set of local or remote addresses SHOULD be
   up-to-date with the currently active set in the protocol
   implementation.  When the underlying protocol is able to change the
   active address set during the connection, this implies that
   subsequent calls to these functions can return different sets of
   addresses.  Along with the current addresses, an application learns
   also about the connection identifier with this call.  The connection
   identifier returned with "Get Remote Address" MUST be the same as the
   identifier returned with "Get Local Address", since it only has local
   meaning, and therefore the other end of the connection typically gets
   entirely different connection identifier for the connection.


5.  Discussion

5.1.  Address Family or Protocol Family?

   The socket API defines separately the protocol family, that is used
   to define the semantics of the socket behavior when a socket is
   created, and the address family that is used to distinguish different
   socket address formats [RFC2553].  By convention, in many systems
   AF_INET is defined to have an equal value to PF_INET, and AF_INET6 is
   defined to have an equal value to PF_INET6, allowing the pairs of
   definitions to be used interchangeably in implementations.

   Defining separate protocol families for IPv6 and IPv4 has some
   unfortunate consequences: in principle, it needs to be decided at
   socket creation time whether to use IPv6 or IPv4.  In practice, IPv6
   defines a specific address range, IPv4-mapped addresses, to
   "virtually" represent IPv4 addresses in IPv6 address space.
   Implementations can use this feature to signal, that IPv4 should be
   used on the wire.  An alternative design choice could have been to
   use same protocol family for both IPv4 and IPv6, and distinguish use
   of IPv4 and IPv6 with the address family, that can be selected also
   after the socket is created.  After all, the transport protocol
   implementation, and its semantics, are the same in both cases.

   In case of AF_MULTIPATH, the format of the socket address structure



Sarolahti               Expires September 5, 2010               [Page 8]


Internet-Draft                AF-Multipath                    March 2010


   changes, while for example in the case of multipath TCP, the
   semantics of the socket calls are intended to remain unchanged.  This
   would suggest that when AF_MULTIPATH address family is used with
   socket address structures, the protocol family definition should
   remain at its typical value.  Here an argument can be made that
   AF_MULTIPATH changes the behavior of bind and connect calls, but on
   the other hand, it is correct to say that from the applications point
   of view the outcome of a successful completion -- choosing a local
   access point, or successfully establishing connection with the peer
   -- is exactly the same as with the traditional use of the API.  It is
   unclear at this point, whether the pairwise definitions of protocol
   family and address family has lead to dependencies in implementations
   that would hinder the implementation of the AF_MULTIPATH address
   family, or whether such dependencies would be difficult to be fixed.

5.2.  Comparison to Alternative Design Options

   Replacing the current socket API with a "connect-by-name" API has
   been proposed.  Different proposals have slightly different
   abstraction levels, but commonly in these APIs application passes a
   DNS name with the connect call.  The benefit of such API is that the
   application does not need to handle the network addresses, that
   arguably shouldn't be application's concern in most cases, and it
   thus avoids a separate name resolution step.  In a long term this
   seems a promising direction to take in API design, but involves
   inter-operation between the name resolver that is often implemented
   in user space in current systems, and may need changes in operating
   system kernel interface.  This proposal intentionally has taken the
   traditional, more short term approach, to expose the network
   addresses to applications.

   Additions to the set of calls in the socket API has been proposed,
   for example, alternative operations for multi-address bind and
   connect [I-D.ietf-tsvwg-sctpsocket].  In the beginning this document
   lauded the elegance of simple, generic socket API with a small basic
   set of operations, and addition of new purpose-specific operations
   would be a deviation from this design principle.  In addition adding
   operations to socket API would cause changes to the operating system
   kernel function interface, that could cause interoperability and
   maintenance issues.  One way to implement such extended operations
   would be through an user-space library that maps the operations to
   the existing socket calls in the kernel implementation.  In mapping
   the additional operations to existing kernel interface, such library
   might leverage a mechanism similar to what presented in this
   document, or use, for example socket options or ioctl calls.

   Socket options can be used tune parameters affecting the protocol
   behavior.  The extensibility of the socket option format can make it



Sarolahti               Expires September 5, 2010               [Page 9]


Internet-Draft                AF-Multipath                    March 2010


   appealing to use this interface for more significant run-time tasks,
   such as adding or deleting addresses in a multi-address session, as
   done in [I-D.ietf-shim6-multihome-shim-api].  In this approach the
   semantics of the traditional single-homed operations still need to be
   specified.  It can also be questioned whether it is appropriate to
   use socket options to trigger actions that can be seen to fall beyond
   the scope of the original meaning of "socket option".

   In summary, introducing a new address family as proposed in this
   document allows keeping the existing set of socket operations in the
   API, which the author believes to be a useful property, for example
   concerning the maintenance of the interfaces between the operation
   system and applications.  If an operating system does not support
   AF_MULTIPATH, it can gracefully return an appropriate error code to
   an application, that can then revert to use the traditional single-
   homed address family, if desired.  There are no backwards
   compatibility issues with old applications, because applications
   explicitly signal their support of this address family with the
   connect or bind calls.

   Presenting the multiple addresses associated with the connection
   using the socket addresses seems a natural and native way of
   expressing this fairly new kind of property to applications.  The
   recent discussion on this idea showed, however, that the use of more
   dynamic socket addresses can be perceived as unconventional and can
   raise doubts, for example regarding the possible assumptions about
   the persistence of the address structure in the implementations.  It
   is unclear how actual this concern is, given that the underlying
   protocol that dynamically maintains the set of addresses is a fairly
   new feature, compared to decades of past use of the end-to-end
   transport.

5.3.  Open Issues

   Below are listed some potentially open issues that need to be taken
   in to account in follow-up discussion on this document.

   o  Are there any constraints on the generic format of the socket
      address structure, that would conflict with what proposed above?
      It appears that for example BSD and Linux use different formats
      for this structure, so that the Linux structure follows the "old
      BSD" convention, without a common length field (sa_len).  Are
      there reasons to follow one of these conventions, or would it be
      possible, for example, to specify a 16-bit length field that could
      be useful for large sets of IPv6 addresses?

   o  Is there a need to expose pairwise source-destination subflow
      associations, instead of just a group of source and destination



Sarolahti               Expires September 5, 2010              [Page 10]


Internet-Draft                AF-Multipath                    March 2010


      addresses?  Currently no such reason can be seen: the socket
      should represent one logical connection between a source host and
      a destination host, that in this case may have multiple IP
      addresses in use for the connection.

   o  Is a separate connection identifier field needed, as in the
      earlier version of this document?  Currently the author cannot
      identify such need.


6.  Security Considerations

   No additional security threats are known because of the multipath
   address family.  This document referred to the possibility that
   dynamic end host multihoming may enable new ways to maliciously
   transfer a connection to another host.  A multi-address interface may
   open this possibility to applications, but ultimately the multihomed
   protocol should have mechanisms to protect from such behavior.


7.  Acknowledgments

   The author is thankful to Alan Ford for pointing out specific
   technical issues to be addressed, and to the people who have
   participated the discussion on the MPTCP mailing list.

   The author is supported by Finland-ICSI Center for Novel Internet
   Architectures (FICNIA) and the Finnish Funding Agency for Technology
   and Innovation (TEKES).


8.  References

8.1.  Normative References

   [I-D.ietf-mptcp-architecture]
              Ford, A., Raiciu, C., Barre, S., and J. Iyengar,
              "Architectural Guidelines for Multipath TCP Development",
              draft-ietf-mptcp-architecture-00 (work in progress),
              March 2010.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

8.2.  Informative References

   [I-D.ford-mptcp-multiaddressed]
              Ford, A., Raiciu, C., and M. Handley, "TCP Extensions for



Sarolahti               Expires September 5, 2010              [Page 11]


Internet-Draft                AF-Multipath                    March 2010


              Multipath Operation with Multiple Addresses",
              draft-ford-mptcp-multiaddressed-02 (work in progress),
              October 2009.

   [I-D.ietf-shim6-multihome-shim-api]
              Komu, M., Bagnulo, M., Slavov, K., and S. Sugimoto,
              "Socket Application Program Interface (API) for
              Multihoming Shim", draft-ietf-shim6-multihome-shim-api-13
              (work in progress), February 2010.

   [I-D.ietf-tsvwg-sctpsocket]
              Stewart, R., Poon, K., Tuexen, M., Yasevich, V., and P.
              Lei, "Sockets API Extensions for Stream Control
              Transmission Protocol (SCTP)",
              draft-ietf-tsvwg-sctpsocket-21 (work in progress),
              February 2010.

   [I-D.scharf-mptcp-api]
              Scharf, M. and A. Ford, "MPTCP Application Interface
              Considerations", draft-scharf-mptcp-api-00 (work in
              progress), October 2009.

   [RFC2367]  McDonald, D., Metz, C., and B. Phan, "PF_KEY Key
              Management API, Version 2", RFC 2367, July 1998.

   [RFC2553]  Gilligan, R., Thomson, S., Bound, J., and W. Stevens,
              "Basic Socket Interface Extensions for IPv6", RFC 2553,
              March 1999.

   [RFC4960]  Stewart, R., "Stream Control Transmission Protocol",
              RFC 4960, September 2007.

   [RFC5206]  Nikander, P., Henderson, T., Vogt, C., and J. Arkko, "End-
              Host Mobility and Multihoming with the Host Identity
              Protocol", RFC 5206, April 2008.

   [RFC5533]  Nordmark, E. and M. Bagnulo, "Shim6: Level 3 Multihoming
              Shim Protocol for IPv6", RFC 5533, June 2009.


Appendix A.  Change log

   Changes from version -00 to -01

   o  Added more background to the Introduction

   o  Added section to discuss protocol family/address family issues,
      and comparison to related API designs



Sarolahti               Expires September 5, 2010              [Page 12]


Internet-Draft                AF-Multipath                    March 2010


   o  Removed the connection identifier from the address structure, and
      changed related descriptions related to socket calls.

   o  Added discussion about open issues in Section 3


Author's Address

   Pasi Sarolahti
   HIIT/ICSI
   1947 Center Street (Suite 600)
   Berkeley, CA  94704
   USA

   Phone: +1 (510) 409 - 9972
   Email: pasi.sarolahti@iki.fi
   URI:   http://www.iki.fi/pasi.sarolahti/


































Sarolahti               Expires September 5, 2010              [Page 13]