/************************************************************************/
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNetNode */
/* ***** ***** Portable */
/* ***** ***** Network */
/* ***** ***** Software */
/* */
/* File src/l2stma.c (maintained by: DF6LN) */
/* */
/* This file is part of "TheNetNode" - Software Package */
/* */
/* Copyright (C) 1998 - 2008 NORD>state]; /* Zeiger auf den Zustandseintrag */
msg = st->msg; /* Meldung zum Layer */
st->func(); /* Zustandsuebergangsfunktion */
l2newstate(st->newstate); /* neuen State setzen */
if (msg != L2MNIX)
{
mftb[msg].func(); /* Meldungsfunktion */
#ifdef __WIN32__
l2tolx((short)msg); /* Ereignis melden */
#else
l2tolx(msg); /* Ereignis melden */
#endif /* WIN32 */
}
}
/************************************************************************\
* *
* "level 2 new state" *
* *
* In einen neuen Zustand uebergehen. Da hier die aktiven Links gezaehlt *
* werden, duerfen Status-Wechel nur hier durchgefuehrt werden. *
* *
\************************************************************************/
void
l2newstate(WORD newstate)
{
WORD oldstate;
PORTINFO *p;
int port;
oldstate = lnkpoi->state; /* alten Status merken */
/****************************************************/
/* Konvertierung von 'short ' in 'unsigned char ',*/
/* moeglicher Datenverlust */
/* Modifiziert durch Oliver Kern */
/* Str. d. Zukunft 29 */
/* 01612 Glaubitz */
#ifdef __WIN32__
lnkpoi->state = (UBYTE)newstate;
#else
lnkpoi->state = newstate;
#endif
/****************************************************/
if (oldstate && !newstate) /* ein Link wird abgebaut */
{
relink(ulink((LEHEAD *)lnkpoi), /* aus der aktiv-Liste nehmen */
(LEHEAD *)l2frel.tail); /* in die Freiliste haengen */
nmblks--; /* nun haben wir einen weniger */
(p = &portpar[port = lnkpoi->liport])->nmblks--;
if (!multiconn(port, lnkpoi->realid)) /* letzter Connect? */
{
p->nmbstn--;
autopers(port); /* Port-Parameter anpassen */
}
getMCs(); /* Veraenderung DAMA melden */
}
if (!oldstate && newstate) /* ein Link wird aufgebaut */
{
if (++nmblks > nmblks_max) /* Maximalwert fuer die Statistik */
nmblks_max = nmblks;
(p = &portpar[port = lnkpoi->liport])->nmblks++;
if (!multiconn(port, lnkpoi->realid)) /* erster Connect? */
{
p->nmbstn++;
autopers(port); /* Port-Parameter anpassen */
}
relink(ulink((LEHEAD *)lnkpoi), /* Link aus der frei-Liste nehmen */
(LEHEAD *)l2actl[lnkpoi->liport].tail);
getMCs(); /* Veraenderung DAMA melden */
}
}
/* End of src/l2stma.c */