plan 9 kernel history: overview | file list | diff list

1991/1107/port/devdk.c (diff list | history)

1991/1105/sys/src/9/port/devdk.c:12,221991/1107/sys/src/9/port/devdk.c:12,17 (short | long | prev | next)
1990/0911    
 
1990/0312    
enum { 
	/* 
	 *  configuration parameters 
	 */ 
	Ndk = 2,		/* max dks */ 
                 
	/* 
	 *  relative or immutable 
	 */ 
	Nline = 256,		/* max lines per dk */ 
1991/1105/sys/src/9/port/devdk.c:97,1021991/1107/sys/src/9/port/devdk.c:92,98
1990/0312    
 */ 
struct Line { 
	QLock; 
1991/1107    
	int	lineno; 
1990/0312    
	Rendez	r;		/* wait here for dial */ 
	int	state;		/* dial state */ 
	int	err;		/* dialing error (if non zero) */ 
1991/1105/sys/src/9/port/devdk.c:107,1131991/1107/sys/src/9/port/devdk.c:103,108
1990/0312    
	char	addr[64]; 
	char	raddr[64]; 
	char	ruser[32]; 
	char	other[64]; 
	Dk *dp;			/* interface contianing this line */ 
}; 
 
1991/1105/sys/src/9/port/devdk.c:124,1371991/1107/sys/src/9/port/devdk.c:119,134
1990/0312    
	int	lines;		/* number of lines */ 
	int	ncsc;		/* csc line number */ 
1990/1101    
	Chan	*csc; 
1990/0312    
	Line	line[Nline]; 
1991/1107    
	Line	**linep; 
1990/0707    
	int	restart; 
1990/0911    
	int	urpwindow; 
1990/1101    
	Rendez	timer; 
1990/1210    
	int	closeall;	/* set when we receive a closeall message */ 
	Rendez	closeallr;	/* wait here for a closeall */ 
1991/1107    
 
	Block	*alloc; 
1990/0312    
}; 
static Dk dk[Ndk]; 
1991/1107    
static Dk *dk; 
1990/1101    
static Lock dklock; 
1990/0312    
 
/* 
1991/1105/sys/src/9/port/devdk.c:217,2301991/1107/sys/src/9/port/devdk.c:214,229
1990/1101    
 *  Look for a dk struct with a name.  If none exists,  create one. 
 */  
static Dk * 
dkalloc(char *name) 
1991/1107    
dkalloc(char *name, int ncsc, int lines) 
1990/0312    
{ 
	Dk *dp; 
1990/1101    
	Dk *freep; 
1991/1107    
	Block *bp; 
	int i, n; 
1990/0312    
 
1990/1101    
	lock(&dklock); 
	freep = 0; 
1990/0312    
	for(dp = dk; dp < &dk[Ndk]; dp++){ 
1991/1107    
	for(dp = dk; dp < &dk[conf.dkif]; dp++){ 
1990/1101    
		if(strcmp(name, dp->name) == 0){ 
			unlock(&dklock); 
			return dp; 
1991/1105/sys/src/9/port/devdk.c:236,2461991/1107/sys/src/9/port/devdk.c:235,276
1990/1101    
		unlock(&dklock); 
1990/11211    
		error(Enoifc); 
1990/1101    
	} 
1991/1107    
	if(lines == 0) 
		errors("unknown dk interface"); 
 
	/* 
 	 *  init the structures 
	 */ 
1990/1101    
	dp = freep; 
	dp->opened = 0; 
	dp->s = 0; 
	dp->ncsc = 1; 
1991/1107    
	dp->ncsc = ncsc; 
	dp->lines = lines; 
1990/1101    
	strncpy(dp->name, name, sizeof(freep->name)); 
1991/1107    
 
	/* 
	 *  allocate memory for line structures 
	 */ 
	n = sizeof(Line*)*dp->lines; 
	bp = allocb(n); 
	if(bp->lim - bp->base < n){ 
		unlock(&dklock); 
		errors("too many lines"); 
	} 
	dp->linep = (Line **)bp->base; 
	bp->wptr += n; 
	dp->alloc = bp; 
	for(i = 0; i < n; i++){ 
		if(bp->lim - bp->wptr < sizeof(Line)){ 
			bp = allocb(sizeof(Line)*n); 
			bp->next = dp->alloc; 
			dp->alloc = bp; 
		} 
		dp->linep[i] = (Line*)bp->wptr; 
		dp->linep[i]->lineno = i; 
		bp->wptr += sizeof(Line); 
	} 
		 
1990/1101    
	unlock(&dklock); 
	return dp; 
1990/0312    
} 
1991/1105/sys/src/9/port/devdk.c:281,2871991/1107/sys/src/9/port/devdk.c:311,317
1990/1101    
	 *  hang up all datakit connections 
	 */ 
	for(i=dp->ncsc; i < dp->lines; i++) 
		dkhangup(&dp->line[i]); 
1991/1107    
		dkhangup(dp->linep[i]); 
1990/1101    
 
	/* 
	 *  wakeup the timer so it can die 
1991/1105/sys/src/9/port/devdk.c:344,3501991/1107/sys/src/9/port/devdk.c:374,380
1990/0312    
		return; 
	} 
 
	lp = &dp->line[line]; 
1991/1107    
	lp = dp->linep[line]; 
1990/0312    
	if(canqlock(lp)){ 
		if(lp->rq) 
			PUTNEXT(lp->rq, bp); 
1991/1105/sys/src/9/port/devdk.c:385,3911991/1107/sys/src/9/port/devdk.c:415,421
1990/0312    
	Line *lp; 
 
	dp = &dk[s->dev]; 
	q->other->ptr = q->ptr = lp = &dp->line[s->id]; 
1991/1107    
	q->other->ptr = q->ptr = lp = dp->linep[s->id]; 
1990/0312    
	lp->dp = dp; 
1990/1101    
	lock(dp); 
	if(dp->opened==0 || streamenter(dp->s)<0){ 
1991/1105/sys/src/9/port/devdk.c:449,4701991/1107/sys/src/9/port/devdk.c:479,500
1990/1101    
	 */ 
	switch(lp->state){ 
1990/0312    
	case Lrclose: 
1990/1101    
		dkmesg(c, T_CHG, D_CLOSE, lp - dp->line, 0); 
1991/1107    
		dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); 
1990/0312    
		lp->state = Lclosed; 
		break; 
 
	case Lackwait: 
1990/1101    
		dkmesg(c, T_CHG, D_CLOSE, lp - dp->line, 0); 
1991/1107    
		dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); 
1990/0312    
		lp->state = Llclose; 
		break; 
 
	case Llistening: 
1990/1101    
		dkmesg(c, T_CHG, D_CLOSE, lp - dp->line, 0); 
1991/1107    
		dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); 
1990/0312    
		lp->state = Llclose; 
		break; 
 
	case Lconnected: 
1990/1101    
		dkmesg(c, T_CHG, D_CLOSE, lp - dp->line, 0); 
1991/1107    
		dkmesg(c, T_CHG, D_CLOSE, lp->lineno, 0); 
1990/0312    
		lp->state = Llclose; 
		break; 
	} 
1991/1105/sys/src/9/port/devdk.c:506,5121991/1107/sys/src/9/port/devdk.c:536,542
1990/0312    
 
	lp = (Line *)q->ptr; 
	dp = lp->dp; 
	line = lp - dp->line; 
1991/1107    
	line = lp->lineno; 
1990/0312    
 
1990/0911    
	bp = padb(bp, 2); 
1990/0312    
	bp->rptr[0] = line; 
1991/1105/sys/src/9/port/devdk.c:590,6031991/1107/sys/src/9/port/devdk.c:620,631
1990/0312    
	/* 
1990/1101    
	 *  set up 
1990/0312    
	 */ 
1990/1101    
	dp = dkalloc(name); 
1991/1107    
	dp = dkalloc(name, ncsc, lines); 
1990/1101    
	lock(dp); 
	if(dp->opened){ 
		unlock(dp); 
1990/11211    
		error(Ebadarg); 
1990/0312    
	} 
1990/1101    
	dp->ncsc = ncsc; 
	dp->lines = lines; 
	dp->restart = restart; 
	dp->urpwindow = window; 
	dp->s = RD(q)->ptr; 
1991/1105/sys/src/9/port/devdk.c:649,6551991/1107/sys/src/9/port/devdk.c:677,682
1990/0312    
	Dlistenqid, 
	Draddrqid, 
	Duserqid, 
	Dotherqid, 
	Dlineqid, 
 
	/* 
1991/1105/sys/src/9/port/devdk.c:669,6751991/1107/sys/src/9/port/devdk.c:696,701
1990/0312    
Dirtab dksubdir[]={ 
1990/11211    
	"addr",		{Daddrqid},	0,	0600, 
	"listen",	{Dlistenqid},	0,	0600, 
	"other",	{Dotherqid},	0,	0600, 
	"raddr",	{Draddrqid},	0, 	0600, 
	"ruser",	{Duserqid},	0, 	0600, 
1990/0312    
}; 
1991/1105/sys/src/9/port/devdk.c:681,6861991/1107/sys/src/9/port/devdk.c:707,713
1990/0312    
void 
dkreset(void) 
{ 
1991/1107    
	dk = (Dk*)ialloc(conf.dkif*sizeof(Dk), 0); 
1990/0321    
	newqinfo(&dkmuxinfo); 
1990/0312    
} 
 
1991/1105/sys/src/9/port/devdk.c:728,7341991/1107/sys/src/9/port/devdk.c:755,761
1990/0312    
	 */ 
1990/0722    
	if(*spec == 0) 
		spec = "dk"; 
1990/1101    
	dp = dkalloc(spec); 
1991/1107    
	dp = dkalloc(spec, 0, 0); 
1990/1101    
 
	/* 
	 *  return the new channel 
1991/1105/sys/src/9/port/devdk.c:778,7841991/1107/sys/src/9/port/devdk.c:805,811
1990/0312    
{ 
	extern Qinfo dkinfo; 
	Stream *s; 
	Line *lp, *end; 
1991/1107    
	Line *lp; 
1990/0312    
	Dk *dp; 
	int line; 
 
1991/1105/sys/src/9/port/devdk.c:794,8141991/1107/sys/src/9/port/devdk.c:821,841
1990/0319    
		/* 
1990/1126    
		 *  get an unused device and open its control file 
1990/0312    
		 */ 
		end = &dp->line[dp->lines]; 
		for(lp = &dp->line[dp->ncsc+1]; lp < end; lp++){ 
1991/1107    
		for(line = dp->ncsc+1; line < dp->lines; line++){ 
			lp = dp->linep[line]; 
1990/0312    
			if(lp->state == Lclosed && canqlock(lp)){ 
				if(lp->state != Lclosed){ 
					qunlock(lp); 
					continue; 
				} 
1990/11211    
				c->qid.path = STREAMQID(lp-dp->line, Sctlqid); 
1991/1107    
				c->qid.path = STREAMQID(line, Sctlqid); 
				lp->state = Lopened; 
				qunlock(lp); 
1990/0312    
				break; 
			} 
		} 
		if(lp == end) 
1991/1107    
		if(line == dp->lines) 
1990/11211    
			error(Enodev); 
1990/1101    
		lp->state = Lopened; 
		qunlock(lp); 
1990/0312    
		streamopen(c, &dkinfo); 
		pushq(c->stream, &urpinfo); 
1990/0319    
		break; 
1991/1105/sys/src/9/port/devdk.c:826,8321991/1107/sys/src/9/port/devdk.c:853,858
1990/0319    
	case Daddrqid: 
	case Draddrqid: 
	case Duserqid: 
	case Dotherqid: 
1990/0312    
		/* 
1990/0319    
		 *  read only files 
		 */ 
1991/1105/sys/src/9/port/devdk.c:877,8831991/1107/sys/src/9/port/devdk.c:903,909
1990/0319    
			return devdirread(c, a, n, dksubdir, Nsubdir, streamgen); 
	} 
 
1990/11211    
	lp = &dk[c->dev].line[STREAMID(c->qid.path)]; 
1991/1107    
	lp = dk[c->dev].linep[STREAMID(c->qid.path)]; 
1990/11211    
	switch(STREAMTYPE(c->qid.path)){ 
1990/0312    
	case Daddrqid: 
1991/0411    
		return stringread(c, a, n, lp->addr, offset); 
1991/1105/sys/src/9/port/devdk.c:1028,10341991/1107/sys/src/9/port/devdk.c:1054,1060
1990/1101    
	 
1990/11211    
	line = STREAMID(c->qid.path); 
1990/0312    
	dp = &dk[c->dev]; 
	lp = &dp->line[line]; 
1991/1107    
	lp = dp->linep[line]; 
1990/0312    
 
	/* 
	 *  only dial on virgin lines 
1991/1105/sys/src/9/port/devdk.c:1272,12781991/1107/sys/src/9/port/devdk.c:1298,1304
1990/0312    
			print("dklisten: illegal line %d\n", lineno); 
			continue; 
		} 
		lp = &dp->line[lineno]; 
1991/1107    
		lp = dp->linep[lineno]; 
1990/0312    
		ts = strtoul(field[1], 0, 0); 
 
		/* 
1991/1105/sys/src/9/port/devdk.c:1338,13461991/1107/sys/src/9/port/devdk.c:1364,1371
1990/11211    
			error(Ebadarg); 
1990/0312    
		} 
 
		sprint(lp->other, "w(%d)", W_TRAF(lp->window)); 
		DPRINT("src(%s)user(%s)dest(%s)other(%s)\n", lp->raddr, lp->ruser, 
			lp->addr, lp->other); 
1991/1107    
		DPRINT("src(%s)user(%s)dest(%s)w(%d)\n", lp->raddr, lp->ruser, 
			lp->addr, W_TRAF(lp->window)); 
1990/0312    
 
		lp->timestamp = ts; 
		lp->state = Lconnected; 
1991/1105/sys/src/9/port/devdk.c:1365,13711991/1107/sys/src/9/port/devdk.c:1390,1396
1990/0312    
	Line *lp; 
 
	dp = &dk[c->dev]; 
	lp = &dp->line[line]; 
1991/1107    
	lp = dp->linep[line]; 
1990/0312    
 
	/* 
	 *  open the data file (c is a control file) 
1991/1105/sys/src/9/port/devdk.c:1398,14041991/1107/sys/src/9/port/devdk.c:1423,1429
1990/0312    
	long wins; 
	Line *lp; 
 
1990/11211    
	lp = &dk[c->dev].line[STREAMID(c->qid.path)]; 
1991/1107    
	lp = dk[c->dev].linep[STREAMID(c->qid.path)]; 
1990/0312    
	if(lp->window == 0) 
		lp->window = 64; 
	sprint(buf, "init %d %d", lp->window, Streamhi); 
1991/1105/sys/src/9/port/devdk.c:1496,15021991/1107/sys/src/9/port/devdk.c:1521,1527
1990/1101    
			dkmesg(c, T_CHG, D_CLOSE, line, 0); 
1990/1022    
			return; 
		} 
		lp = &dp->line[line]; 
1991/1107    
		lp = dp->linep[line]; 
1990/0312    
		switch (lp->state) { 
 
		case Ldialing: 
1991/1105/sys/src/9/port/devdk.c:1532,15381991/1107/sys/src/9/port/devdk.c:1557,1563
1990/1101    
			dkmesg(c, T_CHG, D_CLOSE, line, 0); 
1990/1022    
			return; 
		} 
		lp = &dp->line[line]; 
1991/1107    
		lp = dp->linep[line]; 
1990/0312    
		switch (lp->state) { 
		case Llclose: 
		case Lclosed: 
1991/1105/sys/src/9/port/devdk.c:1552,15581991/1107/sys/src/9/port/devdk.c:1577,1583
1990/1101    
		 *  datakit wants us to close all lines 
		 */ 
1990/1022    
		for(line = dp->ncsc+1; line < dp->lines; line++){ 
			lp = &dp->line[line]; 
1991/1107    
			lp = dp->linep[line]; 
1990/1022    
			switch (lp->state) { 
	 
			case Ldialing: 
1991/1105/sys/src/9/port/devdk.c:1601,16071991/1107/sys/src/9/port/devdk.c:1626,1632
1990/0312    
	if(line < 0 || line >= dp->lines) 
		return; 
 
	lp=&dp->line[line]; 
1991/1107    
	lp = dp->linep[line]; 
1990/0312    
	if(lp->state != Ldialing) 
		return; 
 
1991/1105/sys/src/9/port/devdk.c:1646,16521991/1107/sys/src/9/port/devdk.c:1671,1677
1990/1101    
		 *  hang up any calls waiting for the dk 
		 */ 
		for (i=dp->ncsc+1; i<dp->lines; i++){ 
			lp = &dp->line[i]; 
1991/1107    
			lp = dp->linep[i]; 
1990/1101    
			switch(lp->state){ 
			case Llclose: 
				lp->state = Lclosed; 
1991/1105/sys/src/9/port/devdk.c:1659,16641991/1107/sys/src/9/port/devdk.c:1684,1690
1990/1101    
		} 
		if(c) 
			close(c); 
1991/1107    
		freeb(dp->alloc); 
1990/1101    
		return; 
	} 
 
1991/1105/sys/src/9/port/devdk.c:1682,16881991/1107/sys/src/9/port/devdk.c:1708,1714
1990/1101    
		 *  timeout calls that take to long 
		 */ 
		for (i=dp->ncsc+1; i<dp->lines; i++){ 
			lp = &dp->line[i]; 
1991/1107    
			lp = dp->linep[i]; 
1990/1101    
			switch(lp->state){ 
			case Llclose: 
				dkmesg(c, T_CHG, D_CLOSE, i, 0); 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)