| 1680 | |
| 1681 | #ifdef USE_SCTP |
| 1682 | void SIPpSocket::sipp_sctp_peer_params() |
| 1683 | { |
| 1684 | if (heartbeat > 0 || pathmaxret > 0) { |
| 1685 | struct sctp_paddrparams peerparam; |
| 1686 | memset(&peerparam, 0, sizeof(peerparam)); |
| 1687 | |
| 1688 | sockaddr* addresses; |
| 1689 | #ifdef __SUNOS |
| 1690 | /* Sun takes a void** instead of a struct sockaddr** */ |
| 1691 | int addresscount = sctp_getpaddrs(ss_fd, 0, (void**)&addresses); |
| 1692 | #else |
| 1693 | int addresscount = sctp_getpaddrs(ss_fd, 0, &addresses); |
| 1694 | #endif |
| 1695 | if (addresscount < 1) WARNING("sctp_getpaddrs, errno=%d", errno); |
| 1696 | |
| 1697 | for (int i = 0; i < addresscount; i++) { |
| 1698 | memset(&peerparam.spp_address, 0, sizeof(peerparam.spp_address)); |
| 1699 | struct sockaddr_storage* peeraddress = (struct sockaddr_storage*) &addresses[i]; |
| 1700 | memcpy(&peerparam.spp_address, peeraddress, sizeof(*peeraddress)); |
| 1701 | |
| 1702 | peerparam.spp_hbinterval = heartbeat; |
| 1703 | peerparam.spp_pathmaxrxt = pathmaxret; |
| 1704 | if (heartbeat > 0) peerparam.spp_flags = SPP_HB_ENABLE; |
| 1705 | |
| 1706 | if (pmtu > 0) { |
| 1707 | peerparam.spp_pathmtu = pmtu; |
| 1708 | peerparam.spp_flags |= SPP_PMTUD_DISABLE; |
| 1709 | } |
| 1710 | |
| 1711 | if (setsockopt(ss_fd, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, |
| 1712 | &peerparam, sizeof(peerparam)) == -1) { |
| 1713 | sctp_freepaddrs(addresses); |
| 1714 | WARNING("setsockopt(SCTP_PEER_ADDR_PARAMS) failed, errno=%d", errno); |
| 1715 | } |
| 1716 | } |
| 1717 | sctp_freepaddrs(addresses); |
| 1718 | } |
| 1719 | } |
| 1720 | #endif |
| 1721 | |
| 1722 | void sipp_customize_socket(SIPpSocket *socket) |