xref: /f-stack/freebsd/net/raw_cb.c (revision 22ce4aff)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1980, 1986, 1993
5  *	The Regents of the University of California.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *	@(#)raw_cb.c	8.1 (Berkeley) 6/10/93
33  * $FreeBSD$
34  */
35 
36 #include <sys/param.h>
37 #include <sys/domain.h>
38 #include <sys/lock.h>
39 #include <sys/kernel.h>
40 #include <sys/malloc.h>
41 #include <sys/mutex.h>
42 #include <sys/protosw.h>
43 #include <sys/socket.h>
44 #include <sys/socketvar.h>
45 #include <sys/sysctl.h>
46 #include <sys/systm.h>
47 
48 #include <net/if.h>
49 #include <net/vnet.h>
50 #include <net/raw_cb.h>
51 
52 /*
53  * Routines to manage the raw protocol control blocks.
54  *
55  * TODO:
56  *	hash lookups by protocol family/protocol + address family
57  *	take care of unique address problems per AF?
58  *	redo address binding to allow wildcards
59  */
60 
61 struct mtx rawcb_mtx;
62 VNET_DEFINE(struct rawcb_list_head, rawcb_list);
63 
64 static SYSCTL_NODE(_net, OID_AUTO, raw, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
65     "Raw socket infrastructure");
66 
67 static u_long	raw_sendspace = RAWSNDQ;
68 SYSCTL_ULONG(_net_raw, OID_AUTO, sendspace, CTLFLAG_RW, &raw_sendspace, 0,
69     "Default raw socket send space");
70 
71 static u_long	raw_recvspace = RAWRCVQ;
72 SYSCTL_ULONG(_net_raw, OID_AUTO, recvspace, CTLFLAG_RW, &raw_recvspace, 0,
73     "Default raw socket receive space");
74 
75 /*
76  * Allocate a control block and a nominal amount of buffer space for the
77  * socket.
78  */
79 int
raw_attach(struct socket * so,int proto)80 raw_attach(struct socket *so, int proto)
81 {
82 	struct rawcb *rp = sotorawcb(so);
83 	int error;
84 
85 	/*
86 	 * It is assumed that raw_attach is called after space has been
87 	 * allocated for the rawcb; consumer protocols may simply allocate
88 	 * type struct rawcb, or a wrapper data structure that begins with a
89 	 * struct rawcb.
90 	 */
91 	KASSERT(rp != NULL, ("raw_attach: rp == NULL"));
92 
93 	error = soreserve(so, raw_sendspace, raw_recvspace);
94 	if (error)
95 		return (error);
96 	rp->rcb_socket = so;
97 	rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
98 	rp->rcb_proto.sp_protocol = proto;
99 	mtx_lock(&rawcb_mtx);
100 	LIST_INSERT_HEAD(&V_rawcb_list, rp, list);
101 	mtx_unlock(&rawcb_mtx);
102 	return (0);
103 }
104 
105 /*
106  * Detach the raw connection block and discard socket resources.
107  */
108 void
raw_detach(struct rawcb * rp)109 raw_detach(struct rawcb *rp)
110 {
111 	struct socket *so = rp->rcb_socket;
112 
113 	KASSERT(so->so_pcb == rp, ("raw_detach: so_pcb != rp"));
114 
115 	so->so_pcb = NULL;
116 	mtx_lock(&rawcb_mtx);
117 	LIST_REMOVE(rp, list);
118 	mtx_unlock(&rawcb_mtx);
119 	free((caddr_t)(rp), M_PCB);
120 }
121