@@ -471,13 +471,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
471471 metal_mutex_acquire (& rdev -> lock );
472472 _ept = rpmsg_get_endpoint (rdev , name , RPMSG_ADDR_ANY , dest );
473473
474- if (ns_msg -> flags & RPMSG_NS_DESTROY ) {
474+ if (ns_msg -> flags == RPMSG_NS_DESTROY ) {
475475 if (_ept )
476476 _ept -> dest_addr = RPMSG_ADDR_ANY ;
477477 metal_mutex_release (& rdev -> lock );
478478 if (_ept && _ept -> ns_unbind_cb )
479479 _ept -> ns_unbind_cb (ept );
480- } else {
480+ } else if ( ns_msg -> flags == RPMSG_NS_CREATE ) {
481481 if (!_ept ) {
482482 /*
483483 * send callback to application, that can
@@ -492,6 +492,11 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
492492 _ept -> dest_addr = dest ;
493493 metal_mutex_release (& rdev -> lock );
494494 }
495+ } else { /* RPMSG_NS_CREATE_ACK */
496+ /* save the received destination address */
497+ if (_ept )
498+ _ept -> dest_addr = dest ;
499+ metal_mutex_release (& rdev -> lock );
495500 }
496501
497502 return RPMSG_SUCCESS ;
@@ -540,6 +545,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
540545#endif /*!VIRTIO_MASTER_ONLY*/
541546 vdev -> features = rpmsg_virtio_get_features (rvdev );
542547 rdev -> support_ns = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_NS ));
548+ rdev -> support_ack = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_ACK ));
543549
544550#ifndef VIRTIO_SLAVE_ONLY
545551 if (role == RPMSG_MASTER ) {
@@ -635,7 +641,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
635641 * Create name service announcement endpoint if device supports name
636642 * service announcement feature.
637643 */
638- if (rdev -> support_ns ) {
644+ if (rdev -> support_ns || rdev -> support_ack ) {
639645 rpmsg_initialize_ept (& rdev -> ns_ept , "NS" ,
640646 RPMSG_NS_EPT_ADDR , RPMSG_NS_EPT_ADDR ,
641647 rpmsg_virtio_ns_callback , NULL );
0 commit comments