union sctp_notification {
struct sctp_tlv sn_header;
struct sctp_assoc_change sn_assoc_change;
struct sctp_paddr_change sn_paddr_change;
struct sctp_remote_error sn_remote_error;
struct sctp_send_failed sn_send_failed;
struct sctp_shutdown_event sn_shutdown_event;
struct sctp_adaption_event sn_adaption_event;
struct sctp_pdapi_event sn_pdapi_event;
};
Обратите внимание, что для интерпретации значения типа используется поле sn_header. Таблица 9.2 содержит значения, которые могут помещаться в поля sn_header, sn_type, а также соответствующие значения поля подписки, которые используются с параметром сокета SCTP_EVENTS.
Таблица 9.2. Тип и поле подписки
sn_type Поле подписки SCTP_ASSOC_CHANGE sctp_association_event SCTP_PEER_ADDR_CHANGE sctp_address_event SCTP_REMOTE_ERROR sctp_peer_error_event SCTP_SEND_FAILED sctp_send_failure_event SCTP_SHUTDOWN_EVENT sctp_shutdown_event SCTP_ADAPTION_INDICATON sctp_adaption_layer_event SCTP_PARTIAL_DELIVERY_EVENT sctp_partial_delivery_eventУ каждого уведомления имеется своя собственная структура, которая содержит подробную информацию о произошедшем событии.
■ SCTP_ASSOC_CHANGE
Это уведомление сообщает приложению о том, что произошло изменение, связанное с ассоциациями: возникла новая ассоциация или завершилась существующая. Структура данных имеет следующий формат:
struct sctp_assoc_change {
u_int16_t sac_type;
u_int16_t sac_flags;
u_int32_t sac_length;
u_int16_t sac_state;
u_int16_t sac_error;
u_int16_t sac_outbound_streams;
u_int16_t sac_inbound_streams;
sctp_assoc_t sac_assoc_id;
uint8_t sac_info[];
};
Поле sac_state определяет тип события, связанного с ассоциацией. Оно может принимать следующие значения:
□ SCTP_COMM_UP — создана новая ассоциация. Поля входящих и исходящих потоков (inbound_streams и outbound_streams) говорят о том, сколько потоков доступно в соответствующих направлениях. Идентификатор ассоциации позволяет взаимодействовать со стеком SCTP;
□ SCTP_COMM_LOST — ассоциация закрыта из-за превышения порога недоступности (заданное количество раз был превышен тайм-аут) или собеседник выполнил аварийное закрытие ассоциации (при помощи параметра сокета SO_LINGER или вызовом sendmsg с флагом MSG_ABORT). Пользовательские данные могут быть помещены в поле sac_info;
□ SCTP_RESTART — собеседник перезапущен. Наиболее типичной причиной этого уведомления бывает выход из строя и перезапуск собеседника. Приложение должно проверить количество потоков в обоих направлениях, потому что при перезапуске эти значения могут измениться;
□ SCTP_SHUTDOWN_COMP — закончено завершение соединения, инициированное локальной конечной точкой (вызовом shutdown или sendmsg с флагом MSG_EOF). После получения этого сообщения сокет типа «один-к-одному» может быть использован для подключения к другому собеседнику;
□ SCTP_CANT_STR_ASSOC — собеседник не ответил при попытке установления ассоциации.
Поле sac_error содержит коды причин ошибок протокола SCTP, которые могли привести к изменению состояния ассоциации. Поля sac_inbound_streams и sac_outbound_streams говорят о том, какое количество потоков в каждом направлении было согласовано во время установки ассоциации. Поле sac_assoc_id содержит уникальный идентификатор ассоциации, который может использоваться как при работе с параметрами сокета, так и в последующих уведомлениях. Наконец, поле sac_info может содержать дополнительные пользовательские сведения. Например, если ассоциация была разорвана собеседником в связи с ошибкой, определенной пользователем, код этой ошибки будет помещен в поле sac_info.
■ SCTP_PEER_ADDR_CHANGE Это уведомление говорит об изменении состояния одного из адресов собеседника. Изменение может заключаться либо в отказе (отсутствии подтверждения отправленных на этот адрес данных), либо в восстановлении (ответе отказавшего ранее адреса). Структура данных имеет следующий формат:
struct sctp_paddr_change {
u_int16_t spc_type;
u_int16_t spc_flags;
u_int32_t spc_length;
struct sockaddr_storage spc_aaddr;
u_int32_t spc_state;
u_int32_t spc_error;
sctp_assoc_t spc_assoc_id;
};
Поле spc_aaddr содержит адрес собеседника, с которым связано данное событие. Поле spc_state может принимать одно из значений, перечисленных в табл. 9.3.
Таблица 9.3. Уведомление о состоянии адреса собеседника
spc_state Значение SCTP_ADDR_ADDED Адрес добавлен к ассоциации SCTP_ADDR_AVAILABLE Адрес доступен SCTP_ADDR_CONFIRMED Адрес подтвержден и считается действующим SCTP_ADDR_MADE_PRIM Адрес сделан основным SCTP_ADDR_REMOVED Адрес удален из списка адресов ассоциации SCTP_ADDR_UNREACHABLE Адрес недоступен