Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #ifndef NPS_H_
00025 #define NPS_H_
00026
00027 #include <yang.h>
00028 #include <simplex.h>
00029
00030 #include <RpcListener.h>
00031 #include <Nps_m.h>
00032 #include <CoordinateSystem.h>
00033
00034 class CoordBasedRouting;
00035
00040 struct LandmarkDataEntry
00041 {
00042 simtime_t rtt;
00043 int8_t layer;
00044 std::vector<double> coordinates;
00045 const IPvXAddress* ip;
00046 };
00047
00048 struct RttMeasurement
00049 {
00050 TransportAddress measuredNode;
00051 char rttsPending;
00052 char rttsSent;
00053 char coordsPassed;
00054 #ifdef EXTJOIN_DISCOVERY
00055 RttToNodeCall* message;
00056 #endif
00057 };
00058
00062 class CoordCalcFunction
00063 {
00064 private:
00065 std::vector<LandmarkDataEntry> landmarks;
00066
00067 double endnodeDistance(const Vec_DP& nodeCoordinates,
00068 LandmarkDataEntry landmark) const;
00069
00070 public:
00071 CoordCalcFunction(const std::vector<LandmarkDataEntry> myLandmarks) : landmarks(myLandmarks) { };
00072 double f(const Vec_DP& initCoordinates) const;
00073 static double simplex_min(CoordCalcFunction *functionObject, Vec_DP& init);
00074 };
00075
00076 class Nps : public RpcListener, public AbstractNcs
00077 {
00078 friend class Landmark;
00079
00080 private:
00081 NeighborCache* neighborCache;
00082 BaseOverlay* overlay;
00083 GlobalNodeList* globalNodeList;
00084 CoordBasedRouting* coordBasedRouting;
00085
00086 uint8_t maxLayer;
00087 uint8_t dimensions;
00088 simtime_t landmarkTimeout;
00089
00090 GnpNpsCoordsInfo* ownCoords;
00091
00092 int16_t pendingRequests;
00093 uint8_t coordCalcRuns;
00094
00095 std::vector<TransportAddress> landmarkSet;
00096
00097 uint16_t receivedCalls;
00098
00099 cMessage* landmarkTimer;
00100
00101 public:
00102 Nps() {};
00103 void init(NeighborCache* neighborCache);
00104
00105 void handleTimerEvent(cMessage* msg);
00106 virtual bool handleRpcCall(BaseCallMessage* msg);
00107
00108 Prox getCoordinateBasedProx(const AbstractNcsNodeInfo& info) const;
00109 AbstractNcsNodeInfo* getUnvalidNcsInfo() const {return new GnpNpsCoordsInfo; };
00110 AbstractNcsNodeInfo* createNcsInfo(const std::vector<double>& coords) const;
00111 virtual const AbstractNcsNodeInfo& getOwnNcsInfo() const { return *ownCoords; };
00112
00113 const std::vector<double>& getOwnCoordinates() const { return ownCoords->getCoords(); };
00114 double getOwnCoordinates(uint8_t i) const { return ownCoords->getCoords(i); };
00115 uint8_t getOwnLayer() const { return ownCoords->getLayer(); };
00116
00117 protected:
00121 void computeOwnLayer (const std::vector<LandmarkDataEntry>& landmarks);
00122
00126 void computeOwnCoordinates (const std::vector<LandmarkDataEntry>& landmarks);
00127
00131 void setOwnLayer(int8_t layer);
00132 void setOwnCoordinates(const std::vector<double>& coords) {
00133 for (uint8_t i = 0; i < coords.size(); ++i) {
00134 ownCoords->setCoords(i, coords[i]);
00135 }
00136 };
00137
00142 void sendCoordRequests();
00143 void sendCoordRequests(const std::vector<TransportAddress>& landmarks);
00144 void sendCoordsReqCall(const TransportAddress& dest,
00145 simtime_t timeout);
00146
00147 void handleRpcResponse(BaseResponseMessage* msg,
00148 cPolymorphic* context,
00149 int rpcId, simtime_t rtt);
00150
00151 void handleRpcTimeout(BaseCallMessage* msg,
00152 const TransportAddress& dest,
00153 cPolymorphic* context, int rpcId,
00154 const OverlayKey& destKey);
00155
00156 void coordsReqRpcResponse(CoordsReqResponse* response,
00157 cPolymorphic* context,
00158 int rpcId, simtime_t rtt);
00159
00160 void coordsReqRpc(CoordsReqCall* msg);
00161
00162 std::vector<LandmarkDataEntry> getLandmarkData() const;
00163
00170 std::vector<TransportAddress> getLandmarks(uint8_t howmany);
00171 const std::vector<TransportAddress>& getLandmarkSet() const { return landmarkSet; };
00172 uint16_t getLandmarkSetSize() const { return landmarkSet.size(); };
00173
00174 bool setLandmarkSet(uint8_t howManyLM, uint8_t maxLayer,
00175 std::vector<TransportAddress>* landmarkSet);
00176 bool enoughLandmarks();
00177
00178 std::vector<RttMeasurement> nodeMeasurements;
00179
00180 void updateNodeMeasurement(const TransportAddress& node,
00181 uint8_t pending = 0,
00182 uint8_t sent = 0,
00183 uint8_t passed = 0);
00184
00185 void deleteNodeMeasurement(const TransportAddress& node);
00186
00187 uint16_t getReceivedCalls() const { return receivedCalls; };
00188 };
00189
00190 #endif