From a26f5b5940813ea600fb95c2c70894f6d86ee845 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Mon, 7 Jan 2019 00:26:09 +0800 Subject: [PATCH 1/2] check VIRTIO_RPMSG_F_NS before send the namespace message Signed-off-by: Xiang Xiao --- lib/include/openamp/rpmsg.h | 2 ++ lib/rpmsg/rpmsg.c | 4 ++-- lib/rpmsg/rpmsg_virtio.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/include/openamp/rpmsg.h b/lib/include/openamp/rpmsg.h index 6c320c00f..30f4c7807 100644 --- a/lib/include/openamp/rpmsg.h +++ b/lib/include/openamp/rpmsg.h @@ -98,6 +98,7 @@ struct rpmsg_device_ops { * @ns_bind_cb: callback handler for name service announcement without local * endpoints waiting to bind. * @ops: RPMsg device operations + * @support_ns: create/destroy namespace message */ struct rpmsg_device { struct metal_list endpoints; @@ -106,6 +107,7 @@ struct rpmsg_device { metal_mutex_t lock; rpmsg_ns_bind_cb ns_bind_cb; struct rpmsg_device_ops ops; + bool support_ns; }; /** diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index 7588ddd77..e4467570e 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -227,7 +227,7 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb); rpmsg_register_endpoint(rdev, ept); - if (ept->dest_addr == RPMSG_ADDR_ANY) { + if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) { /* Send NS announcement to remote processor */ metal_mutex_release(&rdev->lock); status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); @@ -257,7 +257,7 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) return; rdev = ept->rdev; - if (ept->addr != RPMSG_NS_EPT_ADDR) + if (rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR) (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); metal_mutex_acquire(&rdev->lock); rpmsg_unregister_endpoint(ept); diff --git a/lib/rpmsg/rpmsg_virtio.c b/lib/rpmsg/rpmsg_virtio.c index f754379f2..6dc85c450 100644 --- a/lib/rpmsg/rpmsg_virtio.c +++ b/lib/rpmsg/rpmsg_virtio.c @@ -541,6 +541,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, } #endif /*!VIRTIO_MASTER_ONLY*/ vdev->features = rpmsg_virtio_get_features(rvdev); + rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS)); #ifndef VIRTIO_SLAVE_ONLY if (role == RPMSG_MASTER) { @@ -636,7 +637,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, * Create name service announcement endpoint if device supports name * service announcement feature. */ - if (vdev->features & (1 << VIRTIO_RPMSG_F_NS)) { + if (rdev->support_ns) { rpmsg_init_ept(&rdev->ns_ept, "NS", RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR, rpmsg_virtio_ns_callback, NULL); From a479847d0adf7ef08c081f5997c621c1056ef5e7 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sat, 2 Feb 2019 14:37:50 +0800 Subject: [PATCH 2/2] shouldn't send RPMSG_NS_DESTROY if endpoint name is empty and support rpmsg_create_ept with name == NULL Signed-off-by: Xiang Xiao --- lib/include/openamp/rpmsg.h | 2 +- lib/rpmsg/rpmsg.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/include/openamp/rpmsg.h b/lib/include/openamp/rpmsg.h index 30f4c7807..3ef1502dc 100644 --- a/lib/include/openamp/rpmsg.h +++ b/lib/include/openamp/rpmsg.h @@ -288,7 +288,7 @@ static inline void rpmsg_init_ept(struct rpmsg_endpoint *ept, rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb) { - strncpy(ept->name, name, sizeof(ept->name)); + strncpy(ept->name, name ? name : "", sizeof(ept->name)); ept->addr = src; ept->dest_addr = dest; ept->cb = cb; diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index e4467570e..260d88c5c 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -257,7 +257,7 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) return; rdev = ept->rdev; - if (rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR) + if (ept->name[0] && rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR) (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); metal_mutex_acquire(&rdev->lock); rpmsg_unregister_endpoint(ept);