Blame view

net/netlabel/netlabel_cipso_v4.c 21.2 KB
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
1
2
3
4
5
6
7
  /*
   * 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...
8
   * Author: Paul Moore <paul@paul-moore.com>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
   *
   */
  
  /*
   * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
   *
   * This program is free software;  you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY;  without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
   * the GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program;  if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
   *
   */
  
  #include <linux/types.h>
  #include <linux/socket.h>
  #include <linux/string.h>
  #include <linux/skbuff.h>
32f50cdee   Paul Moore   [NetLabel]: add a...
35
  #include <linux/audit.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
36
  #include <linux/slab.h>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
37
38
39
40
41
  #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...
42
  #include <linux/atomic.h>
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
43
44
45
  
  #include "netlabel_user.h"
  #include "netlabel_cipso_v4.h"
23bcdc1ad   Paul Moore   SELinux: enable d...
46
  #include "netlabel_mgmt.h"
b1edeb102   Paul Moore   netlabel: Replace...
47
  #include "netlabel_domainhash.h"
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
48

fd3858554   Paul Moore   [NetLabel]: rewor...
49
50
51
52
53
54
  /* 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...
55
56
57
58
59
  /* Argument struct for netlbl_domhsh_walk() */
  struct netlbl_domhsh_walk_arg {
  	struct netlbl_audit *audit_info;
  	u32 doi;
  };
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
60
61
62
63
64
65
  /* NetLabel Generic NETLINK CIPSOv4 family */
  static struct genl_family netlbl_cipsov4_gnl_family = {
  	.id = GENL_ID_GENERATE,
  	.hdrsize = 0,
  	.name = NETLBL_NLTYPE_CIPSOV4_NAME,
  	.version = NETLBL_PROTO_VERSION,
fd3858554   Paul Moore   [NetLabel]: rewor...
66
  	.maxattr = NLBL_CIPSOV4_A_MAX,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
67
  };
fd3858554   Paul Moore   [NetLabel]: rewor...
68
  /* NetLabel Netlink attribute policy */
ef7c79ed6   Patrick McHardy   [NETLINK]: Mark n...
69
  static const struct nla_policy netlbl_cipsov4_genl_policy[NLBL_CIPSOV4_A_MAX + 1] = {
fd3858554   Paul Moore   [NetLabel]: rewor...
70
71
72
73
74
75
76
77
78
79
80
81
82
  	[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...
83
84
85
86
87
88
  
  /*
   * Helper Functions
   */
  
  /**
fd3858554   Paul Moore   [NetLabel]: rewor...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
   * 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]);
  
  	if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_TAGLST],
  				NLBL_CIPSOV4_A_MAX,
  				netlbl_cipsov4_genl_policy) != 0)
  		return -EINVAL;
  
  	nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
113
  		if (nla_type(nla) == NLBL_CIPSOV4_A_TAG) {
2a2f11c22   Paul Moore   NetLabel: correct...
114
  			if (iter >= CIPSO_V4_TAG_MAXCNT)
fd3858554   Paul Moore   [NetLabel]: rewor...
115
116
117
  				return -EINVAL;
  			doi_def->tags[iter++] = nla_get_u8(nla);
  		}
2a2f11c22   Paul Moore   NetLabel: correct...
118
119
  	while (iter < CIPSO_V4_TAG_MAXCNT)
  		doi_def->tags[iter++] = CIPSO_V4_TAG_INVALID;
fd3858554   Paul Moore   [NetLabel]: rewor...
120
121
122
  
  	return 0;
  }
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
123
124
125
126
127
128
129
  
  /*
   * NetLabel Command Handlers
   */
  
  /**
   * netlbl_cipsov4_add_std - Adds a CIPSO V4 DOI definition
fd3858554   Paul Moore   [NetLabel]: rewor...
130
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
131
   * @audit_info: NetLabel audit information
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
132
133
   *
   * Description:
15c45f7b2   Paul Moore   cipso: Add suppor...
134
135
136
   * 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...
137
138
   *
   */
6c2e8ac09   Paul Moore   netlabel: Update ...
139
140
  static int netlbl_cipsov4_add_std(struct genl_info *info,
  				  struct netlbl_audit *audit_info)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
141
142
  {
  	int ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
143
  	struct cipso_v4_doi *doi_def = NULL;
fd3858554   Paul Moore   [NetLabel]: rewor...
144
145
146
147
  	struct nlattr *nla_a;
  	struct nlattr *nla_b;
  	int nla_a_rem;
  	int nla_b_rem;
caff5b6a6   Paul Moore   NetLabel: correct...
148
  	u32 iter;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
149

32f50cdee   Paul Moore   [NetLabel]: add a...
150
  	if (!info->attrs[NLBL_CIPSOV4_A_TAGLST] ||
fd3858554   Paul Moore   [NetLabel]: rewor...
151
152
153
154
155
156
157
  	    !info->attrs[NLBL_CIPSOV4_A_MLSLVLLST])
  		return -EINVAL;
  
  	if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  				NLBL_CIPSOV4_A_MAX,
  				netlbl_cipsov4_genl_policy) != 0)
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
158
159
  
  	doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
160
161
  	if (doi_def == NULL)
  		return -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
162
163
164
165
166
  	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...
167
  	doi_def->type = CIPSO_V4_MAP_TRANS;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
168

fd3858554   Paul Moore   [NetLabel]: rewor...
169
170
  	ret_val = netlbl_cipsov4_add_common(info, doi_def);
  	if (ret_val != 0)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
171
  		goto add_std_failure;
1fd2a25b7   Paul Moore   NetLabel: perform...
172
  	ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
173

fd3858554   Paul Moore   [NetLabel]: rewor...
174
175
176
  	nla_for_each_nested(nla_a,
  			    info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  			    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
177
  		if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) {
1fd2a25b7   Paul Moore   NetLabel: perform...
178
179
180
181
  			if (nla_validate_nested(nla_a,
  					    NLBL_CIPSOV4_A_MAX,
  					    netlbl_cipsov4_genl_policy) != 0)
  					goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
182
  			nla_for_each_nested(nla_b, nla_a, nla_b_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
183
  				switch (nla_type(nla_b)) {
fd3858554   Paul Moore   [NetLabel]: rewor...
184
  				case NLBL_CIPSOV4_A_MLSLVLLOC:
1fd2a25b7   Paul Moore   NetLabel: perform...
185
186
187
  					if (nla_get_u32(nla_b) >
  					    CIPSO_V4_MAX_LOC_LVLS)
  						goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
188
189
190
191
192
193
  					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...
194
195
196
  					if (nla_get_u32(nla_b) >
  					    CIPSO_V4_MAX_REM_LVLS)
  						goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
197
198
199
200
201
202
203
  					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...
204
205
206
207
208
209
210
  	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...
211
212
213
214
215
216
217
  	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...
218
219
220
221
  	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...
222
223
224
  	nla_for_each_nested(nla_a,
  			    info->attrs[NLBL_CIPSOV4_A_MLSLVLLST],
  			    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
225
  		if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) {
fd3858554   Paul Moore   [NetLabel]: rewor...
226
227
  			struct nlattr *lvl_loc;
  			struct nlattr *lvl_rem;
fd3858554   Paul Moore   [NetLabel]: rewor...
228
229
230
231
232
233
234
235
236
237
238
  			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...
239

fd3858554   Paul Moore   [NetLabel]: rewor...
240
241
242
243
244
245
246
247
248
  	if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) {
  		if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  					NLBL_CIPSOV4_A_MAX,
  					netlbl_cipsov4_genl_policy) != 0)
  			goto add_std_failure;
  
  		nla_for_each_nested(nla_a,
  				    info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  				    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
249
  			if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) {
fd3858554   Paul Moore   [NetLabel]: rewor...
250
251
252
253
254
  				if (nla_validate_nested(nla_a,
  					      NLBL_CIPSOV4_A_MAX,
  					      netlbl_cipsov4_genl_policy) != 0)
  					goto add_std_failure;
  				nla_for_each_nested(nla_b, nla_a, nla_b_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
255
  					switch (nla_type(nla_b)) {
fd3858554   Paul Moore   [NetLabel]: rewor...
256
  					case NLBL_CIPSOV4_A_MLSCATLOC:
1fd2a25b7   Paul Moore   NetLabel: perform...
257
258
259
  						if (nla_get_u32(nla_b) >
  						    CIPSO_V4_MAX_LOC_CATS)
  							goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
260
261
262
263
264
265
  						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...
266
267
268
  						if (nla_get_u32(nla_b) >
  						    CIPSO_V4_MAX_REM_CATS)
  							goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
269
270
271
272
273
274
275
  						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...
276
  		doi_def->map.std->cat.local = kcalloc(
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
277
  					      doi_def->map.std->cat.local_size,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
278
279
  					      sizeof(u32),
  					      GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
280
281
282
283
284
  		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...
285
  					      doi_def->map.std->cat.cipso_size,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
286
287
  					      sizeof(u32),
  					      GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
288
289
  		if (doi_def->map.std->cat.cipso == NULL) {
  			ret_val = -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
290
  			goto add_std_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
291
  		}
caff5b6a6   Paul Moore   NetLabel: correct...
292
293
294
295
  		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...
296
297
298
  		nla_for_each_nested(nla_a,
  				    info->attrs[NLBL_CIPSOV4_A_MLSCATLST],
  				    nla_a_rem)
8f4c1f9b0   Thomas Graf   [NETLINK]: Introd...
299
  			if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) {
fd3858554   Paul Moore   [NetLabel]: rewor...
300
301
302
303
304
305
306
307
308
309
  				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...
310
  							nla_get_u32(cat_loc)] =
fd3858554   Paul Moore   [NetLabel]: rewor...
311
312
  					nla_get_u32(cat_rem);
  				doi_def->map.std->cat.cipso[
e1a95265b   YOSHIFUJI Hideaki   [NET] NETLABEL: F...
313
  							nla_get_u32(cat_rem)] =
fd3858554   Paul Moore   [NetLabel]: rewor...
314
315
  					nla_get_u32(cat_loc);
  			}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
316
  	}
6c2e8ac09   Paul Moore   netlabel: Update ...
317
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
318
319
320
321
322
323
  	if (ret_val != 0)
  		goto add_std_failure;
  	return 0;
  
  add_std_failure:
  	if (doi_def)
b1edeb102   Paul Moore   netlabel: Replace...
324
  		cipso_v4_doi_free(doi_def);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
325
326
327
328
329
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_add_pass - Adds a CIPSO V4 DOI definition
fd3858554   Paul Moore   [NetLabel]: rewor...
330
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
331
   * @audit_info: NetLabel audit information
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
332
333
334
335
336
337
338
   *
   * 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 ...
339
340
  static int netlbl_cipsov4_add_pass(struct genl_info *info,
  				   struct netlbl_audit *audit_info)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
341
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
342
  	int ret_val;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
343
  	struct cipso_v4_doi *doi_def = NULL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
344

32f50cdee   Paul Moore   [NetLabel]: add a...
345
  	if (!info->attrs[NLBL_CIPSOV4_A_TAGLST])
fd3858554   Paul Moore   [NetLabel]: rewor...
346
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
347
348
  
  	doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL);
fd3858554   Paul Moore   [NetLabel]: rewor...
349
350
  	if (doi_def == NULL)
  		return -ENOMEM;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
351
  	doi_def->type = CIPSO_V4_MAP_PASS;
fd3858554   Paul Moore   [NetLabel]: rewor...
352
353
354
  	ret_val = netlbl_cipsov4_add_common(info, doi_def);
  	if (ret_val != 0)
  		goto add_pass_failure;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
355

6c2e8ac09   Paul Moore   netlabel: Update ...
356
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
357
358
359
360
361
  	if (ret_val != 0)
  		goto add_pass_failure;
  	return 0;
  
  add_pass_failure:
b1edeb102   Paul Moore   netlabel: Replace...
362
  	cipso_v4_doi_free(doi_def);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
363
364
365
366
  	return ret_val;
  }
  
  /**
d91d40799   Paul Moore   netlabel: Add con...
367
368
   * netlbl_cipsov4_add_local - Adds a CIPSO V4 DOI definition
   * @info: the Generic NETLINK info block
6c2e8ac09   Paul Moore   netlabel: Update ...
369
   * @audit_info: NetLabel audit information
d91d40799   Paul Moore   netlabel: Add con...
370
371
372
373
374
375
376
   *
   * 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 ...
377
378
  static int netlbl_cipsov4_add_local(struct genl_info *info,
  				    struct netlbl_audit *audit_info)
d91d40799   Paul Moore   netlabel: Add con...
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
  {
  	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 ...
394
  	ret_val = cipso_v4_doi_add(doi_def, audit_info);
d91d40799   Paul Moore   netlabel: Add con...
395
396
397
398
399
400
401
402
403
404
  	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...
405
406
407
408
409
410
411
412
413
414
415
416
417
   * 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...
418
  	struct netlbl_audit audit_info;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
419

32f50cdee   Paul Moore   [NetLabel]: add a...
420
421
  	if (!info->attrs[NLBL_CIPSOV4_A_DOI] ||
  	    !info->attrs[NLBL_CIPSOV4_A_MTYPE])
fd3858554   Paul Moore   [NetLabel]: rewor...
422
  		return -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
423

95d4e6be2   Paul Moore   [NetLabel]: audit...
424
  	netlbl_netlink_auditinfo(skb, &audit_info);
6c2e8ac09   Paul Moore   netlabel: Update ...
425
  	switch (nla_get_u32(info->attrs[NLBL_CIPSOV4_A_MTYPE])) {
15c45f7b2   Paul Moore   cipso: Add suppor...
426
  	case CIPSO_V4_MAP_TRANS:
6c2e8ac09   Paul Moore   netlabel: Update ...
427
  		ret_val = netlbl_cipsov4_add_std(info, &audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
428
429
  		break;
  	case CIPSO_V4_MAP_PASS:
6c2e8ac09   Paul Moore   netlabel: Update ...
430
  		ret_val = netlbl_cipsov4_add_pass(info, &audit_info);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
431
  		break;
d91d40799   Paul Moore   netlabel: Add con...
432
  	case CIPSO_V4_MAP_LOCAL:
6c2e8ac09   Paul Moore   netlabel: Update ...
433
  		ret_val = netlbl_cipsov4_add_local(info, &audit_info);
d91d40799   Paul Moore   netlabel: Add con...
434
  		break;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
435
  	}
23bcdc1ad   Paul Moore   SELinux: enable d...
436
  	if (ret_val == 0)
c783f1ce5   Paul Moore   NetLabel: Remove ...
437
  		atomic_inc(&netlabel_mgmt_protocount);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
438

96cb8e331   Paul Moore   [NetLabel]: CIPSO...
439
440
441
442
443
444
445
446
447
  	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...
448
449
450
451
452
453
454
455
456
   * 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...
457
458
459
460
   *
   */
  static int netlbl_cipsov4_list(struct sk_buff *skb, struct genl_info *info)
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
461
462
463
464
  	int ret_val;
  	struct sk_buff *ans_skb = NULL;
  	u32 nlsze_mult = 1;
  	void *data;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
465
  	u32 doi;
fd3858554   Paul Moore   [NetLabel]: rewor...
466
467
468
469
  	struct nlattr *nla_a;
  	struct nlattr *nla_b;
  	struct cipso_v4_doi *doi_def;
  	u32 iter;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
470

fd3858554   Paul Moore   [NetLabel]: rewor...
471
472
  	if (!info->attrs[NLBL_CIPSOV4_A_DOI]) {
  		ret_val = -EINVAL;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
473
  		goto list_failure;
fd3858554   Paul Moore   [NetLabel]: rewor...
474
  	}
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
475

fd3858554   Paul Moore   [NetLabel]: rewor...
476
  list_start:
339bf98ff   Thomas Graf   [NETLINK]: Do pre...
477
  	ans_skb = nlmsg_new(NLMSG_DEFAULT_SIZE * nlsze_mult, GFP_KERNEL);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
478
479
480
481
  	if (ans_skb == NULL) {
  		ret_val = -ENOMEM;
  		goto list_failure;
  	}
17c157c88   Thomas Graf   [GENL]: Add genlm...
482
483
  	data = genlmsg_put_reply(ans_skb, info, &netlbl_cipsov4_gnl_family,
  				 0, NLBL_CIPSOV4_C_LIST);
fd3858554   Paul Moore   [NetLabel]: rewor...
484
485
486
487
488
489
490
491
492
493
494
  	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...
495
  		goto list_failure_lock;
fd3858554   Paul Moore   [NetLabel]: rewor...
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
  	}
  
  	ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MTYPE, doi_def->type);
  	if (ret_val != 0)
  		goto list_failure_lock;
  
  	nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_TAGLST);
  	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...
520
  	case CIPSO_V4_MAP_TRANS:
fd3858554   Paul Moore   [NetLabel]: rewor...
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
  		nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSLVLLST);
  		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;
  
  			nla_b = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSLVL);
  			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);
  
  		nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSCATLST);
  		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;
  
  			nla_b = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSCAT);
  			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...
586

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

fd3858554   Paul Moore   [NetLabel]: rewor...
590
591
592
593
594
  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 ...
595
  		nlsze_mult *= 2;
fd3858554   Paul Moore   [NetLabel]: rewor...
596
597
598
599
  		goto list_start;
  	}
  list_failure_lock:
  	rcu_read_unlock();
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
600
  list_failure:
fd3858554   Paul Moore   [NetLabel]: rewor...
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
  	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;
17c157c88   Thomas Graf   [GENL]: Add genlm...
622
623
624
  	data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).pid,
  			   cb_arg->seq, &netlbl_cipsov4_gnl_family,
  			   NLM_F_MULTI, NLBL_CIPSOV4_C_LISTALL);
fd3858554   Paul Moore   [NetLabel]: rewor...
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
  	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;
  
  	return genlmsg_end(cb_arg->skb, data);
  
  listall_cb_failure:
  	genlmsg_cancel(cb_arg->skb, data);
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
641
642
643
644
645
646
  	return ret_val;
  }
  
  /**
   * netlbl_cipsov4_listall - Handle a LISTALL message
   * @skb: the NETLINK buffer
fd3858554   Paul Moore   [NetLabel]: rewor...
647
   * @cb: the NETLINK callback
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
648
649
650
651
652
653
   *
   * Description:
   * Process a user generated LISTALL message and respond accordingly.  Returns
   * zero on success and negative values on error.
   *
   */
fd3858554   Paul Moore   [NetLabel]: rewor...
654
655
  static int netlbl_cipsov4_listall(struct sk_buff *skb,
  				  struct netlink_callback *cb)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
656
  {
fd3858554   Paul Moore   [NetLabel]: rewor...
657
  	struct netlbl_cipsov4_doiwalk_arg cb_arg;
561967010   Paul Moore   netlabel: Fix som...
658
  	u32 doi_skip = cb->args[0];
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
659

fd3858554   Paul Moore   [NetLabel]: rewor...
660
661
662
  	cb_arg.nl_cb = cb;
  	cb_arg.skb = skb;
  	cb_arg.seq = cb->nlh->nlmsg_seq;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
663

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

fd3858554   Paul Moore   [NetLabel]: rewor...
666
667
  	cb->args[0] = doi_skip;
  	return skb->len;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
668
669
670
  }
  
  /**
b1edeb102   Paul Moore   netlabel: Replace...
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
   * 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;
  
  	if (entry->type == NETLBL_NLTYPE_CIPSOV4 &&
  	    entry->type_def.cipsov4->doi == cb_arg->doi)
  		return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info);
  
  	return 0;
  }
  
  /**
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
694
695
696
697
698
699
700
701
702
703
704
   * 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...
705
  	int ret_val = -EINVAL;
b1edeb102   Paul Moore   netlabel: Replace...
706
  	struct netlbl_domhsh_walk_arg cb_arg;
95d4e6be2   Paul Moore   [NetLabel]: audit...
707
  	struct netlbl_audit audit_info;
b1edeb102   Paul Moore   netlabel: Replace...
708
709
  	u32 skip_bkt = 0;
  	u32 skip_chain = 0;
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
710

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

95d4e6be2   Paul Moore   [NetLabel]: audit...
714
  	netlbl_netlink_auditinfo(skb, &audit_info);
6c2e8ac09   Paul Moore   netlabel: Update ...
715
  	cb_arg.doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]);
b1edeb102   Paul Moore   netlabel: Replace...
716
717
718
719
  	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 ...
720
  		ret_val = cipso_v4_doi_remove(cb_arg.doi, &audit_info);
b1edeb102   Paul Moore   netlabel: Replace...
721
722
723
  		if (ret_val == 0)
  			atomic_dec(&netlabel_mgmt_protocount);
  	}
95d4e6be2   Paul Moore   [NetLabel]: audit...
724

96cb8e331   Paul Moore   [NetLabel]: CIPSO...
725
726
727
728
729
730
  	return ret_val;
  }
  
  /*
   * NetLabel Generic NETLINK Command Definitions
   */
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
731
732
  static struct genl_ops netlbl_cipsov4_ops[] = {
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
733
  	.cmd = NLBL_CIPSOV4_C_ADD,
fd3858554   Paul Moore   [NetLabel]: rewor...
734
735
  	.flags = GENL_ADMIN_PERM,
  	.policy = netlbl_cipsov4_genl_policy,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
736
737
  	.doit = netlbl_cipsov4_add,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
738
739
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
740
  	.cmd = NLBL_CIPSOV4_C_REMOVE,
fd3858554   Paul Moore   [NetLabel]: rewor...
741
742
  	.flags = GENL_ADMIN_PERM,
  	.policy = netlbl_cipsov4_genl_policy,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
743
744
  	.doit = netlbl_cipsov4_remove,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
745
746
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
747
748
  	.cmd = NLBL_CIPSOV4_C_LIST,
  	.flags = 0,
fd3858554   Paul Moore   [NetLabel]: rewor...
749
  	.policy = netlbl_cipsov4_genl_policy,
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
750
751
  	.doit = netlbl_cipsov4_list,
  	.dumpit = NULL,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
752
753
  	},
  	{
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
754
755
  	.cmd = NLBL_CIPSOV4_C_LISTALL,
  	.flags = 0,
fd3858554   Paul Moore   [NetLabel]: rewor...
756
757
758
  	.policy = netlbl_cipsov4_genl_policy,
  	.doit = NULL,
  	.dumpit = netlbl_cipsov4_listall,
227c43c3b   Pavel Emelyanov   [NETLABEL]: Shrin...
759
  	},
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
760
761
762
763
764
765
766
767
768
769
770
771
772
773
  };
  
  /*
   * 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 ...
774
  int __init netlbl_cipsov4_genl_init(void)
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
775
  {
7ae740df3   Michał Mirosław   netlabel: Use gen...
776
777
  	return genl_register_family_with_ops(&netlbl_cipsov4_gnl_family,
  		netlbl_cipsov4_ops, ARRAY_SIZE(netlbl_cipsov4_ops));
96cb8e331   Paul Moore   [NetLabel]: CIPSO...
778
  }