VOS_VOID diag_PortEvtCB(ACM_EVT_E ulEvt,DIAG_PORT_PHY_BEAR_ENUM enPort) { DIAG_PORT_CONNECT_STA_PFN pfnConn = DIAG_PORT_GET_CONN_CALLBACK(); DIAG_DEBUG_SDM_FUN(EN_DIAG_DEBUG_TCP_EVT+enPort, ulEvt, 0, 0); if(ACM_EVT_DEV_READY==ulEvt) { DIAG_PORT_CHAN_STATE_SWITCH(enPort,ACM_EVT_DEV_READY); return ; } else { if(diag_GetLogSendType() == EN_DIAG_SEND_LOG_TO_SD) { return ; } //通知逻辑通道状态 if(pfnConn!=NULL) { pfnConn(DIAG_DISCONN); } DIAG_PORT_CHAN_STATE_SWITCH(enPort,ACM_EVT_DEV_SUSPEND); } return; }
VOS_VOID diag_VcomCtrlEvtCB(APP_VCOM_EVT_UINT32 event) { DIAG_PORT_CONNECT_STA_PFN pfnConn = DIAG_PORT_GET_CONN_CALLBACK(); g_diagVcomState[0] = event; if(APP_VCOM_EVT_OPEN == event) { DIAG_PORT_CHAN_STATE_SWITCH(EN_DIAG_VCOM_BEABER_DIAG_CTRL, ACM_EVT_DEV_READY); return; } else { DIAG_PORT_CHAN_STATE_SWITCH(EN_DIAG_VCOM_BEABER_DIAG_CTRL, ACM_EVT_DEV_SUSPEND); if((g_diagVcomState[0] != APP_VCOM_EVT_RELEASE) || (g_diagVcomState[1] != APP_VCOM_EVT_RELEASE)) { return; } //通知逻辑通道状态 if(pfnConn!=NULL) { pfnConn(DIAG_DISCONN); } } }
VOS_VOID diag_AcceptRecvFromSocket(VOS_VOID) { VOS_SOCKET maxAcceptSock; VOS_SOCKET maxRecvSock; VOS_SOCKET maxSocket; VOS_SOCKET rxSocket; Ip_fd_set fdRxSet,ReadySet,ErrorSet; VOS_INT32 ret; DIAG_TCPIP_CTRL_INFO_STRU *pstDiagTcpInfo; DIAG_TCPIP_PORT_ENUM enTcpPort = (DIAG_TCPIP_PORT_ENUM)0; DIAG_PORT_CONNECT_STA_PFN pfnConn = DIAG_PORT_GET_CONN_CALLBACK(); pstDiagTcpInfo = diag_GetTcpInfo(); DIAG_FD_ZERO(&fdRxSet); DIAG_FD_ZERO(&ReadySet); /*lint -save -e515 -e516*/ g_fdCount = diag_ListenDoneNeedAcceptSet(&fdRxSet, &maxAcceptSock, pstDiagTcpInfo->astTcpIpPort); g_fdCount += diag_AcceptDoneNeedRecvSet(&fdRxSet, &maxRecvSock, pstDiagTcpInfo->astTcpIpPort); /*lint -restore*/ if (0 == g_fdCount) { /* socket set empty, nothing to be monitored*/ diag_printf("diag_AcceptRecvFromSocket 0 ==fd_count! \n"); return; } /* monitor incoming connection/data for TCP sockets*/ maxSocket = (maxAcceptSock > maxRecvSock) ? maxAcceptSock : maxRecvSock; /*select操作子从fdRxSet中选取已经准备好可读的描述符集合ReadySet*/ /*lint -save -e419 -e420*/ memcpy(&ReadySet, &fdRxSet, sizeof(Ip_fd_set)); memcpy(&ErrorSet, &fdRxSet, sizeof(Ip_fd_set)); /*lint -restore*/ /*lint -save -e26*/ ret = select((int) maxSocket + 1, &ReadySet, NULL, &ErrorSet, NULL); /*lint -restore*/ if (SOCKET_ERROR == ret) { diag_printf("diag_AcceptRecvFromSocket 111 \n"); return; } /* accept/receive on TCP sockets*/ for (enTcpPort = (DIAG_TCPIP_PORT_ENUM)0; enTcpPort < EN_TCP_PORT_FULL; enTcpPort++) { /* check and accept incoming connection*/ rxSocket = pstDiagTcpInfo->astTcpIpPort[enTcpPort].listener; if ((rxSocket != INVALID_SOCKET) && (DIAG_FD_ISSET(rxSocket, &ReadySet))) { if(g_dmsPrintFlag == 1) { diag_printf("diag_AcceptRecvFromSocket acceptOnSocket \n"); } diag_AcceptOnSocket(enTcpPort, pstDiagTcpInfo->astTcpIpPort); continue; /* either accept() or recv(), not both*/ } /* check and receive incoming traffic */ rxSocket = pstDiagTcpInfo->astTcpIpPort[enTcpPort].Tcp; if ((rxSocket != INVALID_SOCKET) && (DIAG_FD_ISSET(rxSocket, &ReadySet))) { if(g_dmsPrintFlag == 1) { diag_printf("diag_AcceptRecvFromSocket tcpRcvData \n"); } diag_TcpRcvData(rxSocket, enTcpPort, pfnConn); } } }
VOS_UINT32 diag_TcpSendData(DIAG_TCPIP_PORT_ENUM enTcpPort,VOS_UINT8 *pcData, VOS_UINT32 usDataLen, VOS_UINT32 * pusWrtLen) { VOS_INT32 len = SOCKET_ERROR; DIAG_TCPIP_CTRL_INFO_STRU* pstTcpIpInfo = diag_GetTcpInfo(); DIAG_PORT_CONNECT_STA_PFN pfnConn = DIAG_PORT_GET_CONN_CALLBACK(); DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_SOCKET_SEND, (VOS_UINT32)enTcpPort, (VOS_UINT32)len, 0); if(pstTcpIpInfo->astTcpIpPort[enTcpPort].Tcp ==INVALID_SOCKET) { diag_printf("diag_TcpSendData invalid socket!\n"); DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_SOCKET_SEND_ERROR, (VOS_UINT32)len, 0, 0); return ERR_MSP_FAILURE; } SCM_INVALID_CACHE(pcData , usDataLen); len = send((int)(pstTcpIpInfo->astTcpIpPort[enTcpPort].Tcp), (VOS_CHAR*)pcData, (int)usDataLen, 0); if(g_dmsPrintFlag == 1) { diag_printf("***********diag_TcpSendData !! usDataLen = %d,enTcpPort=%d,pcData = 0x%p\n" ,usDataLen ,enTcpPort, pcData); diag_printf("***********diag_TcpSendData !! len=%d,astTcpIpPort[enTcpPort].Tcp=%d \n" ,len,pstTcpIpInfo->astTcpIpPort[enTcpPort].Tcp); } if (SOCKET_ERROR == len) { /*如果是重连之后的第一次发送,可能由于任务调度的原因导致socket获取错误; */ /*此类错误不可以关闭socket; */ if(pstTcpIpInfo->astTcpIpPort[enTcpPort].ulIsReCon==1) { diag_printf("pstTcpIpInfo->astTcpIpPort[enTcpPort].ulIsReCon==1\n"); DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_SOCKET_SEND_ERROR, (VOS_UINT32)len, 0, 1); return ERR_MSP_FAILURE; } /*关闭socket */ diag_CloseSocket(enTcpPort); /*置连接状态为断开 */ if (enTcpPort == EN_TCP_PORT_DIAG) { DIAG_PORT_PORT_SWITCH(EN_DIAG_SOCKET_BEARER_TCP_20248); if (pfnConn != NULL) { DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_SOCKET_SEND_ERROR, (VOS_UINT32)len, 0, 2); pfnConn(DIAG_DISCONN); } } pstTcpIpInfo = diag_GetTcpInfo(); pstTcpIpInfo->astTcpIpPort[enTcpPort].ulConnectSta = DIAG_DISCONN; return ERR_MSP_FAILURE; } /*后续的发送失败就会直接关闭socket */ pstTcpIpInfo->astTcpIpPort[enTcpPort].ulIsReCon = 0; *pusWrtLen = (VOS_UINT32)len; return ERR_MSP_SUCCESS; }
static VOS_VOID diag_AcceptOnSocket(DIAG_TCPIP_PORT_ENUM ucTcpPort , DIAG_TCPIP_PORT_STRU *astTcpPort) { /*lint -save -e565*/ struct sockaddr_in from; /*lint -restore*/ VOS_SOCKET newSocket; VOS_SOCKET *ListenerSocket; VOS_INT32 len; DIAG_PORT_CONNECT_STA_PFN pfnConn = DIAG_PORT_GET_CONN_CALLBACK(); ListenerSocket = &(astTcpPort[ucTcpPort].listener); /*lint -save -e84 -e565 -e740*/ len = sizeof(struct sockaddr_in); newSocket = accept(*ListenerSocket, (struct sockaddr *)&from, (int *)&len); /*lint -restore*/ if (INVALID_SOCKET == newSocket) { closesocket(*ListenerSocket); *ListenerSocket = INVALID_SOCKET; diag_printf("diag_AcceptOnSocket INVALID_SOCKET == newSocket!\n"); return; } /*增加Diag通道的重连处理流程*/ else { if(astTcpPort[ucTcpPort].Tcp !=INVALID_SOCKET) { closesocket(astTcpPort[ucTcpPort].Tcp); astTcpPort[ucTcpPort].Tcp = INVALID_SOCKET; astTcpPort[ucTcpPort].ulIsReCon= 1; diag_printf("diag_AcceptOnSocket astTcpPort[ucTcpPort].ulIsReCon= 1;!\n"); DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_TCP_RECONNECT, (VOS_UINT32)newSocket, 0, 0); } } DIAG_DEBUG_SDM_FUN(EN_DIAG_TCP_SOCKET_ACP, (VOS_UINT32)newSocket, 0, 0); diag_TcpPortLock(ucTcpPort); astTcpPort[ucTcpPort].Tcp = newSocket; diag_TcpPortUnLock(ucTcpPort); #if (VOS_WIN32== VOS_OS_VER) /* close listening socket (allow one connection per channel)*/ if(ucTcpPort == EN_TCP_PORT_AT) { closesocket(*ListenerSocket); *ListenerSocket = INVALID_SOCKET; } #endif /* 记录该连接状态*/ if(ucTcpPort == EN_TCP_PORT_DIAG) { DIAG_PORT_PORT_SWITCH(EN_DIAG_SOCKET_BEARER_TCP_20248); if (pfnConn != NULL) { pfnConn(DIAG_CONN); diag_printf("diag_AcceptOnSocket pfnConn(EN_DMS_CHANNEL_DIAG, DIAG_DISCONN)!\n"); } } /* 记录该连接状态*/ astTcpPort[ucTcpPort].ulConnectSta = DIAG_CONN; }