xref: /freebsd/sys/net/if_dead.c (revision 20abea6663c46423800256b0d29efea32d36a10f)
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