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 --- |