Linux Сеть: порядковый номер RTP не увеличивается - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь проанализировать RTP-пакеты, вот что я делаю в своей программе:

uint8_t *pkt = xsk_umem__get_data(xsk->umem->buffer, addr);

struct ethhdr *eth = (struct ethhdr*) pkt;

const uint16_t packetIPVersion = ntohs(eth->h_proto);
if(packetIPVersion == ETH_P_IPV6) {
    printf("IPv6!\n");
} else if(packetIPVersion == ETH_P_IP) {
    struct iphdr *iph = (struct iphdr*)(pkt + sizeof(struct ethhdr));
    if(iph->protocol == IPPROTO_UDP) {
        const uint16_t iph_sz_in_bytes = iph->ihl * 4;
        const uint16_t iph_tot_lngth = ntohs(iph->tot_len);

        printf("IP-Header size: %d\n", iph_sz_in_bytes);
        printf("IP-Length: %d\n", iph_tot_lngth);

        struct udphdr *udh = (struct udphdr*)(pkt + sizeof(struct ethhdr) + iph_sz_in_bytes);
        printf("UDP-len: %d\n", ntohs(udh->len));
        printf("UDP-SRC Port: %d\n", ntohs(udh->source));
        printf("UDP-DEST PORT: %d\n", ntohs(udh->dest));

        uint64_t *rtp_hdr = (uint64_t*)(pkt + sizeof(struct ethhdr) + iph_sz_in_bytes + sizeof(struct udphdr));
        uint16_t *rtp_vrsn_nmbr = &rtp_hdr[0];
        uint16_t *rtp_sqnz_nmbr = &rtp_hdr[2];
        uint32_t *rtp_tmstmp = &rtp_hdr[4];

        printf("RTP-VRSN-NMBR: 0x%02X\n", ntohs(*rtp_vrsn_nmbr));
        printf("RTP-SQNZ-NMBR: 0x%02X\n", ntohs(*rtp_sqnz_nmbr));
        printf("RTP-TMSTMP: 0x%04X\n", ntohs(*rtp_tmstmp));
    }
}

И это вывод:

IP-Header size: 20
IP-Length: 1428
UDP-len: 1408
UDP-SRC Port: xxxx
UDP-DEST PORT: xxxx
RTP-VRSN-NMBR: 0x8062
RTP-SQNZ-NMBR: 0x211
RTP-TMSTMP: 0xA169

IP-Header size: 20
IP-Length: 1428
UDP-len: 1408
UDP-SRC Port: xxxx
UDP-DEST PORT: xxxx
RTP-VRSN-NMBR: 0x8062
RTP-SQNZ-NMBR: 0x211
RTP-TMSTMP: 0x357A

IP-Header size: 20
IP-Length: 1428
UDP-len: 1408
UDP-SRC Port: xxxx
UDP-DEST PORT: xxxx
RTP-VRSN-NMBR: 0x8062
RTP-SQNZ-NMBR: 0x211
RTP-TMSTMP: 0x63C4

Как видите, номер версии RTP остается неизменным.

Размер и длина IP-заголовка мне подходят, а также длина UDP и порты.

Я что-то пропустил?

1 Ответ

0 голосов
/ 26 февраля 2020

Проблема в том, что я объявил rtp_hdr как uint64_t*, и поэтому доступ к &rtp_hdr[2] - это не 3-й байт, а фактически 24-й байт. Объявление uint8_t *rtp_hdr решает проблему.

...