raop: fix sequence number overflow

Wrap sequence number when we reach uint16_t's max 0xFFFF.
This commit is contained in:
Colin Leroy 2016-11-06 12:54:13 -06:00 committed by Tanu Kaskinen
parent 81fa11e3a9
commit b95aebdb2d
3 changed files with 29 additions and 3 deletions

View file

@ -316,7 +316,12 @@ static size_t build_tcp_audio_packet(pa_raop_client *c, pa_memchunk *block, pa_m
buffer += packet->index / sizeof(uint32_t);
raw += block->index;
c->seq++;
if (c->seq == 0xFFFF) {
pa_log_debug("wrapping sequence number");
c->seq = pa_raop_packet_buffer_wrap_seq(c->pbuf, c->seq);
} else
c->seq++;
memcpy(buffer, tcp_audio_header, sizeof(tcp_audio_header));
buffer[1] |= htonl((uint32_t) c->seq);
buffer[2] = htonl(c->rtptime);
@ -421,7 +426,12 @@ static size_t build_udp_audio_packet(pa_raop_client *c, pa_memchunk *block, pa_m
}
c->rtptime += length / 4;
c->seq++;
if (c->seq == 0xFFFF) {
pa_log_debug("wrapping sequence number");
c->seq = pa_raop_packet_buffer_wrap_seq(c->pbuf, c->seq);
} else
c->seq++;
pa_memblock_release(block->memblock);

View file

@ -88,13 +88,28 @@ void pa_raop_packet_buffer_reset(pa_raop_packet_buffer *pb, uint16_t seq) {
}
}
uint16_t pa_raop_packet_buffer_wrap_seq(pa_raop_packet_buffer *pb, uint16_t seq) {
int seq_shift;
pa_assert(pb);
if (seq > pb->seq)
seq_shift = pb->seq - 1;
else
seq_shift = seq;
pb->seq -= seq_shift;
return seq - seq_shift;
}
pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size) {
pa_memchunk *packet = NULL;
size_t delta, i;
pa_assert(pb);
pa_assert(pb->packets);
pa_assert(seq > 0);
if (seq == pb->seq)
packet = &pb->packets[pb->pos];

View file

@ -35,4 +35,5 @@ void pa_raop_packet_buffer_free(pa_raop_packet_buffer *pb);
void pa_raop_packet_buffer_reset(pa_raop_packet_buffer *pb, uint16_t seq);
pa_memchunk *pa_raop_packet_buffer_get(pa_raop_packet_buffer *pb, uint16_t seq, const size_t size);
uint16_t pa_raop_packet_buffer_wrap_seq(pa_raop_packet_buffer *pb, uint16_t seq);
#endif