Deleted Added
full compact
if_loop.c (193744) if_loop.c (195699)
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

--- 13 unchanged lines hidden (view full) ---

22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)if_loop.c 8.2 (Berkeley) 1/9/95
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

--- 13 unchanged lines hidden (view full) ---

22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)if_loop.c 8.2 (Berkeley) 1/9/95
30 * $FreeBSD: head/sys/net/if_loop.c 193744 2009-06-08 19:57:35Z bz $
30 * $FreeBSD: head/sys/net/if_loop.c 195699 2009-07-14 22:48:30Z rwatson $
31 */
32
33/*
34 * Loopback interface driver for protocol testing and timing.
35 */
36
37#include "opt_atalk.h"
38#include "opt_inet.h"

--- 64 unchanged lines hidden (view full) ---

103 struct sockaddr *dst, struct route *ro);
104static int lo_clone_create(struct if_clone *, int, caddr_t);
105static void lo_clone_destroy(struct ifnet *);
106static int vnet_loif_iattach(const void *);
107#ifdef VIMAGE
108static int vnet_loif_idetach(const void *);
109#endif
110
31 */
32
33/*
34 * Loopback interface driver for protocol testing and timing.
35 */
36
37#include "opt_atalk.h"
38#include "opt_inet.h"

--- 64 unchanged lines hidden (view full) ---

103 struct sockaddr *dst, struct route *ro);
104static int lo_clone_create(struct if_clone *, int, caddr_t);
105static void lo_clone_destroy(struct ifnet *);
106static int vnet_loif_iattach(const void *);
107#ifdef VIMAGE
108static int vnet_loif_idetach(const void *);
109#endif
110
111#ifdef VIMAGE_GLOBALS
112struct ifnet *loif; /* Used externally */
113#endif
111VNET_DEFINE(struct ifnet *, loif); /* Used externally */
114
115#ifdef VIMAGE
112
113#ifdef VIMAGE
114static VNET_DEFINE(struct ifc_simple_data *, lo_cloner_data);
115static VNET_DEFINE(struct if_clone *, lo_cloner);
116#define V_lo_cloner_data VNET_GET(lo_cloner_data)
117#define V_lo_cloner VNET_GET(lo_cloner)
118
116MALLOC_DEFINE(M_LO_CLONER, "lo_cloner", "lo_cloner");
117#endif
118
119MALLOC_DEFINE(M_LO_CLONER, "lo_cloner", "lo_cloner");
120#endif
121
119#ifndef VIMAGE_GLOBALS
122#ifdef VIMAGE
120static const vnet_modinfo_t vnet_loif_modinfo = {
121 .vmi_id = VNET_MOD_LOIF,
122 .vmi_dependson = VNET_MOD_IF_CLONE,
123 .vmi_name = "loif",
124 .vmi_iattach = vnet_loif_iattach,
123static const vnet_modinfo_t vnet_loif_modinfo = {
124 .vmi_id = VNET_MOD_LOIF,
125 .vmi_dependson = VNET_MOD_IF_CLONE,
126 .vmi_name = "loif",
127 .vmi_iattach = vnet_loif_iattach,
125#ifdef VIMAGE
126 .vmi_idetach = vnet_loif_idetach
128 .vmi_idetach = vnet_loif_idetach
127#endif
128};
129};
129#endif /* !VIMAGE_GLOBALS */
130#endif
130
131IFC_SIMPLE_DECLARE(lo, 1);
132
133static void
134lo_clone_destroy(struct ifnet *ifp)
135{
136
137#ifndef VIMAGE

--- 4 unchanged lines hidden (view full) ---

142 bpfdetach(ifp);
143 if_detach(ifp);
144 if_free(ifp);
145}
146
147static int
148lo_clone_create(struct if_clone *ifc, int unit, caddr_t params)
149{
131
132IFC_SIMPLE_DECLARE(lo, 1);
133
134static void
135lo_clone_destroy(struct ifnet *ifp)
136{
137
138#ifndef VIMAGE

--- 4 unchanged lines hidden (view full) ---

143 bpfdetach(ifp);
144 if_detach(ifp);
145 if_free(ifp);
146}
147
148static int
149lo_clone_create(struct if_clone *ifc, int unit, caddr_t params)
150{
150 INIT_VNET_NET(curvnet);
151 struct ifnet *ifp;
152
153 ifp = if_alloc(IFT_LOOP);
154 if (ifp == NULL)
155 return (ENOSPC);
156
157 if_initname(ifp, ifc->ifc_name, unit);
158 ifp->if_mtu = LOMTU;

--- 9 unchanged lines hidden (view full) ---

168 V_loif = ifp;
169
170 return (0);
171}
172
173static int
174vnet_loif_iattach(const void *unused __unused)
175{
151 struct ifnet *ifp;
152
153 ifp = if_alloc(IFT_LOOP);
154 if (ifp == NULL)
155 return (ENOSPC);
156
157 if_initname(ifp, ifc->ifc_name, unit);
158 ifp->if_mtu = LOMTU;

--- 9 unchanged lines hidden (view full) ---

168 V_loif = ifp;
169
170 return (0);
171}
172
173static int
174vnet_loif_iattach(const void *unused __unused)
175{
176 INIT_VNET_NET(curvnet);
177
176
178 V_loif = NULL;
179
180#ifdef VIMAGE
181 V_lo_cloner = malloc(sizeof(*V_lo_cloner), M_LO_CLONER,
182 M_WAITOK | M_ZERO);
183 V_lo_cloner_data = malloc(sizeof(*V_lo_cloner_data), M_LO_CLONER,
184 M_WAITOK | M_ZERO);
185 bcopy(&lo_cloner, V_lo_cloner, sizeof(*V_lo_cloner));
186 bcopy(lo_cloner.ifc_data, V_lo_cloner_data, sizeof(*V_lo_cloner_data));
187 V_lo_cloner->ifc_data = V_lo_cloner_data;
188 if_clone_attach(V_lo_cloner);
189#else
190 if_clone_attach(&lo_cloner);
191#endif
192 return (0);
193}
194
195#ifdef VIMAGE
196static int
197vnet_loif_idetach(const void *unused __unused)
198{
177#ifdef VIMAGE
178 V_lo_cloner = malloc(sizeof(*V_lo_cloner), M_LO_CLONER,
179 M_WAITOK | M_ZERO);
180 V_lo_cloner_data = malloc(sizeof(*V_lo_cloner_data), M_LO_CLONER,
181 M_WAITOK | M_ZERO);
182 bcopy(&lo_cloner, V_lo_cloner, sizeof(*V_lo_cloner));
183 bcopy(lo_cloner.ifc_data, V_lo_cloner_data, sizeof(*V_lo_cloner_data));
184 V_lo_cloner->ifc_data = V_lo_cloner_data;
185 if_clone_attach(V_lo_cloner);
186#else
187 if_clone_attach(&lo_cloner);
188#endif
189 return (0);
190}
191
192#ifdef VIMAGE
193static int
194vnet_loif_idetach(const void *unused __unused)
195{
199 INIT_VNET_NET(curvnet);
200
201 if_clone_detach(V_lo_cloner);
202 free(V_lo_cloner, M_LO_CLONER);
203 free(V_lo_cloner_data, M_LO_CLONER);
204 V_loif = NULL;
205
206 return (0);
207}
208#endif
209
210static int
211loop_modevent(module_t mod, int type, void *data)
212{
213
214 switch (type) {
215 case MOD_LOAD:
196
197 if_clone_detach(V_lo_cloner);
198 free(V_lo_cloner, M_LO_CLONER);
199 free(V_lo_cloner_data, M_LO_CLONER);
200 V_loif = NULL;
201
202 return (0);
203}
204#endif
205
206static int
207loop_modevent(module_t mod, int type, void *data)
208{
209
210 switch (type) {
211 case MOD_LOAD:
216#ifndef VIMAGE_GLOBALS
212#ifdef VIMAGE
217 vnet_mod_register(&vnet_loif_modinfo);
218#else
219 vnet_loif_iattach(NULL);
220#endif
221 break;
222
223 case MOD_UNLOAD:
224 printf("loop module unload - not possible for this module type\n");

--- 79 unchanged lines hidden (view full) ---

304 * hear their own broadcasts, we create a copy of the packet that we
305 * would normally receive via a hardware loopback.
306 *
307 * This function expects the packet to include the media header of length hlen.
308 */
309int
310if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
311{
213 vnet_mod_register(&vnet_loif_modinfo);
214#else
215 vnet_loif_iattach(NULL);
216#endif
217 break;
218
219 case MOD_UNLOAD:
220 printf("loop module unload - not possible for this module type\n");

--- 79 unchanged lines hidden (view full) ---

300 * hear their own broadcasts, we create a copy of the packet that we
301 * would normally receive via a hardware loopback.
302 *
303 * This function expects the packet to include the media header of length hlen.
304 */
305int
306if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
307{
312 INIT_VNET_NET(ifp->if_vnet);
313 int isr;
314
315 M_ASSERTPKTHDR(m);
316 m_tag_delete_nonpersistent(m);
317 m->m_pkthdr.rcvif = ifp;
318
319#ifdef MAC
320 mac_ifnet_create_mbuf(ifp, m);

--- 161 unchanged lines hidden ---
308 int isr;
309
310 M_ASSERTPKTHDR(m);
311 m_tag_delete_nonpersistent(m);
312 m->m_pkthdr.rcvif = ifp;
313
314#ifdef MAC
315 mac_ifnet_create_mbuf(ifp, m);

--- 161 unchanged lines hidden ---