Протоколы Internet


Транспортный протокол реального времени RTCP - часть 21


Расширения SR/RR. Секция расширения может быть определена для RTCP SR и RR пакетов, если имеется дополнительная информация о получателе или отправителе, которая должна регулярно передаваться.

Проверка корректности заголовка RTCP

Пакеты RTCP подвергаются следующим проверкам.

  • RTP поле версии должно быть равно 2.
  • Поле типа данных первого RTCP пакета в составном пакете должно быть SR или RR.
  • Бит заполнителя (P) должен быть равен нулю для первого пакета составного RTCP пакета, так как заполнитель может присутствовать только в последнем.
  • Длина полей индивидуальных RTCP-пакетов должна в сумме равняться полной длине составного пакета.

Фрагмент приведенной ниже программы выполняет все рассмотренные проверки (текст взят из ссылки, приведенной в начале раздела). Тип пакета для последующих пакетов не проверяется, так как не известный тип пакета должен игнорироваться.

u_int32 len; /* Длина составного RTCP пакета в словах */

rtcp_t *r; /* заголовок RTCP */

rtcp_t *end; /* Конец составного RTCP пакета */

if ((*(u_int16 *)r & RTCP_VALID_MASK) != RTCP_VALID_VALUE) {

/* что-то не в порядке с форматом пакета */

}

end = (rtcp_t *)((u_int32 *)r + len);

do r = (rtcp_t *)((u_int32 *)r + r->common.length + 1);

while (r < end && r->common.version == 2);

if (r != end) {

/* что-то не в порядке с форматом пакета */

}

Генерирование пакетов SDES RTCP

Эта функция формирует фрагмент SDES, состоящий из элементов argc, взятых из массивов type, в буфере b.

char *rtp_write_sdes(char *b, u_int32 src, int argc,

rtcp_sdes_type_t type[], char *value[],

int length[])

{

rtcp_sdes_t *s = (rtcp_sdes_t *)b;

rtcp_sdes_item_t *rsp;

int i;

int len;

int pad;

/* SSRC header */

s->src = src;

rsp = &s->item[0];

/* SDES items */

for (i = 0; i < argc; i++) {

rsp->type = type[i];

len = length[i];

if (len > RTP_MAX_SDES) {

/* неверная длина, возможно нужны другие действия */

len = RTP_MAX_SDES;

}

rsp->length = len;

memcpy(rsp->data, value[i], len);




Начало  Назад  Вперед