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); } } }