projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
make changes to RTM_GET so that you can indicate that you want
[unix-history]
/
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
71e17c6
..
61e0d80
100644
(file)
--- a/
usr/src/sys/net/if_loop.c
+++ b/
usr/src/sys/net/if_loop.c
@@
-1,85
+1,165
@@
-/* if_loop.c 4.18 83/05/27 */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ *
+ * @(#)if_loop.c 7.12 (Berkeley) %G%
+ */
/*
* Loopback interface driver for protocol testing and timing.
*/
/*
* 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 "../h/errno.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/if.h"
+#include "../net/if_types.h"
#include "../net/netisr.h"
#include "../net/route.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.h"
#include "../netinet/in_systm.h"
+#include "../netinet/in_var.h"
#include "../netinet/ip.h"
#include "../netinet/ip.h"
-#include "../netinet/ip_var.h"
+#endif
+
+#ifdef NS
+#include "../netns/ns.h"
+#include "../netns/ns_if.h"
+#endif
+
+#ifdef ISO
+#include "../netiso/iso.h"
+#include "../netiso/iso_var.h"
+#endif
-#ifdef vax
-#include "../vax/mtpr.h"
+#ifdef CCITT
+#include "../netccitt/x25.h"
+#include "../netccitt/hdlc.h"
+#include "../netccitt/hd_var.h"
#endif
#endif
-#define LONET 127
-#define LOHOST 1 /* can't be 0, that's broadcast */
#define LOMTU (1024+512)
struct ifnet loif;
#define LOMTU (1024+512)
struct ifnet loif;
-int looutput();
+int looutput()
, loioctl()
;
loattach()
{
register struct ifnet *ifp = &loif;
loattach()
{
register struct ifnet *ifp = &loif;
- register struct sockaddr_in *sin;
ifp->if_name = "lo";
ifp->if_mtu = LOMTU;
ifp->if_name = "lo";
ifp->if_mtu = LOMTU;
- ifp->if_net = LONET;
- ifp->if_host[0] = LOHOST;
- sin = (struct sockaddr_in *)&ifp->if_addr;
- sin->sin_family = AF_INET;
- sin->sin_addr = if_makeaddr(ifp->if_net, LOHOST);
- ifp->if_flags = IFF_UP;
+ ifp->if_flags = IFF_LOOPBACK;
+ ifp->if_ioctl = loioctl;
ifp->if_output = looutput;
ifp->if_output = looutput;
+ ifp->if_type = IFT_LOOP;
+ ifp->if_hdrlen = 0;
+ ifp->if_addrlen = 0;
if_attach(ifp);
if_attach(ifp);
- if_rtinit(ifp, RTF_UP);
}
}
-looutput(ifp, m
0, ds
t)
+looutput(ifp, m
, dst, r
t)
struct ifnet *ifp;
struct ifnet *ifp;
-
struct mbuf *m0
;
+
register struct mbuf *m
;
struct sockaddr *dst;
struct sockaddr *dst;
+ register struct rtentry *rt;
{
{
- int s
= splimp()
;
- register struct ifqueue *ifq;
+ int s
, isr
;
+ register struct ifqueue *ifq
= 0
;
+ if ((m->m_flags & M_PKTHDR) == 0)
+ panic("looutput no HDR");
+ m->m_pkthdr.rcvif = ifp;
+
+ if (rt && rt->rt_flags & RTF_REJECT) {
+ m_freem(m);
+ return (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
+ }
+ s = splimp();
ifp->if_opackets++;
ifp->if_opackets++;
+ ifp->if_obytes += m->m_pkthdr.len;
switch (dst->sa_family) {
#ifdef INET
case AF_INET:
ifq = &ipintrq;
switch (dst->sa_family) {
#ifdef INET
case AF_INET:
ifq = &ipintrq;
- if (IF_QFULL(ifq)) {
- IF_DROP(ifq);
- m_freem(m0);
- splx(s);
- return (ENOBUFS);
- }
- IF_ENQUEUE(ifq, m0);
- schednetisr(NETISR_IP);
+ isr = NETISR_IP;
+ break;
+#endif
+#ifdef NS
+ case AF_NS:
+ ifq = &nsintrq;
+ isr = NETISR_NS;
+ break;
+#endif
+#ifdef ISO
+ case AF_ISO:
+ ifq = &clnlintrq;
+ isr = NETISR_ISO;
+ break;
+#endif
+#ifdef CCITT
+ case AF_CCITT:
+ ifq = &hdintrq;
+ isr = NETISR_CCITT;
break;
#endif
default:
splx(s);
printf("lo%d: can't handle af%d\n", ifp->if_unit,
dst->sa_family);
break;
#endif
default:
splx(s);
printf("lo%d: can't handle af%d\n", ifp->if_unit,
dst->sa_family);
- m_freem(m
0
);
+ m_freem(m);
return (EAFNOSUPPORT);
}
return (EAFNOSUPPORT);
}
+ if (IF_QFULL(ifq)) {
+ IF_DROP(ifq);
+ m_freem(m);
+ splx(s);
+ return (ENOBUFS);
+ }
+ IF_ENQUEUE(ifq, m);
+ schednetisr(isr);
ifp->if_ipackets++;
ifp->if_ipackets++;
+ ifp->if_ibytes += m->m_pkthdr.len;
splx(s);
return (0);
}
splx(s);
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) {
+
+#ifdef CCITT
+ case SIOCSIFCONF_X25:
+#endif
+ case SIOCSIFADDR:
+ ifp->if_flags |= IFF_UP;
+ /*
+ * Everything else is done at a higher level.
+ */
+ break;
+
+ default:
+ error = EINVAL;
+ }
+ return (error);
+}