1111c6b61SRobert Watson /*- 2fe267a55SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3fe267a55SPedro F. Giffuni * 4111c6b61SRobert Watson * Copyright (c) 2009 Robert N. M. Watson 5111c6b61SRobert Watson * All rights reserved. 6111c6b61SRobert Watson * 7111c6b61SRobert Watson * Redistribution and use in source and binary forms, with or without 8111c6b61SRobert Watson * modification, are permitted provided that the following conditions 9111c6b61SRobert Watson * are met: 10111c6b61SRobert Watson * 1. Redistributions of source code must retain the above copyright 11111c6b61SRobert Watson * notice, this list of conditions and the following disclaimer. 12111c6b61SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 13111c6b61SRobert Watson * notice, this list of conditions and the following disclaimer in the 14111c6b61SRobert Watson * documentation and/or other materials provided with the distribution. 15111c6b61SRobert Watson * 16111c6b61SRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17111c6b61SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18111c6b61SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19111c6b61SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20111c6b61SRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21111c6b61SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22111c6b61SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23111c6b61SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24111c6b61SRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25111c6b61SRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26111c6b61SRobert Watson * SUCH DAMAGE. 27111c6b61SRobert Watson */ 28111c6b61SRobert Watson 29111c6b61SRobert Watson /* 30111c6b61SRobert Watson * When an interface has been detached but not yet freed, we set the various 31111c6b61SRobert Watson * ifnet function pointers to "ifdead" versions. This prevents unexpected 32111c6b61SRobert Watson * calls from the network stack into the device driver after if_detach() has 33111c6b61SRobert Watson * returned. 34111c6b61SRobert Watson */ 35111c6b61SRobert Watson 36111c6b61SRobert Watson #include <sys/cdefs.h> 37111c6b61SRobert Watson __FBSDID("$FreeBSD$"); 38111c6b61SRobert Watson 39111c6b61SRobert Watson #include <sys/param.h> 40111c6b61SRobert Watson #include <sys/mbuf.h> 41111c6b61SRobert Watson #include <sys/socket.h> 42111c6b61SRobert Watson 43111c6b61SRobert Watson #include <net/if.h> 44111c6b61SRobert Watson #include <net/if_var.h> 45111c6b61SRobert Watson 46111c6b61SRobert Watson static int 4747e8d432SGleb Smirnoff ifdead_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *sa, 48111c6b61SRobert Watson struct route *ro) 49111c6b61SRobert Watson { 50111c6b61SRobert Watson 51111c6b61SRobert Watson m_freem(m); 52111c6b61SRobert Watson return (ENXIO); 53111c6b61SRobert Watson } 54111c6b61SRobert Watson 55111c6b61SRobert Watson static void 56111c6b61SRobert Watson ifdead_input(struct ifnet *ifp, struct mbuf *m) 57111c6b61SRobert Watson { 58111c6b61SRobert Watson 59111c6b61SRobert Watson m_freem(m); 60111c6b61SRobert Watson } 61111c6b61SRobert Watson 62111c6b61SRobert Watson static void 63111c6b61SRobert Watson ifdead_start(struct ifnet *ifp) 64111c6b61SRobert Watson { 65111c6b61SRobert Watson 66111c6b61SRobert Watson } 67111c6b61SRobert Watson 68111c6b61SRobert Watson static int 69111c6b61SRobert Watson ifdead_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 70111c6b61SRobert Watson { 71111c6b61SRobert Watson 72111c6b61SRobert Watson return (ENXIO); 73111c6b61SRobert Watson } 74111c6b61SRobert Watson 75111c6b61SRobert Watson static int 76111c6b61SRobert Watson ifdead_resolvemulti(struct ifnet *ifp, struct sockaddr **llsa, 77111c6b61SRobert Watson struct sockaddr *sa) 78111c6b61SRobert Watson { 79111c6b61SRobert Watson 80111c6b61SRobert Watson *llsa = NULL; 81111c6b61SRobert Watson return (ENXIO); 82111c6b61SRobert Watson } 83111c6b61SRobert Watson 84111c6b61SRobert Watson static void 85111c6b61SRobert Watson ifdead_qflush(struct ifnet *ifp) 86111c6b61SRobert Watson { 87111c6b61SRobert Watson 88111c6b61SRobert Watson } 89111c6b61SRobert Watson 90111c6b61SRobert Watson static int 91111c6b61SRobert Watson ifdead_transmit(struct ifnet *ifp, struct mbuf *m) 92111c6b61SRobert Watson { 93111c6b61SRobert Watson 94111c6b61SRobert Watson m_freem(m); 95111c6b61SRobert Watson return (ENXIO); 96111c6b61SRobert Watson } 97111c6b61SRobert Watson 98fd22444cSJohn Baldwin static uint64_t 99fd22444cSJohn Baldwin ifdead_get_counter(struct ifnet *ifp, ift_counter cnt) 100fd22444cSJohn Baldwin { 101fd22444cSJohn Baldwin 102fd22444cSJohn Baldwin return (0); 103fd22444cSJohn Baldwin } 104fd22444cSJohn Baldwin 105f3e7afe2SHans Petter Selasky static int 106f3e7afe2SHans Petter Selasky ifdead_snd_tag_alloc(struct ifnet *ifp, union if_snd_tag_alloc_params *params, 107f3e7afe2SHans Petter Selasky struct m_snd_tag **ppmt) 108f3e7afe2SHans Petter Selasky { 109f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 110f3e7afe2SHans Petter Selasky } 111f3e7afe2SHans Petter Selasky 112f3e7afe2SHans Petter Selasky static int 113f3e7afe2SHans Petter Selasky ifdead_snd_tag_modify(struct m_snd_tag *pmt, union if_snd_tag_modify_params *params) 114f3e7afe2SHans Petter Selasky { 115f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 116f3e7afe2SHans Petter Selasky } 117f3e7afe2SHans Petter Selasky 118f3e7afe2SHans Petter Selasky static int 119f3e7afe2SHans Petter Selasky ifdead_snd_tag_query(struct m_snd_tag *pmt, union if_snd_tag_query_params *params) 120f3e7afe2SHans Petter Selasky { 121f3e7afe2SHans Petter Selasky return (EOPNOTSUPP); 122f3e7afe2SHans Petter Selasky } 123f3e7afe2SHans Petter Selasky 124f3e7afe2SHans Petter Selasky static void 125f3e7afe2SHans Petter Selasky ifdead_snd_tag_free(struct m_snd_tag *pmt) 126f3e7afe2SHans Petter Selasky { 127f3e7afe2SHans Petter Selasky } 128f3e7afe2SHans Petter Selasky 129*20abea66SRandall Stewart static void 130*20abea66SRandall Stewart ifdead_ratelimit_query(struct ifnet *ifp __unused, 131*20abea66SRandall Stewart struct if_ratelimit_query_results *q) 132*20abea66SRandall Stewart { 133*20abea66SRandall Stewart /* 134*20abea66SRandall Stewart * This guy does not support 135*20abea66SRandall Stewart * this interface. Not sure 136*20abea66SRandall Stewart * why we would specify a 137*20abea66SRandall Stewart * flag on the interface 138*20abea66SRandall Stewart * that says we do. 139*20abea66SRandall Stewart */ 140*20abea66SRandall Stewart q->rate_table = NULL; 141*20abea66SRandall Stewart q->flags = RT_NOSUPPORT; 142*20abea66SRandall Stewart q->max_flows = 0; 143*20abea66SRandall Stewart q->number_of_rates = 0; 144*20abea66SRandall Stewart } 145*20abea66SRandall Stewart 146111c6b61SRobert Watson void 147111c6b61SRobert Watson if_dead(struct ifnet *ifp) 148111c6b61SRobert Watson { 149111c6b61SRobert Watson 150111c6b61SRobert Watson ifp->if_output = ifdead_output; 151111c6b61SRobert Watson ifp->if_input = ifdead_input; 152111c6b61SRobert Watson ifp->if_start = ifdead_start; 153111c6b61SRobert Watson ifp->if_ioctl = ifdead_ioctl; 154111c6b61SRobert Watson ifp->if_resolvemulti = ifdead_resolvemulti; 155111c6b61SRobert Watson ifp->if_qflush = ifdead_qflush; 156111c6b61SRobert Watson ifp->if_transmit = ifdead_transmit; 157fd22444cSJohn Baldwin ifp->if_get_counter = ifdead_get_counter; 158f3e7afe2SHans Petter Selasky ifp->if_snd_tag_alloc = ifdead_snd_tag_alloc; 159f3e7afe2SHans Petter Selasky ifp->if_snd_tag_modify = ifdead_snd_tag_modify; 160f3e7afe2SHans Petter Selasky ifp->if_snd_tag_query = ifdead_snd_tag_query; 161f3e7afe2SHans Petter Selasky ifp->if_snd_tag_free = ifdead_snd_tag_free; 162*20abea66SRandall Stewart ifp->if_ratelimit_query = ifdead_ratelimit_query; 163111c6b61SRobert Watson } 164