|
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 | }
|
@@ -2581,6 +2585,11 @@ static int publish_peer(struct peer *peer, bool add_route)
|
2581 | 2585 | peer->path, CC_MCTP_DBUS_IFACE_ENDPOINT,
|
2582 | 2586 | bus_endpoint_cc_vtable, peer);
|
2583 | 2587 |
|
| 2588 | + if (peer->pool_size > 0) { |
| 2589 | + sd_bus_add_object_vtable(peer->ctx->bus, &peer->slot_bridge, |
| 2590 | + peer->path, CC_MCTP_DBUS_IFACE_BRIDGE, |
| 2591 | + bus_endpoint_bridge, peer); |
| 2592 | + } |
2584 | 2593 | if (peer->uuid) {
|
2585 | 2594 | sd_bus_add_object_vtable(peer->ctx->bus, &peer->slot_uuid,
|
2586 | 2595 | peer->path, OPENBMC_IFACE_COMMON_UUID,
|
@@ -2631,6 +2640,8 @@ static int unpublish_peer(struct peer *peer)
|
2631 | 2640 | peer->slot_obmc_endpoint = NULL;
|
2632 | 2641 | sd_bus_slot_unref(peer->slot_cc_endpoint);
|
2633 | 2642 | peer->slot_cc_endpoint = NULL;
|
| 2643 | + sd_bus_slot_unref(peer->slot_bridge); |
| 2644 | + peer->slot_bridge = NULL; |
2634 | 2645 | sd_bus_slot_unref(peer->slot_uuid);
|
2635 | 2646 | peer->slot_uuid = NULL;
|
2636 | 2647 | peer->published = false;
|
@@ -3015,6 +3026,33 @@ static int bus_endpoint_get_prop(sd_bus *bus, const char *path,
|
3015 | 3026 | return rc;
|
3016 | 3027 | }
|
3017 | 3028 |
|
| 3029 | +static int bus_bridge_get_prop(sd_bus *bus, const char *path, |
| 3030 | + const char *interface, const char *property, |
| 3031 | + sd_bus_message *reply, void *userdata, |
| 3032 | + sd_bus_error *berr) |
| 3033 | +{ |
| 3034 | + struct peer *peer = userdata; |
| 3035 | + int rc; |
| 3036 | + |
| 3037 | + if (strcmp(property, "PoolStart") == 0) { |
| 3038 | + rc = sd_bus_message_append(reply, "y", peer->pool_start); |
| 3039 | + } else if (strcmp(property, "PoolSize") == 0) { |
| 3040 | + rc = sd_bus_message_append(reply, "y", peer->pool_size); |
| 3041 | + } else if (strcmp(property, "PoolEnd") == 0) { |
| 3042 | + uint8_t pool_end = |
| 3043 | + peer->pool_size ? |
| 3044 | + peer->pool_start + peer->pool_size - 1 : |
| 3045 | + 0; |
| 3046 | + rc = sd_bus_message_append(reply, "y", pool_end); |
| 3047 | + } else { |
| 3048 | + warnx("Unknown bridge property '%s' for %s iface %s", property, |
| 3049 | + path, interface); |
| 3050 | + rc = -ENOENT; |
| 3051 | + } |
| 3052 | + |
| 3053 | + return rc; |
| 3054 | +} |
| 3055 | + |
3018 | 3056 | static int bus_network_get_prop(sd_bus *bus, const char *path,
|
3019 | 3057 | const char *interface, const char *property,
|
3020 | 3058 | sd_bus_message *reply, void *userdata,
|
@@ -3214,6 +3252,26 @@ static const sd_bus_vtable bus_endpoint_cc_vtable[] = {
|
3214 | 3252 | SD_BUS_VTABLE_END
|
3215 | 3253 | };
|
3216 | 3254 |
|
| 3255 | +static const sd_bus_vtable bus_endpoint_bridge[] = { |
| 3256 | + SD_BUS_VTABLE_START(0), |
| 3257 | + SD_BUS_PROPERTY("PoolStart", |
| 3258 | + "y", |
| 3259 | + bus_bridge_get_prop, |
| 3260 | + 0, |
| 3261 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3262 | + SD_BUS_PROPERTY("PoolSize", |
| 3263 | + "y", |
| 3264 | + bus_bridge_get_prop, |
| 3265 | + 0, |
| 3266 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3267 | + SD_BUS_PROPERTY("PoolEnd", |
| 3268 | + "y", |
| 3269 | + bus_bridge_get_prop, |
| 3270 | + 0, |
| 3271 | + SD_BUS_VTABLE_PROPERTY_CONST), |
| 3272 | + SD_BUS_VTABLE_END |
| 3273 | +}; |
| 3274 | + |
3217 | 3275 | static const sd_bus_vtable bus_link_vtable[] = {
|
3218 | 3276 | SD_BUS_VTABLE_START(0),
|
3219 | 3277 | SD_BUS_WRITABLE_PROPERTY("Role",
|
|
0 commit comments