Deleted Added
full compact
if_disc.c (51646) if_disc.c (53115)
1/*
2 * Copyright (c) 1982, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * From: @(#)if_loop.c 8.1 (Berkeley) 6/10/93
1/*
2 * Copyright (c) 1982, 1986, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * From: @(#)if_loop.c 8.1 (Berkeley) 6/10/93
34 * $FreeBSD: head/sys/net/if_disc.c 51646 1999-09-25 12:06:01Z phk $
34 * $FreeBSD: head/sys/net/if_disc.c 53115 1999-11-12 19:30:08Z phk $
35 */
36
37/*
38 * Discard interface driver for protocol testing and timing.
39 * (Based on the loopback.)
40 */
41
42#include <sys/param.h>
43#include <sys/systm.h>
44#include <sys/kernel.h>
45#include <sys/mbuf.h>
46#include <sys/socket.h>
47#include <sys/sockio.h>
48
49#include <net/if.h>
50#include <net/if_types.h>
51#include <net/route.h>
52#include <net/bpf.h>
53
54#include "opt_inet.h"
55
56#ifdef TINY_DSMTU
57#define DSMTU (1024+512)
58#else
59#define DSMTU 65532
60#endif
61
62static void discattach __P((void *dummy));
63PSEUDO_SET(discattach, if_disc);
64
65static struct ifnet discif;
66static int discoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
67 struct rtentry *);
68static void discrtrequest(int cmd, struct rtentry *rt, struct sockaddr *sa);
69static int discioctl(struct ifnet *, u_long, caddr_t);
70
71/* ARGSUSED */
72static void
73discattach(dummy)
74 void *dummy;
75{
76 register struct ifnet *ifp = &discif;
77
78 ifp->if_name = "ds";
79 ifp->if_mtu = DSMTU;
80 ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
81 ifp->if_ioctl = discioctl;
82 ifp->if_output = discoutput;
83 ifp->if_type = IFT_LOOP;
84 ifp->if_hdrlen = 0;
85 ifp->if_addrlen = 0;
35 */
36
37/*
38 * Discard interface driver for protocol testing and timing.
39 * (Based on the loopback.)
40 */
41
42#include <sys/param.h>
43#include <sys/systm.h>
44#include <sys/kernel.h>
45#include <sys/mbuf.h>
46#include <sys/socket.h>
47#include <sys/sockio.h>
48
49#include <net/if.h>
50#include <net/if_types.h>
51#include <net/route.h>
52#include <net/bpf.h>
53
54#include "opt_inet.h"
55
56#ifdef TINY_DSMTU
57#define DSMTU (1024+512)
58#else
59#define DSMTU 65532
60#endif
61
62static void discattach __P((void *dummy));
63PSEUDO_SET(discattach, if_disc);
64
65static struct ifnet discif;
66static int discoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
67 struct rtentry *);
68static void discrtrequest(int cmd, struct rtentry *rt, struct sockaddr *sa);
69static int discioctl(struct ifnet *, u_long, caddr_t);
70
71/* ARGSUSED */
72static void
73discattach(dummy)
74 void *dummy;
75{
76 register struct ifnet *ifp = &discif;
77
78 ifp->if_name = "ds";
79 ifp->if_mtu = DSMTU;
80 ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
81 ifp->if_ioctl = discioctl;
82 ifp->if_output = discoutput;
83 ifp->if_type = IFT_LOOP;
84 ifp->if_hdrlen = 0;
85 ifp->if_addrlen = 0;
86 ifp->if_snd.ifq_maxlen = 20;
86 if_attach(ifp);
87 bpfattach(ifp, DLT_NULL, sizeof(u_int));
88}
89
90static int
91discoutput(ifp, m, dst, rt)
92 struct ifnet *ifp;
93 register struct mbuf *m;
94 struct sockaddr *dst;
95 register struct rtentry *rt;
96{
97 if ((m->m_flags & M_PKTHDR) == 0)
98 panic("discoutput no HDR");
99 /* BPF write needs to be handled specially */
100 if (dst->sa_family == AF_UNSPEC) {
101 dst->sa_family = *(mtod(m, int *));
102 m->m_len -= sizeof(int);
103 m->m_pkthdr.len -= sizeof(int);
104 m->m_data += sizeof(int);
105 }
106
107 if (discif.if_bpf) {
108 /*
109 * We need to prepend the address family as
110 * a four byte field. Cons up a dummy header
111 * to pacify bpf. This is safe because bpf
112 * will only read from the mbuf (i.e., it won't
113 * try to free it or keep a pointer a to it).
114 */
115 struct mbuf m0;
116 u_int af = dst->sa_family;
117
118 m0.m_next = m;
119 m0.m_len = 4;
120 m0.m_data = (char *)&af;
121
122 bpf_mtap(&discif, &m0);
123 }
124 m->m_pkthdr.rcvif = ifp;
125
126 ifp->if_opackets++;
127 ifp->if_obytes += m->m_pkthdr.len;
128
129 m_freem(m);
130 return 0;
131}
132
133/* ARGSUSED */
134static void
135discrtrequest(cmd, rt, sa)
136 int cmd;
137 struct rtentry *rt;
138 struct sockaddr *sa;
139{
140 if (rt)
141 rt->rt_rmx.rmx_mtu = DSMTU;
142}
143
144/*
145 * Process an ioctl request.
146 */
147/* ARGSUSED */
148static int
149discioctl(ifp, cmd, data)
150 register struct ifnet *ifp;
151 u_long cmd;
152 caddr_t data;
153{
154 register struct ifaddr *ifa;
155 register struct ifreq *ifr = (struct ifreq *)data;
156 register int error = 0;
157
158 switch (cmd) {
159
160 case SIOCSIFADDR:
161 ifp->if_flags |= IFF_UP;
162 ifa = (struct ifaddr *)data;
163 if (ifa != 0)
164 ifa->ifa_rtrequest = discrtrequest;
165 /*
166 * Everything else is done at a higher level.
167 */
168 break;
169
170 case SIOCADDMULTI:
171 case SIOCDELMULTI:
172 if (ifr == 0) {
173 error = EAFNOSUPPORT; /* XXX */
174 break;
175 }
176 switch (ifr->ifr_addr.sa_family) {
177
178#ifdef INET
179 case AF_INET:
180 break;
181#endif
182
183 default:
184 error = EAFNOSUPPORT;
185 break;
186 }
187 break;
188
189 case SIOCSIFMTU:
190 ifp->if_mtu = ifr->ifr_mtu;
191 break;
192
193 default:
194 error = EINVAL;
195 }
196 return (error);
197}
87 if_attach(ifp);
88 bpfattach(ifp, DLT_NULL, sizeof(u_int));
89}
90
91static int
92discoutput(ifp, m, dst, rt)
93 struct ifnet *ifp;
94 register struct mbuf *m;
95 struct sockaddr *dst;
96 register struct rtentry *rt;
97{
98 if ((m->m_flags & M_PKTHDR) == 0)
99 panic("discoutput no HDR");
100 /* BPF write needs to be handled specially */
101 if (dst->sa_family == AF_UNSPEC) {
102 dst->sa_family = *(mtod(m, int *));
103 m->m_len -= sizeof(int);
104 m->m_pkthdr.len -= sizeof(int);
105 m->m_data += sizeof(int);
106 }
107
108 if (discif.if_bpf) {
109 /*
110 * We need to prepend the address family as
111 * a four byte field. Cons up a dummy header
112 * to pacify bpf. This is safe because bpf
113 * will only read from the mbuf (i.e., it won't
114 * try to free it or keep a pointer a to it).
115 */
116 struct mbuf m0;
117 u_int af = dst->sa_family;
118
119 m0.m_next = m;
120 m0.m_len = 4;
121 m0.m_data = (char *)&af;
122
123 bpf_mtap(&discif, &m0);
124 }
125 m->m_pkthdr.rcvif = ifp;
126
127 ifp->if_opackets++;
128 ifp->if_obytes += m->m_pkthdr.len;
129
130 m_freem(m);
131 return 0;
132}
133
134/* ARGSUSED */
135static void
136discrtrequest(cmd, rt, sa)
137 int cmd;
138 struct rtentry *rt;
139 struct sockaddr *sa;
140{
141 if (rt)
142 rt->rt_rmx.rmx_mtu = DSMTU;
143}
144
145/*
146 * Process an ioctl request.
147 */
148/* ARGSUSED */
149static int
150discioctl(ifp, cmd, data)
151 register struct ifnet *ifp;
152 u_long cmd;
153 caddr_t data;
154{
155 register struct ifaddr *ifa;
156 register struct ifreq *ifr = (struct ifreq *)data;
157 register int error = 0;
158
159 switch (cmd) {
160
161 case SIOCSIFADDR:
162 ifp->if_flags |= IFF_UP;
163 ifa = (struct ifaddr *)data;
164 if (ifa != 0)
165 ifa->ifa_rtrequest = discrtrequest;
166 /*
167 * Everything else is done at a higher level.
168 */
169 break;
170
171 case SIOCADDMULTI:
172 case SIOCDELMULTI:
173 if (ifr == 0) {
174 error = EAFNOSUPPORT; /* XXX */
175 break;
176 }
177 switch (ifr->ifr_addr.sa_family) {
178
179#ifdef INET
180 case AF_INET:
181 break;
182#endif
183
184 default:
185 error = EAFNOSUPPORT;
186 break;
187 }
188 break;
189
190 case SIOCSIFMTU:
191 ifp->if_mtu = ifr->ifr_mtu;
192 break;
193
194 default:
195 error = EINVAL;
196 }
197 return (error);
198}