-/* if_il.c 4.10 82/06/24 */
+/* if_il.c 4.17 82/12/17 */
#include "il.h"
/*
* Interlan Ethernet Communications Controller interface
*/
+#include "../machine/pte.h"
+
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/mbuf.h"
-#include "../h/pte.h"
#include "../h/buf.h"
#include "../h/protosw.h"
#include "../h/socket.h"
-#include "../h/ubareg.h"
-#include "../h/ubavar.h"
-#include "../h/ilreg.h"
-#include "../h/cpu.h"
-#include "../h/mtpr.h"
#include "../h/vmmac.h"
-#include "../net/in.h"
-#include "../net/in_systm.h"
-#include "../net/if.h"
-#include "../net/if_il.h"
-#include "../net/if_uba.h"
-#include "../net/ip.h"
-#include "../net/ip_var.h"
-#include "../net/pup.h"
-#include "../net/route.h"
#include <errno.h>
-#define ILMTU 1500
+#include "../net/if.h"
+#include "../net/netisr.h"
+#include "../net/route.h"
+#include "../netinet/in.h"
+#include "../netinet/in_systm.h"
+#include "../netinet/ip.h"
+#include "../netinet/ip_var.h"
+#include "../netpup/pup.h"
+
+#include "../vax/cpu.h"
+#include "../vax/mtpr.h"
+#include "../vaxif/if_ether.h"
+#include "../vaxif/if_il.h"
+#include "../vaxif/if_ilreg.h"
+#include "../vaxif/if_uba.h"
+#include "../vaxuba/ubareg.h"
+#include "../vaxuba/ubavar.h"
int ilprobe(), ilattach(), ilrint(), ilcint();
struct uba_device *ilinfo[NIL];
#ifdef lint
br = 0; cvec = br; br = cvec;
- ilrint(0); ilcint(0); ilwatch(0);
+ i = 0; ilrint(i); ilcint(i); ilwatch(i);
#endif
addr->il_csr = ILC_OFFLINE|IL_CIE;
ifp->if_unit = ui->ui_unit;
ifp->if_name = "il";
- ifp->if_mtu = ILMTU;
+ ifp->if_mtu = ETHERMTU;
ifp->if_net = ui->ui_flags;
/*
printf("il%d: reset failed, csr=%b\n", ui->ui_unit,
addr->il_csr, IL_BITS);
- is->is_ubaddr = uballoc(ui->ui_ubanum, &is->is_stats,
+ is->is_ubaddr = uballoc(ui->ui_ubanum, (caddr_t)&is->is_stats,
sizeof (struct il_stats), 0);
addr->il_bar = is->is_ubaddr & 0xffff;
addr->il_bcr = sizeof (struct il_stats);
ifp->if_init = ilinit;
ifp->if_output = iloutput;
- ifp->if_ubareset = ilreset;
+ ifp->if_reset = ilreset;
ifp->if_watchdog = ilwatch;
is->is_scaninterval = ILWATCHINTERVAL;
ifp->if_timer = is->is_scaninterval;
int s;
if (if_ubainit(&is->is_ifuba, ui->ui_ubanum,
- sizeof (struct il_rheader), (int)btoc(ILMTU)) == 0) {
+ sizeof (struct il_rheader), (int)btoc(ETHERMTU)) == 0) {
printf("il%d: can't initialize\n", unit);
is->is_if.if_flags &= ~IFF_UP;
return;
}
- is->is_ubaddr = uballoc(ui->ui_ubanum, &is->is_stats,
+ is->is_ubaddr = uballoc(ui->ui_ubanum, (caddr_t)&is->is_stats,
sizeof (struct il_stats), 0);
addr = (struct ildevice *)ui->ui_addr;
+ /*
+ * Turn off source address insertion (it's faster this way),
+ * and set board online.
+ */
+ s = splimp();
+ addr->il_csr = ILC_CISA;
+ while ((addr->il_csr & IL_CDONE) == 0)
+ ;
+ addr->il_csr = ILC_ONLINE;
+ while ((addr->il_csr & IL_CDONE) == 0)
+ ;
/*
* Set board online.
* Hang receive buffer and start any pending
while ((addr->il_csr & IL_CDONE) == 0)
;
addr->il_bar = is->is_ifuba.ifu_r.ifrw_info & 0xffff;
- addr->il_bcr = sizeof(struct il_rheader) + ILMTU + 6;
+ addr->il_bcr = sizeof(struct il_rheader) + ETHERMTU + 6;
addr->il_csr =
((is->is_ifuba.ifu_r.ifrw_info >> 2) & IL_EUA)|ILC_RCV|IL_RIE;
while ((addr->il_csr & IL_CDONE) == 0)
ilstart(dev)
dev_t dev;
{
- int unit = ILUNIT(dev), dest, len;
+ int unit = ILUNIT(dev), len;
struct uba_device *ui = ilinfo[unit];
register struct il_softc *is = &il_softc[unit];
register struct ildevice *addr;
if (m == 0) {
if ((is->is_flags & ILF_STATPENDING) == 0)
return;
- addr->il_bar = is->is_ubaddr & 0xfff;
+ addr->il_bar = is->is_ubaddr & 0xffff;
addr->il_bcr = sizeof (struct il_stats);
csr = ((is->is_ubaddr >> 2) & IL_EUA)|ILC_STAT|IL_RIE|IL_CIE;
is->is_flags &= ~ILF_STATPENDING;
goto startcmd;
}
len = if_wubaput(&is->is_ifuba, m);
+ /*
+ * Ensure minimum packet length.
+ * This makes the safe assumtion that there are no virtual holes
+ * after the data.
+ * For security, it might be wise to zero out the added bytes,
+ * but we're mainly interested in speed at the moment.
+ */
+ if (len - sizeof(struct ether_header) < ETHERMIN)
+ len = ETHERMIN + sizeof(struct ether_header);
if (is->is_ifuba.ifu_flags & UBA_NEEDBDP)
UBAPURGE(is->is_ifuba.ifu_uba, is->is_ifuba.ifu_w.ifrw_bdp);
addr->il_bar = is->is_ifuba.ifu_w.ifrw_info & 0xffff;
*/
if (is->is_flags & ILF_RCVPENDING) {
addr->il_bar = is->is_ifuba.ifu_r.ifrw_info & 0xffff;
- addr->il_bcr = sizeof(struct il_rheader) + ILMTU + 6;
+ addr->il_bcr = sizeof(struct il_rheader) + ETHERMTU + 6;
addr->il_csr =
((is->is_ifuba.ifu_r.ifrw_info >> 2) & IL_EUA)|ILC_RCV|IL_RIE;
while ((addr->il_csr & IL_CDONE) == 0)
UBAPURGE(is->is_ifuba.ifu_uba, is->is_ifuba.ifu_r.ifrw_bdp);
il = (struct il_rheader *)(is->is_ifuba.ifu_r.ifrw_addr);
len = il->ilr_length - sizeof(struct il_rheader);
- if ((il->ilr_status&(ILFSTAT_A|ILFSTAT_C)) || len < 46 || len > ILMTU) {
+ if ((il->ilr_status&(ILFSTAT_A|ILFSTAT_C)) || len < 46 ||
+ len > ETHERMTU) {
is->is_if.if_ierrors++;
#ifdef notdef
if (is->is_if.if_ierrors % 100 == 0)
* get true type from first 16-bit word past data.
* Remember that type was trailer by setting off.
*/
+ il->ilr_type = ntohs((u_short)il->ilr_type);
#define ildataaddr(il, off, type) ((type)(((caddr_t)((il)+1)+(off))))
- if (il->ilr_type >= ILPUP_TRAIL &&
- il->ilr_type < ILPUP_TRAIL+ILPUP_NTRAILER) {
- off = (il->ilr_type - ILPUP_TRAIL) * 512;
- if (off >= ILMTU)
+ if (il->ilr_type >= ETHERPUP_TRAIL &&
+ il->ilr_type < ETHERPUP_TRAIL+ETHERPUP_NTRAILER) {
+ off = (il->ilr_type - ETHERPUP_TRAIL) * 512;
+ if (off >= ETHERMTU)
goto setup; /* sanity */
- il->ilr_type = *ildataaddr(il, off, u_short *);
- resid = *(ildataaddr(il, off+2, u_short *));
+ il->ilr_type = ntohs(*ildataaddr(il, off, u_short *));
+ resid = ntohs(*(ildataaddr(il, off+2, u_short *)));
if (off + resid > len)
goto setup; /* sanity */
len = off + resid;
switch (il->ilr_type) {
#ifdef INET
- case ILPUP_IPTYPE:
+ case ETHERPUP_IPTYPE:
schednetisr(NETISR_IP);
inq = &ipintrq;
break;
return;
}
addr->il_bar = is->is_ifuba.ifu_r.ifrw_info & 0xffff;
- addr->il_bcr = sizeof(struct il_rheader) + ILMTU + 6;
+ addr->il_bcr = sizeof(struct il_rheader) + ETHERMTU + 6;
addr->il_csr =
((is->is_ifuba.ifu_r.ifrw_info >> 2) & IL_EUA)|ILC_RCV|IL_RIE;
while ((addr->il_csr & IL_CDONE) == 0)
int type, dest, s, error;
register struct il_softc *is = &il_softc[ifp->if_unit];
register struct mbuf *m = m0;
- register struct il_xheader *il;
- register int off, i;
+ register struct ether_header *il;
+ register int off;
switch (dst->sa_family) {
off = ntohs((u_short)mtod(m, struct ip *)->ip_len) - m->m_len;
if (off > 0 && (off & 0x1ff) == 0 &&
m->m_off >= MMINOFF + 2 * sizeof (u_short)) {
- type = ILPUP_TRAIL + (off>>9);
+ type = ETHERPUP_TRAIL + (off>>9);
m->m_off -= 2 * sizeof (u_short);
m->m_len += 2 * sizeof (u_short);
- *mtod(m, u_short *) = ILPUP_IPTYPE;
- *(mtod(m, u_short *) + 1) = m->m_len;
+ *mtod(m, u_short *) = htons((u_short)ETHERPUP_IPTYPE);
+ *(mtod(m, u_short *) + 1) = htons((u_short)m->m_len);
goto gottrailertype;
}
- type = ILPUP_IPTYPE;
+ type = ETHERPUP_IPTYPE;
off = 0;
goto gottype;
#endif
* allocate another.
*/
if (m->m_off > MMAXOFF ||
- MMINOFF + sizeof (struct il_xheader) > m->m_off) {
- m = m_get(M_DONTWAIT);
+ MMINOFF + sizeof (struct ether_header) > m->m_off) {
+ m = m_get(M_DONTWAIT, MT_HEADER);
if (m == 0) {
error = ENOBUFS;
goto bad;
}
m->m_next = m0;
m->m_off = MMINOFF;
- m->m_len = sizeof (struct il_xheader);
+ m->m_len = sizeof (struct ether_header);
} else {
- m->m_off -= sizeof (struct il_xheader);
- m->m_len += sizeof (struct il_xheader);
+ m->m_off -= sizeof (struct ether_header);
+ m->m_len += sizeof (struct ether_header);
}
- il = mtod(m, struct il_xheader *);
+ il = mtod(m, struct ether_header *);
if ((dest &~ 0xff) == 0)
- bcopy(ilbroadcastaddr, il->ilx_dhost, 6);
+ bcopy((caddr_t)ilbroadcastaddr, (caddr_t)il->ether_dhost, 6);
else {
u_char *to = dest & 0x8000 ? is->is_stats.ils_addr : il_ectop;
- bcopy(to, il->ilx_dhost, 3);
- il->ilx_dhost[3] = (dest>>8) & 0x7f;
- il->ilx_dhost[4] = (dest>>16) & 0xff;
- il->ilx_dhost[5] = (dest>>24) & 0xff;
+ bcopy((caddr_t)to, (caddr_t)il->ether_dhost, 3);
+ il->ether_dhost[3] = (dest>>8) & 0x7f;
+ il->ether_dhost[4] = (dest>>16) & 0xff;
+ il->ether_dhost[5] = (dest>>24) & 0xff;
}
- il->ilx_type = type;
+ bcopy((caddr_t)is->is_stats.ils_addr, (caddr_t)il->ether_shost, 6);
+ il->ether_type = htons((u_short)type);
/*
* Queue message on interface, and start output if interface