Skip to content

Commit d7b5e78

Browse files
ns: acknowledge the received creation message
the two phase handsake make the client could initiate the transfer immediately without the server side send any dummy message first. Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
1 parent c7757cf commit d7b5e78

5 files changed

Lines changed: 19 additions & 6 deletions

File tree

lib/include/openamp/rpmsg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ struct rpmsg_device {
120120
rpmsg_ns_bind_cb ns_bind_cb;
121121
struct rpmsg_device_ops ops;
122122
bool support_ns;
123+
bool support_ack;
123124
};
124125

125126
/**

lib/include/openamp/rpmsg_virtio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern "C" {
2828

2929
/* The feature bitmap for virtio rpmsg */
3030
#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */
31+
#define VIRTIO_RPMSG_F_ACK 1 /* RP supports name service acknowledge */
3132

3233
/**
3334
* struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers

lib/rpmsg/rpmsg.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,13 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev,
297297
rpmsg_register_endpoint(rdev, ept);
298298
metal_mutex_release(&rdev->lock);
299299

300-
/* Send NS announcement to remote processor */
300+
/* Send NS announcement/acknowledge to remote processor */
301301
if (ept->name[0] && rdev->support_ns &&
302302
ept->dest_addr == RPMSG_ADDR_ANY)
303303
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE);
304+
else if (ept->name[0] && rdev->support_ack &&
305+
ept->dest_addr != RPMSG_ADDR_ANY)
306+
status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE_ACK);
304307

305308
if (status)
306309
rpmsg_unregister_endpoint(ept);

lib/rpmsg/rpmsg_internal.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ extern "C" {
4646
*
4747
* @RPMSG_NS_CREATE: a new remote service was just created
4848
* @RPMSG_NS_DESTROY: a known remote service was just destroyed
49-
* @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting
50-
* acknowledgment.
49+
* @RPMSG_NS_CREATE_ACK: acknowledge the previous creation message
5150
*/
5251
enum rpmsg_ns_flags {
5352
RPMSG_NS_CREATE = 0,
5453
RPMSG_NS_DESTROY = 1,
54+
RPMSG_NS_CREATE_ACK = 2,
5555
};
5656

5757
/**

lib/rpmsg/rpmsg_virtio.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,13 +555,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
555555
metal_mutex_acquire(&rdev->lock);
556556
_ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest);
557557

558-
if (ns_msg->flags & RPMSG_NS_DESTROY) {
558+
if (ns_msg->flags == RPMSG_NS_DESTROY) {
559559
if (_ept)
560560
_ept->dest_addr = RPMSG_ADDR_ANY;
561561
metal_mutex_release(&rdev->lock);
562562
if (_ept && _ept->ns_unbind_cb)
563563
_ept->ns_unbind_cb(_ept);
564-
} else {
564+
} else if (ns_msg->flags == RPMSG_NS_CREATE) {
565565
if (!_ept) {
566566
/*
567567
* send callback to application, that can
@@ -575,7 +575,14 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
575575
} else {
576576
_ept->dest_addr = dest;
577577
metal_mutex_release(&rdev->lock);
578+
if (_ept->name[0] && rdev->support_ack)
579+
rpmsg_send_ns_message(_ept, RPMSG_NS_CREATE_ACK);
578580
}
581+
} else { /* RPMSG_NS_CREATE_ACK */
582+
/* save the received destination address */
583+
if (_ept)
584+
_ept->dest_addr = dest;
585+
metal_mutex_release(&rdev->lock);
579586
}
580587

581588
return RPMSG_SUCCESS;
@@ -628,6 +635,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
628635
#endif /*!VIRTIO_MASTER_ONLY*/
629636
vdev->features = rpmsg_virtio_get_features(rvdev);
630637
rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS));
638+
rdev->support_ack = !!(vdev->features & (1 << VIRTIO_RPMSG_F_ACK));
631639

632640
#ifndef VIRTIO_SLAVE_ONLY
633641
if (role == RPMSG_MASTER) {
@@ -723,7 +731,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
723731
* Create name service announcement endpoint if device supports name
724732
* service announcement feature.
725733
*/
726-
if (rdev->support_ns) {
734+
if (rdev->support_ns || rdev->support_ack) {
727735
rpmsg_initialize_ept(&rdev->ns_ept, "NS",
728736
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
729737
rpmsg_virtio_ns_callback, NULL);

0 commit comments

Comments
 (0)