void networkStatusChangeNotif(unsigned int assocID, short affectedPathID, unsigned short newState, void* ulpDataPtr) { SCTP_AssociationStatus assocStatus; SCTP_PathStatus pathStatus; unsigned short pathID; SCTP_getPathStatus(assocID, affectedPathID, &pathStatus); fprintf(fptr, "%-8x: Network status change: path %u (towards %s) is now %s\n", assocID, affectedPathID, pathStatus.destinationAddress, pathStateName(newState)); fflush(fptr); /* if the primary path has become inactive */ if ((newState == SCTP_PATH_UNREACHABLE) && (affectedPathID == SCTP_getPrimary(assocID))) { /* select a new one */ SCTP_getAssocStatus(assocID, &assocStatus); for (pathID=0; pathID < assocStatus.numberOfAddresses; pathID++){ SCTP_getPathStatus(assocID, pathID, &pathStatus); if (pathStatus.state == SCTP_PATH_OK) break; } /* and use it */ if (pathID < assocStatus.numberOfAddresses) { SCTP_setPrimary(assocID, pathID); } } }
void measurementTimerRunOffFunction(unsigned int timerID, void *parameter1, void *parameter2) { int index; SCTP_AssociationStatus assocStatus; SCTP_PathStatus pathStatus; for (index=0; index < MAXIMUM_NUMBER_OF_ASSOCIATIONS; index++) { if (ulpData[index].maximumStreamID >= 0){ SCTP_getAssocStatus(ulpData[index].assocID, &assocStatus); SCTP_getPathStatus(ulpData[index].assocID, 0, &pathStatus); fprintf(fptr, "%-8x %-8lu %-8lu %-8u %-8u %-8u %-8u %-8u\n", ulpData[index].assocID, ulpData[index].nrOfReceivedChunks, ulpData[index].nrOfReceivedBytes, assocStatus.currentReceiverWindowSize, assocStatus.noOfChunksInSendQueue, assocStatus.outstandingBytes, pathStatus.cwnd, pathStatus.ssthresh); fflush(fptr); ulpData[index].nrOfReceivedChunks = 0; ulpData[index].nrOfReceivedBytes = 0; } } SCTP_startTimer(deltaT, measurementTimerRunOffFunction, NULL, NULL); }
void networkStatusChangeNotif(unsigned int assocID, short destAddrIndex, unsigned short newState, void* ulpDataPtr) { SCTP_AssociationStatus assocStatus; SCTP_PathStatus pathStatus; unsigned short pathID; if (verbose) { fprintf(stdout, "%-8x: Network status change: path %u is now %s\n", assocID, destAddrIndex, pathStateName(newState)); fflush(stdout); } /* if the primary path has become inactive */ if ((newState == SCTP_PATH_UNREACHABLE) && (destAddrIndex == SCTP_getPrimary(assocID))) { /* select a new one */ /* should we have a sctp_get_primary()? */ SCTP_getAssocStatus(assocID, &assocStatus); for (pathID=0; pathID < assocStatus.numberOfAddresses; pathID++){ SCTP_getPathStatus(assocID, pathID, &pathStatus); if (pathStatus.state == SCTP_PATH_OK) break; } /* and use it */ if (pathID < assocStatus.numberOfAddresses) { SCTP_setPrimary(assocID, pathID); } } }
void* communicationUpNotif(unsigned int assocID, int status, unsigned int noOfPaths, unsigned short noOfInStreams, unsigned short noOfOutStreams, int associationSupportsPRSCTP, void* dummy) { unsigned int index, packetNumber; unsigned char chunk[MAXIMUM_PAYLOAD_LENGTH]; SCTP_PathStatus pathStatus; unsigned short pathID; unsigned short streamID = 0; if (verbose) { fprintf(stdout, "%-8x: Communication up (%u paths:", assocID, noOfPaths); for (pathID=0; pathID < noOfPaths; pathID++){ SCTP_getPathStatus(assocID, pathID, &pathStatus); fprintf(stdout, " %s", pathStatus.destinationAddress); } fprintf(stdout, ")\n"); fprintf(stdout, "%-8x: %u incoming, %u outgoing streams.\n", assocID, noOfInStreams, noOfOutStreams); fflush(stdout); } /* look for a free ULP data */ for (index=0; index < MAXIMUM_NUMBER_OF_ASSOCIATIONS; index++) { if (ulpData[index].maximumStreamID == -1) break; } /* if found */ if (index < MAXIMUM_NUMBER_OF_ASSOCIATIONS) { /* use it */ ulpData[index].maximumStreamID = noOfOutStreams - 1; ulpData[index].assocID = assocID; ulpData[index].nrOfReceivedChunks = 0; ulpData[index].nrOfReceivedBytes = 0; ulpData[index].ShutdownReceived = 0; /* send the initial packets */ memset(chunk, 0, sizeof(chunk)); for(packetNumber=1; packetNumber <= numberOfInitialPackets; packetNumber++) { SCTP_send(assocID, streamID, chunk, chunkLength, SCTP_GENERIC_PAYLOAD_PROTOCOL_ID, SCTP_USE_PRIMARY, SCTP_NO_CONTEXT, timeToLive, (sendUnordered)?SCTP_UNORDERED_DELIVERY:SCTP_ORDERED_DELIVERY, SCTP_BUNDLING_DISABLED); if (rotateStreams) { streamID = (streamID + 1) % noOfOutStreams; } } return &ulpData[index]; } else { /* abort assoc due to lack of resources */ SCTP_abort(assocID); return NULL; } }
void* communicationUpNotif(unsigned int assocID, int status, unsigned int noOfDestinations, unsigned short noOfInStreams, unsigned short noOfOutStreams, int associationSupportsPRSCTP, void* dummy) { SCTP_PathStatus pathStatus; unsigned int i; if (verbose) { fprintf(stdout, "%-8x: Communication up (%u paths, %u In-Streams, %u Out-Streams)\n", assocID, noOfDestinations, noOfInStreams, noOfOutStreams); fflush(stdout); } if (vverbose) { for (i=0; i < noOfDestinations; i++) { SCTP_getPathStatus(assocID, (unsigned short)i, &pathStatus); fprintf(stdout, "%-8x: Path Status of path %u (towards %s): %s.\n", assocID, i, pathStatus.destinationAddress, pathStateName(pathStatus.state)); SCTP_changeHeartBeat(assocID, (short)i, 1, HBInterval); } } numberOutStreams = noOfOutStreams; return NULL; }
void measurementTimerRunOffFunction(unsigned int timerID, void *parameter1, void *parameter2) { int index; SCTP_AssociationStatus assocStatus; SCTP_PathStatus pathStatus; unsigned short pathID; for (index=0; index < MAXIMUM_NUMBER_OF_ASSOCIATIONS; index++) { if (ulpData[index].maximumStreamID >= 0){ if (doAllMeasurements) { SCTP_getAssocStatus(ulpData[index].assocID, &assocStatus); for (pathID=0; pathID < assocStatus.numberOfAddresses; pathID++){ SCTP_getPathStatus(ulpData[index].assocID, pathID, &pathStatus); fprintf(stdout, "Asoc:%-8x Path:%-2u Ch:%-8lu By:%-8lu rto:%-8u srtt:%-8u qu:%-6u osb:%-8u cwnd:%-8u ssthresh:%-8u\n", ulpData[index].assocID, pathID, ulpData[index].nrOfReceivedChunks, ulpData[index].nrOfReceivedBytes, pathStatus.rto, pathStatus.srtt, assocStatus.noOfChunksInSendQueue, assocStatus.outstandingBytes, pathStatus.cwnd, pathStatus.ssthresh); } } else { fprintf(stdout, "%-8x: %-6lu Chunks, %-8lu Bytes received\n", ulpData[index].assocID, ulpData[index].nrOfReceivedChunks, ulpData[index].nrOfReceivedBytes); } ulpData[index].nrOfReceivedChunks = 0; ulpData[index].nrOfReceivedBytes = 0; } } SCTP_startTimer(deltaT, measurementTimerRunOffFunction, NULL, NULL); }
void* communicationUpNotif(unsigned int assocID, int status, unsigned int noOfPaths, unsigned short noOfInStreams, unsigned short noOfOutStreams, int associationSupportsPRSCTP, void* dummy) { unsigned int index; unsigned char chunk[MAXIMUM_PAYLOAD_LENGTH]; SCTP_PathStatus pathStatus; unsigned short pathID; unsigned short streamID = 0; unsigned long packetNumber; struct timeval now, diffTime; double seconds, throughput; if (verbose) { fprintf(stdout, "%-8x: Communication up (%u paths:", assocID, noOfPaths); for (pathID=0; pathID < noOfPaths; pathID++){ SCTP_getPathStatus(assocID, pathID, &pathStatus); fprintf(stdout, " %s", pathStatus.destinationAddress); } fprintf(stdout, ")\n"); fprintf(stdout, "%-8x: %u incoming, %u outgoing streams.\n", assocID, noOfInStreams, noOfOutStreams); fflush(stdout); } /* look for a free ULP data */ for (index=0; index < MAXIMUM_NUMBER_OF_ASSOCIATIONS; index++) { if (ulpData[index].maximumStreamID == -1) break; } /* if found */ if (index < MAXIMUM_NUMBER_OF_ASSOCIATIONS) { /* use it */ ulpData[index].maximumStreamID = noOfOutStreams - 1; ulpData[index].assocID = assocID; ulpData[index].nrOfReceivedChunks = 0; ulpData[index].nrOfReceivedBytes = 0; ulpData[index].ShutdownReceived = 0; ulpData[index].nrOfSentChunks = 0; ulpData[index].nrOfSentBytes = 0; if (numberOfInitialPackets > 0 && startAssociation) { /* send the initial packets */ memset(chunk, 0, sizeof(chunk)); gettimeofday(&startTime, NULL); for(packetNumber=1; packetNumber <= numberOfInitialPackets; packetNumber++) { SCTP_send(assocID, streamID, chunk, chunkLength, SCTP_GENERIC_PAYLOAD_PROTOCOL_ID, SCTP_USE_PRIMARY, SCTP_NO_CONTEXT, timeToLive, SCTP_ORDERED_DELIVERY, SCTP_BUNDLING_DISABLED); if (rotateStreams) { streamID = (streamID + 1) % noOfOutStreams; } ulpData[index].nrOfSentChunks += 1; ulpData[index].nrOfSentBytes += chunkLength; } SCTP_shutdown(assocID); if (verbose) { fprintf(stdout, "%ld messages of size %d sent.\n", packetNumber-1, chunkLength); } } else if (measurementTime > 0) { memset(chunk, 0, sizeof(chunk)); ulpData[index].stopTimerID = SCTP_startTimer(measurementTime, &stopSendingFunction, (void *) &ulpData[index], NULL); gettimeofday(&startTime, NULL); while((SCTP_send(assocID, streamID, chunk, chunkLength, SCTP_GENERIC_PAYLOAD_PROTOCOL_ID, SCTP_USE_PRIMARY, SCTP_NO_CONTEXT, timeToLive, SCTP_ORDERED_DELIVERY, SCTP_BUNDLING_DISABLED) == SCTP_SUCCESS) && stopSending!=1) { if (vverbose) { fprintf(stdout, "%-8x: %u bytes sent.\n", assocID, chunkLength); fflush(stdout); } if (rotateStreams) { streamID = (streamID + 1) % noOfOutStreams; } ulpData[index].nrOfSentChunks += 1; ulpData[index].nrOfSentBytes += chunkLength; } if (stopSending == 1) { SCTP_shutdown(assocID); gettimeofday(&now, NULL); timersub(&now, &startTime, &diffTime); seconds = diffTime.tv_sec + (double)diffTime.tv_usec/1000000; fprintf(stdout, "%s of %ld messages of length %u took %f seconds.\n", "Sending", ulpData[index].nrOfSentChunks, chunkLength, seconds); throughput = (double)ulpData[index].nrOfSentChunks * (double)chunkLength / seconds / 1024.0; fprintf(stdout, "Throughput was %f KB/sec.\n", throughput); } } return &ulpData[index]; } else { /* abort assoc due to lack of resources */ SCTP_abort(assocID); return NULL; } }