// // Copyright (C) 2006 Institut fuer Telematik, Universitaet Karlsruhe (TH) // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // // The main module of the Chord implementation // // @author Ingmar Baumgart, Markus Mauch // simple Chord parameters: localPort : numeric, // UDP port for Chord messages debugOutput : bool, // enable debug output keyLength : numeric, // overlay key length in bits measureNetwInitPhase: bool, // gather statistics when bootstrapping useCommonAPIforward : bool, // enable CommonAPI forward() calls drawOverlayTopology : bool, // draw arrow to successor node? hopCountMax : numeric, // maximum number of overlay hops // only join the overlay on application request joinOnApplicationRequest : bool, lookupRedundantNodes : numeric, // number of next hops in each step lookupParallelPaths : numeric, // number of parallel paths lookupParallelRpcs : numeric, // number of nodes to ask in parallel // true, if all nodes should be identified with a ping lookupSecure : bool, // true, if parallel Rpc results should be merged lookupMerge : bool, lookupFailedNodeRpcs : bool, // communicate failed nodes // do iterative instead of recursive lookups iterativeLookup : bool, collectPerHopDelay : bool, // delay statistics for single hops useNextHopRpc : bool, // use RPCs for route messages // max number of successors in the SuccessorList successorListSize : numeric, // after joinRetry unsuccessful join requests, we fetch // a need bootstrap node from the BootstrapOracle joinRetry : numeric, // retries before a successor is considered failed stabilizeRetry : numeric, joinDelay : numeric, // delay between join retries (sec) stabilizeDelay : numeric, // stabilize interval (sec) fixfingersDelay : numeric, // fix_fingers interval (sec) aggressiveJoinMode : bool, // use modified (faster) JOIN protocol extendedFingerTable : bool, // use the extended finger table? // number of fingers when using extended finger table numFingerCandidates : numeric, proximityRouting : bool; // use proximity routing gates: in: from_udp[]; // gate from the UDP layer out: to_udp[]; // gate to the UDP layer in: from_app; // gate from the application out: to_app; // gate to the application in: direct_in; // gate for sendDirect endsimple // // This modul contains the successor list of the Chord implementation. // // @author Markus Mauch, Ingmar Baumgart // simple ChordSuccessorList endsimple // // This modul contains the finger table of the Chord implementation. // // @author Markus Mauch, Ingmar Baumgart // simple ChordFingerTable endsimple // // Implementation of the Chord KBR overlay as described in // "Chord: A Scalable Peer-to-Peer Lookup Protocol for Internet // Applications" by I. Stoica et al. published in Transactions on Networking. // // @author Ingmar Baumgart, Markus Mauch // module ChordModules parameters: localPort : numeric, // UDP port for Chord messages debugOutput : bool, // enable debug output keyLength : numeric, // overlay key length in bits measureNetwInitPhase: bool, // gather statistics when bootstrapping collectPerHopDelay : bool, // delay statistics for single hops drawOverlayTopology : bool, // draw arrow to successor node? hopCountMax : numeric, // maximum number of overlay hops // only join the overlay on application request joinOnApplicationRequest : bool, // do iterative instead of recursive lookups iterativeLookup : bool, // forward messages to application in recursive mode useCommonAPIforward : bool, useNextHopRpc : bool, // use RPCs for route messages lookupRedundantNodes : numeric, // number of next hops in each step lookupParallelPaths : numeric, // number of parallel paths lookupParallelRpcs : numeric, // number of nodes to ask in parallel lookupSecure : bool, // true, if all nodes should be // identified with a ping lookupMerge : bool, // true, if parallel Rpc results should // be merged lookupFailedNodeRpcs : bool; // communicate failed Nodes gates: in: from_udp; // gate from the UDP layer out: to_udp; // gate to the UDP layer in: from_app; // gate from the application out: to_app; // gate to the application submodules: chord: Chord; parameters: localPort = localPort, // UDP port for Chord messages debugOutput = debugOutput, // enable debug output keyLength = keyLength, // overlay key length in bits // gather statistics when bootstrapping measureNetwInitPhase = measureNetwInitPhase, // delay statistics for single hops collectPerHopDelay = collectPerHopDelay, // draw arrow to successor node? drawOverlayTopology = drawOverlayTopology, // maximum number of overlay hops hopCountMax = hopCountMax, // only join the overlay on application request joinOnApplicationRequest = joinOnApplicationRequest, // forward messages to application in recursive mode useCommonAPIforward = useCommonAPIforward, // do iterative instead of recursive lookups iterativeLookup = iterativeLookup, useNextHopRpc = useNextHopRpc, // use RPCs for route messages // number of next hops in each step lookupRedundantNodes = lookupRedundantNodes, // number of parallel paths lookupParallelPaths = lookupParallelPaths, // number of nodes to ask in parallel lookupParallelRpcs = lookupParallelRpcs, // true, if all nodes should be identified with a ping lookupSecure = lookupSecure, // true, if parallel Rpc results should be merged lookupMerge = lookupMerge, // communicate failed Nodes lookupFailedNodeRpcs = lookupFailedNodeRpcs; display: "p=60,60;i=block/circle"; fingerTable: ChordFingerTable; display: "p=150,60;i=block/table"; successorList: ChordSuccessorList; display: "p=240,60;i=block/table"; connections nocheck: from_udp --> chord.from_udp++; to_udp <-- chord.to_udp++; from_app --> chord.from_app; to_app <-- chord.to_app; endmodule