static void ProcessSystemData(Cs2ethStruct *Data, MrIpcCmdType *CmdFrame) { char UdpFrame[MR_CS2_UDP_LENGTH]; MrCs2CanDataType CanMsg; int i; ClientInfo *OneClient; if (MrIpcGetCommand(CmdFrame) != MrIpcCmdNull) { switch (MrIpcGetCommand(CmdFrame)) { case MrIpcCmdRequestLocName: case MrIpcCmdRequestLocInfo: break; default: MrIpcDecodeToCan(CmdFrame, &CanMsg); if (Cs2ethGetVerbose(Data)) { #ifdef TRACE if (Cs2ethGetTrace(Data)) MrCs2Trace(&CanMsg); #endif printf("send can data 0x%lx %d to UDP client\n ", MrCs2GetId(&CanMsg), MrCs2GetDlc(&CanMsg)); for (i = 0; i < 8; i++) printf("0x%02x ", CanMsg.Data[i]); printf("\n hash 0x%x resp 0x%x cmd 0x%x prio 0x%x\n", MrCs2GetHash(&CanMsg), MrCs2GetResponse(&CanMsg), MrCs2GetCommand(&CanMsg), MrCs2GetPrio(&CanMsg)); } MrEthCs2Encode(UdpFrame, &CanMsg); if (Cs2ethGetUdpConnected(Data)) { if ((MrIpcGetReceiverSocket(CmdFrame) == MR_IPC_SOCKET_ALL) || (MrIpcGetReceiverSocket(CmdFrame) == Cs2ethGetOutsideUdpSock(Data))) { if (Cs2ethGetVerbose(Data)) puts("send as udp"); MrEthCs2SendTo(Cs2ethGetOutsideUdpSock(Data), (struct sockaddr_in *)&(Cs2ethGetClientAddr(Data)), UdpFrame); } } MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data)); OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data)); while (OneClient != (ClientInfo *)NULL) { if ((MrIpcGetReceiverSocket(CmdFrame) == MR_IPC_SOCKET_ALL) || (MrIpcGetReceiverSocket(CmdFrame) == OneClient->ClientSock)) { if (Cs2ethGetVerbose(Data)) printf("send to tcp socket %d\n", OneClient->ClientSock); MrEthCs2Send(OneClient->ClientSock, UdpFrame); } OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); } break; } } }
static void Stop(Cs2ethStruct *Data) { ClientInfo *OneClient; if (Cs2ethGetVerbose(Data)) puts("stop mrcs2eth"); MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data)); OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data)); while (OneClient != (ClientInfo *)NULL) { MrEthCs2Close(OneClient->ClientSock); OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); } MrIpcClose(Cs2ethGetClientSock(Data)); MrEthCs2Close(Cs2ethGetOutsideUdpSock(Data)); MrEthCs2Close(Cs2ethGetOutsideTcpSock(Data)); }
void CanMemberDelAllInvalid(CanMemberStruct *Data) { Menge *MemberToDel; MengeIterator IterToDel; CollectStruct Collector; unsigned long *UidToDel; MemberToDel = MengeCreate(); MengeInit(MemberToDel, MemberDelCmp, (MengeDelCbFkt)free); Collector.CanMemberDb = CanMemberGetCanMemberDb(Data); Collector.MemberToDel = MemberToDel; MapWalkAscend(CanMemberGetCanMemberDb(Data), (MapWalkCbFkt)CollectInvalid, (void *)&Collector); MengeInitIterator(&IterToDel, MemberToDel); UidToDel = (unsigned long *)MengeFirst(&IterToDel); while (UidToDel != 0l) { MapDel(CanMemberGetCanMemberDb(Data), (MapKeyType)*UidToDel); UidToDel = (unsigned long *)MengeNext(&IterToDel); } MengeDestroy(MemberToDel); }
static void ForwardOutsideData(Cs2ethStruct *Data, char *UdpFrame, int SenderSocket) { ClientInfo *OneClient; if ((Cs2ethGetUdpConnected(Data)) && (SenderSocket != Cs2ethGetOutsideUdpSock(Data))) { if (Cs2ethGetVerbose(Data)) puts("forward as udp"); MrEthCs2Send(Cs2ethGetOutsideUdpSock(Data), UdpFrame); } MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data)); OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data)); while (OneClient != (ClientInfo *)NULL) { if (SenderSocket != OneClient->ClientSock) { if (Cs2ethGetVerbose(Data)) printf("forward to tcp socket %d\n", OneClient->ClientSock); MrEthCs2Send(OneClient->ClientSock, UdpFrame); } OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); } }
void Cs2ethRun(Cs2ethStruct *Data) { fd_set ReadFds; int RetVal, HighFd; struct timeval SelectTimeout; time_t Now; ClientInfo *OneClient; if (Start(Data)) { if (Cs2ethGetVerbose(Data)) puts("run mrcs2eth"); while (Loop) { FD_ZERO(&ReadFds); HighFd = 0; if (Cs2ethGetVerbose(Data)) printf("add client socket %d\n", Cs2ethGetClientSock(Data)); FD_SET(Cs2ethGetClientSock(Data), &ReadFds); if (Cs2ethGetClientSock(Data) > HighFd) HighFd = Cs2ethGetClientSock(Data); if (Cs2ethGetVerbose(Data)) printf("add outside udp socket %d\n", Cs2ethGetOutsideUdpSock(Data)); FD_SET(Cs2ethGetOutsideUdpSock(Data), &ReadFds); if (Cs2ethGetOutsideUdpSock(Data) > HighFd) HighFd = Cs2ethGetOutsideUdpSock(Data); if (Cs2ethGetVerbose(Data)) printf("add outside tcp socket %d\n", Cs2ethGetOutsideTcpSock(Data)); FD_SET(Cs2ethGetOutsideTcpSock(Data), &ReadFds); if (Cs2ethGetOutsideTcpSock(Data) > HighFd) HighFd = Cs2ethGetOutsideTcpSock(Data); MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data)); OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data)); while (OneClient != (ClientInfo *)NULL) { if (Cs2ethGetVerbose(Data)) printf("add app socket %d\n", OneClient->ClientSock); FD_SET(OneClient->ClientSock, &ReadFds); if (OneClient->ClientSock > HighFd) HighFd = OneClient->ClientSock; OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); } SelectTimeout.tv_sec = SELECT_TIMEOUT; SelectTimeout.tv_usec = 0; if (Cs2ethGetVerbose(Data)) printf("wait for %d fd, max %ld s\n", HighFd, SelectTimeout.tv_sec); RetVal = select(HighFd + 1, &ReadFds, NULL, NULL, &SelectTimeout); if (Cs2ethGetVerbose(Data)) printf("select liefert %d\n", RetVal); if (((RetVal == -1) && (errno == EINTR)) || (RetVal == 0)) { Now = time(NULL); if (Cs2ethGetVerbose(Data)) printf("interrupt at %s\n", asctime(localtime(&Now))); } else if (RetVal < 0) { if (Cs2ethGetVerbose(Data)) puts("error in main loop"); Loop = FALSE; } else { if (FD_ISSET(Cs2ethGetClientSock(Data), &ReadFds)) { if (Cs2ethGetVerbose(Data)) puts("data on cmd socket to drehscheibe"); HandleSystemData(Data); } if (FD_ISSET(Cs2ethGetOutsideUdpSock(Data), &ReadFds)) { if (Cs2ethGetVerbose(Data)) puts("data on udp socket to remote"); HandleOutsideData(Data); } if (FD_ISSET(Cs2ethGetOutsideTcpSock(Data), &ReadFds)) { if (Cs2ethGetVerbose(Data)) puts("data on tcp socket server to remote"); HandleOutsideTcpConnection(Data); } MengeInitIterator(Cs2ethGetClientIter(Data), Cs2ethGetClients(Data)); OneClient = (ClientInfo *)MengeFirst(Cs2ethGetClientIter(Data)); while (OneClient != (ClientInfo *)NULL) { if (Cs2ethGetVerbose(Data)) printf("check client socket %d\n", OneClient->ClientSock); if (FD_ISSET(OneClient->ClientSock, &ReadFds)) { if (Cs2ethGetVerbose(Data)) puts("data on app socket to remote"); if (HandleAppData(Data, OneClient)) OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); else OneClient = (ClientInfo *)MengeIterRemove(Cs2ethGetClientIter(Data)); } else OneClient = (ClientInfo *)MengeNext(Cs2ethGetClientIter(Data)); } } } Stop(Data); } }