TheNetNode-CB/src/l7time.c

576 lines
20 KiB
C
Executable File

/************************************************************************/
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNetNode */
/* ***** ***** Portable */
/* ***** ***** Network */
/* ***** ***** Software */
/* */
/* File src/l7time.c (maintained by: ???) */
/* */
/* This file is part of "TheNetNode" - Software Package */
/* */
/* Copyright (C) 1998 - 2008 NORD><LINK e.V. Braunschweig */
/* */
/* This program is free software; you can redistribute it and/or modify */
/* it under the terms of the NORD><LINK ALAS (Allgemeine Lizenz fuer */
/* Amateurfunk Software) as published by Hans Georg Giese (DF2AU) */
/* on 13/Oct/1992; either version 1, or (at your option) any later */
/* version. */
/* */
/* This program is distributed WITHOUT ANY WARRANTY only for further */
/* development and learning purposes. See the ALAS (Allgemeine Lizenz */
/* fuer Amateurfunk Software). */
/* */
/* You should have received a copy of the NORD><LINK ALAS (Allgemeine */
/* Lizenz fuer Amateurfunk Software) along with this program; if not, */
/* write to NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/* Dieses Programm ist PUBLIC DOMAIN, mit den Einschraenkungen durch */
/* die ALAS (Allgemeine Lizenz fuer Amateurfunk Software), entweder */
/* Version 1, veroeffentlicht von Hans Georg Giese (DF2AU), */
/* am 13.Oct.1992, oder (wenn gewuenscht) jede spaetere Version. */
/* */
/* Dieses Programm wird unter Haftungsausschluss vertrieben, aus- */
/* schliesslich fuer Weiterentwicklungs- und Lehrzwecke. Naeheres */
/* koennen Sie der ALAS (Allgemeine Lizenz fuer Amateurfunk Software) */
/* entnehmen. */
/* */
/* Sollte dieser Software keine ALAS (Allgemeine Lizenz fuer Amateur- */
/* funk Software) beigelegen haben, wenden Sie sich bitte an */
/* NORD><LINK e.V., Hinter dem Berge 5, D-38108 Braunschweig */
/* */
/************************************************************************/
#include "tnn.h"
#ifdef BEACON_STATUS
static void noden(MBHEAD *mbp);
static void statusqual(MBHEAD *mbp, ULONG qual);
#endif
/************************************************************************/
/*---- ----*/
/*----------------------------------------------------------------------*/
void timsrv(void)
{
static LONG Time10 = 0L;
#ifdef BEACON_STATUS
static LONG Time500 = 0L;
#endif
static WORD s_time = 0;
static WORD sec_cnt = 0;
UWORD zeit;
PTCENT *ptcp;
PORTSTAT *statp;
int i;
CQBUF *cqp;
UID uid, p_uid;
#ifdef CONNECTTIME
PEER *pp;
int max_peers = netp->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 */