netlink: fix potential deadlock in netlink_set_err()
[platform/kernel/linux-starfive.git] / net / netlabel / netlabel_unlabeled.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * NetLabel Unlabeled Support
4  *
5  * This file defines functions for dealing with unlabeled packets for the
6  * NetLabel system.  The NetLabel system manages static and dynamic label
7  * mappings for network protocols such as CIPSO and RIPSO.
8  *
9  * Author: Paul Moore <paul@paul-moore.com>
10  */
11
12 /*
13  * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
14  */
15
16 #ifndef _NETLABEL_UNLABELED_H
17 #define _NETLABEL_UNLABELED_H
18
19 #include <net/netlabel.h>
20
21 /*
22  * The following NetLabel payloads are supported by the Unlabeled subsystem.
23  *
24  * o STATICADD
25  *   This message is sent from an application to add a new static label for
26  *   incoming unlabeled connections.
27  *
28  *   Required attributes:
29  *
30  *     NLBL_UNLABEL_A_IFACE
31  *     NLBL_UNLABEL_A_SECCTX
32  *
33  *   If IPv4 is specified the following attributes are required:
34  *
35  *     NLBL_UNLABEL_A_IPV4ADDR
36  *     NLBL_UNLABEL_A_IPV4MASK
37  *
38  *   If IPv6 is specified the following attributes are required:
39  *
40  *     NLBL_UNLABEL_A_IPV6ADDR
41  *     NLBL_UNLABEL_A_IPV6MASK
42  *
43  * o STATICREMOVE
44  *   This message is sent from an application to remove an existing static
45  *   label for incoming unlabeled connections.
46  *
47  *   Required attributes:
48  *
49  *     NLBL_UNLABEL_A_IFACE
50  *
51  *   If IPv4 is specified the following attributes are required:
52  *
53  *     NLBL_UNLABEL_A_IPV4ADDR
54  *     NLBL_UNLABEL_A_IPV4MASK
55  *
56  *   If IPv6 is specified the following attributes are required:
57  *
58  *     NLBL_UNLABEL_A_IPV6ADDR
59  *     NLBL_UNLABEL_A_IPV6MASK
60  *
61  * o STATICLIST
62  *   This message can be sent either from an application or by the kernel in
63  *   response to an application generated STATICLIST message.  When sent by an
64  *   application there is no payload and the NLM_F_DUMP flag should be set.
65  *   The kernel should response with a series of the following messages.
66  *
67  *   Required attributes:
68  *
69  *     NLBL_UNLABEL_A_IFACE
70  *     NLBL_UNLABEL_A_SECCTX
71  *
72  *   If IPv4 is specified the following attributes are required:
73  *
74  *     NLBL_UNLABEL_A_IPV4ADDR
75  *     NLBL_UNLABEL_A_IPV4MASK
76  *
77  *   If IPv6 is specified the following attributes are required:
78  *
79  *     NLBL_UNLABEL_A_IPV6ADDR
80  *     NLBL_UNLABEL_A_IPV6MASK
81  *
82  * o STATICADDDEF
83  *   This message is sent from an application to set the default static
84  *   label for incoming unlabeled connections.
85  *
86  *   Required attribute:
87  *
88  *     NLBL_UNLABEL_A_SECCTX
89  *
90  *   If IPv4 is specified the following attributes are required:
91  *
92  *     NLBL_UNLABEL_A_IPV4ADDR
93  *     NLBL_UNLABEL_A_IPV4MASK
94  *
95  *   If IPv6 is specified the following attributes are required:
96  *
97  *     NLBL_UNLABEL_A_IPV6ADDR
98  *     NLBL_UNLABEL_A_IPV6MASK
99  *
100  * o STATICREMOVEDEF
101  *   This message is sent from an application to remove the existing default
102  *   static label for incoming unlabeled connections.
103  *
104  *   If IPv4 is specified the following attributes are required:
105  *
106  *     NLBL_UNLABEL_A_IPV4ADDR
107  *     NLBL_UNLABEL_A_IPV4MASK
108  *
109  *   If IPv6 is specified the following attributes are required:
110  *
111  *     NLBL_UNLABEL_A_IPV6ADDR
112  *     NLBL_UNLABEL_A_IPV6MASK
113  *
114  * o STATICLISTDEF
115  *   This message can be sent either from an application or by the kernel in
116  *   response to an application generated STATICLISTDEF message.  When sent by
117  *   an application there is no payload and the NLM_F_DUMP flag should be set.
118  *   The kernel should response with the following message.
119  *
120  *   Required attribute:
121  *
122  *     NLBL_UNLABEL_A_SECCTX
123  *
124  *   If IPv4 is specified the following attributes are required:
125  *
126  *     NLBL_UNLABEL_A_IPV4ADDR
127  *     NLBL_UNLABEL_A_IPV4MASK
128  *
129  *   If IPv6 is specified the following attributes are required:
130  *
131  *     NLBL_UNLABEL_A_IPV6ADDR
132  *     NLBL_UNLABEL_A_IPV6MASK
133  *
134  * o ACCEPT
135  *   This message is sent from an application to specify if the kernel should
136  *   allow unlabled packets to pass if they do not match any of the static
137  *   mappings defined in the unlabeled module.
138  *
139  *   Required attributes:
140  *
141  *     NLBL_UNLABEL_A_ACPTFLG
142  *
143  * o LIST
144  *   This message can be sent either from an application or by the kernel in
145  *   response to an application generated LIST message.  When sent by an
146  *   application there is no payload.  The kernel should respond to a LIST
147  *   message with a LIST message on success.
148  *
149  *   Required attributes:
150  *
151  *     NLBL_UNLABEL_A_ACPTFLG
152  *
153  */
154
155 /* NetLabel Unlabeled commands */
156 enum {
157         NLBL_UNLABEL_C_UNSPEC,
158         NLBL_UNLABEL_C_ACCEPT,
159         NLBL_UNLABEL_C_LIST,
160         NLBL_UNLABEL_C_STATICADD,
161         NLBL_UNLABEL_C_STATICREMOVE,
162         NLBL_UNLABEL_C_STATICLIST,
163         NLBL_UNLABEL_C_STATICADDDEF,
164         NLBL_UNLABEL_C_STATICREMOVEDEF,
165         NLBL_UNLABEL_C_STATICLISTDEF,
166         __NLBL_UNLABEL_C_MAX,
167 };
168
169 /* NetLabel Unlabeled attributes */
170 enum {
171         NLBL_UNLABEL_A_UNSPEC,
172         NLBL_UNLABEL_A_ACPTFLG,
173         /* (NLA_U8)
174          * if true then unlabeled packets are allowed to pass, else unlabeled
175          * packets are rejected */
176         NLBL_UNLABEL_A_IPV6ADDR,
177         /* (NLA_BINARY, struct in6_addr)
178          * an IPv6 address */
179         NLBL_UNLABEL_A_IPV6MASK,
180         /* (NLA_BINARY, struct in6_addr)
181          * an IPv6 address mask */
182         NLBL_UNLABEL_A_IPV4ADDR,
183         /* (NLA_BINARY, struct in_addr)
184          * an IPv4 address */
185         NLBL_UNLABEL_A_IPV4MASK,
186         /* (NLA_BINARY, struct in_addr)
187          * and IPv4 address mask */
188         NLBL_UNLABEL_A_IFACE,
189         /* (NLA_NULL_STRING)
190          * network interface */
191         NLBL_UNLABEL_A_SECCTX,
192         /* (NLA_BINARY)
193          * a LSM specific security context */
194         __NLBL_UNLABEL_A_MAX,
195 };
196 #define NLBL_UNLABEL_A_MAX (__NLBL_UNLABEL_A_MAX - 1)
197
198 /* NetLabel protocol functions */
199 int netlbl_unlabel_genl_init(void);
200
201 /* Unlabeled connection hash table size */
202 /* XXX - currently this number is an uneducated guess */
203 #define NETLBL_UNLHSH_BITSIZE       7
204
205 /* General Unlabeled init function */
206 int netlbl_unlabel_init(u32 size);
207
208 /* Static/Fallback label management functions */
209 int netlbl_unlhsh_add(struct net *net,
210                       const char *dev_name,
211                       const void *addr,
212                       const void *mask,
213                       u32 addr_len,
214                       u32 secid,
215                       struct netlbl_audit *audit_info);
216 int netlbl_unlhsh_remove(struct net *net,
217                          const char *dev_name,
218                          const void *addr,
219                          const void *mask,
220                          u32 addr_len,
221                          struct netlbl_audit *audit_info);
222
223 /* Process Unlabeled incoming network packets */
224 int netlbl_unlabel_getattr(const struct sk_buff *skb,
225                            u16 family,
226                            struct netlbl_lsm_secattr *secattr);
227
228 /* Set the default configuration to allow Unlabeled packets */
229 int netlbl_unlabel_defconf(void);
230
231 #endif