From: Lennart Poettering Date: Fri, 12 Apr 2013 20:48:34 +0000 (+0200) Subject: kbdus: add null bloom filter to our messages X-Git-Tag: v202~119 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=b5baa8fe8838870cc2bd7cef0949299f061ae15d;ds=sidebyside kbdus: add null bloom filter to our messages This makes things work again with the requirements of the kernel on bloom filters. --- diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index c1901384b..7918aeab1 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -69,7 +69,7 @@ static void append_payload_vec(struct kdbus_msg_data **d, const void *p, size_t static void append_destination(struct kdbus_msg_data **d, const char *s, size_t length) { assert(d); - assert(d); + assert(s); *d = ALIGN8_PTR(*d); @@ -80,6 +80,19 @@ static void append_destination(struct kdbus_msg_data **d, const char *s, size_t *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size); } +static void append_bloom(struct kdbus_msg_data **d, const void *p, size_t length) { + assert(d); + assert(p); + + *d = ALIGN8_PTR(*d); + + (*d)->size = offsetof(struct kdbus_msg_data, data) + length; + (*d)->type = KDBUS_MSG_BLOOM; + memcpy((*d)->data, p, length); + + *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size); +} + static int bus_message_setup_kmsg(sd_bus_message *m) { struct kdbus_msg_data *d; bool well_known; @@ -107,6 +120,8 @@ static int bus_message_setup_kmsg(sd_bus_message *m) { /* Add in fixed header, fields header, fields header padding and payload */ sz += 4 * ALIGN8(offsetof(struct kdbus_msg_data, vec) + sizeof(struct kdbus_vec)); + sz += ALIGN8(offsetof(struct kdbus_msg_data, data) + 5); + /* Add in well-known destination header */ if (well_known) { dl = strlen(m->destination); @@ -124,7 +139,7 @@ static int bus_message_setup_kmsg(sd_bus_message *m) { ((m->header->flags & SD_BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0); m->kdbus->dst_id = well_known ? 0 : - m->destination ? unique : (uint64_t) -1; + m->destination ? unique : KDBUS_DST_ID_BROADCAST; m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS1; m->kdbus->cookie = m->header->serial; @@ -150,6 +165,9 @@ static int bus_message_setup_kmsg(sd_bus_message *m) { if (m->body) append_payload_vec(&d, m->body, m->header->body_size); + if (m->kdbus->dst_id == KDBUS_DST_ID_BROADCAST) + append_bloom(&d, "bloom", 5); + m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus; assert(m->kdbus->size <= sz);