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
00019 #ifndef __SCTP_H
00020 #define __SCTP_H
00021
00022 #ifdef _MSC_VER
00023 #pragma warning(disable : 4786)
00024 #endif
00025
00026 #include <omnetpp.h>
00027 #include <map>
00028 #include "IPvXAddress.h"
00029 #include "UDPSocket.h"
00030
00031
00032 class SCTPAssociation;
00033 class SCTPMessage;
00034
00035
00036 #define sctpEV3 (!SCTP::testing==true)?std::cerr:std::cerr
00037
00038
00039
00084 class INET_API SCTP : public cSimpleModule
00085 {
00086 public:
00087 struct AppConnKey
00088 {
00089 int32 appGateIndex;
00090 int32 assocId;
00091
00092 inline bool operator<(const AppConnKey& b) const
00093 {
00094 if (appGateIndex!=b.appGateIndex)
00095 return appGateIndex<b.appGateIndex;
00096 else
00097 return assocId<b.assocId;
00098 }
00099
00100 };
00101 struct SockPair
00102 {
00103 IPvXAddress localAddr;
00104 IPvXAddress remoteAddr;
00105 uint16 localPort;
00106 uint16 remotePort;
00107
00108 inline bool operator<(const SockPair& b) const
00109 {
00110 if (remoteAddr!=b.remoteAddr)
00111 return remoteAddr<b.remoteAddr;
00112 else if (localAddr!=b.localAddr)
00113 return localAddr<b.localAddr;
00114 else if (remotePort!=b.remotePort)
00115 return remotePort<b.remotePort;
00116 else
00117 return localPort<b.localPort;
00118 }
00119 };
00120 struct VTagPair
00121 {
00122 uint32 peerVTag;
00123 uint32 localVTag;
00124 uint16 localPort;
00125 uint16 remotePort;
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 };
00137 typedef struct
00138 {
00139 int32 assocId;
00140 simtime_t start;
00141 simtime_t stop;
00142 uint64 rcvdBytes;
00143 uint64 sentBytes;
00144 uint64 transmittedBytes;
00145 uint64 ackedBytes;
00146 uint32 numFastRtx;
00147 uint32 numDups;
00148 uint32 numT3Rtx;
00149 uint32 numPathFailures;
00150 uint32 numForwardTsn;
00151 double throughput;
00152 simtime_t lifeTime;
00153 }AssocStat;
00154
00155 typedef std::map<int32,AssocStat> AssocStatMap;
00156 AssocStatMap assocStatMap;
00157 typedef std::map<int32, VTagPair> SctpVTagMap;
00158 SctpVTagMap sctpVTagMap;
00159
00160
00161 typedef std::map<AppConnKey,SCTPAssociation*> SctpAppConnMap;
00162 typedef std::map<SockPair,SCTPAssociation*> SctpConnMap;
00163
00164
00165 SctpAppConnMap sctpAppConnMap;
00166 SctpConnMap sctpConnMap;
00167 std::list<SCTPAssociation*>assocList;
00168 protected:
00169 int32 sizeConnMap;
00170 static int32 nextConnId;
00171
00172 uint16 nextEphemeralPort;
00173
00174 SCTPAssociation *findAssocForMessage(IPvXAddress srcAddr, IPvXAddress destAddr, uint32 srcPort, uint32 destPort, bool findListen);
00175 SCTPAssociation *findAssocForApp(int32 appGateIndex, int32 assocId);
00176 void sendAbortFromMain(SCTPMessage* sctpmsg, IPvXAddress srcAddr, IPvXAddress destAddr);
00177 void sendShutdownCompleteFromMain(SCTPMessage* sctpmsg, IPvXAddress srcAddr, IPvXAddress destAddr);
00178 void updateDisplayString();
00179
00180 public:
00181 static bool testing;
00182 static bool logverbose;
00183 void printInfoConnMap();
00184 void printVTagMap();
00185
00186 void removeAssociation(SCTPAssociation *assoc);
00187 simtime_t testTimeout;
00188 uint32 numGapReports;
00189 uint32 numPacketsReceived;
00190 uint32 numPacketsDropped;
00191
00192 public:
00193
00194 virtual ~SCTP();
00195 virtual void initialize();
00196 virtual void handleMessage(cMessage *msg);
00197 virtual void finish();
00198
00199 inline AssocStat* getAssocStat(uint32 assocId) {
00200 SCTP::AssocStatMap::iterator found = assocStatMap.find(assocId);
00201 if(found != assocStatMap.end()) {
00202 return(&found->second);
00203 }
00204 return(NULL);
00205 }
00206
00210 void updateSockPair(SCTPAssociation *assoc, IPvXAddress localAddr, IPvXAddress remoteAddr, int32 localPort, int32 remotePort);
00211 void addLocalAddress(SCTPAssociation *conn, IPvXAddress address);
00212 void addLocalAddressToAllRemoteAddresses(SCTPAssociation *conn, IPvXAddress address, std::vector<IPvXAddress> remAddresses);
00213 void addRemoteAddress(SCTPAssociation *conn, IPvXAddress localAddress, IPvXAddress remoteAddress);
00214 void removeLocalAddressFromAllRemoteAddresses(SCTPAssociation *conn, IPvXAddress address, std::vector<IPvXAddress> remAddresses);
00215 void removeRemoteAddressFromAllConnections(SCTPAssociation *conn, IPvXAddress address, std::vector<IPvXAddress> locAddresses);
00220 void addForkedAssociation(SCTPAssociation *assoc, SCTPAssociation *newAssoc, IPvXAddress localAddr, IPvXAddress remoteAddr, int32 localPort, int32 remotePort);
00221
00225 uint16 getEphemeralPort();
00226
00231 static int32 getNewConnId() {return ++nextConnId;}
00232
00233 SCTPAssociation* getAssoc(int32 assocId);
00234 SCTPAssociation *findAssocWithVTag(uint32 peerVTag, uint32 remotePort, uint32 localPort);
00235 SctpVTagMap getVTagMap() {return sctpVTagMap;};
00236
00237 void bindPortForUDP();
00238 };
00239
00240 #endif
00241
00242
00243