This commit is contained in:
Matthias Urlichs 1996-01-03 13:52:26 +01:00 committed by Harald Welte
parent b3ebfb62ea
commit 673bb12c8f
7 changed files with 84 additions and 31 deletions

5
DOKU
View File

@ -685,10 +685,13 @@ Alle Zeilentypen:
"ab" "cd" -> leere Menge
"ab" "xay" -> "a"
"ab" "+x" -> leere Menge
"ab" "+bx" -> "b"
"ab" "+bx" -> "ab+bx"
"ab" "+bx" "a" -> leere Menge
Damit läßt sich sehr flexibel einstellen, wer auf welcher Leitung /
Nummer mit welchen Parametern anrufen kann.
Das Ganze ist noch optimierbar, aber ich bin zu faul...
insbesondere ist das obige "ab+bx" zu "ab" reduzierbar
(weil nur einer der hinter dem + angegebenen Flags gesetzt ist).
<Karte> ist der vierstellige Name der ISDN-Karte, der dieser beim Laden
des Treibers verpaßt wurde; üblich ist eine dreistellike Kennung
des Kartentyps und eine fortlaufende Numerierung.

6
README
View File

@ -4,6 +4,12 @@ Die Anleitung und der ganze Kram findet sich in der Datei DOKU, oder
README.isdn in den Kernelsourcen.
*** 1996-01-03
Update 33. Timer wieder umgestellt. Testcode für automatische Anpassung des
Timeouts, noch nicht ausreichend getestet.
*** 1996-01-02
Update 32. WICHTIG UNBEDINGT INSTALLIEREN. Verbindungen werden nicht

View File

@ -250,7 +250,6 @@ read_file (FILE * ffile, char *errf)
c->arg[strlen(c->arg)-1] = '\0';
if (isintime(c->arg) < 0) break;
chkone(c);
do_subclass(c);
c->cclass = str_enter(c->cclass);
c->arg = str_enter(c->arg);
app (&cf_TM, c);
@ -417,6 +416,7 @@ read_args (void *nix)
seqnum = 0;
for(conn=isdn4_conn; conn != NULL; conn = conn->next) {
char *fp;
if((cg = conn->cg) == NULL)
continue;
cg->dl = NULL;
@ -443,10 +443,12 @@ read_args (void *nix)
theclass = "*";
for(cft = cf_TM; cft != NULL; cft = cft->next) {
if((nexttime = isintime(cft->arg)) > 0) {
theclass = cft->arg;
theclass = cft->cclass;
break;
}
}
do_run_now++;
run_now(NULL);
if((nexttime == 0) || (nexttime > 32767/HZ/60))
nexttime = 32767/HZ/60;
@ -454,6 +456,17 @@ read_args (void *nix)
classtimer =
#endif
timeout(read_args_run,NULL,nexttime * 60 * HZ);
conn = xmalloc(sizeof(*conn));
if(conn != NULL) {
bzero(conn,sizeof(*conn));
conn->seqnum = ++connseq;
conn->causeInfo = "config files read";
conn->cause = ID_priv_Print;
conn->classname = theclass;
conn->next = isdn4_conn; isdn4_conn = conn;
dropconn(conn);
}
}
/* Read all the files and kick off the programs. */

View File

@ -81,6 +81,7 @@ pmatch1 (cf prot, conngrab *cgm)
car = wildmatch(cg->card, prot->card); if(car == NULL) return "5ERR Match CARD";
cla =classmatch(cg->cclass, prot->cclass); if(cla == NULL) return "4ERR Match CLASS";
sub = maskmatch(cg->mask, prot->mask); if(sub == 0) return "6ERR Match SUBCARD";
if(!classmatch(cla,theclass)) return("2Not Now");
/* OK, that fits. Make a copy to assign the values to. */
cg = newgrab(cg);
@ -116,6 +117,7 @@ pmatch1 (cf prot, conngrab *cgm)
car = wildmatch(cg->card, prot->card); if(car==NULL) continue;
cla =classmatch(cg->cclass, prot->cclass); if(cla==NULL) continue;
sub = maskmatch(cg->mask, prot->mask); if(sub==0) continue;
if(!classmatch(cla,theclass)) continue;
}
/* Now make another copy for the parameters. If they don't fit
we'll have to undo everything. This is stupid but there is no
@ -495,6 +497,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */
continue;
if ((matsub = maskmatch (cg->mask, dl->mask)) == 0)
continue;
if(!classmatch(matclass,theclass)) continue;
if(!(cg->flags & F_LEASED)) { /* ... and a working dial prefix. */
char *crd;
ulong_t sub;
@ -555,6 +558,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */
if((matcar = wildmatch(matcrd,d->card)) == NULL) continue;
if((matcla = classmatch(matclass,d->cclass)) == NULL) continue;
if((matsub = maskmatch(cg->mask,d->mask)) == 0) continue;
if(!classmatch(matcla,theclass)) continue;
if(cg->d_level != d->num) {
if((cg->d_level < d->num) && (cg->d_nextlevel < d->num))
cg->d_nextlevel = d->num;
@ -683,7 +687,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */
struct conninfo *conn;
int naconn = 0;
if(classmatch(cg->cclass,cl->cclass) == NULL)
if(classmatch(theclass,classmatch(cg->cclass,cl->cclass)) == NULL)
continue;
if(wildmatch(cg->card, cl->card) == NULL)
continue;
@ -706,7 +710,7 @@ if(0)printf("%s.%s.!.",cg->site,cg->card); /* I hate debugging. */
continue;
if((sit = wildmatch(conn->cg->site, cl->site)) == NULL)
continue;
if(classmatch(conn->cg->cclass, cl->cclass) == NULL)
if(classmatch(theclass,classmatch(conn->cg->cclass, cl->cclass)) == NULL)
continue;
if(maskmatch(conn->cg->mask,cl->mask) == 0)
continue;
@ -765,11 +769,6 @@ findit (conngrab *foo, int ignbusy)
if(cg == NULL)
return "NoMemFoo";
cg->cclass = classmatch(cg->cclass,theclass);
if(cg->cclass == NULL) {
dropgrab(cg);
return "0Not Now";
}
p = cg->par_in;
if(p != NULL) {

View File

@ -84,7 +84,7 @@ pushprot (conngrab cg, int minor, int connref, char update)
if (!wildmatch (cg->protocol, prot->protocol)) continue;
if (!wildmatch (cg->card, prot->card)) continue;
if (!maskmatch (cg->mask, prot->mask)) continue;
if (!classmatch (cg->cclass, prot->cclass)) continue;
if (!classmatch(theclass,classmatch (cg->cclass, prot->cclass))) continue;
break;
}
if (prot == NULL)
@ -158,7 +158,7 @@ pushprot (conngrab cg, int minor, int connref, char update)
if (!wildmatch (cg->protocol, cm->protocol)) continue;
if (!wildmatch (cg->card, cm->card)) continue;
if (!maskmatch (cg->mask, cm->mask)) continue;
if (!classmatch (cg->cclass, cm->cclass)) continue;
if (!classmatch(theclass, classmatch(cg->cclass, cm->cclass))) continue;
if (!wildmatch (sp1, cm->arg)) continue;
mz = allocsb (strlen (cm->args), (streamchar *)cm->args);
@ -1145,7 +1145,7 @@ run_rp(struct conninfo *conn, char what)
if((pro = wildmatch(conn->cg->protocol,cfr->protocol)) == NULL) continue;
if((car = wildmatch(conn->cg->card,cfr->card)) == NULL) continue;
if((sub = maskmatch(conn->cg->mask,cfr->mask)) == 0) continue;
if((cla = classmatch(conn->cg->cclass,cfr->cclass)) == NULL) continue;
if((cla = classmatch(theclass,classmatch(conn->cg->cclass,cfr->cclass))) == NULL) continue;
if((ids = strchr(cfr->type,'/')) != NULL)
id = atoi(ids);
@ -1225,7 +1225,7 @@ run_now(void *nix)
continue;
if(strcmp(conn->cg->protocol,what->protocol))
continue;
if(!classmatch(conn->cg->cclass,what->cclass))
if(!classmatch(theclass,classmatch(conn->cg->cclass,what->cclass)))
continue;
break;
}
@ -1285,6 +1285,26 @@ run_now(void *nix)
if(log_34 & 2)
printf("exist %s:%s\n",conn->cg->site,conn->cg->protocol);
if(conn->cg != NULL && conn->minor != 0 && conn->pid != 0) {
if(conn->cg->cclass != NULL) {
char *newclass = classmatch(conn->cg->cclass, theclass);
if((newclass == NULL) && (conn->state >= c_going_up)) {
mblk_t *mb = allocb(80,BPRI_MED);
setconnstate(conn, c_down);
if(log_34 & 2)printf("DisM8 ");
if(mb != NULL) {
int xlen;
*mb->b_wptr++ = PREF_NOERR;
m_putid (mb, CMD_OFF);
m_putsx (mb, ARG_MINOR);
m_puti (mb, conn->minor);
xlen = mb->b_wptr - mb->b_rptr;
DUMPW (mb->b_rptr, xlen);
(void) strwrite (xs_mon, (uchar_t *) mb->b_rptr, xlen, 1);
freeb(mb);
}
}
}
if(conn->state >= c_going_up)
pushprot(conn->cg,conn->minor,conn->connref,PUSH_UPDATE);
else

View File

@ -24,15 +24,15 @@
#ifdef KERNEL
#ifdef linux
#include <linux/sched.h>
#define TIME (jiffies/HZ)
#define TIME jiffies
#else
extern struct timeval time;
#define TIME time.tv_sec
#define TIME (time.tv_sec*HZ + time.tv_usec/(1000000/HZ))
#endif
#else
extern struct timeval Time;
#define TIME time.tv_sec
#define TIME (time.tv_sec*HZ + time.tv_usec/(1000000/HZ))
#define time Time
#endif
@ -72,6 +72,7 @@ struct timer_ {
#define TIMER_INCOMING 040
#define TIMER_IFDATA_IN 0100
#define TIMER_IFDATA_OUT 0200
int lasttime;
int interval;
int pretime;
int maxread, maxwrite;
@ -129,7 +130,7 @@ timer_timeout(struct timer_ *tim)
#ifdef NEW_TIMEOUT
tim->timer =
#endif
timeout((void *)timer_timeout,tim,tim->interval);
timeout((void *)timer_timeout,tim,tim->interval-HZ);
}
/* Streams code to close the driver. */
@ -174,6 +175,12 @@ timer_proto (queue_t * q, mblk_t * mp, char down)
default:
break;
case PROTO_TICK:
if(tim->lasttime && (tim->lasttime < TIME)) {
if(tim->interval > TIME - tim->lasttime) /* shorter! */
tim->interval = TIME - tim->lasttime;
/* if it gets longer we won't do a thing. */
}
tim->lasttime = TIME;
if(tim->flags & TIMER_TIMER) {
#ifdef NEW_TIMEOUT
untimeout(tim->timer);
@ -181,7 +188,10 @@ timer_proto (queue_t * q, mblk_t * mp, char down)
untimeout(timer_timeout,tim);
#endif
timer_timeout(tim);
#ifdef NEW_TIMEOUT
tim->timer =
#endif
timeout((void *)timer_timeout,tim,tim->interval-HZ);
}
break;
case PROTO_INCOMING:
@ -202,12 +212,13 @@ timer_proto (queue_t * q, mblk_t * mp, char down)
#ifdef NEW_TIMEOUT
tim->timer =
#endif
timeout((void *)timer_timeout,tim,tim->pretime);
timeout((void *)timer_timeout,tim,tim->pretime-HZ);
tim->flags |= TIMER_TIMER;
break;
default:
break;
}
tim->lasttime = 0;
break;
case PROTO_DISCONNECT:
case PROTO_INTERRUPT:
@ -275,6 +286,7 @@ timer_proto (queue_t * q, mblk_t * mp, char down)
if(z < 1 || z > 24*60*60)
goto err;
tim->interval = z*HZ;
tim->lasttime = 0; /* for sync */
break;
case TIMER_PRETIME:
if ((error = m_geti (mp, &z)) != 0)
@ -288,14 +300,14 @@ timer_proto (queue_t * q, mblk_t * mp, char down)
goto err;
if (z < 2 || z >= 7*24*60*60)
goto err;
tim->maxread = z;
tim->maxread = z*HZ;
break;
case TIMER_WRITEMAX:
if ((error = m_geti (mp, &z)) != 0)
goto err;
if (z < 2 || z >= 7*24*60*60)
goto err;
tim->maxwrite = z;
tim->maxwrite = z*HZ;
break;
}
}

View File

@ -206,15 +206,15 @@ MP * * +I * - timer :tr 4 :tw 4 :ti 2 :to 3 :lo
# Grmbl. Innerdeutsch 9 Uhr, ausserhalb 8 Uhr, USA 14 Uhr.
# a-e: deutsch; fg: Euro1, hi: USA
TM +dgi Mo-Fr0500-0800
TM +dfi Mo-Fr0800-0900
TM +afi Mo-Fr0900-1200
TM +bfi Mo-Fr1200-1400
TM +bfh Mo-Fr1400-1800
TM +cgh Mo-Fr1800-2100
TM +dgh Mo-Fr2100-0200
TM +egh Mo-Fr0200-0300
TM +egi Mo-Fr0300-0500
TM +dgi Wk0500-0800
TM +dfi Wk0800-0900
TM +afi Wk0900-1200
TM +bfi Wk1200-1400
TM +bfh Wk1400-1800
TM +cgh Wk1800-2100
TM +dgh Wk2100-0200
TM +egh Wk0200-0300
TM +egi Wk0300-0500
TM +cgi SaSu0500-1400
TM +cgh SaSu1400-2100
TM +dgh SaSu2100-0200