void MainTask(void) { IP_Init(); OS_SetPriority(OS_GetTaskID(), 255); // This task has highest prio for real-time application OS_CREATETASK(&_TCB , "IP_Task" , IP_Task , 150, _Stack); // Start the IP task #if USE_RX_TASK OS_CREATETASK(&_IPRxTCB , "IP_RxTask", IP_RxTask , 140, _IPRxStack); // Start the IP_RxTask, optional. #endif OS_CREATETASK(&_TCBShell, "Shell" , IP_ShellServer, 100, _StackShell); // Start the shell server while (IP_IFaceIsReady() == 0) { OS_Delay(50); } while (1) { BSP_ToggleLED(1); OS_Delay (200); } }
/*----------------------------------------------------------------------* rtp_net_connect *----------------------------------------------------------------------*/ int rtp_net_connect (RTP_HANDLE sockHandle, unsigned char *ipAddr, int port, int type) { int sinLen; struct sockaddr_in sin; unsigned long in_addr = 0; int connectStatus; sinLen = sizeof(sin); memset(&sin, 0, sinLen); if (ipAddr) { unsigned char *ptr = (unsigned char *) &in_addr; ptr[0] = ipAddr[0]; ptr[1] = ipAddr[1]; ptr[2] = ipAddr[2]; ptr[3] = ipAddr[3]; } else { /* invalid address */ return (-1); } sin.sin_family = AF_INET; sin.sin_addr.s_addr = in_addr; sin.sin_port = htons((unsigned short)port); #ifdef DO_IFACE_CHECK while (IP_IFaceIsReady() == 0) { OS_Delay(100); } #endif connectStatus = connect((int) sockHandle, ( struct sockaddr *) &sin, sinLen); if (connectStatus != 0) { int errVal = _rtp_get_last_socket_error(sockHandle); if ((errVal == EINPROGRESS) || (errVal == EWOULDBLOCK) || (errVal == EALREADY) || (errVal == EISCONN)) { #ifdef RTP_DEBUG RTP_DEBUG_OUTPUT_STR("rtp_net_connect: non-fatal error returned "); RTP_DEBUG_OUTPUT_INT(errVal); RTP_DEBUG_OUTPUT_STR(".\n"); #endif return (-2); } #ifdef RTP_DEBUG RTP_DEBUG_OUTPUT_STR("rtp_net_connect: error returned "); RTP_DEBUG_OUTPUT_INT(errVal); RTP_DEBUG_OUTPUT_STR(".\n"); #endif return (-1); } return (0); }
/*----------------------------------------------------------------------* rtp_net_accept *----------------------------------------------------------------------*/ int rtp_net_accept (RTP_HANDLE *connectSock, RTP_HANDLE serverSock, unsigned char *ipAddr, int *port, int *type) { struct sockaddr_in clientAddr; int clientLen; int conSocket; clientLen = sizeof(clientAddr); memset(&clientAddr, 0, clientLen); #ifdef DO_IFACE_CHECK while (IP_IFaceIsReady() == 0) { OS_Delay(100); } #endif conSocket = accept((int) serverSock, (struct sockaddr *) &clientAddr, &clientLen); if (conSocket == -1) { int errVal = _rtp_get_last_socket_error(serverSock); *connectSock = ((RTP_HANDLE)-1); /* The man page for accept(2) indicates that due to Linux passing already-pending errors through accept, the following TCP/IP errors should be treated as EAGAIN: ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, and ENETUNREACH. */ if (//(errVal == EAGAIN) || (errVal == EWOULDBLOCK) || //(errVal == EINTR) || //(errVal == ENETDOWN) || //(errVal == EPROTO) || (errVal == ENOPROTOOPT) || //(errVal == EHOSTDOWN) || //(errVal == ENONET) || //(errVal == EHOSTUNREACH) || (errVal == EOPNOTSUPP) || (errVal == ENETUNREACH)) { #ifdef RTP_DEBUG RTP_DEBUG_OUTPUT_STR("rtp_net_accept: non-fatal error returned "); RTP_DEBUG_OUTPUT_INT(errVal); RTP_DEBUG_OUTPUT_STR(".\n"); #endif return (-2); } #ifdef RTP_DEBUG RTP_DEBUG_OUTPUT_STR("rtp_net_accept: error returned "); RTP_DEBUG_OUTPUT_INT(errVal); RTP_DEBUG_OUTPUT_STR(".\n"); #endif return (-1); } *connectSock = (RTP_HANDLE)conSocket; if (ipAddr) { unsigned long d = clientAddr.sin_addr.s_addr; unsigned char *ptr = (unsigned char *) &d; *type = RTP_NET_TYPE_IPV4; ipAddr[0] = ptr[0]; ipAddr[1] = ptr[1]; ipAddr[2] = ptr[2]; ipAddr[3] = ptr[3]; } if (port) { *port = ntohs(clientAddr.sin_port); } return (0); }