someday I'll get all this correct (sigh)
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 13 Jun 1983 15:00:29 +0000 (07:00 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 13 Jun 1983 15:00:29 +0000 (07:00 -0800)
SCCS-vsn: sys/vax/if/if_dmc.c 4.27
SCCS-vsn: sys/vax/if/if_ec.c 4.36
SCCS-vsn: sys/vax/if/if_il.c 4.23
SCCS-vsn: sys/vax/if/if_pcl.c 4.2

usr/src/sys/vax/if/if_dmc.c
usr/src/sys/vax/if/if_ec.c
usr/src/sys/vax/if/if_il.c
usr/src/sys/vax/if/if_pcl.c

index f3705fa..b4051c5 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_dmc.c        4.26    83/05/27        */
+/*     if_dmc.c        4.27    83/06/12        */
 
 #include "dmc.h"
 #if NDMC > 0
 
 #include "dmc.h"
 #if NDMC > 0
@@ -10,7 +10,7 @@ int dmcdebug = 0;
  * TODO
  *     allow more than one outstanding read or write.
  *
  * TODO
  *     allow more than one outstanding read or write.
  *
- * UNTESTED WITH 4.1C
+ * UNTESTED WITH 4.2
  */
 #include "../machine/pte.h"
 
  */
 #include "../machine/pte.h"
 
@@ -22,7 +22,8 @@ int dmcdebug = 0;
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/vmmac.h"
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/vmmac.h"
-#include <errno.h>
+#include "../h/ioctl.h"
+#include "../h/errno.h"
 
 #include "../net/if.h"
 #include "../net/netisr.h"
 
 #include "../net/if.h"
 #include "../net/netisr.h"
@@ -44,15 +45,13 @@ int dmcdebug = 0;
 /*
  * Driver information for auto-configuration stuff.
  */
 /*
  * Driver information for auto-configuration stuff.
  */
-int    dmcprobe(), dmcattach(), dmcinit(), dmcoutput(), dmcreset();
+int    dmcprobe(), dmcattach(), dmcinit(), dmcioctl();
+int    dmcoutput(), dmcreset();
 struct uba_device *dmcinfo[NDMC];
 u_short        dmcstd[] = { 0 };
 struct uba_driver dmcdriver =
        { dmcprobe, 0, dmcattach, 0, dmcstd, "dmc", dmcinfo };
 
 struct uba_device *dmcinfo[NDMC];
 u_short        dmcstd[] = { 0 };
 struct uba_driver dmcdriver =
        { dmcprobe, 0, dmcattach, 0, dmcstd, "dmc", dmcinfo };
 
-#define        DMC_AF  0xff            /* 8 bits of address type in ui_flags */
-#define        DMC_NET 0xffffff00      /* 24 bits of net number in ui_flags */
-
 /*
  * DMC software status per interface.
  *
 /*
  * DMC software status per interface.
  *
@@ -122,18 +121,13 @@ dmcattach(ui)
        register struct uba_device *ui;
 {
        register struct dmc_softc *sc = &dmc_softc[ui->ui_unit];
        register struct uba_device *ui;
 {
        register struct dmc_softc *sc = &dmc_softc[ui->ui_unit];
-       register struct sockaddr_in *sin;
 
        sc->sc_if.if_unit = ui->ui_unit;
        sc->sc_if.if_name = "dmc";
        sc->sc_if.if_mtu = DMCMTU;
 
        sc->sc_if.if_unit = ui->ui_unit;
        sc->sc_if.if_name = "dmc";
        sc->sc_if.if_mtu = DMCMTU;
-       sc->sc_if.if_net = (ui->ui_flags & DMC_NET) >> 8;
-       sc->sc_if.if_host[0] = 17;      /* random number */
-       sin = (struct sockaddr_in *)&sc->sc_if.if_addr;
-       sin->sin_family = AF_INET;
-       sin->sin_addr = if_makeaddr(sc->sc_if.if_net, sc->sc_if.if_host[0]);
        sc->sc_if.if_init = dmcinit;
        sc->sc_if.if_output = dmcoutput;
        sc->sc_if.if_init = dmcinit;
        sc->sc_if.if_output = dmcoutput;
+       sc->sc_if.if_ioctl = dmcioctl;
        sc->sc_if.if_reset = dmcreset;
        /* DON'T KNOW IF THIS WILL WORK WITH A BDP AT HIGH SPEEDS */
        sc->sc_ifuba.ifu_flags = UBA_NEEDBDP | UBA_CANTWAIT;
        sc->sc_if.if_reset = dmcreset;
        /* DON'T KNOW IF THIS WILL WORK WITH A BDP AT HIGH SPEEDS */
        sc->sc_ifuba.ifu_flags = UBA_NEEDBDP | UBA_CANTWAIT;
@@ -165,34 +159,42 @@ dmcinit(unit)
        register struct dmc_softc *sc = &dmc_softc[unit];
        register struct uba_device *ui = dmcinfo[unit];
        register struct dmcdevice *addr;
        register struct dmc_softc *sc = &dmc_softc[unit];
        register struct uba_device *ui = dmcinfo[unit];
        register struct dmcdevice *addr;
+       register struct ifnet *ifp = &sc->sc_if;
+       struct sockaddr_in *sin;
        int base;
 
        printd("dmcinit\n");
        int base;
 
        printd("dmcinit\n");
-       if ((sc->sc_flag&DMCBMAPPED) == 0) {
-               sc->sc_ubinfo = uballoc(ui->ui_ubanum,
-                   (caddr_t)&dmc_base[unit], sizeof (struct dmc_base), 0);
-               sc->sc_flag |= DMCBMAPPED;
-       }
-       if (if_ubainit(&sc->sc_ifuba, ui->ui_ubanum, 0,
-           (int)btoc(DMCMTU)) == 0) {
-               printf("dmc%d: can't initialize\n", unit);
-               sc->sc_if.if_flags &= ~IFF_UP;
+       sin = (struct sockaddr_in *)&ifp->if_addr;
+       if (sin->sin_addr.s_addr == 0)
                return;
                return;
+       if ((ifp->if_flags & IFF_RUNNING) == 0) {
+               if ((sc->sc_flag&DMCBMAPPED) == 0) {
+                       sc->sc_ubinfo = uballoc(ui->ui_ubanum,
+                           (caddr_t)&dmc_base[unit],
+                           sizeof (struct dmc_base), 0);
+                       sc->sc_flag |= DMCBMAPPED;
+               }
+               if (if_ubainit(&sc->sc_ifuba, ui->ui_ubanum, 0,
+                   (int)btoc(DMCMTU)) == 0) {
+                       printf("dmc%d: can't initialize\n", unit);
+                       ifp->if_flags &= ~IFF_UP;
+                       return;
+               }
+               addr = (struct dmcdevice *)ui->ui_addr;
+               addr->bsel2 |= DMC_IEO;
+               base = sc->sc_ubinfo & 0x3ffff;
+               printd("  base 0x%x\n", base);
+               dmcload(sc, DMC_BASEI, base, (base>>2)&DMC_XMEM);
+               dmcload(sc, DMC_CNTLI, 0, DMC_USEMAINT ? DMC_MAINT : 0);
+               base = sc->sc_ifuba.ifu_r.ifrw_info & 0x3ffff;
+               dmcload(sc, DMC_READ, base, ((base>>2)&DMC_XMEM)|DMCMTU);
+               printd("  first read queued, addr 0x%x\n", base);
+               ifp->if_flags |= IFF_UP|IFF_RUNNING;
        }
        }
-       addr = (struct dmcdevice *)ui->ui_addr;
-       addr->bsel2 |= DMC_IEO;
-       base = sc->sc_ubinfo & 0x3ffff;
-       printd("  base 0x%x\n", base);
-       dmcload(sc, DMC_BASEI, base, (base>>2)&DMC_XMEM);
-       dmcload(sc, DMC_CNTLI, 0, DMC_USEMAINT ? DMC_MAINT : 0);
-       base = sc->sc_ifuba.ifu_r.ifrw_info & 0x3ffff;
-       dmcload(sc, DMC_READ, base, ((base>>2)&DMC_XMEM)|DMCMTU);
-       printd("  first read queued, addr 0x%x\n", base);
-       sc->sc_if.if_flags |= IFF_UP;
        /* set up routing table entry */
        /* set up routing table entry */
-       if ((sc->sc_if.if_flags & IFF_ROUTE) == 0) {
-               rtinit(&sc->sc_if.if_addr, &sc->sc_if.if_addr, RTF_HOST|RTF_UP);
-               sc->sc_if.if_flags |= IFF_ROUTE;
+       if ((ifp->if_flags & IFF_ROUTE) == 0) {
+               rtinit(sin, sin, RTF_HOST|RTF_UP);
+               ifp->if_flags |= IFF_ROUTE;
        }
 }
 
        }
 }
 
@@ -426,3 +428,38 @@ dmcoutput(ifp, m, dst)
        splx(s);
        return (0);
 }
        splx(s);
        return (0);
 }
+
+/*
+ * Process an ioctl request.
+ */
+dmcioctl(ifp, cmd, data)
+       register struct ifnet *ifp;
+       int cmd;
+       caddr_t data;
+{
+       struct ifreq *ifr = (struct ifreq *)data;
+       struct sockaddr_in *sin;
+       int s = splimp(), error = 0;
+
+       switch (cmd) {
+
+       case SIOCSIFADDR:
+               if (ifp->if_flags & IFF_RUNNING)
+                       if_rtinit(ifp, -1);     /* delete previous route */
+               sin = (struct sockaddr_in *)&ifr->ifr_addr;
+               ifp->if_addr = *sin;
+               ifp->if_net = in_netof(sin->sin_addr);
+               ifp->if_host[0] = in_lnaof(sin->sin_addr);
+               dmcinit(ifp->if_unit);
+               break;
+
+       case SIOCSIFDSTADDR:
+               ifp->if_dstaddr = ifr->ifr_dstaddr;
+               break;
+
+       default:
+               error = EINVAL;
+       }
+       splx(s);
+       return (error);
+}
index 50d094e..f2e2b32 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_ec.c 4.35    83/06/12        */
+/*     if_ec.c 4.36    83/06/13        */
 
 #include "ec.h"
 
 
 #include "ec.h"
 
@@ -744,7 +744,6 @@ ecioctl(ifp, cmd, data)
        caddr_t data;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
        caddr_t data;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
-       register struct sockaddr_in *sin;
        int s = splimp(), error = 0;
 
        switch (cmd) {
        int s = splimp(), error = 0;
 
        switch (cmd) {
@@ -752,13 +751,7 @@ ecioctl(ifp, cmd, data)
        case SIOCSIFADDR:
                if (ifp->if_flags & IFF_RUNNING)
                        if_rtinit(ifp, -1);     /* delete previous route */
        case SIOCSIFADDR:
                if (ifp->if_flags & IFF_RUNNING)
                        if_rtinit(ifp, -1);     /* delete previous route */
-               ifp->if_addr = ifr->ifr_addr;
-               ifp->if_net = in_netof(ifr->ifr_addr);
-               ifp->if_host[0] = in_lnaof(ifr->ifr_addr);
-               sin = (struct sockaddr_in *)&ifp->if_broadaddr;
-               sin->sin_family = AF_INET;
-               sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY);
-               ifp->if_flags |= IFF_BROADCAST;
+               ecsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr);
                ecinit(ifp->if_unit);
                break;
 
                ecinit(ifp->if_unit);
                break;
 
@@ -768,3 +761,17 @@ ecioctl(ifp, cmd, data)
        splx(s);
        return (error);
 }
        splx(s);
        return (error);
 }
+
+ecsetaddr(ifp, sin)
+       register struct ifnet *ifp;
+       register struct sockaddr_in *sin;
+{
+
+       ifp->if_addr = *(struct sockaddr *)sin;
+       ifp->if_net = in_netof(sin->sin_addr);
+       ifp->if_host[0] = in_lnaof(sin->sin_addr);
+       sin = (struct sockaddr_in *)&ifp->if_broadaddr;
+       sin->sin_family = AF_INET;
+       sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY);
+       ifp->if_flags |= IFF_BROADCAST;
+}
index 803d7d9..069bf97 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_il.c 4.22    83/06/12        */
+/*     if_il.c 4.23    83/06/13        */
 
 #include "il.h"
 
 
 #include "il.h"
 
@@ -619,7 +619,6 @@ ilioctl(ifp, cmd, data)
        caddr_t data;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
        caddr_t data;
 {
        register struct ifreq *ifr = (struct ifreq *)data;
-       register struct sockaddr_in *sin;
        int s = splimp(), error = 0;
 
        switch (cmd) {
        int s = splimp(), error = 0;
 
        switch (cmd) {
@@ -627,13 +626,7 @@ ilioctl(ifp, cmd, data)
        case SIOCSIFADDR:
                if (ifp->if_flags & IFF_RUNNING)
                        if_rtinit(ifp, -1);     /* delete previous route */
        case SIOCSIFADDR:
                if (ifp->if_flags & IFF_RUNNING)
                        if_rtinit(ifp, -1);     /* delete previous route */
-               ifp->if_addr = ifr->ifr_addr;
-               ifp->if_net = in_netof(ifr->ifr_addr);
-               ifp->if_host[0] = in_lnaof(ifr->ifr_addr);
-               sin = (struct sockaddr_in *)&ifp->if_broadaddr;
-               sin->sin_family = AF_INET;
-               sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY);
-               ifp->if_flags |= IFF_BROADCAST;
+               ilsetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr);
                ilinit(ifp->if_unit);
                break;
 
                ilinit(ifp->if_unit);
                break;
 
@@ -643,3 +636,17 @@ ilioctl(ifp, cmd, data)
        splx(s);
        return (error);
 }
        splx(s);
        return (error);
 }
+
+ilsetaddr(ifp, sin);
+       register struct ifnet *ifp;
+       register struct sockaddr_in *sin;
+{
+
+       ifp->if_addr = *(struct sockaddr *)sin;
+       ifp->if_net = in_netof(sin->sin_addr);
+       ifp->if_host[0] = in_lnaof(sin->sin_addr);
+       sin = (struct sockaddr_in *)&ifp->if_broadaddr;
+       sin->sin_family = AF_INET;
+       sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY);
+       ifp->if_flags |= IFF_BROADCAST;
+}
index d4c1000..e0411f1 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_pcl.c        4.1     83/03/31        */
+/*     if_pcl.c        4.2     83/06/13        */
 
 #include "pcl.h"
 #if NPCL > 0
 
 #include "pcl.h"
 #if NPCL > 0
@@ -16,6 +16,7 @@
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/vmmac.h"
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/vmmac.h"
+#include "../h/ioctl.h"
 #include "../h/errno.h"
 
 #include "../net/if.h"
 #include "../h/errno.h"
 
 #include "../net/if.h"
@@ -37,7 +38,7 @@
 #define        PCLMTU  (1006)          /* Max transmission unit (bytes) */
 
 int    pclprobe(), pclattach(), pclrint(), pclxint();
 #define        PCLMTU  (1006)          /* Max transmission unit (bytes) */
 
 int    pclprobe(), pclattach(), pclrint(), pclxint();
-int    pclinit(),pcloutput(),pclreset();
+int    pclinit(), pclioctl(), pcloutput(), pclreset();
 
 struct uba_device      *pclinfo[NPCL];
 u_short pclstd[] = { 0 };
 
 struct uba_device      *pclinfo[NPCL];
 u_short pclstd[] = { 0 };
@@ -116,16 +117,9 @@ pclattach(ui)
        sc->sc_if.if_unit = ui->ui_unit;
        sc->sc_if.if_name = "pcl";
        sc->sc_if.if_mtu = PCLMTU;
        sc->sc_if.if_unit = ui->ui_unit;
        sc->sc_if.if_name = "pcl";
        sc->sc_if.if_mtu = PCLMTU;
-       /* copy network addr from flags long */
-       sc->sc_if.if_net = in_netof(htonl(ui->ui_flags));
-       sc->sc_if.if_host[0] = in_lnaof(htonl(ui->ui_flags));
-
-       sin = (struct sockaddr_in *)&sc->sc_if.if_addr;
-       sin->sin_family = AF_INET;
-       sin->sin_addr.s_addr = htonl(ui->ui_flags);
-
        sc->sc_if.if_init = pclinit;
        sc->sc_if.if_output = pcloutput;
        sc->sc_if.if_init = pclinit;
        sc->sc_if.if_output = pcloutput;
+       sc->sc_if.if_ioctl = pclioctl;
        sc->sc_if.if_reset = pclreset;
        sc->sc_ifuba.ifu_flags = UBA_NEEDBDP;
        if_attach(&sc->sc_if);
        sc->sc_if.if_reset = pclreset;
        sc->sc_ifuba.ifu_flags = UBA_NEEDBDP;
        if_attach(&sc->sc_if);
@@ -157,8 +151,12 @@ pclinit(unit)
        register struct pcl_softc *sc = &pcl_softc[unit];
        register struct uba_device *ui = pclinfo[unit];
        register struct pcldevice *addr;
        register struct pcl_softc *sc = &pcl_softc[unit];
        register struct uba_device *ui = pclinfo[unit];
        register struct pcldevice *addr;
+       struct sockaddr_in *sin;
        int s;
 
        int s;
 
+       sin = &sc->sc_if.if_addr;
+       if (sin->sin_addr.s_addr == 0)
+               return;
        if (if_ubainit(&sc->sc_ifuba, ui->ui_ubanum, 0,
            (int)btoc(PCLMTU)) == 0) { 
                printf("pcl%d: can't init\n", unit);
        if (if_ubainit(&sc->sc_ifuba, ui->ui_ubanum, 0,
            (int)btoc(PCLMTU)) == 0) { 
                printf("pcl%d: can't init\n", unit);
@@ -179,7 +177,7 @@ pclinit(unit)
        addr->pcl_rcr = (((int)(sc->sc_ifuba.ifu_r.ifrw_info>>12))&0x0030) |
                PCL_RCNPR | PCL_RCVWD | PCL_RCVDAT | PCL_IE;
        sc->sc_oactive = 0;
        addr->pcl_rcr = (((int)(sc->sc_ifuba.ifu_r.ifrw_info>>12))&0x0030) |
                PCL_RCNPR | PCL_RCVWD | PCL_RCVDAT | PCL_IE;
        sc->sc_oactive = 0;
-       sc->sc_if.if_flags |= IFF_UP;           /* Mark interface up */
+       sc->sc_if.if_flags |= IFF_UP|IFF_RUNNING;
        pclstart(unit);
        splx(s);
        /* Set up routing table entry */
        pclstart(unit);
        splx(s);
        /* Set up routing table entry */
@@ -438,4 +436,38 @@ setup:
        addr->pcl_rcr = (((int)(sc->sc_ifuba.ifu_w.ifrw_info>>12))&0x0030) |
                PCL_RCNPR | PCL_RCVWD | PCL_RCVDAT | PCL_IE;
 }
        addr->pcl_rcr = (((int)(sc->sc_ifuba.ifu_w.ifrw_info>>12))&0x0030) |
                PCL_RCNPR | PCL_RCVWD | PCL_RCVDAT | PCL_IE;
 }
+
+/*
+ * Process an ioctl request.
+ */
+pclioctl(ifp, cmd, data)
+       register struct ifnet *ifp;
+       int cmd;
+       caddr_t data;
+{
+       struct ifreq *ifr = (struct ifreq *)data;
+       struct sockaddr_in *sin;
+       int s = splimp(), error = 0;
+
+       switch (cmd) {
+
+       case SIOCSIFADDR:
+               if (ifp->if_flags & IFF_RUNNING)
+                       if_rtinit(ifp, -1);     /* delete previous route */
+               sin = (struct sockaddr_in *)&ifr->ifr_addr;
+               ifp->if_addr = *sin;
+               ifp->if_net = in_netof(sin->sin_addr);
+               ifp->if_host[0] = in_lnaof(sin->sin_addr);
+               if (ifp->if_flags & IFF_RUNNING)
+                       if_rtinit(ifp, RTF_UP);
+               else
+                       pclinit(ifp->if_unit);
+               break;
+
+       default:
+               error = EINVAL;
+       }
+       splx(s);
+       return (error);
+}
 #endif
 #endif