1111c6b61SRobert Watson /*- 2111c6b61SRobert Watson * Copyright (c) 2009 Robert N. M. Watson 3111c6b61SRobert Watson * All rights reserved. 4111c6b61SRobert Watson * 5111c6b61SRobert Watson * Redistribution and use in source and binary forms, with or without 6111c6b61SRobert Watson * modification, are permitted provided that the following conditions 7111c6b61SRobert Watson * are met: 8111c6b61SRobert Watson * 1. Redistributions of source code must retain the above copyright 9111c6b61SRobert Watson * notice, this list of conditions and the following disclaimer. 10111c6b61SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 11111c6b61SRobert Watson * notice, this list of conditions and the following disclaimer in the 12111c6b61SRobert Watson * documentation and/or other materials provided with the distribution. 13111c6b61SRobert Watson * 14111c6b61SRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15111c6b61SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16111c6b61SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17111c6b61SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18111c6b61SRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19111c6b61SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20111c6b61SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21111c6b61SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22111c6b61SRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23111c6b61SRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24111c6b61SRobert Watson * SUCH DAMAGE. 25111c6b61SRobert Watson */ 26111c6b61SRobert Watson 27111c6b61SRobert Watson /* 28111c6b61SRobert Watson * When an interface has been detached but not yet freed, we set the various 29111c6b61SRobert Watson * ifnet function pointers to "ifdead" versions. This prevents unexpected 30111c6b61SRobert Watson * calls from the network stack into the device driver after if_detach() has 31111c6b61SRobert Watson * returned. 32111c6b61SRobert Watson */ 33111c6b61SRobert Watson 34111c6b61SRobert Watson #include <sys/cdefs.h> 35111c6b61SRobert Watson __FBSDID("$FreeBSD$"); 36111c6b61SRobert Watson 37111c6b61SRobert Watson #include <sys/param.h> 38111c6b61SRobert Watson #include <sys/mbuf.h> 39111c6b61SRobert Watson #include <sys/socket.h> 40111c6b61SRobert Watson 41111c6b61SRobert Watson #include <net/if.h> 42111c6b61SRobert Watson #include <net/if_var.h> 43111c6b61SRobert Watson 44111c6b61SRobert Watson static int 45*47e8d432SGleb Smirnoff ifdead_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *sa, 46111c6b61SRobert Watson struct route *ro) 47111c6b61SRobert Watson { 48111c6b61SRobert Watson 49111c6b61SRobert Watson m_freem(m); 50111c6b61SRobert Watson return (ENXIO); 51111c6b61SRobert Watson } 52111c6b61SRobert Watson 53111c6b61SRobert Watson static void 54111c6b61SRobert Watson ifdead_input(struct ifnet *ifp, struct mbuf *m) 55111c6b61SRobert Watson { 56111c6b61SRobert Watson 57111c6b61SRobert Watson m_freem(m); 58111c6b61SRobert Watson } 59111c6b61SRobert Watson 60111c6b61SRobert Watson static void 61111c6b61SRobert Watson ifdead_start(struct ifnet *ifp) 62111c6b61SRobert Watson { 63111c6b61SRobert Watson 64111c6b61SRobert Watson } 65111c6b61SRobert Watson 66111c6b61SRobert Watson static int 67111c6b61SRobert Watson ifdead_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 68111c6b61SRobert Watson { 69111c6b61SRobert Watson 70111c6b61SRobert Watson return (ENXIO); 71111c6b61SRobert Watson } 72111c6b61SRobert Watson 73111c6b61SRobert Watson static int 74111c6b61SRobert Watson ifdead_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, 75111c6b61SRobert Watson struct sockaddr *sa) 76111c6b61SRobert Watson { 77111c6b61SRobert Watson 78111c6b61SRobert Watson *llsa = NULL; 79111c6b61SRobert Watson return (ENXIO); 80111c6b61SRobert Watson } 81111c6b61SRobert Watson 82111c6b61SRobert Watson static void 83111c6b61SRobert Watson ifdead_qflush(struct ifnet *ifp) 84111c6b61SRobert Watson { 85111c6b61SRobert Watson 86111c6b61SRobert Watson } 87111c6b61SRobert Watson 88111c6b61SRobert Watson static int 89111c6b61SRobert Watson ifdead_transmit(struct ifnet *ifp, struct mbuf *m) 90111c6b61SRobert Watson { 91111c6b61SRobert Watson 92111c6b61SRobert Watson m_freem(m); 93111c6b61SRobert Watson return (ENXIO); 94111c6b61SRobert Watson } 95111c6b61SRobert Watson 96111c6b61SRobert Watson void 97111c6b61SRobert Watson if_dead(struct ifnet *ifp) 98111c6b61SRobert Watson { 99111c6b61SRobert Watson 100111c6b61SRobert Watson ifp->if_output = ifdead_output; 101111c6b61SRobert Watson ifp->if_input = ifdead_input; 102111c6b61SRobert Watson ifp->if_start = ifdead_start; 103111c6b61SRobert Watson ifp->if_ioctl = ifdead_ioctl; 104111c6b61SRobert Watson ifp->if_resolvemulti = ifdead_resolvemulti; 105111c6b61SRobert Watson ifp->if_qflush = ifdead_qflush; 106111c6b61SRobert Watson ifp->if_transmit = ifdead_transmit; 107111c6b61SRobert Watson } 108