X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/b454c3ea9e19212a6333dbc8463e4e9f25c0ad65..dd70a7d6ef08e95a9ce58964a17dfc668962ec4c:/usr/src/sys/net/if_loop.c diff --git a/usr/src/sys/net/if_loop.c b/usr/src/sys/net/if_loop.c index 572929b963..dca1d80f4c 100644 --- a/usr/src/sys/net/if_loop.c +++ b/usr/src/sys/net/if_loop.c @@ -1,25 +1,55 @@ -/* if_loop.c 4.3 81/12/03 */ +/* + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)if_loop.c 7.5 (Berkeley) %G% + */ /* * Loopback interface driver for protocol testing and timing. */ -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/mbuf.h" -#include "../h/socket.h" -#include "../net/in.h" -#include "../net/in_systm.h" +#include "param.h" +#include "systm.h" +#include "mbuf.h" +#include "socket.h" +#include "errno.h" +#include "ioctl.h" + #include "../net/if.h" -#include "../net/ip.h" -#include "../net/ip_var.h" -#include "../h/mtpr.h" +#include "../net/netisr.h" +#include "../net/route.h" + +#include "../machine/mtpr.h" + +#ifdef INET +#include "../netinet/in.h" +#include "../netinet/in_systm.h" +#include "../netinet/in_var.h" +#include "../netinet/ip.h" +#endif + +#ifdef NS +#include "../netns/ns.h" +#include "../netns/ns_if.h" +#endif -#define LONET 254 -#define LOMTU 1024 +#define LOMTU (1024+512) struct ifnet loif; -int looutput(); +int looutput(), loioctl(); loattach() { @@ -27,36 +57,101 @@ loattach() ifp->if_name = "lo"; ifp->if_mtu = LOMTU; - ifp->if_net = LONET; - ifp->if_addr = if_makeaddr(ifp->if_net, 0); + ifp->if_flags = IFF_LOOPBACK; + ifp->if_ioctl = loioctl; ifp->if_output = looutput; if_attach(ifp); } -looutput(ifp, m0, pf) +struct mbuf *Loop_Sanity; + +looutput(ifp, m, dst) struct ifnet *ifp; - struct mbuf *m0; - int pf; + register struct mbuf *m; + struct sockaddr *dst; { - int s = splimp(); + int s; + register struct ifqueue *ifq; + if ((m->m_flags & M_PKTHDR) == 0) + panic("looutput no HDR"); + m->m_pkthdr.rcvif = ifp; + +{struct mbuf *mm; int mlen = 0; +for (mm = m; m; m = m->m_next) /* XXX debugging code -- sklwoer */ + mlen += m->m_len; +m = mm; +if (mlen != m->m_pkthdr.len) { + if (Loop_Sanity) + m_freem(Loop_Sanity); + Loop_Sanity = m_copy(m, 0, M_COPYALL); +} +} + + s = splimp(); ifp->if_opackets++; - switch (pf) { + switch (dst->sa_family) { #ifdef INET - case PF_INET: - IF_ENQUEUE(&ipintrq, m0); - setipintr(); + case AF_INET: + ifq = &ipintrq; + if (IF_QFULL(ifq)) { + IF_DROP(ifq); + m_freem(m); + splx(s); + return (ENOBUFS); + } + IF_ENQUEUE(ifq, m); + schednetisr(NETISR_IP); + break; +#endif +#ifdef NS + case AF_NS: + ifq = &nsintrq; + if (IF_QFULL(ifq)) { + IF_DROP(ifq); + m_freem(m); + splx(s); + return (ENOBUFS); + } + IF_ENQUEUE(ifq, m); + schednetisr(NETISR_NS); break; #endif - default: splx(s); - printf("lo%d: can't encapsulate pf%d\n", ifp->if_unit, pf); - m_freem(m0); - return (0); + printf("lo%d: can't handle af%d\n", ifp->if_unit, + dst->sa_family); + m_freem(m); + return (EAFNOSUPPORT); } ifp->if_ipackets++; splx(s); - return (1); + return (0); +} + +/* + * Process an ioctl request. + */ +/* ARGSUSED */ +loioctl(ifp, cmd, data) + register struct ifnet *ifp; + int cmd; + caddr_t data; +{ + int error = 0; + + switch (cmd) { + + case SIOCSIFADDR: + ifp->if_flags |= IFF_UP; + /* + * Everything else is done at a higher level. + */ + break; + + default: + error = EINVAL; + } + return (error); }