Blame view

net/netlabel/netlabel_cipso_v4.c 21 KB
1ccea77e2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
2
3
4
5
6
7
8
  /*
   * NetLabel CIPSO/IPv4 Support
   *
   * This file defines the CIPSO/IPv4 functions for the NetLabel system.  The
   * NetLabel system manages static and dynamic label mappings for network
   * protocols such as CIPSO and RIPSO.
   *
82c21bfab   Paul Moore   doc: Update the e...
9
   * Author: Paul Moore <paul@paul-moore.com>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
10
11
12
13
   */
  
  /*
   * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
14
15
16
17
18
19
   */
  
  #include <linux/types.h>
  #include <linux/socket.h>
  #include <linux/string.h>
  #include <linux/skbuff.h>
32f50cdee   Paul Moore   [NetLabel]: add a...
20
  #include <linux/audit.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
21
  #include <linux/slab.h>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
22
23
24
25
26
  #include <net/sock.h>
  #include <net/netlink.h>
  #include <net/genetlink.h>
  #include <net/netlabel.h>
  #include <net/cipso_ipv4.h>
60063497a   Arun Sharma   atomic: use <linu...
27
  #include <linux/atomic.h>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
28
29
30
  
  #include "netlabel_user.h"
  #include "netlabel_cipso_v4.h"
23bcdc1ad   Paul Moore   SELinux: enable d...
31
  #include "netlabel_mgmt.h"
b1edeb102   Paul Moore   netlabel: Replace...
32
  #include "netlabel_domainhash.h"
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
33

fd3858554   Paul Moore   [NetLabel]: rewor...
34
35
36
37
38
39
  /* Argument struct for cipso_v4_doi_walk() */
  struct netlbl_cipsov4_doiwalk_arg {
  	struct netlink_callback *nl_cb;
  	struct sk_buff *skb;
  	u32 seq;
  };
b1edeb102   Paul Moore   netlabel: Replace...
40
41
42
43
44
  /* Argument struct for netlbl_domhsh_walk() */
  struct netlbl_domhsh_walk_arg {
  	struct netlbl_audit *audit_info;
  	u32 doi;
  };
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
45
  /* NetLabel Generic NETLINK CIPSOv4 family */
489111e5c   Johannes Berg   genetlink: static...
46
  static struct genl_family netlbl_cipsov4_gnl_family;
fd3858554   Paul Moore   [NetLabel]: rewor...
47
  /* NetLabel Netlink attribute policy */
ef7c79ed6   Patrick McHardy   [NETLINK]: Mark n...
48
  static const struct nla_policy netlbl_cipsov4_genl_policy[NLBL_CIPSOV4_A_MAX + 1] = {
fd3858554   Paul Moore   [NetLabel]: rewor...
49
50
51
52
53
54
55
56
57
58
59
60
61
  	[NLBL_CIPSOV4_A_DOI] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_MTYPE] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_TAG] = { .type = NLA_U8 },
  	[NLBL_CIPSOV4_A_TAGLST] = { .type = NLA_NESTED },
  	[NLBL_CIPSOV4_A_MLSLVLLOC] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_MLSLVLREM] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_MLSLVL] = { .type = NLA_NESTED },
  	[NLBL_CIPSOV4_A_MLSLVLLST] = { .type = NLA_NESTED },
  	[NLBL_CIPSOV4_A_MLSCATLOC] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_MLSCATREM] = { .type = NLA_U32 },
  	[NLBL_CIPSOV4_A_MLSCAT] = { .type = NLA_NESTED },
  	[NLBL_CIPSOV4_A_MLSCATLST] = { .type = NLA_NESTED },
  };
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
62
63
64
65
66
67
  
  /*
   * Helper Functions
   */
  
  /**
fd3858554   Paul Moore   [NetLabel]: rewor...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
   * netlbl_cipsov4_add_common - Parse the common sections of a ADD message
   * @info: the Generic NETLINK info block
   * @doi_def: the CIPSO V4 DOI definition
   *
   * Description:
   * Parse the common sections of a ADD message and fill in the related values
   * in @doi_def.  Returns zero on success, negative values on failure.
   *
   */
  static int netlbl_cipsov4_add_common(struct genl_info *info,
  				     struct cipso_v4_doi *doi_def)
  {
  	struct nlattr *nla;
  	int nla_rem;
  	u32 iter = 0;
  
  	doi_def->doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]);
8cb081746   Johannes Berg   netlink: make val...
85
86
87
88
  	if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_TAGLST],
  					   NLBL_CIPSOV4_A_MAX,
  					   netlbl_cipsov4_genl_policy,
  					   NULL) != 0)
fd3858554   Paul Moore   [NetLabel]: rewor...
89
90
91
  		return -EINVAL;
  
  	nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
92
  		if (nla_type(nla) == NLBL_CIPSOV4_A_TAG) {
2a2f11c22   Paul Moore   NetLabel: correct...
93
  			if (iter >= CIPSO_V4_TAG_MAXCNT)
fd3858554   Paul Moore   [NetLabel]: rewor...
94
95
96
  				return -EINVAL;
  			doi_def->tags[iter++] = nla_get_u8(nla);
  		}
2a2f11c22   Paul Moore   NetLabel: correct...
97
98
  	while (iter < CIPSO_V4_TAG_MAXCNT)
  		doi_def->tags[iter++] = CIPSO_V4_TAG_INVALID;
fd3858554   Paul Moore   [NetLabel]: rewor...
99
100
101
  
  	return 0;
  }
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
102
103
104
105
106
107
108
  
  /*
   * NetLabel Command Handlers
   */
  
  /**
   * netlbl_cipsov4_add_std - Adds a CIPSO V4 DOI definition
fd3858554   Paul Moore   [NetLabel]: rewor...
109
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
110
   * @audit_info: NetLabel audit information
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
111
112
   *
   * Description:
15c45f7b2   Paul Moore   cipso: Add suppor...
113
114
115
   * Create a new CIPSO_V4_MAP_TRANS DOI definition based on the given ADD
   * message and add it to the CIPSO V4 engine.  Return zero on success and
   * non-zero on error.
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
116
117
   *
   */
6c2e8ac09   Paul Moore   netlabel: Update ...
118
119
  static int netlbl_cipsov4_add_std(struct genl_info *info,
  				  struct netlbl_audit *audit_info)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
120
121
  {
  	int ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
122
  	struct cipso_v4_doi *doi_def = NULL;
fd3858554   Paul Moore   [NetLabel]: rewor...
123
124
125
126
  	struct nlattr *nla_a;
  	struct nlattr *nla_b;
  	int nla_a_rem;
  	int nla_b_rem;
caff5b6a6   Paul Moore   NetLabel: correct...
127
  	u32 iter;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
128

32f50cdee   Paul Moore   [NetLabel]: add a...
129
  	if (!info->attrs[NLBL_CIPSOV4_A_TAGLST] ||
fd3858554   Paul Moore   [NetLabel]: rewor...
130
131
  	    !info->attrs[NLBL_CIPSOV4_A_MLSLVLLST])
  		return -EINVAL;
8cb081746   Johannes Berg   netlink: make val...
132
133
134
135
  	if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  					   NLBL_CIPSOV4_A_MAX,
  					   netlbl_cipsov4_genl_policy,
  					   NULL) != 0)
fd3858554   Paul Moore   [NetLabel]: rewor...
136
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
137
138
  
  	doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
139
140
  	if (doi_def == NULL)
  		return -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
141
142
143
144
145
  	doi_def->map.std = kzalloc(sizeof(*doi_def->map.std), GFP_KERNEL);
  	if (doi_def->map.std == NULL) {
  		ret_val = -ENOMEM;
  		goto add_std_failure;
  	}
15c45f7b2   Paul Moore   cipso: Add suppor...
146
  	doi_def->type = CIPSO_V4_MAP_TRANS;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
147

fd3858554   Paul Moore   [NetLabel]: rewor...
148
149
  	ret_val = netlbl_cipsov4_add_common(info, doi_def);
  	if (ret_val != 0)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
150
  		goto add_std_failure;
1fd2a25b7   Paul Moore   NetLabel: perform...
151
  	ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
152

fd3858554   Paul Moore   [NetLabel]: rewor...
153
154
155
  	nla_for_each_nested(nla_a,
  			    info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  			    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
156
  		if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) {
8cb081746   Johannes Berg   netlink: make val...
157
158
159
160
  			if (nla_validate_nested_deprecated(nla_a,
  							   NLBL_CIPSOV4_A_MAX,
  							   netlbl_cipsov4_genl_policy,
  							   NULL) != 0)
fceb6435e   Johannes Berg   netlink: pass ext...
161
  				goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
162
  			nla_for_each_nested(nla_b, nla_a, nla_b_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
163
  				switch (nla_type(nla_b)) {
fd3858554   Paul Moore   [NetLabel]: rewor...
164
  				case NLBL_CIPSOV4_A_MLSLVLLOC:
1fd2a25b7   Paul Moore   NetLabel: perform...
165
166
167
  					if (nla_get_u32(nla_b) >
  					    CIPSO_V4_MAX_LOC_LVLS)
  						goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
168
169
170
171
172
173
  					if (nla_get_u32(nla_b) >=
  					    doi_def->map.std->lvl.local_size)
  					     doi_def->map.std->lvl.local_size =
  						     nla_get_u32(nla_b) + 1;
  					break;
  				case NLBL_CIPSOV4_A_MLSLVLREM:
1fd2a25b7   Paul Moore   NetLabel: perform...
174
175
176
  					if (nla_get_u32(nla_b) >
  					    CIPSO_V4_MAX_REM_LVLS)
  						goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
177
178
179
180
181
182
183
  					if (nla_get_u32(nla_b) >=
  					    doi_def->map.std->lvl.cipso_size)
  					     doi_def->map.std->lvl.cipso_size =
  						     nla_get_u32(nla_b) + 1;
  					break;
  				}
  		}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
184
185
186
187
188
189
190
  	doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size,
  					      sizeof(u32),
  					      GFP_KERNEL);
  	if (doi_def->map.std->lvl.local == NULL) {
  		ret_val = -ENOMEM;
  		goto add_std_failure;
  	}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
191
192
193
194
195
196
197
  	doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size,
  					      sizeof(u32),
  					      GFP_KERNEL);
  	if (doi_def->map.std->lvl.cipso == NULL) {
  		ret_val = -ENOMEM;
  		goto add_std_failure;
  	}
caff5b6a6   Paul Moore   NetLabel: correct...
198
199
200
201
  	for (iter = 0; iter < doi_def->map.std->lvl.local_size; iter++)
  		doi_def->map.std->lvl.local[iter] = CIPSO_V4_INV_LVL;
  	for (iter = 0; iter < doi_def->map.std->lvl.cipso_size; iter++)
  		doi_def->map.std->lvl.cipso[iter] = CIPSO_V4_INV_LVL;
fd3858554   Paul Moore   [NetLabel]: rewor...
202
203
204
  	nla_for_each_nested(nla_a,
  			    info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  			    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
205
  		if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) {
fd3858554   Paul Moore   [NetLabel]: rewor...
206
207
  			struct nlattr *lvl_loc;
  			struct nlattr *lvl_rem;
fd3858554   Paul Moore   [NetLabel]: rewor...
208
209
210
211
212
213
214
215
216
217
218
  			lvl_loc = nla_find_nested(nla_a,
  						  NLBL_CIPSOV4_A_MLSLVLLOC);
  			lvl_rem = nla_find_nested(nla_a,
  						  NLBL_CIPSOV4_A_MLSLVLREM);
  			if (lvl_loc == NULL || lvl_rem == NULL)
  				goto add_std_failure;
  			doi_def->map.std->lvl.local[nla_get_u32(lvl_loc)] =
  				nla_get_u32(lvl_rem);
  			doi_def->map.std->lvl.cipso[nla_get_u32(lvl_rem)] =
  				nla_get_u32(lvl_loc);
  		}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
219

fd3858554   Paul Moore   [NetLabel]: rewor...
220
  	if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) {
8cb081746   Johannes Berg   netlink: make val...
221
222
223
224
  		if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  						   NLBL_CIPSOV4_A_MAX,
  						   netlbl_cipsov4_genl_policy,
  						   NULL) != 0)
fd3858554   Paul Moore   [NetLabel]: rewor...
225
226
227
228
229
  			goto add_std_failure;
  
  		nla_for_each_nested(nla_a,
  				    info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  				    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
230
  			if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) {
8cb081746   Johannes Berg   netlink: make val...
231
232
233
234
  				if (nla_validate_nested_deprecated(nla_a,
  								   NLBL_CIPSOV4_A_MAX,
  								   netlbl_cipsov4_genl_policy,
  								   NULL) != 0)
fd3858554   Paul Moore   [NetLabel]: rewor...
235
236
  					goto add_std_failure;
  				nla_for_each_nested(nla_b, nla_a, nla_b_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
237
  					switch (nla_type(nla_b)) {
fd3858554   Paul Moore   [NetLabel]: rewor...
238
  					case NLBL_CIPSOV4_A_MLSCATLOC:
1fd2a25b7   Paul Moore   NetLabel: perform...
239
240
241
  						if (nla_get_u32(nla_b) >
  						    CIPSO_V4_MAX_LOC_CATS)
  							goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
242
243
244
245
246
247
  						if (nla_get_u32(nla_b) >=
  					      doi_def->map.std->cat.local_size)
  					     doi_def->map.std->cat.local_size =
  						     nla_get_u32(nla_b) + 1;
  						break;
  					case NLBL_CIPSOV4_A_MLSCATREM:
1fd2a25b7   Paul Moore   NetLabel: perform...
248
249
250
  						if (nla_get_u32(nla_b) >
  						    CIPSO_V4_MAX_REM_CATS)
  							goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
251
252
253
254
255
256
257
  						if (nla_get_u32(nla_b) >=
  					      doi_def->map.std->cat.cipso_size)
  					     doi_def->map.std->cat.cipso_size =
  						     nla_get_u32(nla_b) + 1;
  						break;
  					}
  			}
fd3858554   Paul Moore   [NetLabel]: rewor...
258
  		doi_def->map.std->cat.local = kcalloc(
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
259
  					      doi_def->map.std->cat.local_size,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
260
261
  					      sizeof(u32),
  					      GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
262
263
264
265
266
  		if (doi_def->map.std->cat.local == NULL) {
  			ret_val = -ENOMEM;
  			goto add_std_failure;
  		}
  		doi_def->map.std->cat.cipso = kcalloc(
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
267
  					      doi_def->map.std->cat.cipso_size,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
268
269
  					      sizeof(u32),
  					      GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
270
271
  		if (doi_def->map.std->cat.cipso == NULL) {
  			ret_val = -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
272
  			goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
273
  		}
caff5b6a6   Paul Moore   NetLabel: correct...
274
275
276
277
  		for (iter = 0; iter < doi_def->map.std->cat.local_size; iter++)
  			doi_def->map.std->cat.local[iter] = CIPSO_V4_INV_CAT;
  		for (iter = 0; iter < doi_def->map.std->cat.cipso_size; iter++)
  			doi_def->map.std->cat.cipso[iter] = CIPSO_V4_INV_CAT;
fd3858554   Paul Moore   [NetLabel]: rewor...
278
279
280
  		nla_for_each_nested(nla_a,
  				    info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  				    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
281
  			if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) {
fd3858554   Paul Moore   [NetLabel]: rewor...
282
283
284
285
286
287
288
289
290
291
  				struct nlattr *cat_loc;
  				struct nlattr *cat_rem;
  
  				cat_loc = nla_find_nested(nla_a,
  						     NLBL_CIPSOV4_A_MLSCATLOC);
  				cat_rem = nla_find_nested(nla_a,
  						     NLBL_CIPSOV4_A_MLSCATREM);
  				if (cat_loc == NULL || cat_rem == NULL)
  					goto add_std_failure;
  				doi_def->map.std->cat.local[
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
292
  							nla_get_u32(cat_loc)] =
fd3858554   Paul Moore   [NetLabel]: rewor...
293
294
  					nla_get_u32(cat_rem);
  				doi_def->map.std->cat.cipso[
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
295
  							nla_get_u32(cat_rem)] =
fd3858554   Paul Moore   [NetLabel]: rewor...
296
297
  					nla_get_u32(cat_loc);
  			}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
298
  	}
6c2e8ac09   Paul Moore   netlabel: Update ...
299
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
300
301
302
303
304
  	if (ret_val != 0)
  		goto add_std_failure;
  	return 0;
  
  add_std_failure:
7a11b1d30   Markus Elfring   netlabel: Deletio...
305
  	cipso_v4_doi_free(doi_def);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
306
307
308
309
310
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_add_pass - Adds a CIPSO V4 DOI definition
fd3858554   Paul Moore   [NetLabel]: rewor...
311
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
312
   * @audit_info: NetLabel audit information
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
313
314
315
316
317
318
319
   *
   * Description:
   * Create a new CIPSO_V4_MAP_PASS DOI definition based on the given ADD message
   * and add it to the CIPSO V4 engine.  Return zero on success and non-zero on
   * error.
   *
   */
6c2e8ac09   Paul Moore   netlabel: Update ...
320
321
  static int netlbl_cipsov4_add_pass(struct genl_info *info,
  				   struct netlbl_audit *audit_info)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
322
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
323
  	int ret_val;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
324
  	struct cipso_v4_doi *doi_def = NULL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
325

32f50cdee   Paul Moore   [NetLabel]: add a...
326
  	if (!info->attrs[NLBL_CIPSOV4_A_TAGLST])
fd3858554   Paul Moore   [NetLabel]: rewor...
327
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
328
329
  
  	doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
330
331
  	if (doi_def == NULL)
  		return -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
332
  	doi_def->type = CIPSO_V4_MAP_PASS;
fd3858554   Paul Moore   [NetLabel]: rewor...
333
334
335
  	ret_val = netlbl_cipsov4_add_common(info, doi_def);
  	if (ret_val != 0)
  		goto add_pass_failure;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
336

6c2e8ac09   Paul Moore   netlabel: Update ...
337
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
338
339
340
341
342
  	if (ret_val != 0)
  		goto add_pass_failure;
  	return 0;
  
  add_pass_failure:
b1edeb102   Paul Moore   netlabel: Replace...
343
  	cipso_v4_doi_free(doi_def);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
344
345
346
347
  	return ret_val;
  }
  
  /**
d91d40799   Paul Moore   netlabel: Add con...
348
349
   * netlbl_cipsov4_add_local - Adds a CIPSO V4 DOI definition
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
350
   * @audit_info: NetLabel audit information
d91d40799   Paul Moore   netlabel: Add con...
351
352
353
354
355
356
357
   *
   * Description:
   * Create a new CIPSO_V4_MAP_LOCAL DOI definition based on the given ADD
   * message and add it to the CIPSO V4 engine.  Return zero on success and
   * non-zero on error.
   *
   */
6c2e8ac09   Paul Moore   netlabel: Update ...
358
359
  static int netlbl_cipsov4_add_local(struct genl_info *info,
  				    struct netlbl_audit *audit_info)
d91d40799   Paul Moore   netlabel: Add con...
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  {
  	int ret_val;
  	struct cipso_v4_doi *doi_def = NULL;
  
  	if (!info->attrs[NLBL_CIPSOV4_A_TAGLST])
  		return -EINVAL;
  
  	doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
  	if (doi_def == NULL)
  		return -ENOMEM;
  	doi_def->type = CIPSO_V4_MAP_LOCAL;
  
  	ret_val = netlbl_cipsov4_add_common(info, doi_def);
  	if (ret_val != 0)
  		goto add_local_failure;
6c2e8ac09   Paul Moore   netlabel: Update ...
375
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
d91d40799   Paul Moore   netlabel: Add con...
376
377
378
379
380
381
382
383
384
385
  	if (ret_val != 0)
  		goto add_local_failure;
  	return 0;
  
  add_local_failure:
  	cipso_v4_doi_free(doi_def);
  	return ret_val;
  }
  
  /**
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
386
387
388
389
390
391
392
393
394
395
396
397
398
   * netlbl_cipsov4_add - Handle an ADD message
   * @skb: the NETLINK buffer
   * @info: the Generic NETLINK info block
   *
   * Description:
   * Create a new DOI definition based on the given ADD message and add it to the
   * CIPSO V4 engine.  Returns zero on success, negative values on failure.
   *
   */
  static int netlbl_cipsov4_add(struct sk_buff *skb, struct genl_info *info)
  
  {
  	int ret_val = -EINVAL;
95d4e6be2   Paul Moore   [NetLabel]: audit...
399
  	struct netlbl_audit audit_info;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
400

32f50cdee   Paul Moore   [NetLabel]: add a...
401
402
  	if (!info->attrs[NLBL_CIPSOV4_A_DOI] ||
  	    !info->attrs[NLBL_CIPSOV4_A_MTYPE])
fd3858554   Paul Moore   [NetLabel]: rewor...
403
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
404

95d4e6be2   Paul Moore   [NetLabel]: audit...
405
  	netlbl_netlink_auditinfo(skb, &audit_info);
6c2e8ac09   Paul Moore   netlabel: Update ...
406
  	switch (nla_get_u32(info->attrs[NLBL_CIPSOV4_A_MTYPE])) {
15c45f7b2   Paul Moore   cipso: Add suppor...
407
  	case CIPSO_V4_MAP_TRANS:
6c2e8ac09   Paul Moore   netlabel: Update ...
408
  		ret_val = netlbl_cipsov4_add_std(info, &audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
409
410
  		break;
  	case CIPSO_V4_MAP_PASS:
6c2e8ac09   Paul Moore   netlabel: Update ...
411
  		ret_val = netlbl_cipsov4_add_pass(info, &audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
412
  		break;
d91d40799   Paul Moore   netlabel: Add con...
413
  	case CIPSO_V4_MAP_LOCAL:
6c2e8ac09   Paul Moore   netlabel: Update ...
414
  		ret_val = netlbl_cipsov4_add_local(info, &audit_info);
d91d40799   Paul Moore   netlabel: Add con...
415
  		break;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
416
  	}
23bcdc1ad   Paul Moore   SELinux: enable d...
417
  	if (ret_val == 0)
c783f1ce5   Paul Moore   NetLabel: Remove ...
418
  		atomic_inc(&netlabel_mgmt_protocount);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
419

96cb8e331   Paul Moore   [NetLabel]: CIPSO...
420
421
422
423
424
425
426
427
428
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_list - Handle a LIST message
   * @skb: the NETLINK buffer
   * @info: the Generic NETLINK info block
   *
   * Description:
fd3858554   Paul Moore   [NetLabel]: rewor...
429
430
431
432
433
434
435
436
437
   * Process a user generated LIST message and respond accordingly.  While the
   * response message generated by the kernel is straightforward, determining
   * before hand the size of the buffer to allocate is not (we have to generate
   * the message to know the size).  In order to keep this function sane what we
   * do is allocate a buffer of NLMSG_GOODSIZE and try to fit the response in
   * that size, if we fail then we restart with a larger buffer and try again.
   * We continue in this manner until we hit a limit of failed attempts then we
   * give up and just send an error message.  Returns zero on success and
   * negative values on error.
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
438
439
440
441
   *
   */
  static int netlbl_cipsov4_list(struct sk_buff *skb, struct genl_info *info)
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
442
443
444
445
  	int ret_val;
  	struct sk_buff *ans_skb = NULL;
  	u32 nlsze_mult = 1;
  	void *data;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
446
  	u32 doi;
fd3858554   Paul Moore   [NetLabel]: rewor...
447
448
449
450
  	struct nlattr *nla_a;
  	struct nlattr *nla_b;
  	struct cipso_v4_doi *doi_def;
  	u32 iter;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
451

fd3858554   Paul Moore   [NetLabel]: rewor...
452
453
  	if (!info->attrs[NLBL_CIPSOV4_A_DOI]) {
  		ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
454
  		goto list_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
455
  	}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
456

fd3858554   Paul Moore   [NetLabel]: rewor...
457
  list_start:
339bf98ff   Thomas Graf   [NETLINK]: Do pre...
458
  	ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE * nlsze_mult, GFP_KERNEL);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
459
460
461
462
  	if (ans_skb == NULL) {
  		ret_val = -ENOMEM;
  		goto list_failure;
  	}
17c157c88   Thomas Graf   [GENL]: Add genlm...
463
464
  	data = genlmsg_put_reply(ans_skb, info, &netlbl_cipsov4_gnl_family,
  				 0, NLBL_CIPSOV4_C_LIST);
fd3858554   Paul Moore   [NetLabel]: rewor...
465
466
467
468
469
470
471
472
473
474
475
  	if (data == NULL) {
  		ret_val = -ENOMEM;
  		goto list_failure;
  	}
  
  	doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]);
  
  	rcu_read_lock();
  	doi_def = cipso_v4_doi_getdef(doi);
  	if (doi_def == NULL) {
  		ret_val = -EINVAL;
561967010   Paul Moore   netlabel: Fix som...
476
  		goto list_failure_lock;
fd3858554   Paul Moore   [NetLabel]: rewor...
477
478
479
480
481
  	}
  
  	ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MTYPE, doi_def->type);
  	if (ret_val != 0)
  		goto list_failure_lock;
ae0be8de9   Michal Kubecek   netlink: make nla...
482
  	nla_a = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_TAGLST);
fd3858554   Paul Moore   [NetLabel]: rewor...
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
  	if (nla_a == NULL) {
  		ret_val = -ENOMEM;
  		goto list_failure_lock;
  	}
  	for (iter = 0;
  	     iter < CIPSO_V4_TAG_MAXCNT &&
  	       doi_def->tags[iter] != CIPSO_V4_TAG_INVALID;
  	     iter++) {
  		ret_val = nla_put_u8(ans_skb,
  				     NLBL_CIPSOV4_A_TAG,
  				     doi_def->tags[iter]);
  		if (ret_val != 0)
  			goto list_failure_lock;
  	}
  	nla_nest_end(ans_skb, nla_a);
  
  	switch (doi_def->type) {
15c45f7b2   Paul Moore   cipso: Add suppor...
500
  	case CIPSO_V4_MAP_TRANS:
ae0be8de9   Michal Kubecek   netlink: make nla...
501
502
  		nla_a = nla_nest_start_noflag(ans_skb,
  					      NLBL_CIPSOV4_A_MLSLVLLST);
fd3858554   Paul Moore   [NetLabel]: rewor...
503
504
505
506
507
508
509
510
511
512
  		if (nla_a == NULL) {
  			ret_val = -ENOMEM;
  			goto list_failure_lock;
  		}
  		for (iter = 0;
  		     iter < doi_def->map.std->lvl.local_size;
  		     iter++) {
  			if (doi_def->map.std->lvl.local[iter] ==
  			    CIPSO_V4_INV_LVL)
  				continue;
ae0be8de9   Michal Kubecek   netlink: make nla...
513
514
  			nla_b = nla_nest_start_noflag(ans_skb,
  						      NLBL_CIPSOV4_A_MLSLVL);
fd3858554   Paul Moore   [NetLabel]: rewor...
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
  			if (nla_b == NULL) {
  				ret_val = -ENOMEM;
  				goto list_retry;
  			}
  			ret_val = nla_put_u32(ans_skb,
  					      NLBL_CIPSOV4_A_MLSLVLLOC,
  					      iter);
  			if (ret_val != 0)
  				goto list_retry;
  			ret_val = nla_put_u32(ans_skb,
  					    NLBL_CIPSOV4_A_MLSLVLREM,
  					    doi_def->map.std->lvl.local[iter]);
  			if (ret_val != 0)
  				goto list_retry;
  			nla_nest_end(ans_skb, nla_b);
  		}
  		nla_nest_end(ans_skb, nla_a);
ae0be8de9   Michal Kubecek   netlink: make nla...
532
533
  		nla_a = nla_nest_start_noflag(ans_skb,
  					      NLBL_CIPSOV4_A_MLSCATLST);
fd3858554   Paul Moore   [NetLabel]: rewor...
534
535
536
537
538
539
540
541
542
543
  		if (nla_a == NULL) {
  			ret_val = -ENOMEM;
  			goto list_retry;
  		}
  		for (iter = 0;
  		     iter < doi_def->map.std->cat.local_size;
  		     iter++) {
  			if (doi_def->map.std->cat.local[iter] ==
  			    CIPSO_V4_INV_CAT)
  				continue;
ae0be8de9   Michal Kubecek   netlink: make nla...
544
545
  			nla_b = nla_nest_start_noflag(ans_skb,
  						      NLBL_CIPSOV4_A_MLSCAT);
fd3858554   Paul Moore   [NetLabel]: rewor...
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
  			if (nla_b == NULL) {
  				ret_val = -ENOMEM;
  				goto list_retry;
  			}
  			ret_val = nla_put_u32(ans_skb,
  					      NLBL_CIPSOV4_A_MLSCATLOC,
  					      iter);
  			if (ret_val != 0)
  				goto list_retry;
  			ret_val = nla_put_u32(ans_skb,
  					    NLBL_CIPSOV4_A_MLSCATREM,
  					    doi_def->map.std->cat.local[iter]);
  			if (ret_val != 0)
  				goto list_retry;
  			nla_nest_end(ans_skb, nla_b);
  		}
  		nla_nest_end(ans_skb, nla_a);
  
  		break;
  	}
  	rcu_read_unlock();
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
567

fd3858554   Paul Moore   [NetLabel]: rewor...
568
  	genlmsg_end(ans_skb, data);
fe785bee0   Denis V. Lunev   netlabel: netlink...
569
  	return genlmsg_reply(ans_skb, info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
570

fd3858554   Paul Moore   [NetLabel]: rewor...
571
572
573
574
575
  list_retry:
  	/* XXX - this limit is a guesstimate */
  	if (nlsze_mult < 4) {
  		rcu_read_unlock();
  		kfree_skb(ans_skb);
83aa2e964   Denis V. Lunev   netlabel: return ...
576
  		nlsze_mult *= 2;
fd3858554   Paul Moore   [NetLabel]: rewor...
577
578
579
580
  		goto list_start;
  	}
  list_failure_lock:
  	rcu_read_unlock();
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
581
  list_failure:
fd3858554   Paul Moore   [NetLabel]: rewor...
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
  	kfree_skb(ans_skb);
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_listall_cb - cipso_v4_doi_walk() callback for LISTALL
   * @doi_def: the CIPSOv4 DOI definition
   * @arg: the netlbl_cipsov4_doiwalk_arg structure
   *
   * Description:
   * This function is designed to be used as a callback to the
   * cipso_v4_doi_walk() function for use in generating a response for a LISTALL
   * message.  Returns the size of the message on success, negative values on
   * failure.
   *
   */
  static int netlbl_cipsov4_listall_cb(struct cipso_v4_doi *doi_def, void *arg)
  {
  	int ret_val = -ENOMEM;
  	struct netlbl_cipsov4_doiwalk_arg *cb_arg = arg;
  	void *data;
15e473046   Eric W. Biederman   netlink: Rename p...
603
  	data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid,
17c157c88   Thomas Graf   [GENL]: Add genlm...
604
605
  			   cb_arg->seq, &netlbl_cipsov4_gnl_family,
  			   NLM_F_MULTI, NLBL_CIPSOV4_C_LISTALL);
fd3858554   Paul Moore   [NetLabel]: rewor...
606
607
608
609
610
611
612
613
614
615
616
  	if (data == NULL)
  		goto listall_cb_failure;
  
  	ret_val = nla_put_u32(cb_arg->skb, NLBL_CIPSOV4_A_DOI, doi_def->doi);
  	if (ret_val != 0)
  		goto listall_cb_failure;
  	ret_val = nla_put_u32(cb_arg->skb,
  			      NLBL_CIPSOV4_A_MTYPE,
  			      doi_def->type);
  	if (ret_val != 0)
  		goto listall_cb_failure;
053c095a8   Johannes Berg   netlink: make nlm...
617
618
  	genlmsg_end(cb_arg->skb, data);
  	return 0;
fd3858554   Paul Moore   [NetLabel]: rewor...
619
620
621
  
  listall_cb_failure:
  	genlmsg_cancel(cb_arg->skb, data);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
622
623
624
625
626
627
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_listall - Handle a LISTALL message
   * @skb: the NETLINK buffer
fd3858554   Paul Moore   [NetLabel]: rewor...
628
   * @cb: the NETLINK callback
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
629
630
631
632
633
634
   *
   * Description:
   * Process a user generated LISTALL message and respond accordingly.  Returns
   * zero on success and negative values on error.
   *
   */
fd3858554   Paul Moore   [NetLabel]: rewor...
635
636
  static int netlbl_cipsov4_listall(struct sk_buff *skb,
  				  struct netlink_callback *cb)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
637
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
638
  	struct netlbl_cipsov4_doiwalk_arg cb_arg;
561967010   Paul Moore   netlabel: Fix som...
639
  	u32 doi_skip = cb->args[0];
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
640

fd3858554   Paul Moore   [NetLabel]: rewor...
641
642
643
  	cb_arg.nl_cb = cb;
  	cb_arg.skb = skb;
  	cb_arg.seq = cb->nlh->nlmsg_seq;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
644

fd3858554   Paul Moore   [NetLabel]: rewor...
645
  	cipso_v4_doi_walk(&doi_skip, netlbl_cipsov4_listall_cb, &cb_arg);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
646

fd3858554   Paul Moore   [NetLabel]: rewor...
647
648
  	cb->args[0] = doi_skip;
  	return skb->len;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
649
650
651
  }
  
  /**
b1edeb102   Paul Moore   netlabel: Replace...
652
653
654
655
656
657
658
659
660
661
662
663
664
665
   * netlbl_cipsov4_remove_cb - netlbl_cipsov4_remove() callback for REMOVE
   * @entry: LSM domain mapping entry
   * @arg: the netlbl_domhsh_walk_arg structure
   *
   * Description:
   * This function is intended for use by netlbl_cipsov4_remove() as the callback
   * for the netlbl_domhsh_walk() function; it removes LSM domain map entries
   * which are associated with the CIPSO DOI specified in @arg.  Returns zero on
   * success, negative values on failure.
   *
   */
  static int netlbl_cipsov4_remove_cb(struct netlbl_dom_map *entry, void *arg)
  {
  	struct netlbl_domhsh_walk_arg *cb_arg = arg;
6a8b7f0c8   Paul Moore   netlabel: use dom...
666
667
  	if (entry->def.type == NETLBL_NLTYPE_CIPSOV4 &&
  	    entry->def.cipso->doi == cb_arg->doi)
b1edeb102   Paul Moore   netlabel: Replace...
668
669
670
671
672
673
  		return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info);
  
  	return 0;
  }
  
  /**
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
674
675
676
677
678
679
680
681
682
683
684
   * netlbl_cipsov4_remove - Handle a REMOVE message
   * @skb: the NETLINK buffer
   * @info: the Generic NETLINK info block
   *
   * Description:
   * Process a user generated REMOVE message and respond accordingly.  Returns
   * zero on success, negative values on failure.
   *
   */
  static int netlbl_cipsov4_remove(struct sk_buff *skb, struct genl_info *info)
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
685
  	int ret_val = -EINVAL;
b1edeb102   Paul Moore   netlabel: Replace...
686
  	struct netlbl_domhsh_walk_arg cb_arg;
95d4e6be2   Paul Moore   [NetLabel]: audit...
687
  	struct netlbl_audit audit_info;
b1edeb102   Paul Moore   netlabel: Replace...
688
689
  	u32 skip_bkt = 0;
  	u32 skip_chain = 0;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
690

95d4e6be2   Paul Moore   [NetLabel]: audit...
691
692
  	if (!info->attrs[NLBL_CIPSOV4_A_DOI])
  		return -EINVAL;
32f50cdee   Paul Moore   [NetLabel]: add a...
693

95d4e6be2   Paul Moore   [NetLabel]: audit...
694
  	netlbl_netlink_auditinfo(skb, &audit_info);
6c2e8ac09   Paul Moore   netlabel: Update ...
695
  	cb_arg.doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]);
b1edeb102   Paul Moore   netlabel: Replace...
696
697
698
699
  	cb_arg.audit_info = &audit_info;
  	ret_val = netlbl_domhsh_walk(&skip_bkt, &skip_chain,
  				     netlbl_cipsov4_remove_cb, &cb_arg);
  	if (ret_val == 0 || ret_val == -ENOENT) {
6c2e8ac09   Paul Moore   netlabel: Update ...
700
  		ret_val = cipso_v4_doi_remove(cb_arg.doi, &audit_info);
b1edeb102   Paul Moore   netlabel: Replace...
701
702
703
  		if (ret_val == 0)
  			atomic_dec(&netlabel_mgmt_protocount);
  	}
95d4e6be2   Paul Moore   [NetLabel]: audit...
704

96cb8e331   Paul Moore   [NetLabel]: CIPSO...
705
706
707
708
709
710
  	return ret_val;
  }
  
  /*
   * NetLabel Generic NETLINK Command Definitions
   */
4534de830   Johannes Berg   genetlink: make a...
711
  static const struct genl_ops netlbl_cipsov4_ops[] = {
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
712
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
713
  	.cmd = NLBL_CIPSOV4_C_ADD,
ef6243acb   Johannes Berg   genetlink: option...
714
  	.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
fd3858554   Paul Moore   [NetLabel]: rewor...
715
  	.flags = GENL_ADMIN_PERM,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
716
717
  	.doit = netlbl_cipsov4_add,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
718
719
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
720
  	.cmd = NLBL_CIPSOV4_C_REMOVE,
ef6243acb   Johannes Berg   genetlink: option...
721
  	.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
fd3858554   Paul Moore   [NetLabel]: rewor...
722
  	.flags = GENL_ADMIN_PERM,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
723
724
  	.doit = netlbl_cipsov4_remove,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
725
726
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
727
  	.cmd = NLBL_CIPSOV4_C_LIST,
ef6243acb   Johannes Berg   genetlink: option...
728
  	.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
729
730
731
  	.flags = 0,
  	.doit = netlbl_cipsov4_list,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
732
733
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
734
  	.cmd = NLBL_CIPSOV4_C_LISTALL,
ef6243acb   Johannes Berg   genetlink: option...
735
  	.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
736
  	.flags = 0,
fd3858554   Paul Moore   [NetLabel]: rewor...
737
738
  	.doit = NULL,
  	.dumpit = netlbl_cipsov4_listall,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
739
  	},
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
740
  };
56989f6d8   Johannes Berg   genetlink: mark f...
741
  static struct genl_family netlbl_cipsov4_gnl_family __ro_after_init = {
489111e5c   Johannes Berg   genetlink: static...
742
743
744
745
  	.hdrsize = 0,
  	.name = NETLBL_NLTYPE_CIPSOV4_NAME,
  	.version = NETLBL_PROTO_VERSION,
  	.maxattr = NLBL_CIPSOV4_A_MAX,
3b0f31f2b   Johannes Berg   genetlink: make p...
746
  	.policy = netlbl_cipsov4_genl_policy,
489111e5c   Johannes Berg   genetlink: static...
747
748
749
750
  	.module = THIS_MODULE,
  	.ops = netlbl_cipsov4_ops,
  	.n_ops = ARRAY_SIZE(netlbl_cipsov4_ops),
  };
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
751
752
753
754
755
756
757
758
759
760
761
762
  /*
   * NetLabel Generic NETLINK Protocol Functions
   */
  
  /**
   * netlbl_cipsov4_genl_init - Register the CIPSOv4 NetLabel component
   *
   * Description:
   * Register the CIPSOv4 packet NetLabel component with the Generic NETLINK
   * mechanism.  Returns zero on success, negative values on failure.
   *
   */
05705e4e1   Pavel Emelyanov   [NETLABEL]: Move ...
763
  int __init netlbl_cipsov4_genl_init(void)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
764
  {
489111e5c   Johannes Berg   genetlink: static...
765
  	return genl_register_family(&netlbl_cipsov4_gnl_family);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
766
  }