connection: do version check only once

This commit is contained in:
Wim Taymans 2020-10-30 12:56:37 +01:00
parent 0ef41252bd
commit 21bda3102b

View file

@ -45,6 +45,7 @@
#define MAX_FDS 1024 #define MAX_FDS 1024
#define MAX_FDS_MSG 28 #define MAX_FDS_MSG 28
#define HDR_SIZE_V0 8
#define HDR_SIZE 16 #define HDR_SIZE 16
static bool debug_messages = 0; static bool debug_messages = 0;
@ -71,6 +72,7 @@ struct impl {
uint32_t version; uint32_t version;
size_t hdr_size; size_t hdr_size;
unsigned int checked:1;
}; };
/** \endcond */ /** \endcond */
@ -317,20 +319,20 @@ static int prepare_packet(struct pw_protocol_native_connection *conn, struct buf
buf->msg.opcode = p[1] >> 24; buf->msg.opcode = p[1] >> 24;
len = p[1] & 0xffffff; len = p[1] & 0xffffff;
if (buf->msg.id == 0 && buf->msg.opcode == 1) { if (!impl->checked) {
if (p[3] >= 4) { if (p[3] >= 4) {
pw_log_warn("old version detected"); pw_log_warn("old version detected");
impl->version = 0; impl->version = 0;
impl->hdr_size = 8; impl->hdr_size = HDR_SIZE_V0;
} else { } else {
impl->version = 3; impl->version = 3;
impl->hdr_size = 16; impl->hdr_size = HDR_SIZE;
} }
spa_hook_list_call(&conn->listener_list, spa_hook_list_call(&conn->listener_list,
struct pw_protocol_native_connection_events, struct pw_protocol_native_connection_events,
start, 0, impl->version); start, 0, impl->version);
impl->checked = 1;
} }
if (impl->version >= 3) { if (impl->version >= 3) {
buf->msg.seq = p[2]; buf->msg.seq = p[2];
buf->msg.n_fds = p[3]; buf->msg.n_fds = p[3];
@ -338,6 +340,7 @@ static int prepare_packet(struct pw_protocol_native_connection *conn, struct buf
buf->msg.seq = 0; buf->msg.seq = 0;
buf->msg.n_fds = 0; buf->msg.n_fds = 0;
} }
data += impl->hdr_size; data += impl->hdr_size;
size -= impl->hdr_size; size -= impl->hdr_size;
buf->msg.fds = &buf->fds[buf->fds_offset]; buf->msg.fds = &buf->fds[buf->fds_offset];