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 4547e8d432SGleb 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 96fd22444cSJohn Baldwin static uint64_t 97fd22444cSJohn Baldwin ifdead_get_counter(struct ifnet *ifp, ift_counter cnt) 98fd22444cSJohn Baldwin { 99fd22444cSJohn Baldwin 100fd22444cSJohn Baldwin return (0); 101fd22444cSJohn Baldwin } 102fd22444cSJohn Baldwin 103*f3e7afe2SHans Petter Selasky static int 104*f3e7afe2SHans Petter Selasky ifdead_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, 105*f3e7afe2SHans Petter Selasky struct m_snd_tag **ppmt) 106*f3e7afe2SHans Petter Selasky { 107*f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 108*f3e7afe2SHans Petter Selasky } 109*f3e7afe2SHans Petter Selasky 110*f3e7afe2SHans Petter Selasky static int 111*f3e7afe2SHans Petter Selasky ifdead_snd_tag_modify(struct m_snd_tag *pmt, union if_snd_tag_modify_params *params) 112*f3e7afe2SHans Petter Selasky { 113*f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 114*f3e7afe2SHans Petter Selasky } 115*f3e7afe2SHans Petter Selasky 116*f3e7afe2SHans Petter Selasky static int 117*f3e7afe2SHans Petter Selasky ifdead_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) 118*f3e7afe2SHans Petter Selasky { 119*f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 120*f3e7afe2SHans Petter Selasky } 121*f3e7afe2SHans Petter Selasky 122*f3e7afe2SHans Petter Selasky static void 123*f3e7afe2SHans Petter Selasky ifdead_snd_tag_free(struct m_snd_tag *pmt) 124*f3e7afe2SHans Petter Selasky { 125*f3e7afe2SHans Petter Selasky } 126*f3e7afe2SHans Petter Selasky 127111c6b61SRobert Watson void 128111c6b61SRobert Watson if_dead(struct ifnet *ifp) 129111c6b61SRobert Watson { 130111c6b61SRobert Watson 131111c6b61SRobert Watson ifp->if_output = ifdead_output; 132111c6b61SRobert Watson ifp->if_input = ifdead_input; 133111c6b61SRobert Watson ifp->if_start = ifdead_start; 134111c6b61SRobert Watson ifp->if_ioctl = ifdead_ioctl; 135111c6b61SRobert Watson ifp->if_resolvemulti = ifdead_resolvemulti; 136111c6b61SRobert Watson ifp->if_qflush = ifdead_qflush; 137111c6b61SRobert Watson ifp->if_transmit = ifdead_transmit; 138fd22444cSJohn Baldwin ifp->if_get_counter = ifdead_get_counter; 139*f3e7afe2SHans Petter Selasky ifp->if_snd_tag_alloc = ifdead_snd_tag_alloc; 140*f3e7afe2SHans Petter Selasky ifp->if_snd_tag_modify = ifdead_snd_tag_modify; 141*f3e7afe2SHans Petter Selasky ifp->if_snd_tag_query = ifdead_snd_tag_query; 142*f3e7afe2SHans Petter Selasky ifp->if_snd_tag_free = ifdead_snd_tag_free; 143111c6b61SRobert Watson } 144