rptun: add ns_match callback to resolve rptun deadlock

thread A: accept -> net_lock -> socket_rpmsg_accept
          -> rpmsg_register_callabck -> rptun_lock
thread B: ns_bind -> rpmsg_socket_ns_bind -> get_tx_payload_buffer
          -> rptun_wait_tx -> usrsock_rpmsg_ept_cb -> usrsockdev_write
          -> net_lock -> deadlock

fix:
add ns_match callback

Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
ligd 2022-06-06 16:38:11 +08:00 committed by Xiang Xiao
parent 033cd4d7df
commit 8a3683fb9f
15 changed files with 213 additions and 112 deletions

View File

@ -1418,7 +1418,8 @@ int mpfs_ihc_init(void)
/* Register callback to notify when rpmsg device is ready */
ret = rpmsg_register_callback(NULL, mpfs_rpmsg_device_created, NULL, NULL);
ret = rpmsg_register_callback(NULL, mpfs_rpmsg_device_created,
NULL, NULL, NULL);
if (ret < 0)
{
ihcerr("ERROR: Not able to register rpmsg callback\n");
@ -1438,7 +1439,8 @@ int mpfs_ihc_init(void)
if (ret < 0)
{
ihcerr("ERROR: Not able to create a thread!\n");
rpmsg_unregister_callback(NULL, mpfs_rpmsg_device_created, NULL, NULL);
rpmsg_unregister_callback(NULL, mpfs_rpmsg_device_created,
NULL, NULL, NULL);
goto init_error;
}

View File

@ -160,6 +160,10 @@ static void clk_rpmsg_client_created(FAR struct rpmsg_device *rdev,
static void clk_rpmsg_client_destroy(FAR struct rpmsg_device *rdev,
FAR void *priv_);
static bool clk_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest);
static void clk_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@ -249,6 +253,7 @@ clk_rpmsg_get_priv(FAR const char *name)
rpmsg_register_callback(priv,
clk_rpmsg_client_created,
clk_rpmsg_client_destroy,
NULL,
NULL);
return priv;
@ -495,6 +500,14 @@ static int64_t clk_rpmsg_sendrecv(FAR struct rpmsg_endpoint *ept,
return cookie.result;
}
static bool clk_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
{
return !strcmp(name, CLK_RPMSG_EPT_NAME);
}
static void clk_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@ -502,23 +515,20 @@ static void clk_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
{
FAR struct clk_rpmsg_server_s *priv;
if (!strcmp(name, CLK_RPMSG_EPT_NAME))
priv = kmm_zalloc(sizeof(struct clk_rpmsg_server_s));
if (!priv)
{
priv = kmm_zalloc(sizeof(struct clk_rpmsg_server_s));
if (!priv)
{
return;
}
priv->ept.priv = priv;
list_initialize(&priv->clk_list);
rpmsg_create_ept(&priv->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
clk_rpmsg_ept_cb,
clk_rpmsg_server_unbind);
return;
}
priv->ept.priv = priv;
list_initialize(&priv->clk_list);
rpmsg_create_ept(&priv->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
clk_rpmsg_ept_cb,
clk_rpmsg_server_unbind);
}
static void clk_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
@ -905,5 +915,6 @@ int clk_rpmsg_server_initialize(void)
return rpmsg_register_callback(NULL,
NULL,
NULL,
clk_rpmsg_server_match,
clk_rpmsg_server_bind);
}

View File

@ -258,7 +258,7 @@ static int uinput_rpmsg_initialize(FAR struct uinput_context_s *ctx,
list_initialize(&ctx->eptlist);
strlcpy(ctx->name, name, UINPUT_NAME_SIZE);
return rpmsg_register_callback(ctx, uinput_rpmsg_device_created,
uinput_rpmsg_device_destroy, NULL);
uinput_rpmsg_device_destroy, NULL, NULL);
}
/****************************************************************************

View File

@ -613,31 +613,37 @@ static void ioe_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
kmm_free(ept);
}
static void ioe_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
static bool ioe_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
{
FAR struct ioe_rpmsg_server_s *priv = priv_;
char eptname[RPMSG_NAME_SIZE];
snprintf(eptname, RPMSG_NAME_SIZE, IOE_RPMSG_EPT_FORMAT, priv->name);
if (!strcmp(name, eptname))
return !strcmp(name, eptname);
}
static void ioe_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
{
FAR struct ioe_rpmsg_server_s *priv = priv_;
FAR struct rpmsg_endpoint *ept;
ept = kmm_zalloc(sizeof(struct rpmsg_endpoint));
if (!ept)
{
FAR struct rpmsg_endpoint *ept;
ept = kmm_zalloc(sizeof(struct rpmsg_endpoint));
if (!ept)
{
return;
}
ept->priv = priv;
rpmsg_create_ept(ept, rdev, name, RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
ioe_rpmsg_server_ept_cb, ioe_rpmsg_server_unbind);
return;
}
ept->priv = priv;
rpmsg_create_ept(ept, rdev, name, RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
ioe_rpmsg_server_ept_cb, ioe_rpmsg_server_unbind);
}
/****************************************************************************
@ -672,7 +678,9 @@ int ioe_rpmsg_server_initialize(FAR const char *name,
priv->name = name;
priv->ioe = ioe;
ret = rpmsg_register_callback(priv, NULL, NULL, ioe_rpmsg_server_bind);
ret = rpmsg_register_callback(priv, NULL, NULL,
ioe_rpmsg_server_match,
ioe_rpmsg_server_bind);
if (ret < 0)
{
kmm_free(priv);
@ -712,7 +720,7 @@ ioe_rpmsg_client_initialize(FAR const char *cpuname, FAR const char *name)
nxsem_init(&priv->sem, 0, 0);
ret = rpmsg_register_callback(priv, ioe_rpmsg_client_created,
ioe_rpmsg_client_destroy, NULL);
ioe_rpmsg_client_destroy, NULL, NULL);
if (ret < 0)
{
kmm_free(priv);

View File

@ -1200,6 +1200,7 @@ int net_rpmsg_drv_init(FAR const char *cpuname,
rpmsg_register_callback(dev,
net_rpmsg_drv_device_created,
net_rpmsg_drv_device_destroy,
NULL,
NULL);
/* Register the device with the OS so that socket IOCTLs can be performed */

View File

@ -136,6 +136,10 @@ static void regulator_rpmsg_client_destroy(struct rpmsg_device *rdev,
FAR void *priv_);
static void regulator_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept);
static bool regulator_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest);
static void regulator_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@ -216,6 +220,7 @@ regulator_rpmsg_get_priv(FAR const char *name)
rpmsg_register_callback(priv,
regulator_rpmsg_client_created,
regulator_rpmsg_client_destroy,
NULL,
NULL);
return priv;
@ -347,6 +352,14 @@ static void regulator_rpmsg_server_unbind(FAR struct rpmsg_endpoint *ept)
kmm_free(priv);
}
static bool regulator_rpmsg_server_match(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
{
return !strcmp(name, REGULATOR_RPMSG_EPT_NAME);
}
static void regulator_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
@ -354,23 +367,20 @@ static void regulator_rpmsg_server_bind(FAR struct rpmsg_device *rdev,
{
FAR struct regulator_rpmsg_server_s *priv;
if (!strcmp(name, REGULATOR_RPMSG_EPT_NAME))
priv = kmm_zalloc(sizeof(struct regulator_rpmsg_server_s));
if (!priv)
{
priv = kmm_zalloc(sizeof(struct regulator_rpmsg_server_s));
if (!priv)
{
return;
}
priv->ept.priv = priv;
list_initialize(&priv->regulator_list);
rpmsg_create_ept(&priv->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
regulator_rpmsg_ept_cb,
regulator_rpmsg_server_unbind);
return;
}
priv->ept.priv = priv;
list_initialize(&priv->regulator_list);
rpmsg_create_ept(&priv->ept, rdev, name,
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
regulator_rpmsg_ept_cb,
regulator_rpmsg_server_unbind);
}
static int regulator_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept,
@ -695,5 +705,6 @@ int regulator_rpmsg_server_init(void)
return rpmsg_register_callback(NULL,
NULL,
NULL,
regulator_rpmsg_server_match,
regulator_rpmsg_server_bind);
}

View File

@ -100,6 +100,7 @@ struct rptun_cb_s
FAR void *priv;
rpmsg_dev_cb_t device_created;
rpmsg_dev_cb_t device_destroy;
rpmsg_match_cb_t ns_match;
rpmsg_bind_cb_t ns_bind;
struct metal_list node;
};
@ -480,33 +481,43 @@ static void rptun_ns_bind(FAR struct rpmsg_device *rdev,
{
FAR struct rptun_priv_s *priv = rptun_get_priv_by_rdev(rdev);
FAR struct rptun_bind_s *bind;
FAR struct metal_list *node;
bind = kmm_malloc(sizeof(struct rptun_bind_s));
if (bind)
nxmutex_lock(&g_rptun_lockcb);
metal_list_for_each(&g_rptun_cb, node)
{
FAR struct metal_list *node;
FAR struct rptun_cb_s *cb;
bind->dest = dest;
strlcpy(bind->name, name, RPMSG_NAME_SIZE);
nxmutex_lock(&g_rptun_lockcb);
metal_list_for_each(&g_rptun_cb, node)
cb = metal_container_of(node, struct rptun_cb_s, node);
if (cb->ns_match && cb->ns_match(rdev, cb->priv, name, dest))
{
cb = metal_container_of(node, struct rptun_cb_s, node);
if (cb->ns_bind)
{
cb->ns_bind(rdev, cb->priv, name, dest);
}
rpmsg_bind_cb_t ns_bind = cb->ns_bind;
FAR void *cb_priv = cb->priv;
nxmutex_unlock(&g_rptun_lockcb);
DEBUGASSERT(ns_bind != NULL);
ns_bind(rdev, cb_priv, name, dest);
return;
}
nxmutex_unlock(&g_rptun_lockcb);
nxmutex_lock(&priv->lock);
metal_list_add_tail(&priv->bind, &bind->node);
nxmutex_unlock(&priv->lock);
}
nxmutex_unlock(&g_rptun_lockcb);
bind = kmm_malloc(sizeof(struct rptun_bind_s));
if (bind == NULL)
{
return;
}
bind->dest = dest;
strlcpy(bind->name, name, RPMSG_NAME_SIZE);
nxmutex_lock(&priv->lock);
metal_list_add_tail(&priv->bind, &bind->node);
nxmutex_unlock(&priv->lock);
}
static void rptun_ns_unbind(FAR struct rpmsg_device *rdev,
@ -1016,6 +1027,7 @@ FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev)
int rpmsg_register_callback(FAR void *priv_,
rpmsg_dev_cb_t device_created,
rpmsg_dev_cb_t device_destroy,
rpmsg_match_cb_t ns_match,
rpmsg_bind_cb_t ns_bind)
{
FAR struct metal_list *node;
@ -1031,6 +1043,7 @@ int rpmsg_register_callback(FAR void *priv_,
cb->priv = priv_;
cb->device_created = device_created;
cb->device_destroy = device_destroy;
cb->ns_match = ns_match;
cb->ns_bind = ns_bind;
nxmutex_lock(&g_rptun_lockpriv);
@ -1045,20 +1058,32 @@ int rpmsg_register_callback(FAR void *priv_,
device_created(&priv->rvdev.rdev, priv_);
}
if (ns_bind)
if (ns_bind == NULL)
{
nxmutex_lock(&priv->lock);
metal_list_for_each(&priv->bind, bnode)
{
struct rptun_bind_s *bind;
bind = metal_container_of(bnode, struct rptun_bind_s, node);
ns_bind(&priv->rvdev.rdev, priv_, bind->name, bind->dest);
}
nxmutex_unlock(&priv->lock);
continue;
}
DEBUGASSERT(ns_match != NULL);
again:
nxmutex_lock(&priv->lock);
metal_list_for_each(&priv->bind, bnode)
{
FAR struct rptun_bind_s *bind;
bind = metal_container_of(bnode, struct rptun_bind_s, node);
if (ns_match(&priv->rvdev.rdev, priv_, bind->name, bind->dest))
{
metal_list_del(bnode);
nxmutex_unlock(&priv->lock);
ns_bind(&priv->rvdev.rdev, priv_, bind->name, bind->dest);
kmm_free(bind);
goto again;
}
}
nxmutex_unlock(&priv->lock);
}
nxmutex_unlock(&g_rptun_lockpriv);
@ -1073,6 +1098,7 @@ int rpmsg_register_callback(FAR void *priv_,
void rpmsg_unregister_callback(FAR void *priv_,
rpmsg_dev_cb_t device_created,
rpmsg_dev_cb_t device_destroy,
rpmsg_match_cb_t ns_match,
rpmsg_bind_cb_t ns_bind)
{
FAR struct metal_list *node;
@ -1082,12 +1108,13 @@ void rpmsg_unregister_callback(FAR void *priv_,
metal_list_for_each(&g_rptun_cb, node)
{
struct rptun_cb_s *cb = NULL;
FAR struct rptun_cb_s *cb = NULL;
cb = metal_container_of(node, struct rptun_cb_s, node);
if (cb->priv == priv_ &&
cb->device_created == device_created &&
cb->device_destroy == device_destroy &&
cb->ns_match == ns_match &&
cb->ns_bind == ns_bind)
{
metal_list_del(&cb->node);

View File

@ -434,6 +434,7 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const char *devname,
ret = rpmsg_register_callback(dev,
uart_rpmsg_device_created,
uart_rpmsg_device_destroy,
NULL,
NULL);
if (ret < 0)
{

View File

@ -450,5 +450,6 @@ int syslog_rpmsg_init(void)
return rpmsg_register_callback(&g_syslog_rpmsg,
syslog_rpmsg_device_created,
syslog_rpmsg_device_destroy,
NULL,
NULL);
}

View File

@ -63,6 +63,9 @@ struct syslog_rpmsg_server_s
static void syslog_rpmsg_write(FAR const char *buf1, size_t len1,
FAR const char *buf2, size_t len2);
static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
@ -167,6 +170,13 @@ static void syslog_rpmsg_write(FAR const char *buf1, size_t len1,
}
}
static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
{
return !strcmp(name, SYSLOG_RPMSG_EPT_NAME);
}
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
@ -174,11 +184,6 @@ static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
FAR struct syslog_rpmsg_server_s *priv;
int ret;
if (strcmp(name, SYSLOG_RPMSG_EPT_NAME))
{
return;
}
priv = kmm_zalloc(sizeof(struct syslog_rpmsg_server_s));
if (!priv)
{
@ -308,5 +313,6 @@ int syslog_rpmsg_server_init(void)
return rpmsg_register_callback(NULL,
NULL,
NULL,
syslog_rpmsg_ns_match,
syslog_rpmsg_ns_bind);
}

View File

@ -696,6 +696,14 @@ static int rpmsg_rtc_server_ept_cb(FAR struct rpmsg_endpoint *ept,
}
}
static bool rpmsg_rtc_server_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
uint32_t dest)
{
return !strcmp(name, RPMSG_RTC_EPT_NAME);
}
static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv,
FAR const char *name,
@ -706,11 +714,6 @@ static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
struct rpmsg_rtc_set_s msg;
struct rtc_time rtctime;
if (strcmp(name, RPMSG_RTC_EPT_NAME))
{
return;
}
client = kmm_zalloc(sizeof(*client));
if (client == NULL)
{
@ -767,6 +770,7 @@ FAR struct rtc_lowerhalf_s *rpmsg_rtc_initialize(void)
rpmsg_register_callback(lower,
rpmsg_rtc_device_created,
rpmsg_rtc_device_destroy,
NULL,
NULL);
}
@ -800,6 +804,7 @@ FAR struct rtc_lowerhalf_s *rpmsg_rtc_server_initialize(
list_initialize(&server->list);
nxsem_init(&server->exclsem, 0, 1);
if (rpmsg_register_callback(server, NULL, NULL,
rpmsg_rtc_server_ns_match,
rpmsg_rtc_server_ns_bind) < 0)
{
nxsem_destroy(&server->exclsem);

View File

@ -717,6 +717,7 @@ int rpmsgfs_client_bind(FAR void **handle, FAR const char *cpuname)
ret = rpmsg_register_callback(priv,
rpmsgfs_device_created,
rpmsgfs_device_destroy,
NULL,
NULL);
if (ret < 0)
{
@ -738,6 +739,7 @@ int rpmsgfs_client_unbind(FAR void *handle)
rpmsg_unregister_callback(priv,
rpmsgfs_device_created,
rpmsgfs_device_destroy,
NULL,
NULL);
nxsem_destroy(&priv->wait);

View File

@ -123,6 +123,9 @@ static int rpmsgfs_chstat_handler(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len,
uint32_t src, FAR void *priv);
static bool rpmsgfs_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest);
@ -826,6 +829,13 @@ out:
return rpmsg_send(ept, msg, sizeof(*msg));
}
static bool rpmsgfs_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
{
return !strncmp(name, RPMSGFS_NAME_PREFIX, strlen(RPMSGFS_NAME_PREFIX));
}
static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_, FAR const char *name,
uint32_t dest)
@ -833,11 +843,6 @@ static void rpmsgfs_ns_bind(FAR struct rpmsg_device *rdev,
FAR struct rpmsgfs_server_s *priv;
int ret;
if (strncmp(name, RPMSGFS_NAME_PREFIX, strlen(RPMSGFS_NAME_PREFIX)))
{
return;
}
priv = kmm_zalloc(sizeof(*priv));
if (!priv)
{
@ -912,5 +917,6 @@ int rpmsgfs_server_init(void)
return rpmsg_register_callback(NULL,
NULL,
NULL,
rpmsgfs_ns_match,
rpmsgfs_ns_bind);
}

View File

@ -38,6 +38,9 @@
typedef void (*rpmsg_dev_cb_t)(FAR struct rpmsg_device *rdev,
FAR void *priv);
typedef bool (*rpmsg_match_cb_t)(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest);
typedef void (*rpmsg_bind_cb_t)(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest);
@ -62,10 +65,12 @@ const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev);
int rpmsg_register_callback(FAR void *priv,
rpmsg_dev_cb_t device_created,
rpmsg_dev_cb_t device_destroy,
rpmsg_match_cb_t ns_match,
rpmsg_bind_cb_t ns_bind);
void rpmsg_unregister_callback(FAR void *priv,
rpmsg_dev_cb_t device_created,
rpmsg_dev_cb_t device_destroy,
rpmsg_match_cb_t ns_match,
rpmsg_bind_cb_t ns_bind);
#ifdef __cplusplus

View File

@ -468,22 +468,18 @@ static void rpmsg_socket_device_destroy(FAR struct rpmsg_device *rdev,
}
}
static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest)
static bool rpmsg_socket_ns_match(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest)
{
FAR struct rpmsg_socket_conn_s *server = priv;
FAR struct rpmsg_socket_conn_s *tmp;
FAR struct rpmsg_socket_conn_s *new;
char buf[RPMSG_NAME_SIZE];
int cnt = 0;
int ret;
snprintf(buf, sizeof(buf), "%s%s", RPMSG_SOCKET_NAME_PREFIX,
server->rpaddr.rp_name);
if (strncmp(name, buf, strlen(buf)))
{
return;
return false;
}
if (strlen(server->rpaddr.rp_cpu) &&
@ -491,9 +487,22 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
{
/* Bind specific CPU, then only listen that CPU */
return;
return false;
}
return true;
}
static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv, FAR const char *name,
uint32_t dest)
{
FAR struct rpmsg_socket_conn_s *server = priv;
FAR struct rpmsg_socket_conn_s *tmp;
FAR struct rpmsg_socket_conn_s *new;
int cnt = 0;
int ret;
new = rpmsg_socket_alloc();
if (!new)
{
@ -662,9 +671,10 @@ static int rpmsg_socket_listen(FAR struct socket *psock, int backlog)
server->backlog = backlog;
return rpmsg_register_callback(server,
NULL,
NULL,
rpmsg_socket_ns_bind);
NULL,
NULL,
rpmsg_socket_ns_match,
rpmsg_socket_ns_bind);
}
static int rpmsg_socket_connect_internal(FAR struct socket *psock)
@ -681,6 +691,7 @@ static int rpmsg_socket_connect_internal(FAR struct socket *psock)
ret = rpmsg_register_callback(conn,
rpmsg_socket_device_created,
rpmsg_socket_device_destroy,
NULL,
NULL);
if (ret < 0)
{
@ -702,6 +713,7 @@ static int rpmsg_socket_connect_internal(FAR struct socket *psock)
rpmsg_unregister_callback(conn,
rpmsg_socket_device_created,
rpmsg_socket_device_destroy,
NULL,
NULL);
}
}
@ -769,6 +781,7 @@ static int rpmsg_socket_accept(FAR struct socket *psock,
rpmsg_register_callback(conn,
rpmsg_socket_device_created,
rpmsg_socket_device_destroy,
NULL,
NULL);
if (conn->sendsize == 0)
@ -1280,6 +1293,7 @@ static int rpmsg_socket_close(FAR struct socket *psock)
rpmsg_unregister_callback(conn,
NULL,
NULL,
rpmsg_socket_ns_match,
rpmsg_socket_ns_bind);
}
else
@ -1287,6 +1301,7 @@ static int rpmsg_socket_close(FAR struct socket *psock)
rpmsg_unregister_callback(conn,
rpmsg_socket_device_created,
rpmsg_socket_device_destroy,
NULL,
NULL);
}