Rice Pastry API

rice.pastry.socket.internet
Class InternetPastryNodeFactory

java.lang.Object
  extended by rice.pastry.PastryNodeFactory
      extended by rice.pastry.transport.TransportPastryNodeFactory
          extended by rice.pastry.socket.SocketPastryNodeFactory
              extended by rice.pastry.socket.nat.rendezvous.RendezvousSocketPastryNodeFactory
                  extended by rice.pastry.socket.internet.InternetPastryNodeFactory

public class InternetPastryNodeFactory
extends RendezvousSocketPastryNodeFactory

This Factory is designed for real deployments (with NATs). Optimized for the following use cases (in order) 1) Internet Routable, No firewall 2) Internet Routable, Firewall (not NAT) 3) NAT: User Configured Port Forwarding 4) NAT: UPnP 5) NAT: No port forwarding

Author:
Jeff Hoye

Nested Class Summary
 
Nested classes/interfaces inherited from class rice.pastry.socket.SocketPastryNodeFactory
SocketPastryNodeFactory.TLBootstrapper, SocketPastryNodeFactory.TransLiveness<Identifier,MessageType>, SocketPastryNodeFactory.TransLivenessProximity<Identifier,MessageType>
 
Field Summary
static int ALWAYS
          NAT policy variables
static int BOOT
          Don't check bootstrap nodes
static int FAIL
           
static int NEVER
           
static int OVERWRITE
           
static int PREFIX_MATCH
           
static int RENDEZVOUS
           
static int USE_DIFFERENT_PORT
           
 
Fields inherited from class rice.pastry.socket.nat.rendezvous.RendezvousSocketPastryNodeFactory
CONTACT_STATE, random, RENDEZVOUS_CONTACT_DIRECT_STRATEGY, RENDEZVOUS_STRATEGY, RENDEZVOUS_TL, SIMULATE_FIREWALL
 
Fields inherited from class rice.pastry.socket.SocketPastryNodeFactory
findFireWallPolicy, IP_SERVICE, localAddress, MULTI_ADDRESS_STRATEGY, MULTI_INET_TL, NETWORK_INFO_NODE_HANDLE_INDEX, nidFactory, NODE_HANDLE_FACTORY, PASTRY_MAGIC_NUMBER, PRIORITY_TL, PROXY_ADDRESS, testFireWallPolicy
 
Fields inherited from class rice.pastry.transport.TransportPastryNodeFactory
leafSetMaintFreq, routeSetMaintFreq
 
Fields inherited from class rice.pastry.PastryNodeFactory
environment, logger, lSetSize, rtBase, rtMax
 
Constructor Summary
InternetPastryNodeFactory(NodeIdFactory nf, java.net.InetAddress bindAddress, int startPort, Environment env, NATHandler handler, java.util.Collection<java.net.InetSocketAddress> probeAddresses, java.net.InetAddress[] externalAddresses)
          May block for more than a second to determine network information.
InternetPastryNodeFactory(NodeIdFactory nf, int startPort, Environment env)
           
 
Method Summary
protected  void findExternalAddress(Id nodeId, java.net.InetSocketAddress bindAddress, Continuation<PastryNode,java.io.IOException> deliverResultToMe)
          Finds the external address, calls openFirewallPort()
protected  void findExternalAddressHelper(Id nodeId, java.net.InetSocketAddress bindAddress, Continuation<PastryNode,java.io.IOException> deliverResultToMe, java.util.Collection<java.net.InetSocketAddress> myProbeAddresses)
           
protected  boolean findExternalAddressIfNecessary(java.net.InetAddress address)
          Sets/Verifies externalAddresses Return true if all is well.
protected  void findExternalNodes(Id nodeId, java.net.InetSocketAddress bindAddress, java.util.Collection<java.net.InetSocketAddress> nonInternetRoutable, Continuation<PastryNode,java.io.IOException> deliverResultToMe)
          Probe the internalAddresses to get more externalAddresses, then call findExternalAddressHelper
protected  NATHandler getDefaultNatHandler(Environment env, java.net.InetAddress localAddress)
          Return a NATHandler
protected  int getFireWallPolicyVariable(java.lang.String key)
           
protected  boolean isInternetRoutable(MultiInetSocketAddress proxyAddress)
           
protected  void newNodeSelector(Id nodeId, MultiInetSocketAddress proxyAddress, Continuation<PastryNode,java.io.IOException> deliverResultToMe, java.util.Map<java.lang.String,java.lang.Object> initialVars)
          This is where the action takes place.
protected  void openFirewallPort(Id nodeId, java.net.InetSocketAddress bindAddress, Continuation<PastryNode,java.io.IOException> deliverResultToMe, java.net.InetAddress externalAddress, int requestedPort)
          Attempt to open the firewall on the specified port if it doesn't work, uses Rendezvous
protected  boolean shouldCheckConnectivity(MultiInetSocketAddress proxyAddress, java.util.Collection<java.net.InetSocketAddress> bootstraps)
           
protected  boolean shouldFindExternalAddress(java.net.InetAddress address)
           
protected  void verifyConnectivityThenMakeNewNode(Id nodeId, MultiInetSocketAddress proxyAddress, Continuation<PastryNode,java.io.IOException> deliverResultToMe)
          Verifies the connectivity (if necessary), then calls super.newNodeSelector() if connectivity fails, then uses Rendezvous
 
Methods inherited from class rice.pastry.socket.nat.rendezvous.RendezvousSocketPastryNodeFactory
generatePilotStrategy, getBootstrapper, getContactDeserializer, getContactDirectStrategy, getIdentiySerializer, getIpServiceTransportLayer, getJoinProtocol, getLocalHandle, getNextHopStrategy, getNodeHandleFactory, getPilotFinder, getPriorityTransportLayer, getProximityNeighborSelector, getRendezvousGenerator, getRendezvousStrategy, getRendezvousStrategyHelper, getRendezvousTransportLayer, getResponseStrategy, getWireTransportLayer, isInternetRoutablePrefix, newNodeSelector, newNodeSelector, registerApps, setContactState
 
Methods inherited from class rice.pastry.socket.SocketPastryNodeFactory
cloneEnvironment, cloneLogManager, cloneProcessor, cloneRandomSource, cloneSelectorManager, getBindAddress, getBindStrategy, getBottomLayers, getCommonAPITransportLayer, getIdentityImpl, getLimitSocketsTransportLayer, getLivenessTransportLayer, getLowerIdentityLayer, getMagicNumberTransportLayer, getMultiAddressSourceRouteFactory, getMultiAddressSourceRouteTransportLayer, getNextInetSocketAddress, getNodeHandle, getNodeHandle, getNodeHandle, getNodeHandle, getNodeHandleAdapter, getOptionsAdder, getProbeStrategy, getSocketCountListener, getSourceRouteForwardStrategy, getSourceRouteManagerLayer, getSourceRouteStrategy, getSourceRouteTransportLayer, getUpperIdentityLayer, newNode, newNode, newNode, newNode, newNode, newNode, newNode, newNode, newNode, verifyConnection
 
Methods inherited from class rice.pastry.transport.TransportPastryNodeFactory
getLeafSetProtocol, getRouterStrategy, getRouteSetProtocol, getTLDeserializer, nodeHandleHelper
 
Methods inherited from class rice.pastry.PastryNodeFactory
getEnvironment
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

ALWAYS

public static final int ALWAYS
NAT policy variables

See Also:
Constant Field Values

PREFIX_MATCH

public static final int PREFIX_MATCH
See Also:
Constant Field Values

NEVER

public static final int NEVER
See Also:
Constant Field Values

BOOT

public static final int BOOT
Don't check bootstrap nodes

See Also:
Constant Field Values

OVERWRITE

public static final int OVERWRITE
See Also:
Constant Field Values

USE_DIFFERENT_PORT

public static final int USE_DIFFERENT_PORT
See Also:
Constant Field Values

FAIL

public static final int FAIL
See Also:
Constant Field Values

RENDEZVOUS

public static final int RENDEZVOUS
See Also:
Constant Field Values
Constructor Detail

InternetPastryNodeFactory

public InternetPastryNodeFactory(NodeIdFactory nf,
                                 int startPort,
                                 Environment env)
                          throws java.io.IOException
Throws:
java.io.IOException

InternetPastryNodeFactory

public InternetPastryNodeFactory(NodeIdFactory nf,
                                 java.net.InetAddress bindAddress,
                                 int startPort,
                                 Environment env,
                                 NATHandler handler,
                                 java.util.Collection<java.net.InetSocketAddress> probeAddresses,
                                 java.net.InetAddress[] externalAddresses)
                          throws java.io.IOException
May block for more than a second to determine network information.

Parameters:
nf - can be null, but must call newNode() with a NodeId of the new PastryNode
bindAddress - the NIC to use (null will choose one that can access the Internet)
startPort - the port of the first created node, will be incremented for additional nodes, can be specified on a per-Node basis by calling newNode() with a MultiInetSocketAddress
env - can't be null
handler - will attempt to use SBBI's UPnP library if null, unless blocked by deleting the param "nat_handler_class"
probeAddresses - a list of bootstrap nodes' Internet routable addresses, used to establish firewall information
externalAddresses - ordered addresses of the nat propagation from most external to most internal, null will use natHandler and probeAddresses to determine this
Throws:
java.io.IOException
Method Detail

getDefaultNatHandler

protected NATHandler getDefaultNatHandler(Environment env,
                                          java.net.InetAddress localAddress)
Return a NATHandler

Parameters:
env -
localAddress - the address of the interface we should search for a NAT on
Returns:

shouldFindExternalAddress

protected boolean shouldFindExternalAddress(java.net.InetAddress address)

findExternalAddressIfNecessary

protected boolean findExternalAddressIfNecessary(java.net.InetAddress address)
                                          throws java.io.IOException
Sets/Verifies externalAddresses Return true if all is well. Return false if a firewall should be found but couldn't. Throws an exception if firewall was found and disagrees with the existing externalAddress (if it's not null).

Parameters:
address -
Returns:
Throws:
java.io.IOException

newNodeSelector

protected void newNodeSelector(Id nodeId,
                               MultiInetSocketAddress proxyAddress,
                               Continuation<PastryNode,java.io.IOException> deliverResultToMe,
                               java.util.Map<java.lang.String,java.lang.Object> initialVars)
This is where the action takes place. 1) Make sure the proxyAddress is valid and good a) add the external address/port if needed 2) Try to configure the firewall 3) call newNodeSelectorHelper

Overrides:
newNodeSelector in class SocketPastryNodeFactory

findExternalAddress

protected void findExternalAddress(Id nodeId,
                                   java.net.InetSocketAddress bindAddress,
                                   Continuation<PastryNode,java.io.IOException> deliverResultToMe)
Finds the external address, calls openFirewallPort()


findExternalNodes

protected void findExternalNodes(Id nodeId,
                                 java.net.InetSocketAddress bindAddress,
                                 java.util.Collection<java.net.InetSocketAddress> nonInternetRoutable,
                                 Continuation<PastryNode,java.io.IOException> deliverResultToMe)
Probe the internalAddresses to get more externalAddresses, then call findExternalAddressHelper


findExternalAddressHelper

protected void findExternalAddressHelper(Id nodeId,
                                         java.net.InetSocketAddress bindAddress,
                                         Continuation<PastryNode,java.io.IOException> deliverResultToMe,
                                         java.util.Collection<java.net.InetSocketAddress> myProbeAddresses)

openFirewallPort

protected void openFirewallPort(Id nodeId,
                                java.net.InetSocketAddress bindAddress,
                                Continuation<PastryNode,java.io.IOException> deliverResultToMe,
                                java.net.InetAddress externalAddress,
                                int requestedPort)
Attempt to open the firewall on the specified port if it doesn't work, uses Rendezvous

Parameters:
port - the external firewall port to (attempt to) use, -1 to use anything

verifyConnectivityThenMakeNewNode

protected void verifyConnectivityThenMakeNewNode(Id nodeId,
                                                 MultiInetSocketAddress proxyAddress,
                                                 Continuation<PastryNode,java.io.IOException> deliverResultToMe)
Verifies the connectivity (if necessary), then calls super.newNodeSelector() if connectivity fails, then uses Rendezvous

Parameters:
nodeId -
proxyAddress -
deliverResultToMe -

isInternetRoutable

protected boolean isInternetRoutable(MultiInetSocketAddress proxyAddress)

getFireWallPolicyVariable

protected int getFireWallPolicyVariable(java.lang.String key)

shouldCheckConnectivity

protected boolean shouldCheckConnectivity(MultiInetSocketAddress proxyAddress,
                                          java.util.Collection<java.net.InetSocketAddress> bootstraps)
Parameters:
proxyAddress -
Returns:

Rice Pastry API

Copyright © 2001-2005 - Rice Pastry.


Imprint-Dataprotection