コード例 #1
0
ファイル: diag_port.c プロジェクト: rgmabs19357/Huawei-
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;
}
コード例 #2
0
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);
        }
    }
}
コード例 #3
0
ファイル: diag_tcp.c プロジェクト: herryfan/kernel-huawei-h60
 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);
        }
    }
}
コード例 #4
0
ファイル: diag_tcp.c プロジェクト: herryfan/kernel-huawei-h60
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;
}
コード例 #5
0
ファイル: diag_tcp.c プロジェクト: herryfan/kernel-huawei-h60
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;
}