Я пытаюсь проанализировать 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 и порты.
Я что-то пропустил?