00001 #ifndef _SPP2_H__
00002 #define _SPP2_H__
00003
00004 #include <map>
00005 #include <awds/routing.h>
00006 #include <gea/Time.h>
00007 #include <gea/Blocker.h>
00008 #include "History.h"
00009 #include <vector>
00010
00011 #include "awds/SPP.h"
00012
00013 using namespace std;
00014 using namespace awds;
00015 using namespace gea;
00016
00017 class SppManager2 : public SppManager {
00018
00019 public:
00020
00021
00022 struct SppHandlerEntry {
00023
00024 uint32_t spp_id;
00025
00026 spp_request_handler h;
00027 void * data;
00028 };
00029
00030 enum SppPacketType {
00031 SppTypeRequest = 0,
00032 SppTypeResponse = 1,
00033 SppTypeResponseAck = 2
00034 };
00035
00036 struct SppPendingPacket {
00037 SppManager2 *manager;
00038
00039 SppPendingPacket *next;
00040
00041 enum SppPacketType packetType;
00042 awds::NodeId dest;
00043 uint32_t seq;
00044 uint32_t spp_id;
00045
00046 void *payload;
00047 unsigned payloadSize;
00048
00049 gea::Blocker blocker;
00050
00051 bool pending;
00052 bool canCleanup;
00053 int retransmitCounter;
00054 int broadcastLimit;
00055 gea::Duration retransmitTimeout;
00056 gea::Duration bcRetransmitTimeout;
00057
00058 SppPendingPacket(SppManager2 *manager);
00059 void setPacketToRetransmit(class awds::UnicastPacket& uniP);
00060 virtual void retriesExceeded();
00061 virtual ~SppPendingPacket();
00062
00063 static void retransmitRequest(class gea::Handle *, gea::AbsTime t, void *data);
00064
00065 };
00066
00067 struct SppRequest :
00068 public SppPendingPacket
00069 {
00070
00071
00072 void * data;
00073 spp_response_handler handler;
00074
00075 SppRequest(SppManager2 *manager);
00076 virtual void retriesExceeded();
00077
00078 virtual ~SppRequest();
00079 };
00080
00081 struct SppAllIterator {
00082
00083 SppManager2 * const manager;
00084 const uint32_t spp_id;
00085 void * const data;
00086 void * const data2;
00087 const spp_response_handler response_handler;
00088 const spp_finished_handler finished_handler;
00089
00090 char payload[2048];
00091 unsigned payloadSize;
00092
00093
00094
00095 vector<awds::NodeId> allNodes;
00096
00097 SppAllIterator(SppManager2 *m,
00098 uint32_t id,
00099 void *d, spp_response_handler h,
00100 void *d2, spp_finished_handler h2 ) :
00101 manager(m),
00102 spp_id(id),
00103 data(d),
00104 data2(d2),
00105 response_handler(h),
00106 finished_handler(h2)
00107 {}
00108
00109 static int my_response_handler (void *data, ReadMarshalStream* msIn,
00110 const awds::NodeId& src);
00111
00112 static void create_request(void *data, WriteMarshalStream* msOut);
00113
00114 void askNextNode();
00115
00116 };
00117
00118 typedef SppPendingPacket SppResponse;
00119
00120 awds::Routing *routing;
00121 uint32_t seq;
00122
00123 typedef std::map<uint32_t, SppHandlerEntry *> SppHandlers;
00124 SppHandlers sppHandlers;
00125
00126 History< pair<NodeId, uint32_t>, 64 > history;
00127 SppRequest *pendingRequests;
00128 SppResponse *pendingResponses;
00129
00130 SppManager2(awds::Routing *routing);
00131
00132 virtual ~SppManager2() {}
00133
00134 virtual void registerHandler( uint32_t _spp_id, void * data, spp_request_handler handler);
00135
00136 virtual int sendRequest( const awds::NodeId& dest, uint32_t spp_id,
00137 void * data1, spp_request_creator h1,
00138 void * data2, spp_response_handler h2);
00139
00140 virtual int sendRequestAll( uint32_t spp_id,
00141 void * data1, spp_request_creator h1,
00142 void * data2, spp_response_handler h2,
00143 void * data3, spp_finished_handler h3);
00144
00145
00146 void handleRequest( ReadMarshalStream * rms,
00147 const awds::NodeId& src,
00148 uint32_t spp_id,
00149 uint32_t seq);
00150
00151 void handleResponse( ReadMarshalStream * rms,
00152 const awds::NodeId& src,
00153 uint32_t spp_id,
00154 uint32_t seq);
00155
00156 void handleResponseAck( const awds::NodeId& src,
00157 uint32_t spp_id,
00158 uint32_t seq);
00159
00160
00161 void cleanPendingPackets();
00162
00163 static void packet_recv_uc(awds::BasePacket *p, void *data);
00164 static void packet_recv_bc(awds::BasePacket *p, void *data);
00165
00166 void packet_recv(const NodeId& src, ReadMarshalStream &rms);
00167
00168 };
00169
00170
00171
00172
00173 #endif //SPP2_H__
00174
00175
00176
00177
00178
00179