This commit is contained in:
Matthias Urlichs 1996-02-24 10:42:17 +01:00 committed by Harald Welte
parent f2119ac17e
commit b4dd41d935
6 changed files with 144 additions and 135 deletions

View File

@ -352,6 +352,7 @@ reset_card(struct _bintec *bp)
untimeout(toss_unknown, bp);
#endif
}
bp->sndoffset = -1;
bp->rcvoffset = -1;
bp->msgnr = 0;
@ -1215,9 +1216,11 @@ toss_unknown (struct _bintec *bp)
static void
process_unknown (struct _bintec *bp)
{
long s;
if(bp->q_unknown.nblocks == 0)
return;
s = splstr();
if(bp->unknown_timer) {
bp->unknown_timer = 0;
#ifdef NEW_TIMEOUT
@ -1226,6 +1229,8 @@ process_unknown (struct _bintec *bp)
untimeout(toss_unknown, bp);
#endif
}
splx(s);
{
struct _smallq sq = bp->q_unknown;
mblk_t *mb;

View File

@ -33,6 +33,7 @@ short spl(short);
* resource shortage.
*/
void putbqf (queue_t * q, mblk_t * mp);
void putbqff(queue_t * q, mblk_t * mp);
/*
* dsize()
@ -87,7 +88,9 @@ int deb_putctlx (const char *deb_file, unsigned int deb_line, queue_t * q, char
int deb_putctlx1 (const char *deb_file, unsigned int deb_line, queue_t * q, char type, streamchar msg);
#define putbqf(q,m) deb_putbqf(__FILE__,__LINE__,(q),(m))
#define putbqff(q,m) deb_putbqff(__FILE__,__LINE__,(q),(m))
void deb_putbqf (const char *deb_file, unsigned int deb_line, queue_t * q, mblk_t *mb);
void deb_putbqff(const char *deb_file, unsigned int deb_line, queue_t * q, mblk_t *mb);
#endif /* CONFIG_DEBUG_STREAMS */

View File

@ -1533,123 +1533,121 @@ isdn2_recv (struct _isdn1_card *card, short channel, mblk_t * data)
ctl = (isdn2_card) card->ctl;
if (ctl == NULL || (channel == 0 && isdn_chan.qptr == NULL)) {
return -ENXIO;
} else {
if (channel == 0) { /* D Channel */
uchar_t SAPI, TEI, x1, x2;
char cmd;
isdn2_state state;
} else if (channel == 0) { /* D Channel */
uchar_t SAPI, TEI, x1, x2;
char cmd;
isdn2_state state;
#ifdef CONFIG_DEBUG_STREAMS
if(msgdsize(data) < 0)
return 0;
if(msgdsize(data) < 0)
return 0;
#endif
if(isdn2_log & 0x10) {
printf ("%s*** %d", KERN_DEBUG,ctl->nr);
log_printmsg (NULL, " Recv", data, KERN_DEBUG);
}
(void)msgdsize(data);
if (card->modes & CHM_INTELLIGENT) {
state = ctl->state[0];
if(state != NULL)
err = D_recv(state,0,data);
else
err = -ENXIO;
} else {
if(ctl->flags & HDR_CARD_DEBUG) {
isdn23_hdr hdr;
mblk_t *m1 = allocb(sizeof(*hdr),BPRI_MED);
mblk_t *m2 = dupmsg(data);
if (m1 == NULL || m2 == NULL) {
if(m1 != NULL)
freemsg(m1);
if(m2 != NULL)
freemsg(m2);
} else {
hdr = ((isdn23_hdr) m1->b_wptr)++;
hdr->key = HDR_RAWDATA;
hdr->seqnum = hdrseq; hdrseq += 2;
hdr->hdr_rawdata.card = ctl->nr;
hdr->hdr_rawdata.dchan = 1;
hdr->hdr_rawdata.len = dsize (m2);
hdr->hdr_rawdata.flags = 0;
linkb (m1, m2);
if(canput(isdn_chan.qptr->q_next))
putnext (isdn_chan.qptr, m1);
else
freemsg(m1);
}
}
if (ctl->status != C_up && ctl->status != C_wont_down) {
if(isdn2_debug & 0x80)
printf("%s -- L1 up\n",KERN_DEBUG);
(void) D_L1_up (ctl);
}
(void)msgdsize(data);
data = pullupm (data, 0);
if (data == NULL) /* Packet too short */
return 0;
x1 = SAPI = *data->b_rptr++;
if (SAPI & 0x01) { /* TODO: X25 packet? */
if (isdn2_debug & 0x10)
printf ("%sisdn2_recv %d: SAPI %x invalid\n",KERN_DEBUG, ctl->nr, SAPI);
freemsg (data);
return 0 /* ESRCH */ ;
}
data = pullupm (data, 0);
if (data == NULL)
return 0;
x2 = TEI = *data->b_rptr++;
if ((TEI & 0x01) == 0) {
if (isdn2_debug & 0x10)
printf ("%sisdn2_recv %d: TEI %x invalid\n",KERN_DEBUG, ctl->nr, TEI);
goto rawdata;
}
cmd = (SAPI & 0x02) ? 1 : 0;
SAPI >>= 2;
TEI >>= 1;
for(ch=0;ch <= N_TEI; ch++) {
if (ctl->TEI[ch] == TEI || TEI == TEI_BROADCAST)
break;
}
if(ch > N_TEI) {
if (isdn2_debug & 0x100)
printf("%sisdn2_recv %d: %02x: not my TEI (%02x)\n",KERN_DEBUG,ctl->nr,TEI,ctl->TEI[0]);
freemsg (data);
return 0;
}
data = pullupm (data, 0);
if (data == NULL)
return 0;
state = D__findstate (ctl, SAPI,ch);
if (state != NULL) {
if (TEI == TEI_BROADCAST)
cmd |= 2;
err = x75_recv (&state->state, cmd, data);
} else if (TEI == TEI_BROADCAST && isdn_chan.qptr != NULL) {
rawdata:
err = -ENXIO;
} else {
err = 0; /* Not an error */
freemsg (data);
}
}
} else { /* B Channel */
isdn2_chan chn = ctl->chan[channel];
if (chn != NULL && chn->qptr != NULL) {
putq (chn->qptr, data);
err = 0;
} else {
if(isdn2_log & 0x10) {
printf ("%s*** %d", KERN_DEBUG,ctl->nr);
log_printmsg (NULL, " Recv", data, KERN_DEBUG);
}
(void)msgdsize(data);
if (card->modes & CHM_INTELLIGENT) {
state = ctl->state[0];
if(state != NULL)
err = D_recv(state,0,data);
else
err = -ENXIO;
(*card->ch_mode) (card, channel, M_FREE, 0); /* No B Channel. Take it
* down. (Needless to
* say, this shouldn't
* happen.) */
} else {
if(ctl->flags & HDR_CARD_DEBUG) {
isdn23_hdr hdr;
mblk_t *m1 = allocb(sizeof(*hdr),BPRI_MED);
mblk_t *m2 = dupmsg(data);
if (m1 == NULL || m2 == NULL) {
if(m1 != NULL)
freemsg(m1);
if(m2 != NULL)
freemsg(m2);
} else {
hdr = ((isdn23_hdr) m1->b_wptr)++;
hdr->key = HDR_RAWDATA;
hdr->seqnum = hdrseq; hdrseq += 2;
hdr->hdr_rawdata.card = ctl->nr;
hdr->hdr_rawdata.dchan = 1;
hdr->hdr_rawdata.len = dsize (m2);
hdr->hdr_rawdata.flags = 0;
linkb (m1, m2);
if(canput(isdn_chan.qptr->q_next))
putnext (isdn_chan.qptr, m1);
else
freemsg(m1);
}
}
if (ctl->status != C_up && ctl->status != C_wont_down) {
if(isdn2_debug & 0x80)
printf("%s -- L1 up\n",KERN_DEBUG);
(void) D_L1_up (ctl);
}
(void)msgdsize(data);
data = pullupm (data, 0);
if (data == NULL) /* Packet too short */
return 0;
x1 = SAPI = *data->b_rptr++;
if (SAPI & 0x01) { /* TODO: X25 packet? */
if (isdn2_debug & 0x10)
printf ("%sisdn2_recv %d: SAPI %x invalid\n",KERN_DEBUG, ctl->nr, SAPI);
freemsg (data);
return 0 /* ESRCH */ ;
}
data = pullupm (data, 0);
if (data == NULL)
return 0;
x2 = TEI = *data->b_rptr++;
if ((TEI & 0x01) == 0) {
if (isdn2_debug & 0x10)
printf ("%sisdn2_recv %d: TEI %x invalid\n",KERN_DEBUG, ctl->nr, TEI);
goto rawdata;
}
cmd = (SAPI & 0x02) ? 1 : 0;
SAPI >>= 2;
TEI >>= 1;
for(ch=0;ch <= N_TEI; ch++) {
if (ctl->TEI[ch] == TEI || TEI == TEI_BROADCAST)
break;
}
if(ch > N_TEI) {
if (isdn2_debug & 0x100)
printf("%sisdn2_recv %d: %02x: not my TEI (%02x)\n",KERN_DEBUG,ctl->nr,TEI,ctl->TEI[0]);
freemsg (data);
return 0;
}
data = pullupm (data, 0);
if (data == NULL)
return 0;
state = D__findstate (ctl, SAPI,ch);
if (state != NULL) {
if (TEI == TEI_BROADCAST)
cmd |= 2;
err = x75_recv (&state->state, cmd, data);
} else if (TEI == TEI_BROADCAST && isdn_chan.qptr != NULL) {
rawdata:
err = -ENXIO;
} else {
err = 0; /* Not an error */
freemsg (data);
}
}
} else { /* B Channel */
isdn2_chan chn = ctl->chan[channel];
if (chn != NULL && chn->qptr != NULL) {
putq (chn->qptr, data);
err = 0;
} else {
err = -ENXIO;
(*card->ch_mode) (card, channel, M_FREE, 0); /* No B Channel. Take it
* down. (Needless to
* say, this shouldn't
* happen.) */
}
}
return err;
@ -3075,7 +3073,7 @@ isdn2_wsrv (queue_t *q)
}
} else {
if(0)printf (",");
putbqf (q, mp);
putbqff (q, mp);
return;
}
} else {
@ -3160,12 +3158,6 @@ isdn2_rsrv (queue_t * q)
}
#ifdef sun
/*
* TODO: Put in SunOS autoload code
*/
#endif
void
chkfree (void *x)
{

View File

@ -240,35 +240,25 @@ mblk_t *pullupm(mblk_t *p_msg, short length)
}
#ifdef CONFIG_DEBUG_STREAMS
void
deb_putbqf (const char *deb_file,unsigned int deb_line, queue_t * q, mblk_t * mp)
deb_putbqff(const char *deb_file,unsigned int deb_line, queue_t * q, mblk_t * mp)
#else
void
putbqf (queue_t * q, mblk_t * mp)
putbqff(queue_t * q, mblk_t * mp)
#endif
{
int qflag;
/*
* putbq() schedules a queue when a priority packet is putbq()'d onto it.
* We don't want that to happen.
*
* Solution: Temporarily turn the flag on which says that this queue already
* is scheduled, call the real putbq, then turn the flag off again. Then
* turn on QWANTR which says that the queue wants to get scheduled if a new
* packet arrives.
*
* This exercise should work with all Streams versions.
* like putbqf but is not an error...
*/
int ms = splstr ();
qflag = q->q_flag;
q->q_flag |= QENAB;
#ifdef CONFIG_DEBUG_STREAMS
/* This is KERN_EMERG message because it just shouldn't happen --
putbqf is for emergencies, putbq is for normal scheduling. */
printf("%sPutBQF %p:%p at %s:%d\n",KERN_EMERG,q,mp,deb_file,deb_line);
deb_putbq (deb_file,deb_line, q, mp);
#else
putbq (q, mp);
@ -282,6 +272,25 @@ putbqf (queue_t * q, mblk_t * mp)
}
#ifdef CONFIG_DEBUG_STREAMS
void
deb_putbqf (const char *deb_file,unsigned int deb_line, queue_t * q, mblk_t * mp)
#else
void
putbqf (queue_t * q, mblk_t * mp)
#endif
{
#ifdef CONFIG_DEBUG_STREAMS
/* This is KERN_EMERG message because it just shouldn't happen --
putbqf is for emergencies, putbq is for normal scheduling. */
printf("%sPutBQF %p:%p at %s:%d\n",KERN_EMERG,q,mp,deb_file,deb_line);
deb_putbqff(deb_file,deb_line, q,mp);
#else
putbqff(q,mp);
#endif
}
int
#ifdef CONFIG_DEBUG_STREAMS
deb_putctlx (const char *deb_file,unsigned int deb_line, queue_t * q, char type)

View File

@ -573,7 +573,7 @@ x75_check_pending (x75 state, char fromLow)
* send pending I frames because we're still waiting for an ack.
*/
if (state->status != S_up) {
if(state->I.first != NULL)
if((state->I.first != NULL) && state->debug)
printf("%sx75.%d: State %d/%s, pending\n",KERN_DEBUG,state->debugnr,state->status,x75_sname[state->status]);
if ((state->status == S_await_up) && fromLow) {
stop_T(1,err);

View File

@ -2399,7 +2399,7 @@ do_runqueues(void *dummy)
if(!--cnt) {
if(!looping)
printf("%sStreams loop %c %s?\n",KERN_EMERG,(p_queue->q_flag & QREADR ? 'R':'W'), p_queue->q_qinfo->qi_minfo->mi_idname);
looping++; looping++;
/* looping++; looping++; */
break;
}
}