/************************************************************************/ /* */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* ***** ***** */ /* *************** *************** */ /* ***************** ***************** */ /* *************** *************** */ /* ***** ***** TheNetNode */ /* ***** ***** Portable */ /* ***** ***** Network */ /* ***** ***** Software */ /* */ /* File src/l7time.c (maintained by: ???) */ /* */ /* This file is part of "TheNetNode" - Software Package */ /* */ /* Copyright (C) 1998 - 2008 NORD>max_peers; #endif /* CONNECTTIME */ /************************************************************************/ /* */ /* Die Verbindungen bei Antwort auf CQ-Ruf herstellen. */ /* In der Liste cq_statl sind die herzustellenden Verbindungen festge- */ /* legt. In jedem Buffer dieser Liste steht die UID des CQ-Rufers in */ /* uid sowie die UID dessen, der antwortet in p_uid. */ /* */ /************************************************************************/ while ((LHEAD *)cq_statl.head != &cq_statl) { cqp = (CQBUF *)ulink((LEHEAD *)cq_statl.head); uid = cqp->uid; p_uid = cqp->p_uid; l2tol7(L7MCONNT, g_ulink(uid), g_utyp(uid)); l2tol7(L7MCONNT, g_ulink(p_uid), g_utyp(p_uid)); (ptctab + p_uid)->state = UPLINK; (ptctab + uid)->state = DOWNLINK; dealoc((MBHEAD *)cqp); } zeit = (UWORD) (tic10-lastic); if (zeit != 0) { lastic = tic10; #ifndef MC68K l1timr(zeit); #endif hostsv(); #ifdef __LINUX__ if ((tic10 % 10) == 0) /* Alle 100ms arbeiten */ shellsrv(); #endif if ((UWORD)(tic1s += zeit) >= 100) /* Alle Sekunde arbeiten */ { tic1s -= 100; time(&sys_time); sys_localtime = localtime(&sys_time); for (i = 0, ptcp = ptctab; i < NUMPAT; i++, ptcp++) if (ptcp->state) ptcp->contime++; #ifdef CONNECTTIME /* Alle Segmente durchgehen. */ for (i = 0, pp = netp->peertab; i < max_peers; i++, pp++) { if (!pp->used) /* Unbenutzer Eintrag, */ continue; /* zum naechsten Segment. */ if (pp->nbrl2l == NULL) /* Link ist deaktiv. */ { pp->contime = 0; /* Connectzeit zuruecksetzen. */ continue; } if (pp->nbrl2l->state < L2SIXFER)/* Link ist aktiv,aber im Auf/Abbau*/ { pp->contime = 0; /* Connectzeit zuruecksetzen. */ continue; } if (pp->nbrl2l->state >= L2SIXFER) /* Link ist aktiv. */ { if (pp->quality) /* Nur wenn gueltige Qualitaet, */ pp->contime++; /* connectzeit um eins erhoehen. */ else pp->contime = 0; /* Connectzeit zuruecksetzen. */ } } #endif /* CONNECTTIME */ if (++sec_cnt % 10 == 0) /* alle 10 Sekunden */ { #ifdef __LINUX__ calculate_load (); #endif for (i = 0, statp = portstat; i < L2PNUM; i++, statp++) { if (statp->rx_baud) statp->rx_baud = ((statp->rx_baud+1)*7L-1+ (statp->rx_bytes-statp->last_rx)/10L ) / 8L; else statp->rx_baud = (statp->rx_bytes-statp->last_rx)/10L / 4L; if (statp->tx_baud) statp->tx_baud = ((statp->tx_baud+1)*7L-1+ (statp->tx_bytes-statp->last_tx)/10L ) / 8L; else statp->tx_baud = (statp->tx_bytes-statp->last_tx)/10L / 4L; statp->last_rx = statp->rx_bytes; statp->last_tx = statp->tx_bytes; } if (thbps) /* Durchsatz/Baudrate berechnen */ thbps = ((thbps+1)*7L-1+throughput/10L)/8L; else thbps = throughput/10L / 4L; if (thbps > thbps_max) /* Maximalwert merken */ thbps_max = thbps; throughput = 0L; /* Durschsatzzaehler leeren */ for (i = 0, ptcp = ptctab; i < NUMPAT; i++, ptcp++) if (ptcp->state) { if (ptcp->rxbps) /* Durchsatz/Baudrate berechnen */ ptcp->rxbps = ((ptcp->rxbps+1)*7L-1+ (ptcp->inforx-ptcp->lastrx)/10L ) / 8L; else ptcp->rxbps = (ptcp->inforx-ptcp->lastrx)/10L / 4L; if (ptcp->txbps) ptcp->txbps = ((ptcp->txbps+1)*7L-1+ (ptcp->infotx-ptcp->lasttx)/10L ) / 8L; else ptcp->txbps = (ptcp->infotx-ptcp->lasttx)/10L / 4L; ptcp->lastrx = ptcp->inforx; ptcp->lasttx = ptcp->infotx; } } if (sec_cnt == 60) /* Alle Minute */ { sec_cnt = 0; rounds_pro_sec = (rounds_count / 60L); if (rounds_max_sec && rounds_min_sec) { rounds_max_sec = rounds_pro_sec > rounds_max_sec ? rounds_pro_sec : rounds_max_sec; rounds_min_sec = rounds_pro_sec > rounds_min_sec ? rounds_min_sec : rounds_pro_sec; } else rounds_min_sec = rounds_max_sec = rounds_pro_sec; rounds_count = 0; #ifdef GRAPH /* Eine Minute warten nach Programmstart*/ if (graph.enabled == FALSE) graph.enabled = TRUE; #endif #ifdef MC68K l1timr(zeit); #endif beacsv(); /* Baken bearbeiten */ #ifdef __GO32__ toggle_lpt(); #endif } #ifdef GRAPH graph_timer(); #endif if (Time10 <= 0L) /* 10 min abgelaufen */ { Time10 = 600L; /* neu setzen */ /* 600 Sekunden = 10 min */ if (save_timer != 0) { if (s_time <= 0) { save_stat(); /* Einstellungen sichern*/ #ifdef GRAPH save_graph(); #endif if (!startup_running) save_mh(); personalmanager(SAVE, NULL, NULL); /* Convers pers. Daten */ s_time = save_timer & 0x7FFF; } s_time--; } #ifdef MC68302 compact(); /* RAM aufraeumen */ #endif } Time10--; /* 10 min Zaehler decrementieren*/ #ifdef BEACON_STATUS /* Ist statusbake abgelaufen */ if (Time500 <= 0L) { /* Timer statusbake neusetzen. */ Time500 = statustim; /* Bake aussenden. */ bake(); } Time500--; #endif hostim(); chknoa(); l3rtt_service(); brosrv(); trasrv(); conversd(); #ifdef IPROUTE arpsrv(); #endif #ifndef __LINUX__ shellsrv(); #endif /* Timeout fuer gelernte AX25IP-Routen durchfuehren */ #if defined(__LINUX__) || defined(__WIN32__) route_age(); #endif #ifdef L1TCPIP /* TCPIP Timer, */ /* Noactivity-Timer fuer alle TCPIP Connect */ /* reduzieren und ggf. Link disconnecten. */ TimerTCP(); #endif /* L1TCPIP */ } } } /* timsrv() */ /*------------------------------------------------------------------------*/ /* beacsv() Baken-Server zur Identifikation des Knotens und */ /* per BEACON-Befehl zuschaltbarer Telemetrie. */ /*------------------------------------------------------------------------*/ void beacsv(void) { MBHEAD *mbp; BEACON *beapoi; time_t upt; LONG upd, uph; WORD i, k; ULONG summe; struct tm *p; p = localtime(&sys_time); for (i = 0, beapoi = beacon; i < L2PNUM; ++beapoi, ++i) { beapoi->beatim++; if (nmbfre > 300 && beapoi->interval != 0) { if (beapoi->beatim >= beapoi->interval) { beapoi->beatim = 0; #ifndef BAKEFIX (mbp = (MBHEAD *) allocb(ALLOC_MBHEAD))->l2fflg = L2CPID; putstr(signon, mbp); if (alias[0] != ' ') putalt(alias,mbp); putcal(myid, mbp); putstr(")\r", mbp); if (beapoi->text[0] != '\0') { putstr(beapoi->text, mbp); putchr('\r', mbp); } rwndmb(mbp); #ifdef __WIN32__ sdui(beapoi->beadil, beapoi->beades, myid, (char)i, mbp); #else sdui(beapoi->beadil, beapoi->beades, myid, i, mbp); #endif /* WIN32 */ dealmb(mbp); #else if (beapoi->text[0] != '\0')/* Bake nur senden wenn Text gesetzt ist. */ { /* Buffer besorgen. */ (mbp = (MBHEAD *) allocb(ALLOC_MBHEAD))->l2fflg = L2CPID; putstr(beapoi->text, mbp); putchr('\r', mbp); rwndmb(mbp); sdui(beapoi->beadil, beapoi->beades, myid, (char)i, mbp); dealmb(mbp); } #endif /* BAKEFIX */ #ifdef BEACON_STATUS if (beapoi->telemetrie == 2) #else if (beapoi->telemetrie) #endif { (mbp = (MBHEAD *) allocb(ALLOC_MBHEAD))->l2fflg = L2CPID; upt = sys_time - start_time; /* Uptime in seconds */ /* Summe */ summe = 0L; /* Gesamtdurchsatz */ for (k = 0; k < L2PNUM; k++) /* Alle Ports des Knotens*/ if (portenabled(k)) summe += (portstat[k].rx_bytes+portstat[k].tx_bytes); if (beapoi->telemetrie == 3) { putprintf(mbp,"%02d.%02d.%02d %02d:%02d:%02d %7lu %8lu %4u %5lu", p->tm_mday, p->tm_mon+1, p->tm_year % 100, p->tm_hour, p->tm_min, p->tm_sec, upt, (ULONG) coreleft(), nmbfre, rounds_pro_sec); putprintf(mbp, " %3d %3d %10lu %7lu\r", nmblks, /* Number of L2-Links */ nmbcir, /* Numer of aktive Cir */ summe, thbps*8L); #ifdef BEACON_STATUS } if (beapoi->telemetrie == 1) { #else } else { #endif putprintf(mbp,"%02d%02d%02d %02d%02d%02d", p->tm_year % 100, p->tm_mon+1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec); upd = upt/SECONDS_PER_DAY; /* Uptime days */ upt %= SECONDS_PER_DAY; uph = upt/SECONDS_PER_HOUR; /* Uptime hours */ upt %= SECONDS_PER_HOUR; upt /= SECONDS_PER_MIN; /* Uptime minutes */ putprintf(mbp," Up=%3ld%02ld%02lu Mem=%6lu Buf=%4d Rps=%5lu", upd, uph, upt, /* Uptime */ (ULONG) coreleft(), /* Free Mem */ nmbfre, /* Free Buffer */ rounds_pro_sec); /* Runden */ putprintf(mbp, "\rLnk=%3d Cir=%3d Sum=%10lu Thr=%6lu\r", nmblks, /* Number of L2-Links */ nmbcir, /* Numer of aktive Cir */ summe, thbps*8L); } rwndmb(mbp); #ifdef __WIN32__ sdui(beapoi->beadil, "STAT \140", myid, (char)i, mbp); #else sdui(beapoi->beadil, "STAT \140", myid, i, mbp); #endif /* WIN32 */ dealmb(mbp); } } } } } #ifdef BEACON_STATUS static void statusqual(MBHEAD *mbp, ULONG qual) { if (qual) putprintf(mbp,":%-4ld ", qual/10); else putstr(":-- ",mbp); } static void noden(MBHEAD *mbp) { PEER *pp; int i; int max_peers = netp->max_peers; int len,width = 0; for (i = 0, pp = netp->peertab; i < max_peers; i++, pp++) { if (pp->used) { mbp->l4time = mbp->mbpc; if (pp->typ >= LOCAL) continue; putide(pp->l2link->call,mbp); statusqual(mbp,pp->quality); len = (mbp->mbpc - mbp->l4time); /* Laenge eines Eintrages */ width += len; if (width + len < 79) { /* einer passt noch in die Zeile */ len = (79 % len) / (79 / len); while (len--) putchr(' ', mbp); } else { putchr('\r', mbp); width = 0; } } } } void bake(void) { MBHEAD *mbp; MBHEAD *tmpmbp; BEACON *beapoi; BOOLEAN frame1 = TRUE; char cuser[4]; int i; int anz_frag,info,pacl = 0; for (i = 0, beapoi = beacon; i < L2PNUM; ++beapoi, ++i) { if (beapoi->telemetrie == 3) { char runtime[8 + 1]; #ifndef CONNECTTIME_ unsigned long zeit, sec, min, std; zeit = sys_time - start_time; /* Uptime in seconds */ sec = zeit % 60L; zeit /= 60L; min = zeit % 60L; zeit /= 60L; std = zeit % 24L; zeit /= 24L; if (zeit > 0) sprintf(runtime, "%2lud,%2luh",zeit, std); /* Tage, Stunden. */ else if (std > 0) sprintf(runtime, "%2luh,%2lum",std, min); /* Stunden, Minuten. */ else if (min > 0) sprintf(runtime, "%2lum,%2lus", min, sec); /* Minuten, Sekunden. */ else { if (sec > 0) sprintf(runtime, " %2lus", sec); /* Ausgabe in Sekunden. */ else sprintf(runtime, " "); } #else sprintf(runtime, "%s", ConnectTime(tic10 / 100)); #endif /* CONNECTTIME */ (mbp = (MBHEAD *)allocb(ALLOC_MBHEAD))->l2fflg = L2CPID; convers_user(cuser); putprintf(mbp, "Links: %2d, Convers: %2s, Dest/Nodes: %3d, Buffers: %5lu, Runtime: %7s\r" , nmblks , cuser , netp->num_nodes , nmbfre , runtime); noden(mbp); rwndmb(mbp); info = ((mbp->mbpc) - (mbp->mbgc)); if (info < 257) { #ifdef __WIN32__ sdui("", "STATUS\140", myid, (char)i, mbp); #else sdui("", "STATUS\140", myid, i, mbp); #endif /* WIN32 */ dealmb(mbp); } else { anz_frag = info / 217; if (anz_frag > 127) { dealmb(mbp); return; } do { (tmpmbp = (MBHEAD *)allocb(ALLOC_MBHEAD))->l2fflg = L2CPID; if (frame1 == TRUE) { pacl = 229; frame1 = FALSE; } else pacl = 234; while (tmpmbp->mbpc < pacl) { if (!(mbp->mbpc - mbp->mbgc)) break; putchr(getchr(mbp), tmpmbp); } rwndmb(tmpmbp); #ifdef __WIN32__ sdui("", "STATUS\140", myid, (char)i, tmpmbp); #else sdui("", "STATUS\140", myid, i, tmpmbp); #endif /* WIN32 */ dealmb(tmpmbp); } while (anz_frag-- > 0); dealmb(mbp); } } } } #endif /* End of src/l7time.c */