@@ -565,13 +565,13 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
565565 metal_mutex_acquire (& rdev -> lock );
566566 _ept = rpmsg_get_endpoint (rdev , name , RPMSG_ADDR_ANY , dest );
567567
568- if (ns_msg -> flags & RPMSG_NS_DESTROY ) {
568+ if (ns_msg -> flags == RPMSG_NS_DESTROY ) {
569569 if (_ept )
570570 _ept -> dest_addr = RPMSG_ADDR_ANY ;
571571 metal_mutex_release (& rdev -> lock );
572572 if (_ept && _ept -> ns_unbind_cb )
573573 _ept -> ns_unbind_cb (_ept );
574- } else {
574+ } else if ( ns_msg -> flags == RPMSG_NS_CREATE ) {
575575 if (!_ept ) {
576576 /*
577577 * send callback to application, that can
@@ -585,7 +585,14 @@ static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data,
585585 } else {
586586 _ept -> dest_addr = dest ;
587587 metal_mutex_release (& rdev -> lock );
588+ if (_ept -> name [0 ] && rdev -> support_ack )
589+ rpmsg_send_ns_message (_ept , RPMSG_NS_CREATE_ACK );
588590 }
591+ } else { /* RPMSG_NS_CREATE_ACK */
592+ /* save the received destination address */
593+ if (_ept )
594+ _ept -> dest_addr = dest ;
595+ metal_mutex_release (& rdev -> lock );
589596 }
590597
591598 return RPMSG_SUCCESS ;
@@ -638,6 +645,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
638645#endif /*!VIRTIO_MASTER_ONLY*/
639646 vdev -> features = rpmsg_virtio_get_features (rvdev );
640647 rdev -> support_ns = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_NS ));
648+ rdev -> support_ack = !!(vdev -> features & (1 << VIRTIO_RPMSG_F_ACK ));
641649
642650#ifndef VIRTIO_SLAVE_ONLY
643651 if (role == RPMSG_MASTER ) {
@@ -733,7 +741,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
733741 * Create name service announcement endpoint if device supports name
734742 * service announcement feature.
735743 */
736- if (rdev -> support_ns ) {
744+ if (rdev -> support_ns || rdev -> support_ack ) {
737745 rpmsg_initialize_ept (& rdev -> ns_ept , "NS" ,
738746 RPMSG_NS_EPT_ADDR , RPMSG_NS_EPT_ADDR ,
739747 rpmsg_virtio_ns_callback , NULL );
0 commit comments