isdn-36
This commit is contained in:
parent
f2119ac17e
commit
b4dd41d935
|
@ -352,6 +352,7 @@ reset_card(struct _bintec *bp)
|
||||||
untimeout(toss_unknown, bp);
|
untimeout(toss_unknown, bp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bp->sndoffset = -1;
|
bp->sndoffset = -1;
|
||||||
bp->rcvoffset = -1;
|
bp->rcvoffset = -1;
|
||||||
bp->msgnr = 0;
|
bp->msgnr = 0;
|
||||||
|
@ -1215,9 +1216,11 @@ toss_unknown (struct _bintec *bp)
|
||||||
static void
|
static void
|
||||||
process_unknown (struct _bintec *bp)
|
process_unknown (struct _bintec *bp)
|
||||||
{
|
{
|
||||||
|
long s;
|
||||||
if(bp->q_unknown.nblocks == 0)
|
if(bp->q_unknown.nblocks == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
s = splstr();
|
||||||
if(bp->unknown_timer) {
|
if(bp->unknown_timer) {
|
||||||
bp->unknown_timer = 0;
|
bp->unknown_timer = 0;
|
||||||
#ifdef NEW_TIMEOUT
|
#ifdef NEW_TIMEOUT
|
||||||
|
@ -1226,6 +1229,8 @@ process_unknown (struct _bintec *bp)
|
||||||
untimeout(toss_unknown, bp);
|
untimeout(toss_unknown, bp);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
splx(s);
|
||||||
|
|
||||||
{
|
{
|
||||||
struct _smallq sq = bp->q_unknown;
|
struct _smallq sq = bp->q_unknown;
|
||||||
mblk_t *mb;
|
mblk_t *mb;
|
||||||
|
|
|
@ -33,6 +33,7 @@ short spl(short);
|
||||||
* resource shortage.
|
* resource shortage.
|
||||||
*/
|
*/
|
||||||
void putbqf (queue_t * q, mblk_t * mp);
|
void putbqf (queue_t * q, mblk_t * mp);
|
||||||
|
void putbqff(queue_t * q, mblk_t * mp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dsize()
|
* 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);
|
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 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_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 */
|
#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;
|
ctl = (isdn2_card) card->ctl;
|
||||||
if (ctl == NULL || (channel == 0 && isdn_chan.qptr == NULL)) {
|
if (ctl == NULL || (channel == 0 && isdn_chan.qptr == NULL)) {
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
} else {
|
} else if (channel == 0) { /* D Channel */
|
||||||
if (channel == 0) { /* D Channel */
|
uchar_t SAPI, TEI, x1, x2;
|
||||||
uchar_t SAPI, TEI, x1, x2;
|
char cmd;
|
||||||
char cmd;
|
isdn2_state state;
|
||||||
isdn2_state state;
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_STREAMS
|
#ifdef CONFIG_DEBUG_STREAMS
|
||||||
if(msgdsize(data) < 0)
|
if(msgdsize(data) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
if(isdn2_log & 0x10) {
|
if(isdn2_log & 0x10) {
|
||||||
printf ("%s*** %d", KERN_DEBUG,ctl->nr);
|
printf ("%s*** %d", KERN_DEBUG,ctl->nr);
|
||||||
log_printmsg (NULL, " Recv", data, KERN_DEBUG);
|
log_printmsg (NULL, " Recv", data, KERN_DEBUG);
|
||||||
}
|
}
|
||||||
(void)msgdsize(data);
|
(void)msgdsize(data);
|
||||||
if (card->modes & CHM_INTELLIGENT) {
|
if (card->modes & CHM_INTELLIGENT) {
|
||||||
state = ctl->state[0];
|
state = ctl->state[0];
|
||||||
if(state != NULL)
|
if(state != NULL)
|
||||||
err = D_recv(state,0,data);
|
err = D_recv(state,0,data);
|
||||||
else
|
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 {
|
|
||||||
err = -ENXIO;
|
err = -ENXIO;
|
||||||
(*card->ch_mode) (card, channel, M_FREE, 0); /* No B Channel. Take it
|
} else {
|
||||||
* down. (Needless to
|
if(ctl->flags & HDR_CARD_DEBUG) {
|
||||||
* say, this shouldn't
|
isdn23_hdr hdr;
|
||||||
* happen.) */
|
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;
|
return err;
|
||||||
|
@ -3075,7 +3073,7 @@ isdn2_wsrv (queue_t *q)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(0)printf (",");
|
if(0)printf (",");
|
||||||
putbqf (q, mp);
|
putbqff (q, mp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -3160,12 +3158,6 @@ isdn2_rsrv (queue_t * q)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef sun
|
|
||||||
/*
|
|
||||||
* TODO: Put in SunOS autoload code
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
chkfree (void *x)
|
chkfree (void *x)
|
||||||
{
|
{
|
||||||
|
|
|
@ -240,35 +240,25 @@ mblk_t *pullupm(mblk_t *p_msg, short length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_STREAMS
|
#ifdef CONFIG_DEBUG_STREAMS
|
||||||
void
|
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
|
#else
|
||||||
void
|
void
|
||||||
putbqf (queue_t * q, mblk_t * mp)
|
putbqff(queue_t * q, mblk_t * mp)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
int qflag;
|
int qflag;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* putbq() schedules a queue when a priority packet is putbq()'d onto it.
|
* like putbqf but is not an error...
|
||||||
* 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.
|
|
||||||
*/
|
*/
|
||||||
int ms = splstr ();
|
int ms = splstr ();
|
||||||
|
|
||||||
qflag = q->q_flag;
|
qflag = q->q_flag;
|
||||||
q->q_flag |= QENAB;
|
q->q_flag |= QENAB;
|
||||||
#ifdef CONFIG_DEBUG_STREAMS
|
#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);
|
deb_putbq (deb_file,deb_line, q, mp);
|
||||||
#else
|
#else
|
||||||
putbq (q, mp);
|
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
|
int
|
||||||
#ifdef CONFIG_DEBUG_STREAMS
|
#ifdef CONFIG_DEBUG_STREAMS
|
||||||
deb_putctlx (const char *deb_file,unsigned int deb_line, queue_t * q, char type)
|
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.
|
* send pending I frames because we're still waiting for an ack.
|
||||||
*/
|
*/
|
||||||
if (state->status != S_up) {
|
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]);
|
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) {
|
if ((state->status == S_await_up) && fromLow) {
|
||||||
stop_T(1,err);
|
stop_T(1,err);
|
||||||
|
|
|
@ -2399,7 +2399,7 @@ do_runqueues(void *dummy)
|
||||||
if(!--cnt) {
|
if(!--cnt) {
|
||||||
if(!looping)
|
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);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue