static int manageLinks(Sdr sdr, time_t currentTime) { PsmPartition ionwm = getIonwm(); LtpVdb *ltpvdb = getLtpVdb(); IonVdb *ionvdb = getIonVdb(); PsmAddress elt; LtpVspan *vspan; Object obj; LtpSpan span; IonNeighbor *neighbor; PsmAddress nextElt; unsigned long priorXmitRate; sdr_begin_xn(sdr); for (elt = sm_list_first(ionwm, ltpvdb->spans); elt; elt = sm_list_next(ionwm, elt)) { vspan = (LtpVspan *) psp(ionwm, sm_list_data(ionwm, elt)); /* Finish aggregation as necessary. */ obj = sdr_list_data(sdr, vspan->spanElt); sdr_stage(sdr, (char *) &span, obj, sizeof(LtpSpan)); if (span.lengthOfBufferedBlock > 0) { span.ageOfBufferedBlock++; sdr_write(sdr, obj, (char *) &span, sizeof(LtpSpan)); if (span.ageOfBufferedBlock >= span.aggrTimeLimit) { sm_SemGive(vspan->bufFullSemaphore); } } /* Find Neighbor object encapsulating the current * known state of this LTP engine. */ neighbor = findNeighbor(ionvdb, vspan->engineId, &nextElt); if (neighbor == NULL) { neighbor = addNeighbor(ionvdb, vspan->engineId, nextElt); if (neighbor == NULL) { putErrmsg("Can't update span.", NULL); return -1; } } if (neighbor->xmitRate == 0) { if (vspan->localXmitRate > 0) { vspan->localXmitRate = 0; ltpStopXmit(vspan); } } else { if (vspan->localXmitRate == 0) { vspan->localXmitRate = neighbor->xmitRate; ltpStartXmit(vspan); } } if (neighbor->fireRate == 0) { if (vspan->remoteXmitRate > 0) { priorXmitRate = vspan->remoteXmitRate; vspan->remoteXmitRate = 0; if (ltpSuspendTimers(vspan, elt, currentTime, priorXmitRate)) { putErrmsg("Can't manage links.", NULL); return -1; } } } else { if (vspan->remoteXmitRate == 0) { vspan->remoteXmitRate = neighbor->fireRate; if (ltpResumeTimers(vspan, elt, currentTime, vspan->remoteXmitRate)) { putErrmsg("Can't manage links.", NULL); return -1; } } } if (neighbor->recvRate == 0) { vspan->receptionRate = 0; } else { vspan->receptionRate = neighbor->recvRate; } if (neighbor->owltInbound != vspan->owltInbound) { vspan->owltInbound = neighbor->owltInbound; } if (neighbor->owltOutbound != vspan->owltOutbound) { vspan->owltOutbound = neighbor->owltOutbound; } } if (sdr_end_xn(sdr) < 0) { putErrmsg("ltpclock failed managing links.", NULL); return -1; } return 0; }
int udplsi(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10) { char *endpointSpec = (char *) a1; #else int main(int argc, char *argv[]) { char *endpointSpec = (argc > 1 ? argv[1] : NULL); #endif LtpVdb *vdb; unsigned short portNbr = 0; unsigned int ipAddress = INADDR_ANY; struct sockaddr socketName; struct sockaddr_in *inetName; ReceiverThreadParms rtp; socklen_t nameLength; pthread_t receiverThread; int fd; char quit = '\0'; /* Note that ltpadmin must be run before the first * invocation of ltplsi, to initialize the LTP database * (as necessary) and dynamic database. */ if (ltpInit(0) < 0) { putErrmsg("udplsi can't initialize LTP.", NULL); return 1; } vdb = getLtpVdb(); if (vdb->lsiPid != ERROR && vdb->lsiPid != sm_TaskIdSelf()) { putErrmsg("LSI task is already started.", itoa(vdb->lsiPid)); return 1; } /* All command-line arguments are now validated. */ if (endpointSpec) { if(parseSocketSpec(endpointSpec, &portNbr, &ipAddress) != 0) { putErrmsg("Can't get IP/port for endpointSpec.", endpointSpec); return -1; } } if (portNbr == 0) { portNbr = LtpUdpDefaultPortNbr; } portNbr = htons(portNbr); ipAddress = htonl(ipAddress); memset((char *) &socketName, 0, sizeof socketName); inetName = (struct sockaddr_in *) &socketName; inetName->sin_family = AF_INET; inetName->sin_port = portNbr; memcpy((char *) &(inetName->sin_addr.s_addr), (char *) &ipAddress, 4); rtp.linkSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (rtp.linkSocket < 0) { putSysErrmsg("LSI can't open UDP socket", NULL); return -1; } nameLength = sizeof(struct sockaddr); if (reUseAddress(rtp.linkSocket) || bind(rtp.linkSocket, &socketName, nameLength) < 0 || getsockname(rtp.linkSocket, &socketName, &nameLength) < 0) { closesocket(rtp.linkSocket); putSysErrmsg("Can't initialize socket", NULL); return 1; } /* Set up signal handling; SIGTERM is shutdown signal. */ ionNoteMainThread("udplsi"); isignal(SIGTERM, interruptThread); /* Start the receiver thread. */ rtp.running = 1; if (pthread_begin(&receiverThread, NULL, handleDatagrams, &rtp)) { closesocket(rtp.linkSocket); putSysErrmsg("udplsi can't create receiver thread", NULL); return 1; } /* Now sleep until interrupted by SIGTERM, at which point * it's time to stop the link service. */ { char txt[500]; isprintf(txt, sizeof(txt), "[i] udplsi is running, spec=[%s:%d].", inet_ntoa(inetName->sin_addr), ntohs(portNbr)); writeMemo(txt); } ionPauseMainThread(-1); /* Time to shut down. */ rtp.running = 0; /* Wake up the receiver thread by sending it a 1-byte * datagram. */ fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (fd >= 0) { isendto(fd, &quit, 1, 0, &socketName, sizeof(struct sockaddr)); closesocket(fd); } pthread_join(receiverThread, NULL); closesocket(rtp.linkSocket); writeErrmsgMemos(); writeMemo("[i] udplsi has ended."); ionDetach(); return 0; }
int pmqlsi(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10) { char *mqName = (char *) a1; #else int main(int argc, char *argv[]) { char *mqName = (argc > 1 ? argv[1] : NULL); #endif LtpVdb *vdb; struct mq_attr mqAttributes = { 0, PMQLSA_MAXMSG, PMQLSA_MSGSIZE, 0 }; ReceiverThreadParms rtp; pthread_t receiverThread; char stop = '0'; if (mqName == NULL) { puts("Usage: pmqlsi <message queue name>"); return 0; } /* Note that ltpadmin must be run before the first * invocation of ltplsi, to initialize the LTP database * (as necessary) and dynamic database. */ if (ltpInit(0, 0) < 0) { putErrmsg("pmqlsi can't initialize LTP.", NULL); return 1; } vdb = getLtpVdb(); if (vdb->lsiPid > 0 && vdb->lsiPid != sm_TaskIdSelf()) { putErrmsg("LSI task is already started.", itoa(vdb->lsiPid)); return 1; } /* All command-line arguments are now validated. */ rtp.mq = mq_open(mqName, O_RDWR | O_CREAT, 0777, &mqAttributes); if (rtp.mq == (mqd_t) -1) { putSysErrmsg("pmglsi can't open message queue", mqName); return 1; } /* Set up signal handling; SIGTERM is shutdown signal. */ isignal(SIGTERM, interruptThread); /* Start the receiver thread. */ rtp.running = 1; rtp.mainThread = pthread_self(); if (pthread_create(&receiverThread, NULL, handleMessages, &rtp)) { mq_close(rtp.mq); putSysErrmsg("pmqlsi can't create receiver thread", NULL); return 1; } /* Now sleep until interrupted by SIGTERM, at which point * it's time to stop the link service. */ writeMemo("[i] pmqlsi is running"); snooze(2000000000); /* Time to shut down. */ rtp.running = 0; mq_send(rtp.mq, &stop, 1, 0); /* Tell receiver to stop. */ pthread_join(receiverThread, NULL); mq_close(rtp.mq); writeErrmsgMemos(); writeMemo("[i] pmqlsi duct has ended."); return 0; }