mirror of
https://github.com/systemd/systemd.git
synced 2024-10-28 20:25:38 +03:00
bus: sync with kdbus.git
Changes: * bloom parameters are returned in an offset via HELLO * FREE now takes items just like any other ioctl
This commit is contained in:
parent
eccaf89933
commit
d31f486b83
@ -815,7 +815,9 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int bus_kernel_take_fd(sd_bus *b) {
|
int bus_kernel_take_fd(sd_bus *b) {
|
||||||
|
struct kdbus_bloom_parameter *bloom = NULL;
|
||||||
struct kdbus_cmd_hello *hello;
|
struct kdbus_cmd_hello *hello;
|
||||||
|
struct kdbus_item_list *items;
|
||||||
struct kdbus_item *item;
|
struct kdbus_item *item;
|
||||||
_cleanup_free_ char *g = NULL;
|
_cleanup_free_ char *g = NULL;
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -928,23 +930,40 @@ int bus_kernel_take_fd(sd_bus *b) {
|
|||||||
b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
|
b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
|
||||||
if (b->kdbus_buffer == MAP_FAILED) {
|
if (b->kdbus_buffer == MAP_FAILED) {
|
||||||
b->kdbus_buffer = NULL;
|
b->kdbus_buffer = NULL;
|
||||||
return -errno;
|
r = -errno;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The higher 32bit of the bus_flags fields are considered
|
/* The higher 32bit of the bus_flags fields are considered
|
||||||
* 'incompatible flags'. Refuse them all for now. */
|
* 'incompatible flags'. Refuse them all for now. */
|
||||||
if (hello->bus_flags > 0xFFFFFFFFULL)
|
if (hello->bus_flags > 0xFFFFFFFFULL) {
|
||||||
return -ENOTSUP;
|
r = -ENOTSUP;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
|
/* extract bloom parameters from items */
|
||||||
return -ENOTSUP;
|
items = (void*)((uint8_t*)b->kdbus_buffer + hello->offset);
|
||||||
|
KDBUS_ITEM_FOREACH(item, items, items) {
|
||||||
|
switch (item->type) {
|
||||||
|
case KDBUS_ITEM_BLOOM_PARAMETER:
|
||||||
|
bloom = &item->bloom_parameter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
b->bloom_size = (size_t) hello->bloom.size;
|
if (!bloom || !bloom_validate_parameters((size_t) bloom->size, (unsigned) bloom->n_hash)) {
|
||||||
b->bloom_n_hash = (unsigned) hello->bloom.n_hash;
|
r = -ENOTSUP;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0)
|
b->bloom_size = (size_t) bloom->size;
|
||||||
return -ENOMEM;
|
b->bloom_n_hash = (unsigned) bloom->n_hash;
|
||||||
|
|
||||||
|
if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0) {
|
||||||
|
r = -ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
b->unique_id = hello->id;
|
b->unique_id = hello->id;
|
||||||
|
|
||||||
@ -957,7 +976,14 @@ int bus_kernel_take_fd(sd_bus *b) {
|
|||||||
/* the kernel told us the UUID of the underlying bus */
|
/* the kernel told us the UUID of the underlying bus */
|
||||||
memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
|
memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
|
||||||
|
|
||||||
|
/* free returned items */
|
||||||
|
(void) bus_kernel_cmd_free(b, hello->offset);
|
||||||
|
|
||||||
return bus_start_running(b);
|
return bus_start_running(b);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
(void) bus_kernel_cmd_free(b, hello->offset);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bus_kernel_connect(sd_bus *b) {
|
int bus_kernel_connect(sd_bus *b) {
|
||||||
@ -980,6 +1006,7 @@ int bus_kernel_connect(sd_bus *b) {
|
|||||||
|
|
||||||
int bus_kernel_cmd_free(sd_bus *bus, uint64_t offset) {
|
int bus_kernel_cmd_free(sd_bus *bus, uint64_t offset) {
|
||||||
struct kdbus_cmd_free cmd = {
|
struct kdbus_cmd_free cmd = {
|
||||||
|
.size = sizeof(cmd),
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.offset = offset,
|
.offset = offset,
|
||||||
};
|
};
|
||||||
@ -1724,6 +1751,7 @@ int bus_kernel_make_starter(
|
|||||||
BusNamePolicy *policy,
|
BusNamePolicy *policy,
|
||||||
BusPolicyAccess world_policy) {
|
BusPolicyAccess world_policy) {
|
||||||
|
|
||||||
|
struct kdbus_cmd_free cmd_free = { .size = sizeof(cmd_free) };
|
||||||
struct kdbus_cmd_hello *hello;
|
struct kdbus_cmd_hello *hello;
|
||||||
struct kdbus_item *n;
|
struct kdbus_item *n;
|
||||||
size_t policy_cnt = 0;
|
size_t policy_cnt = 0;
|
||||||
@ -1781,14 +1809,15 @@ int bus_kernel_make_starter(
|
|||||||
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
|
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
/* not interested in any output values */
|
||||||
|
cmd_free.offset = hello->offset;
|
||||||
|
(void) ioctl(fd, KDBUS_CMD_FREE, &cmd_free);
|
||||||
|
|
||||||
/* The higher 32bit of the bus_flags fields are considered
|
/* The higher 32bit of the bus_flags fields are considered
|
||||||
* 'incompatible flags'. Refuse them all for now. */
|
* 'incompatible flags'. Refuse them all for now. */
|
||||||
if (hello->bus_flags > 0xFFFFFFFFULL)
|
if (hello->bus_flags > 0xFFFFFFFFULL)
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
|
||||||
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
|
|
||||||
return -ENOTSUP;
|
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,6 +132,7 @@ static void message_free(sd_bus_message *m) {
|
|||||||
if (m->release_kdbus) {
|
if (m->release_kdbus) {
|
||||||
struct kdbus_cmd_free cmd_free = { };
|
struct kdbus_cmd_free cmd_free = { };
|
||||||
|
|
||||||
|
cmd_free.size = sizeof(cmd_free);
|
||||||
cmd_free.flags = 0;
|
cmd_free.flags = 0;
|
||||||
cmd_free.offset = (uint8_t *)m->kdbus - (uint8_t *)m->bus->kdbus_buffer;
|
cmd_free.offset = (uint8_t *)m->kdbus - (uint8_t *)m->bus->kdbus_buffer;
|
||||||
(void) ioctl(m->bus->input_fd, KDBUS_CMD_FREE, &cmd_free);
|
(void) ioctl(m->bus->input_fd, KDBUS_CMD_FREE, &cmd_free);
|
||||||
|
@ -383,6 +383,16 @@ struct kdbus_item {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct kdbus_item_list - A list of items
|
||||||
|
* @size: The total size of the structure
|
||||||
|
* @items: Array of items
|
||||||
|
*/
|
||||||
|
struct kdbus_item_list {
|
||||||
|
__u64 size;
|
||||||
|
struct kdbus_item items[0];
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* enum kdbus_msg_flags - type of message
|
* enum kdbus_msg_flags - type of message
|
||||||
* @KDBUS_MSG_EXPECT_REPLY: Expect a reply message, used for
|
* @KDBUS_MSG_EXPECT_REPLY: Expect a reply message, used for
|
||||||
@ -576,19 +586,23 @@ struct kdbus_cmd_cancel {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* struct kdbus_cmd_free - struct to free a slice of memory in the pool
|
* struct kdbus_cmd_free - struct to free a slice of memory in the pool
|
||||||
|
* @size: Overall size of this structure
|
||||||
* @offset: The offset of the memory slice, as returned by other
|
* @offset: The offset of the memory slice, as returned by other
|
||||||
* ioctls
|
* ioctls
|
||||||
* @flags: Flags for the free command, userspace → kernel
|
* @flags: Flags for the free command, userspace → kernel
|
||||||
* @return_flags: Command return flags, kernel → userspace
|
* @return_flags: Command return flags, kernel → userspace
|
||||||
* @kernel_flags: Supported flags of the free command, userspace → kernel
|
* @kernel_flags: Supported flags of the free command, userspace → kernel
|
||||||
|
* @items: Additional items to modify the behavior
|
||||||
*
|
*
|
||||||
* This struct is used with the KDBUS_CMD_FREE ioctl.
|
* This struct is used with the KDBUS_CMD_FREE ioctl.
|
||||||
*/
|
*/
|
||||||
struct kdbus_cmd_free {
|
struct kdbus_cmd_free {
|
||||||
|
__u64 size;
|
||||||
__u64 offset;
|
__u64 offset;
|
||||||
__u64 flags;
|
__u64 flags;
|
||||||
__u64 kernel_flags;
|
__u64 kernel_flags;
|
||||||
__u64 return_flags;
|
__u64 return_flags;
|
||||||
|
struct kdbus_item items[0];
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -701,6 +715,10 @@ enum kdbus_attach_flags {
|
|||||||
* @id: The ID of this connection (kernel → userspace)
|
* @id: The ID of this connection (kernel → userspace)
|
||||||
* @pool_size: Size of the connection's buffer where the received
|
* @pool_size: Size of the connection's buffer where the received
|
||||||
* messages are placed
|
* messages are placed
|
||||||
|
* @offset: Pool offset where additional items of type
|
||||||
|
* kdbus_item_list are stored. They contain information
|
||||||
|
* about the bus and the newly created connection.
|
||||||
|
* @items_size: Copy of item_list.size stored in @offset.
|
||||||
* @bloom: The bloom properties of the bus, specified
|
* @bloom: The bloom properties of the bus, specified
|
||||||
* by the bus creator (kernel → userspace)
|
* by the bus creator (kernel → userspace)
|
||||||
* @id128: Unique 128-bit ID of the bus (kernel → userspace)
|
* @id128: Unique 128-bit ID of the bus (kernel → userspace)
|
||||||
@ -718,7 +736,8 @@ struct kdbus_cmd_hello {
|
|||||||
__u64 bus_flags;
|
__u64 bus_flags;
|
||||||
__u64 id;
|
__u64 id;
|
||||||
__u64 pool_size;
|
__u64 pool_size;
|
||||||
struct kdbus_bloom_parameter bloom;
|
__u64 offset;
|
||||||
|
__u64 items_size;
|
||||||
__u8 id128[16];
|
__u8 id128[16];
|
||||||
struct kdbus_item items[0];
|
struct kdbus_item items[0];
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
Loading…
Reference in New Issue
Block a user