2.11BSD/sys/OTHERS/berknet/berknet_driver
From dual!amd!megatest!cadvax.roman Sat Oct 12 18:33:10 1985
Date: Thu, 10 Oct 85 10:45:25 pdt
From: dual!amd!megatest!cadvax.roman (Roman Rycerz)
To: lll-crg!seismo!keith
Subject: bk driver
here is the bk driver that handles mapped buffers..
it works and we run berknet here to connect small test stations
to a central host...
-roman
{lbl-csam,decvax!decwrl![sun|amd|fortune]}!megatest!roman
----------------------- CUT HERE --------------------------------------
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
echo 'Extracting bk.h'
sed 's/^X//' > bk.h << '+ END-OF-FILE bk.h'
X#define NBK 1
X/* BK_DEBUG /* turn on debugging */
+ END-OF-FILE bk.h
chmod 'u=rw,g=r,o=r' 'bk.h'
echo ' -rw-r--r-- 1 root 52 Oct 9 22:27 bk.h (as sent)'
echo -n ' '
/bin/ls -l bk.h
echo 'Extracting dev/bk.c'
sed 's/^X//' > dev/bk.c << '+ END-OF-FILE dev/bk.c'
X#include "param.h"
X#include "bk.h"
X#if NBK > 0
X#include <sys/systm.h>
X#include <sys/seg.h>
X#include <sys/dir.h>
X#include <sys/user.h>
X#include <sys/tty.h>
X#include <sys/proc.h>
X#ifdef MPX_FILS
X#include <sys/mx.h>
X#endif
X#include <sys/inode.h>
X#include <sys/file.h>
X#include <sys/conf.h>
X#include <sys/buf.h>
X
X/*
X * SCCS id @(#)bk.c 2.1 (Berkeley) 8/5/83
X */
X
X#ifdef UCB_NTTY
X#ifdef BK_DEBUG
Xint bkdbg = 1;
X#define DBG_printf if(bkdbg) printf /* debugging printf */
X#else
X#define DBG_printf bknull /* null routine */
Xbknull(s,a,b,c,d) char *s;{};
X#endif
X
X/*
X * When running dz's using only SAE (silo alarm) on input
X * it is necessary to call dzrint() at clock interrupt time.
X * This is unsafe unless spl5()s in tty code are changed to
X * spl6()s to block clock interrupts. Note that the dh driver
X * currently in use works the same way as the dz, even though
X * we could try to more intelligently manage its silo.
X * Thus don't take this out if you have no dz's unless you
X * change clock.c and dhtimer().
X */
X#define spl5 spl6
X
X/*
X * Line discipline for Berkeley network.
X *
X * This supplies single lines to a user level program
X * with a minimum of fuss. Lines are newline terminated.
X * A later version will implement full 8-bit paths by providing
X * an escape sequence to include a newline in a record.
X *
X * This discipline requires that tty device drivers call
X * the line specific l_ioctl routine from their ioctl routines,
X * assigning the result to cmd so that we can refuse most tty specific
X * ioctls which are unsafe because we have ambushed the
X * teletype input queues, overlaying them with other information.
X */
X
X/*
X * Open as networked discipline. Called when discipline changed
X * with ioctl, this assigns a buffer to the line for input, and
X * changing the interpretation of the information in the tty structure.
X */
Xbkopen(tp)
Xregister struct tty *tp;
X{
X register struct buf *bp;
X
X if (u.u_error)
X return; /* paranoia */
X /*
X * The suser check was added since once it gets set you can't turn
X * it off, even as root. Theoretically a setuid root program could
X * be run over the net which opened /dev/tty but this seems farfetched.
X */
X if (tp->t_line == NETLDISC && !suser()) {
X u.u_error = EBUSY; /* sometimes the network */
X return; /* ... opens /dev/tty */
X }
X bp = geteblk();
X flushtty(tp,FREAD|FWRITE);
X tp->t_bufp = bp;
X#ifndef NOKA5
X tp->t_cp = (char *)mapin(bp);
X mapout(bp);
X#else
X tp->t_cp = (char *)tp->t_bufp->b_un.b_addr;
X#endif
X tp->t_inbuf = 0;
X tp->t_rec = 0;
X DBG_printf("bkop: bp %o cp %o\n",tp->t_bufp,tp->t_cp);
X}
X
X/*
X * Break down... called when discipline changed or from device
X * close routine.
X */
Xbkclose(tp)
Xregister struct tty *tp;
X{
X register s;
X register struct buf *bp;
X
X DBG_printf("bkcl: bp %o cp %o\n",tp->t_bufp,tp->t_cp);
X s = spl5();
X wakeup((caddr_t)&tp->t_bufp);
X if (tp->t_bufp) {
X brelse(tp->t_bufp);
X tp->t_bufp = 0;
X }
X tp->t_cp = 0;
X tp->t_inbuf = 0;
X tp->t_rec = 0;
X tp->t_line = DFLT_LDISC; /* paranoid: avoid races */
X splx(s);
X}
X
X/*
X * Read from a network line.
X * Characters have been buffered in a system buffer and are
X * now dumped back to the user in one fell swoop, and with a
X * minimum of fuss. Note that no input is accepted when a record
X * is waiting. Our clearing tp->t_rec here allows further input
X * to accumulate.
X */
Xbkread(tp)
Xregister struct tty *tp;
X{
X register int i;
X register s;
X
X if ((tp->t_state&CARR_ON)==0)
X return (-1);
X DBG_printf("bkrd: bp %o cp %o\n",tp->t_bufp,tp->t_cp);
X s = spl5();
X while (tp->t_rec == 0 && tp->t_line == NETLDISC)
X sleep((caddr_t)&tp->t_bufp, TTIPRI);
X splx(s);
X if (tp->t_line != NETLDISC)
X return (-1);
X i = MIN(tp->t_inbuf, (int)u.u_count);
X#ifndef NOKA5
X if (copyout(mapin(tp->t_bufp), u.u_base, (unsigned)i)) {
X mapout(tp->t_bufp);
X u.u_error = EFAULT;
X return (-1);
X };
X mapout(tp->t_bufp);
X#else
X if (copyout(tp->t_bufp->b_un.b_addr, u.u_base, (unsigned)i)) {
X u.u_error = EFAULT;
X return (-1);
X };
X#endif
X u.u_count -= i;
X u.u_base += i;
X u.u_offset += i;
X#ifndef NOKA5
X tp->t_cp = (char *)mapin(tp->t_bufp);
X mapout(tp->t_bufp);
X#else
X tp->t_cp = (char *)tp->t_bufp->b_un.b_addr;
X#endif
X tp->t_inbuf = 0;
X tp->t_rec = 0;
X DBG_printf("bkrd: bp %o cp %o\n",tp->t_bufp,tp->t_cp);
X return (0);
X}
X
X/*
X * Low level character input routine.
X * Stuff the character in the buffer, and wake up the top
X * half after setting t_rec if this completes the record
X * or if the buffer is (ick!) full.
X *
X * This is where the formatting should get done to allow
X * 8 character data paths through escapes.
X *
X * This routine should be expanded in-line in the receiver
X * interrupt routine of the dh-11 to make it run as fast as possible.
X */
X
Xbkinput(c, tp)
Xregister c;
Xregister struct tty *tp;
X{
X#ifndef NOKA5
X segm save5;
X extern struct buf *hasmap;
X struct buf *oldmap;
X
X if (tp->t_rec)
X return;
X saveseg5(save5);
X oldmap = hasmap;
X if( hasmap != (struct buf *)NULL)
X mapout(hasmap);
X mapin(tp->t_bufp);
X *tp->t_cp++ = c;
X mapout(tp->t_bufp);
X if(oldmap != (struct buf *)NULL)
X mapin(oldmap);
X restorseg5(save5);
X#else
X if (tp->t_rec)
X return;
X *tp->t_cp++ = c;
X#endif
X if (++tp->t_inbuf == BSIZE || c == '\n') {
X DBG_printf("bkip: bp %o cp %o\n",tp->t_bufp,tp->t_cp);
X tp->t_rec = 1;
X wakeup((caddr_t)&tp->t_bufp);
X }
X}
X
X/*
X * This routine is called whenever a ioctl is about to be performed
X * and gets a chance to reject the ioctl. We reject all teletype
X * oriented ioctl's except those which set the discipline, and
X * those which get parameters (gtty and get special characters).
X */
X/*ARGSUSED*/
Xbkioctl(tp, cmd, addr)
Xstruct tty *tp;
Xcaddr_t addr;
X{
X
X if ((cmd>>8) != 't')
X return (cmd);
X switch (cmd) {
X
X case TIOCSETD:
X case TIOCGETD:
X case TIOCGETP:
X case TIOCGETC:
X return (cmd);
X }
X u.u_error = ENOTTY;
X return (0);
X}
X#endif UCB_NTTY
X#endif NBK
+ END-OF-FILE dev/bk.c
chmod 'u=rw,g=r,o=r' 'dev/bk.c'
echo ' -rw-r--r-- 1 root 5815 Oct 9 22:27 dev/bk.c (as sent)'
echo -n ' '
/bin/ls -l dev/bk.c
echo 'Extracting c.c'
sed 's/^X//' > c.c << '+ END-OF-FILE c.c'
X/*
X * SCCS id %W% (Berkeley) %G%
X */
X
X#include "param.h"
X#include <sys/systm.h>
X#include <sys/buf.h>
X#include <sys/tty.h>
X#include <sys/conf.h>
X#include <sys/proc.h>
X#include <sys/text.h>
X#include <sys/dir.h>
X#include <sys/user.h>
X#include <sys/file.h>
X#include <sys/inode.h>
X#include <sys/acct.h>
X#include <sys/map.h>
X#include <sys/filsys.h>
X#include <sys/mount.h>
X
X
Xint nulldev();
Xint nodev();
Xint nullioctl();
X
X
X#include "dh.h"
X#if NDH > 0
Xint dhopen(), dhclose(), dhread(), dhwrite(), dhioctl(), dhstop();
Xextern struct tty dh11[];
X#else
X#define dhopen nodev
X#define dhclose nodev
X#define dhread nodev
X#define dhwrite nodev
X#define dhioctl nodev
X#define dhstop nodev
X#define dh11 ((struct tty *) NULL)
X#endif NDH
X
X#include "dn.h"
X#if NDN > 0
Xint dnopen(), dnclose(), dnwrite();
X#else
X#define dnopen nodev
X#define dnclose nodev
X#define dnwrite nodev
X#endif NDN
X
X#include "dz.h"
X#if NDZ > 0
Xint dzopen(), dzclose(), dzread(), dzwrite(), dzioctl();
X#ifdef DZ_PDMA
Xint dzstop();
X#else
X#define dzstop nulldev
X#endif
Xextern struct tty dz11[];
X#else
X#define dzopen nodev
X#define dzclose nodev
X#define dzread nodev
X#define dzwrite nodev
X#define dzioctl nodev
X#define dzstop nodev
X#define dz11 ((struct tty *) NULL)
X#endif NDZ
X
X#include "hk.h"
X#if NHK > 0
Xint hkstrategy(), hkread(), hkwrite(), hkroot();
Xextern struct buf hktab;
X#define hkopen nulldev
X#define hkclose nulldev
X#define _hktab &hktab
X#else
X#define hkopen nodev
X#define hkclose nodev
X#define hkstrategy nodev
X#define hkread nodev
X#define hkwrite nodev
X#define hkroot nulldev
X#define _hktab ((struct buf *) NULL)
X#endif NHK
X
X#include "hp.h"
X#if NHP > 0
Xint hpstrategy(), hpread(), hpwrite(), hproot();
Xextern struct buf hptab;
X#define hpopen nulldev
X#define hpclose nulldev
X#define _hptab &hptab
X#else
X#define hpopen nodev
X#define hpclose nodev
X#define hproot nulldev
X#define hpstrategy nodev
X#define hpread nodev
X#define hpwrite nodev
X#define _hptab ((struct buf *) NULL)
X#endif NHP
X
X#include "hs.h"
X#if NHS > 0
Xint hsstrategy(), hsread(), hswrite(), hsroot();
Xextern struct buf hstab;
X#define _hstab &hstab
X#define hsopen nulldev
X#define hsclose nulldev
X#else
X#define hsopen nodev
X#define hsclose nodev
X#define hsstrategy nodev
X#define hsread nodev
X#define hswrite nodev
X#define hsroot nulldev
X#define _hstab ((struct buf *) NULL)
X#endif NHS
X
X#include "ht.h"
X#if NHT > 0
Xint htopen(), htclose(), htread(), htwrite(), htstrategy();
X#ifdef HT_IOCTL
Xint htioctl();
X#else
X#define htioctl nodev
X#endif
Xextern struct buf httab;
X#define _httab &httab
X#else
X#define htopen nodev
X#define htclose nodev
X#define htread nodev
X#define htwrite nodev
X#define htioctl nodev
X#define htstrategy nodev
X#define _httab ((struct buf *) NULL)
X#endif NHT
X
X#include "lp.h"
X#if NLP > 0
Xint lpopen(), lpclose(), lpwrite();
X#else
X#define lpopen nodev
X#define lpclose nodev
X#define lpwrite nodev
X#endif NLP
X
X#include "rk.h"
X#if NRK > 0
Xint rkstrategy(), rkread(), rkwrite();
Xextern struct buf rktab;
X#define rkopen nulldev
X#define rkclose nulldev
X#define _rktab &rktab
X#else
X#define rkopen nodev
X#define rkclose nodev
X#define rkstrategy nodev
X#define rkread nodev
X#define rkwrite nodev
X#define _rktab ((struct buf *) NULL)
X#endif NRK
X
X#include "rl.h"
X#if NRL > 0
Xint rlstrategy(), rlread(), rlwrite();
Xextern struct buf rltab;
X#define rlopen nulldev
X#define rlclose nulldev
X#define _rltab &rltab
X#else
X#define rlopen nodev
X#define rlclose nodev
X#define rlstrategy nodev
X#define rlread nodev
X#define rlwrite nodev
X#define _rltab ((struct buf *) NULL)
X#endif NRL
X
X#include "rm.h"
X#if NRM > 0
Xint rmstrategy(), rmread(), rmwrite(), rmroot();
Xextern struct buf rmtab;
X#define rmopen nulldev
X#define rmclose nulldev
X#define _rmtab &rmtab
X#else
X#define rmopen nodev
X#define rmclose nodev
X#define rmroot nulldev
X#define rmstrategy nodev
X#define rmread nodev
X#define rmwrite nodev
X#define _rmtab ((struct buf *) NULL)
X#endif NRM
X
X#include "rp.h"
X#if NRP > 0
Xint rpstrategy(), rpread(), rpwrite();
Xextern struct buf rptab;
X#define rpopen nulldev
X#define rpclose nulldev
X#define _rptab &rptab
X#else
X#define rpopen nodev
X#define rpclose nodev
X#define rpstrategy nodev
X#define rpread nodev
X#define rpwrite nodev
X#define _rptab ((struct buf *) NULL)
X#endif NRP
X
X#include "tm.h"
X#if NTM > 0
Xint tmopen(), tmclose(), tmread(), tmwrite(), tmstrategy();
X#ifdef TM_IOCTL
Xint tmioctl();
X#else
X#define tmioctl nodev
X#endif
Xextern struct buf tmtab;
X#define _tmtab &tmtab
X#else
X#define tmopen nodev
X#define tmclose nodev
X#define tmread nodev
X#define tmwrite nodev
X#define tmioctl nodev
X#define tmstrategy nodev
X#define _tmtab ((struct buf *) NULL)
X#endif NTM
X
X#include "ts.h"
X#if NTS > 0
Xint tsopen(), tsclose(), tsread(), tswrite(), tsstrategy();
X#ifdef TS_IOCTL
Xint tsioctl();
X#else
X#define tsioctl nodev
X#endif
Xextern struct buf tstab;
X#define _tstab &tstab
X#else
X#define tsopen nodev
X#define tsclose nodev
X#define tsread nodev
X#define tswrite nodev
X#define tsioctl nodev
X#define tsstrategy nodev
X#define _tstab ((struct buf *) NULL)
X#endif NTS
X
X#include "vp.h"
X#if NVP > 0
Xint vpopen(), vpclose(), vpwrite(), vpioctl();
X#else
X#define vpopen nodev
X#define vpclose nodev
X#define vpwrite nodev
X#define vpioctl nodev
X#endif NVP
X
X#include "xp.h"
X#if NXP > 0
Xint xpstrategy(), xpread(), xpwrite(), xproot();
Xextern struct buf xptab;
X#define xpopen nulldev
X#define xpclose nulldev
X#define _xptab &xptab
X#else
X#define xpopen nodev
X#define xpclose nodev
X#define xproot nulldev
X#define xpstrategy nodev
X#define xpread nodev
X#define xpwrite nodev
X#define _xptab ((struct buf *) NULL)
X#endif NXP
X
Xstruct bdevsw bdevsw[] =
X{
X rkopen, rkclose, rkstrategy,
X nulldev, _rktab, /* rk = 0 */
X
X rpopen, rpclose, rpstrategy,
X nulldev, _rptab, /* rp = 1 */
X
X nodev, nodev, nodev,
X nulldev, 0, /* rf = 2 */
X
X tmopen, tmclose, tmstrategy,
X nulldev, _tmtab, /* tm = 3 */
X
X hkopen, hkclose, hkstrategy,
X hkroot, _hktab, /* hk = 4 */
X
X hsopen, hsclose, hsstrategy,
X hsroot, _hstab, /* hs = 5 */
X
X#if NXP > 0
X xpopen, xpclose, xpstrategy,
X xproot, _xptab, /* xp = 6 */
X#else
X
X#if NHP > 0
X hpopen, hpclose, hpstrategy,
X hproot, _hptab, /* hp = 6 */
X#else
X
X rmopen, rmclose, rmstrategy,
X rmroot, _rmtab, /* rm = 6 */
X#endif
X#endif
X
X htopen, htclose, htstrategy,
X nulldev, _httab, /* ht = 7 */
X
X rlopen, rlclose, rlstrategy,
X nulldev, _rltab, /* rl = 8 */
X
X tsopen, tsclose, tsstrategy,
X nulldev, _tstab, /* ts = 9 */
X};
Xint nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]);
X
Xint klopen(), klclose(), klread(), klwrite(), klioctl();
Xextern struct tty kl11[];
Xint mmread(), mmwrite();
Xint syopen(), syread(), sywrite(), sysioctl();
X
X#include "ft.h"
X#if NFT > 0
Xint ftopen(), ftclose(), ftioctl();
X#else
X#define ftopen nodev
X#define ftclose nodev
X#define ftioctl nodev
X#endif
X
X#include "ib.h"
X#if NIB > 0
Xint ibopen(), ibclose(), ibread(), ibwrite(), ibioctl();
X#else
X#define ibopen nodev
X#define ibclose nodev
X#define ibread nodev
X#define ibwrite nodev
X#define ibioctl nodev
X#endif
X
X#include "mq.h"
X#if NMQ > 0
Xint mqopen(), mqclose(), mqread(), mqwrite();
X#else
X#define mqopen nodev
X#define mqclose nodev
X#define mqread nodev
X#define mqwrite nodev
X#endif
X
Xstruct cdevsw cdevsw[] =
X{
X klopen, klclose, klread, klwrite,
X klioctl, nulldev, kl11, /* kl = 0 */
X
X nodev, nodev, nodev, nodev,
X nodev, nodev, 0, /* pc = 1 */
X
X vpopen, vpclose, nodev, vpwrite,
X vpioctl, nulldev, 0, /* vp = 2 */
X
X lpopen, lpclose, nodev, lpwrite,
X nodev, nulldev, 0, /* lp = 3 */
X
X dhopen, dhclose, dhread, dhwrite,
X dhioctl, dhstop, dh11, /* dh = 4 */
X
X nodev, nodev, nodev, nodev,
X nodev, nodev, 0, /* dp = 5 */
X
X nodev, nodev, nodev, nodev,
X nodev, nodev, 0, /* dj = 6 */
X
X dnopen, dnclose, nodev, dnwrite,
X nodev, nulldev, 0, /* dn = 7 */
X
X nulldev, nulldev, mmread, mmwrite,
X nodev, nulldev, 0, /* mem = 8 */
X
X rkopen, rkclose, rkread, rkwrite,
X nodev, nulldev, 0, /* rk = 9 */
X
X nodev, nodev, nodev, nodev,
X nodev, nodev, 0, /* rf = 10 */
X
X rpopen, rpclose, rpread, rpwrite,
X nodev, nulldev, 0, /* rp = 11 */
X
X tmopen, tmclose, tmread, tmwrite,
X tmioctl, nulldev, 0, /* tm = 12 */
X
X hsopen, hsclose, hsread, hswrite,
X nodev, nulldev, 0, /* hs = 13 */
X
X#if NXP > 0
X xpopen, xpclose, xpread, xpwrite,
X nodev, nulldev, 0, /* xp = 14 */
X#else
X#if NHP > 0
X
X hpopen, hpclose, hpread, hpwrite,
X nodev, nulldev, 0, /* hp = 14 */
X#else
X
X rmopen, rmclose, rmread, rmwrite,
X nodev, nulldev, 0, /* rm = 14 */
X#endif
X#endif
X
X htopen, htclose, htread, htwrite,
X htioctl, nulldev, 0, /* ht = 15 */
X
X nodev, nodev, nodev, nodev,
X nodev, nodev, 0, /* du = 16 */
X
X syopen, nulldev, syread, sywrite,
X sysioctl, nulldev, 0, /* tty = 17 */
X
X rlopen, rlclose, rlread, rlwrite,
X nodev, nulldev, 0, /* rl = 18 */
X
X hkopen, hkclose, hkread, hkwrite,
X nodev, nulldev, 0, /* hk = 19 */
X
X tsopen, tsclose, tsread, tswrite,
X tsioctl, nulldev, 0, /* ts = 20 */
X
X dzopen, dzclose, dzread, dzwrite,
X dzioctl, dzstop, dz11, /* dz = 21 */
X
X ibopen, ibclose, ibread, ibwrite,
X ibioctl, nulldev, 0, /* ib = 22 */
X
X ftopen, ftclose, nodev, nodev,
X ftioctl, nodev, 0, /* ft = 23 */
X
X mqopen, mqclose, mqread, mqwrite,
X nodev, nodev, 0 /* mq = 24 */
X};
X
Xint nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
X
X#ifdef OLDTTY
Xint ttread(), ttyinput(), ttyoutput();
Xcaddr_t ttwrite();
X#define ttopen nulldev
X#define ttclose nulldev
X#define ttioctl nullioctl
X#define ttmodem nulldev
X#else
X#define ttopen nodev
X#define ttclose nodev
X#define ttread nodev
X#define ttwrite nodev
X#define ttioctl nodev
X#define ttyinput nodev
X#define ttyoutput nodev
X#define ttmodem nodev
X#endif
X
X
X#ifdef UCB_NTTY
Xint ntyopen(), ntyclose(), ntread(), ntyinput(), ntyoutput();
Xcaddr_t ntwrite();
X#define ntyioctl nullioctl
X#define ntymodem nulldev
X#else
X#define ntyopen nodev
X#define ntyclose nodev
X#define ntread nodev
X#define ntwrite nodev
X#define ntyioctl nodev
X#define ntyinput nodev
X#define ntyoutput nodev
X#define ntymodem nodev
X
X#endif
X#include "bk.h"
X#if NBK > 0
Xint bkopen(), bkclose(), bkread(), bkioctl(), bkinput();
X#else
X#define bkopen nodev
X#define bkclose nodev
X#define bkread nodev
X#define bkioctl nodev
X#define bkinput nodev
X#endif
X
Xstruct linesw linesw[] =
X{
X ttopen, ttclose, ttread, ttwrite,
X ttioctl, ttyinput, ttyoutput, ttmodem, /*0*/
X
X ntyopen, ntyclose, ntread, ntwrite,
X ntyioctl, ntyinput, ntyoutput, ntymodem, /*1*/
X
X bkopen, bkclose, bkread, ntwrite,
X bkioctl, bkinput, ntyoutput, ntymodem /*2*/
X};
X
X#ifndef MPX_FILS
Xint nldisp = sizeof(linesw) / sizeof(linesw[0]);
X#else
Xint nldisp = sizeof(linesw) / sizeof(linesw[0]) - 1;
Xint mpxchan();
Xint (*ldmpx)() = mpxchan;
X#endif
+ END-OF-FILE c.c
chmod 'u=rw,g=r,o=r' 'c.c'
echo ' -rw-r--r-- 1 root 10672 Oct 9 22:27 c.c (as sent)'
echo -n ' '
/bin/ls -l c.c
exit 0