@@ -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