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 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 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 restartNotif(unsigned int assocID, void* ulpDataPtr) { SCTP_AssociationStatus assocStatus; if (verbose) { fprintf(stdout, "%-8x: Restart\n", assocID); fflush(stdout); } SCTP_getAssocStatus(assocID, &assocStatus); /* update ULP data */ ((struct ulp_data *) ulpDataPtr)->maximumStreamID = assocStatus.outStreams - 1; }
void restartNotif(unsigned int assocID, void* ulpDataPtr) { SCTP_AssociationStatus assocStatus; fprintf(fptr, "%-8x: Restart\n", assocID); fflush(fptr); /* update ULP data */ if (ulpDataPtr) { SCTP_getAssocStatus(assocID, &assocStatus); ((struct ulp_data *) ulpDataPtr)->maximumStreamID = assocStatus.outStreams - 1; ((struct ulp_data *) ulpDataPtr)->assocID = assocID; } }
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); }