| 324 | } |
| 325 | |
| 326 | static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept, |
| 327 | FAR void *data, size_t len, uint32_t src, |
| 328 | FAR void *priv) |
| 329 | { |
| 330 | FAR struct rpmsg_socket_conn_s *conn = ept->priv; |
| 331 | FAR struct rpmsg_socket_sync_s *head = data; |
| 332 | |
| 333 | if (head->cmd == RPMSG_SOCKET_CMD_SYNC) |
| 334 | { |
| 335 | nxmutex_lock(&conn->sendlock); |
| 336 | conn->sendsize = head->size; |
| 337 | conn->cred.pid = head->pid; |
| 338 | conn->cred.uid = head->uid; |
| 339 | conn->cred.gid = head->gid; |
| 340 | |
| 341 | conn->sconn.s_flags |= _SF_CONNECTED; |
| 342 | _SO_CONN_SETERRNO(conn, OK); |
| 343 | |
| 344 | rpmsg_socket_post(&conn->sendsem); |
| 345 | rpmsg_socket_poll_notify(conn, POLLOUT); |
| 346 | nxmutex_unlock(&conn->sendlock); |
| 347 | } |
| 348 | else if (head->cmd == RPMSG_SOCKET_CMD_DATA) |
| 349 | { |
| 350 | FAR struct rpmsg_socket_data_s *msg = data; |
| 351 | FAR uint8_t *buf = msg->data; |
| 352 | |
| 353 | nxmutex_lock(&conn->sendlock); |
| 354 | conn->ackpos = msg->pos; |
| 355 | if (rpmsg_socket_get_space(conn) > 0) |
| 356 | { |
| 357 | rpmsg_socket_post(&conn->sendsem); |
| 358 | rpmsg_socket_poll_notify(conn, POLLOUT); |
| 359 | } |
| 360 | |
| 361 | nxmutex_unlock(&conn->sendlock); |
| 362 | if (len > sizeof(*msg)) |
| 363 | { |
| 364 | len -= sizeof(*msg); |
| 365 | DEBUGASSERT(len == msg->len || len == msg->len + sizeof(uint32_t)); |
| 366 | |
| 367 | nxmutex_lock(&conn->recvlock); |
| 368 | if (conn->recvdata) |
| 369 | { |
| 370 | conn->recvlen = MIN(conn->recvlen, msg->len); |
| 371 | if (len == msg->len) |
| 372 | { |
| 373 | /* SOCK_STREAM */ |
| 374 | |
| 375 | conn->recvpos += conn->recvlen; |
| 376 | memcpy(conn->recvdata, buf, conn->recvlen); |
| 377 | buf += conn->recvlen; |
| 378 | len -= conn->recvlen; |
| 379 | } |
| 380 | else |
| 381 | { |
| 382 | /* SOCK_DGRAM */ |
| 383 |
nothing calls this directly
no test coverage detected