|
45 | 45 | #define MCTP_DBUS_PATH_LINKS "/au/com/codeconstruct/mctp1/interfaces"
|
46 | 46 | #define CC_MCTP_DBUS_IFACE_BUSOWNER "au.com.codeconstruct.MCTP.BusOwner1"
|
47 | 47 | #define CC_MCTP_DBUS_IFACE_ENDPOINT "au.com.codeconstruct.MCTP.Endpoint1"
|
| 48 | +#define CC_MCTP_DBUS_IFACE_BRIDGE "au.com.codeconstruct.MCTP.Bridge1" |
48 | 49 | #define CC_MCTP_DBUS_IFACE_TESTING "au.com.codeconstruct.MCTPTesting"
|
49 | 50 | #define MCTP_DBUS_NAME "au.com.codeconstruct.MCTP1"
|
50 | 51 | #define MCTP_DBUS_IFACE_ENDPOINT "xyz.openbmc_project.MCTP.Endpoint"
|
@@ -156,6 +157,7 @@ struct peer {
|
156 | 157 | bool published;
|
157 | 158 | sd_bus_slot *slot_obmc_endpoint;
|
158 | 159 | sd_bus_slot *slot_cc_endpoint;
|
| 160 | + sd_bus_slot *slot_bridge; |
159 | 161 | sd_bus_slot *slot_uuid;
|
160 | 162 | char *path;
|
161 | 163 |
|
@@ -257,6 +259,7 @@ static int endpoint_allocate_eid(struct peer *peer);
|
257 | 259 |
|
258 | 260 | static const sd_bus_vtable bus_endpoint_obmc_vtable[];
|
259 | 261 | static const sd_bus_vtable bus_endpoint_cc_vtable[];
|
| 262 | +static const sd_bus_vtable bus_endpoint_bridge[]; |
260 | 263 | static const sd_bus_vtable bus_endpoint_uuid_vtable[];
|
261 | 264 |
|
262 | 265 | __attribute__((format(printf, 1, 2))) static void bug_warn(const char *fmt, ...)
|
@@ -1599,6 +1602,7 @@ static void free_peers(struct ctx *ctx)
|
1599 | 1602 | free(peer->path);
|
1600 | 1603 | sd_bus_slot_unref(peer->slot_obmc_endpoint);
|
1601 | 1604 | sd_bus_slot_unref(peer->slot_cc_endpoint);
|
| 1605 | + sd_bus_slot_unref(peer->slot_bridge); |
1602 | 1606 | sd_bus_slot_unref(peer->slot_uuid);
|
1603 | 1607 | free(peer);
|
1604 | 1608 | }
|
@@ -2613,6 +2617,11 @@ static int publish_peer(struct peer *peer, bool add_route)
|
2613 | 2617 | peer->path, CC_MCTP_DBUS_IFACE_ENDPOINT,
|
2614 | 2618 | bus_endpoint_cc_vtable, peer);
|
2615 | 2619 |
|
| 2620 | + if (peer->pool_size > 0) { |
| 2621 | + sd_bus_add_object_vtable(peer->ctx->bus, &peer->slot_bridge, |
| 2622 | + peer->path, CC_MCTP_DBUS_IFACE_BRIDGE, |
| 2623 | + bus_endpoint_bridge, peer); |
| 2624 | + } |
2616 | 2625 | if (peer->uuid) {
|
2617 | 2626 | sd_bus_add_object_vtable(peer->ctx->bus, &peer->slot_uuid,
|
2618 | 2627 | peer->path, OPENBMC_IFACE_COMMON_UUID,
|
@@ -2663,6 +2672,8 @@ static int unpublish_peer(struct peer *peer)
|
2663 | 2672 | peer->slot_obmc_endpoint = NULL;
|
2664 | 2673 | sd_bus_slot_unref(peer->slot_cc_endpoint);
|
2665 | 2674 | peer->slot_cc_endpoint = NULL;
|
| 2675 | + sd_bus_slot_unref(peer->slot_bridge); |
| 2676 | + peer->slot_bridge = NULL; |
2666 | 2677 | sd_bus_slot_unref(peer->slot_uuid);
|
2667 | 2678 | peer->slot_uuid = NULL;
|
2668 | 2679 | peer->published = false;
|
@@ -3047,6 +3058,33 @@ static int bus_endpoint_get_prop(sd_bus *bus, const char *path,
|
3047 | 3058 | return rc;
|
3048 | 3059 | }
|
3049 | 3060 |
|
| 3061 | +static int bus_bridge_get_prop(sd_bus *bus, const char *path, |
| 3062 | + const char *interface, const char *property, |
| 3063 | + sd_bus_message *reply, void *userdata, |
| 3064 | + sd_bus_error *berr) |
| 3065 | +{ |
| 3066 | + struct peer *peer = userdata; |
| 3067 | + int rc; |
| 3068 | + |
| 3069 | + if (strcmp(property, "PoolStart") == 0) { |
| 3070 | + rc = sd_bus_message_append(reply, "y", peer->pool_start); |
| 3071 | + } else if (strcmp(property, "PoolSize") == 0) { |
| 3072 | + rc = sd_bus_message_append(reply, "y", peer->pool_size); |
| 3073 | + } else if (strcmp(property, "PoolEnd") == 0) { |
| 3074 | + uint8_t pool_end = |
| 3075 | + peer->pool_size ? |
| 3076 | + peer->pool_start + peer->pool_size - 1 : |
| 3077 | + 0; |
| 3078 | + rc = sd_bus_message_append(reply, "y", pool_end); |
| 3079 | + } else { |
| 3080 | + warnx("Unknown bridge property '%s' for %s iface %s", property, |
| 3081 | + path, interface); |
| 3082 | + rc = -ENOENT; |
| 3083 | + } |
| 3084 | + |
| 3085 | + return rc; |
| 3086 | +} |
| 3087 | + |
3050 | 3088 | static int bus_network_get_prop(sd_bus *bus, const char *path,
|
3051 | 3089 | const char *interface, const char *property,
|
3052 | 3090 | sd_bus_message *reply, void *userdata,
|
@@ -3246,6 +3284,26 @@ static const sd_bus_vtable bus_endpoint_cc_vtable[] = {
|
3246 | 3284 | SD_BUS_VTABLE_END
|
3247 | 3285 | };
|
3248 | 3286 |
|
| 3287 | +static const sd_bus_vtable bus_endpoint_bridge[] = { |
| 3288 | + SD_BUS_VTABLE_START(0), |
| 3289 | + SD_BUS_PROPERTY("PoolStart", |
| 3290 | + "y", |
| 3291 | + bus_bridge_get_prop, |
| 3292 | + 0, |
| 3293 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3294 | + SD_BUS_PROPERTY("PoolSize", |
| 3295 | + "y", |
| 3296 | + bus_bridge_get_prop, |
| 3297 | + 0, |
| 3298 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3299 | + SD_BUS_PROPERTY("PoolEnd", |
| 3300 | + "y", |
| 3301 | + bus_bridge_get_prop, |
| 3302 | + 0, |
| 3303 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3304 | + SD_BUS_VTABLE_END |
| 3305 | +}; |
| 3306 | + |
3249 | 3307 | static const sd_bus_vtable bus_link_vtable[] = {
|
3250 | 3308 | SD_BUS_VTABLE_START(0),
|
3251 | 3309 | SD_BUS_WRITABLE_PROPERTY("Role",
|
|
0 commit comments