@@ -62,6 +62,9 @@ struct nsos_socket {
6262
6363static sys_dlist_t nsos_polls = SYS_DLIST_STATIC_INIT (& nsos_polls );
6464
65+ /* Forward declaration of the interface */
66+ NET_IF_DECLARE (nsos_socket , 0 );
67+
6568static int socket_family_to_nsos_mid (int family , int * family_mid )
6669{
6770 switch (family ) {
@@ -693,6 +696,7 @@ static int nsos_connect_blocking(struct nsos_socket *sock,
693696
694697static int nsos_connect (void * obj , const struct sockaddr * addr , socklen_t addrlen )
695698{
699+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
696700 struct nsos_socket * sock = obj ;
697701 struct nsos_mid_sockaddr_storage addr_storage_mid ;
698702 struct nsos_mid_sockaddr * addr_mid = (struct nsos_mid_sockaddr * )& addr_storage_mid ;
@@ -718,6 +722,7 @@ static int nsos_connect(void *obj, const struct sockaddr *addr, socklen_t addrle
718722 errno = nsi_errno_from_mid (- ret );
719723 return -1 ;
720724 }
725+ conn_mgr_if_used (iface );
721726
722727 return ret ;
723728}
@@ -738,6 +743,7 @@ static int nsos_listen(void *obj, int backlog)
738743
739744static int nsos_accept (void * obj , struct sockaddr * addr , socklen_t * addrlen )
740745{
746+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
741747 struct nsos_socket * accept_sock = obj ;
742748 struct nsos_mid_sockaddr_storage addr_storage_mid ;
743749 struct nsos_mid_sockaddr * addr_mid = (struct nsos_mid_sockaddr * )& addr_storage_mid ;
@@ -782,6 +788,7 @@ static int nsos_accept(void *obj, struct sockaddr *addr, socklen_t *addrlen)
782788
783789 zvfs_finalize_typed_fd (zephyr_fd , conn_sock , & nsos_socket_fd_op_vtable .fd_vtable ,
784790 ZVFS_MODE_IFSOCK );
791+ conn_mgr_if_used (iface );
785792
786793 return zephyr_fd ;
787794
@@ -799,6 +806,7 @@ static int nsos_accept(void *obj, struct sockaddr *addr, socklen_t *addrlen)
799806static ssize_t nsos_sendto (void * obj , const void * buf , size_t len , int flags ,
800807 const struct sockaddr * addr , socklen_t addrlen )
801808{
809+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
802810 struct nsos_socket * sock = obj ;
803811 struct nsos_mid_sockaddr_storage addr_storage_mid ;
804812 struct nsos_mid_sockaddr * addr_mid = (struct nsos_mid_sockaddr * )& addr_storage_mid ;
@@ -832,11 +840,13 @@ static ssize_t nsos_sendto(void *obj, const void *buf, size_t len, int flags,
832840 return -1 ;
833841 }
834842
843+ conn_mgr_if_used (iface );
835844 return ret ;
836845}
837846
838847static ssize_t nsos_sendmsg (void * obj , const struct msghdr * msg , int flags )
839848{
849+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
840850 struct nsos_socket * sock = obj ;
841851 struct nsos_mid_sockaddr_storage addr_storage_mid ;
842852 struct nsos_mid_sockaddr * addr_mid = (struct nsos_mid_sockaddr * )& addr_storage_mid ;
@@ -893,12 +903,14 @@ static ssize_t nsos_sendmsg(void *obj, const struct msghdr *msg, int flags)
893903 return -1 ;
894904 }
895905
906+ conn_mgr_if_used (iface );
896907 return ret ;
897908}
898909
899910static ssize_t nsos_recvfrom (void * obj , void * buf , size_t len , int flags ,
900911 struct sockaddr * addr , socklen_t * addrlen )
901912{
913+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
902914 struct nsos_socket * sock = obj ;
903915 struct nsos_mid_sockaddr_storage addr_storage_mid ;
904916 struct nsos_mid_sockaddr * addr_mid = (struct nsos_mid_sockaddr * )& addr_storage_mid ;
@@ -932,6 +944,7 @@ static ssize_t nsos_recvfrom(void *obj, void *buf, size_t len, int flags,
932944 return -1 ;
933945 }
934946
947+ conn_mgr_if_used (iface );
935948 return ret ;
936949}
937950
@@ -1492,6 +1505,7 @@ static int nsos_getaddrinfo(const char *node, const char *service,
14921505 const struct zsock_addrinfo * hints ,
14931506 struct zsock_addrinfo * * res )
14941507{
1508+ struct net_if * iface = NET_IF_GET (nsos_socket , 0 );
14951509 struct nsos_mid_addrinfo hints_mid ;
14961510 struct nsos_mid_addrinfo * res_mid ;
14971511 int system_errno ;
@@ -1525,6 +1539,7 @@ static int nsos_getaddrinfo(const char *node, const char *service,
15251539 errno = - ret ;
15261540 return DNS_EAI_SYSTEM ;
15271541 }
1542+ conn_mgr_if_used (iface );
15281543
15291544 return ret ;
15301545}
@@ -1651,6 +1666,14 @@ static int nsos_net_if_disconnect(struct conn_mgr_conn_binding *const binding)
16511666 LOG_INF ("NSOS: dormant" );
16521667 k_work_cancel_delayable (& data -> work );
16531668 net_if_dormant_on (binding -> iface );
1669+
1670+ if (conn_mgr_binding_get_flag (binding , CONN_MGR_IF_PERSISTENT ) &&
1671+ !conn_mgr_binding_get_flag (binding , CONN_MGR_IF_DISCONNECTING )) {
1672+ /* Interface marked as persistent, application didn't request the disconnect */
1673+ LOG_INF ("NSOS: reconnecting" );
1674+ k_work_reschedule (& data -> work , data -> connect_delay );
1675+ }
1676+
16541677 return 0 ;
16551678}
16561679
0 commit comments