X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/51595ca22093666a8ba6b09214e4cf8aad770db4..961945a80c6f995f4567dbce8881af0bbdee211c:/usr/src/sys/vax/if/if_il.c diff --git a/usr/src/sys/vax/if/if_il.c b/usr/src/sys/vax/if/if_il.c index e26c04927f..677401c58f 100644 --- a/usr/src/sys/vax/if/if_il.c +++ b/usr/src/sys/vax/if/if_il.c @@ -1,14 +1,15 @@ -/* if_il.c 4.13 82/10/31 */ +/* 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" @@ -26,14 +27,13 @@ #include "../vax/cpu.h" #include "../vax/mtpr.h" -#include "../vaxif/if_ilreg.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" -#define ILMTU 1500 - int ilprobe(), ilattach(), ilrint(), ilcint(); struct uba_device *ilinfo[NIL]; u_short ilstd[] = { 0 }; @@ -81,7 +81,7 @@ ilprobe(reg) #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; @@ -108,7 +108,7 @@ ilattach(ui) ifp->if_unit = ui->ui_unit; ifp->if_name = "il"; - ifp->if_mtu = ILMTU; + ifp->if_mtu = ETHERMTU; ifp->if_net = ui->ui_flags; /* @@ -122,7 +122,7 @@ ilattach(ui) 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); @@ -194,15 +194,26 @@ ilinit(unit) 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 @@ -215,7 +226,7 @@ ilinit(unit) 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) @@ -236,7 +247,7 @@ ilinit(unit) 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; @@ -248,13 +259,22 @@ ilstart(dev) 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; @@ -292,7 +312,7 @@ ilcint(unit) */ 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) @@ -345,7 +365,8 @@ ilrint(unit) 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) @@ -359,14 +380,15 @@ ilrint(unit) * 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; @@ -391,7 +413,7 @@ ilrint(unit) switch (il->ilr_type) { #ifdef INET - case ILPUP_IPTYPE: + case ETHERPUP_IPTYPE: schednetisr(NETISR_IP); inq = &ipintrq; break; @@ -419,7 +441,7 @@ setup: 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) @@ -440,8 +462,8 @@ iloutput(ifp, m0, dst) 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) { @@ -451,14 +473,14 @@ iloutput(ifp, m0, dst) 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 @@ -488,31 +510,32 @@ gottype: * 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