@@ -470,13 +470,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
470470 metal_mutex_acquire (& rdev -> lock );
471471 _ept = rpmsg_get_endpoint (rdev , name , RPMSG_ADDR_ANY , dest );
472472
473- if (ns_msg -> flags & RPMSG_NS_DESTROY ) {
473+ if (ns_msg -> flags == RPMSG_NS_DESTROY ) {
474474 if (_ept )
475475 _ept -> dest_addr = RPMSG_ADDR_ANY ;
476476 metal_mutex_release (& rdev -> lock );
477477 if (_ept && _ept -> ns_unbind_cb )
478478 _ept -> ns_unbind_cb (ept );
479- } else {
479+ } else if ( ns_msg -> flags == RPMSG_NS_CREATE ) {
480480 if (!_ept ) {
481481 /*
482482 * send callback to application, that can
@@ -491,6 +491,11 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
491491 _ept -> dest_addr = dest ;
492492 metal_mutex_release (& rdev -> lock );
493493 }
494+ } else { /* RPMSG_NS_CREATE_ACK */
495+ /* save the received destination address */
496+ if (_ept )
497+ _ept -> dest_addr = dest ;
498+ metal_mutex_release (& rdev -> lock );
494499 }
495500
496501 return RPMSG_SUCCESS ;
@@ -539,6 +544,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
539544#endif /*!VIRTIO_MASTER_ONLY*/
540545 vdev -> features = rpmsg_virtio_get_features (rvdev );
541546 rdev -> support_ns = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_NS ));
547+ rdev -> support_ack = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_ACK ));
542548
543549#ifndef VIRTIO_SLAVE_ONLY
544550 if (role == RPMSG_MASTER ) {
@@ -634,7 +640,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
634640 * Create name service announcement endpoint if device supports name
635641 * service announcement feature.
636642 */
637- if (rdev -> support_ns ) {
643+ if (rdev -> support_ns || rdev -> support_ack ) {
638644 rpmsg_init_ept (& rdev -> ns_ept , "NS" ,
639645 RPMSG_NS_EPT_ADDR , RPMSG_NS_EPT_ADDR ,
640646 rpmsg_virtio_ns_callback , NULL );
0 commit comments