isdn-36
This commit is contained in:
parent
f2119ac17e
commit
b4dd41d935
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
230
isdn_2/isdn_2.c
230
isdn_2/isdn_2.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue