]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/raw_cb.c
sysctl(9): Fix a few mandoc related issues
[FreeBSD/FreeBSD.git] / sys / net / raw_cb.c
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
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
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 }