vendor/qcom/proprietary/commonsys-intf/qmi-framework/qcci/src/qmi_cci_xport_qrtr.c static void *data_msg_reader_thread( void *arg) {
struct xport_handle *xp = (struct xport_handle *)arg; unsigned char ch, *buf; int i; ssize_t rx_len; struct pollfd pbits[ 2 ]; struct xport_ipc_router_server_addr src_addr; struct sockaddr_qrtr addr; while ( 1 ) {
pbits[ 0 ].fd = xp->rdr_tdata.wakeup_pipe[ 0 ]; pbits[ 0 ].events = POLLIN; pbits[ 1 ].fd = xp->fd; pbits[ 1 ].events = POLLIN; // 等待数据 i = poll(pbits, 2 , - 1 ); if (i < 0 ) {
if (errno == EINTR) QMI_CCI_LOGD( "%s: poll error (%d)\n" , __func__, errno); else QMI_FW_LOGE( "%s: poll error (%d)\n" , __func__, errno); continue ; } ...... if ((pbits[ 1 ].revents & POLLIN)) {
socklen_t addr_size = sizeof(struct sockaddr_qrtr); buf = (unsigned char *)calloc(xp->max_rx_len, 1 ); if (!buf) {
QMI_FW_LOGE( "%s: Unable to allocate read buffer for %p of size %d\n" , __func__, xp, xp->max_rx_len); break ; } addr_size = sizeof(struct sockaddr_qrtr); // 通过socket读取bp发送过来的数据 rx_len = recvfrom(xp->fd, buf, xp->max_rx_len, MSG_DONTWAIT, (struct sockaddr *)&addr, &addr_size); if (rx_len < 0 ) {
QMI_FW_LOGE( "%s: Error recvfrom %p - rc : %d\n" , __func__, xp, errno); free(buf); break ; } else if (rx_len == 0 ) {
if (addr_size == sizeof(struct sockaddr_qrtr)) {
QMI_CCI_LOGD( "%s: QCCI Received Resume_Tx on FD %d from port %08x:%08x\n" , __func__, xp->fd, addr.sq_node, addr.sq_port); qmi_cci_xport_resume(xp->clnt); } else {
QMI_FW_LOGE( "%s: No data read from %d\n" , __func__, xp->fd); } free(buf); continue ; } else if (addr.sq_port == QRTR_PORT_CTRL) {
/* NOT expected to receive data from control port */ QMI_FW_LOGE( "%s: DATA from control port len[%d]\n" , __func__, rx_len); free(buf); continue ; } QMI_CCI_LOGD( "%s: Received %d bytes from %d\n" , __func__, rx_len, xp->fd); src_addr.service = 0 ; src_addr.instance = 0 ; src_addr.node_id = addr.sq_node; src_addr.port_id = addr.sq_port; // NO.1 将buf往上分发 qmi_cci_xport_recv(xp->clnt, ( void *)&src_addr, buf, (uint32_t)rx_len); free(buf); } ...... return NULL; } |