Lines Matching +full:zero +full:- +full:based

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Author: Paul Moore <paul@paul-moore.com>
13 * (c) Copyright Hewlett-Packard Development Company, L.P., 2006
70 * netlbl_cipsov4_add_common - Parse the common sections of a ADD message
76 * in @doi_def. Returns zero on success, negative values on failure.
86 doi_def->doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); in netlbl_cipsov4_add_common()
88 if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_TAGLST], in netlbl_cipsov4_add_common()
92 return -EINVAL; in netlbl_cipsov4_add_common()
94 nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem) in netlbl_cipsov4_add_common()
97 return -EINVAL; in netlbl_cipsov4_add_common()
98 doi_def->tags[iter++] = nla_get_u8(nla); in netlbl_cipsov4_add_common()
101 doi_def->tags[iter++] = CIPSO_V4_TAG_INVALID; in netlbl_cipsov4_add_common()
111 * netlbl_cipsov4_add_std - Adds a CIPSO V4 DOI definition
116 * Create a new CIPSO_V4_MAP_TRANS DOI definition based on the given ADD
117 * message and add it to the CIPSO V4 engine. Return zero on success and
118 * non-zero on error.
124 int ret_val = -EINVAL; in netlbl_cipsov4_add_std()
132 if (!info->attrs[NLBL_CIPSOV4_A_TAGLST] || in netlbl_cipsov4_add_std()
133 !info->attrs[NLBL_CIPSOV4_A_MLSLVLLST]) in netlbl_cipsov4_add_std()
134 return -EINVAL; in netlbl_cipsov4_add_std()
136 if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], in netlbl_cipsov4_add_std()
140 return -EINVAL; in netlbl_cipsov4_add_std()
144 return -ENOMEM; in netlbl_cipsov4_add_std()
145 doi_def->map.std = kzalloc(sizeof(*doi_def->map.std), GFP_KERNEL); in netlbl_cipsov4_add_std()
146 if (doi_def->map.std == NULL) { in netlbl_cipsov4_add_std()
148 return -ENOMEM; in netlbl_cipsov4_add_std()
150 doi_def->type = CIPSO_V4_MAP_TRANS; in netlbl_cipsov4_add_std()
155 ret_val = -EINVAL; in netlbl_cipsov4_add_std()
158 info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], in netlbl_cipsov4_add_std()
173 doi_def->map.std->lvl.local_size) in netlbl_cipsov4_add_std()
174 doi_def->map.std->lvl.local_size = in netlbl_cipsov4_add_std()
182 doi_def->map.std->lvl.cipso_size) in netlbl_cipsov4_add_std()
183 doi_def->map.std->lvl.cipso_size = in netlbl_cipsov4_add_std()
188 doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size, in netlbl_cipsov4_add_std()
191 if (doi_def->map.std->lvl.local == NULL) { in netlbl_cipsov4_add_std()
192 ret_val = -ENOMEM; in netlbl_cipsov4_add_std()
195 doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size, in netlbl_cipsov4_add_std()
198 if (doi_def->map.std->lvl.cipso == NULL) { in netlbl_cipsov4_add_std()
199 ret_val = -ENOMEM; in netlbl_cipsov4_add_std()
202 for (iter = 0; iter < doi_def->map.std->lvl.local_size; iter++) in netlbl_cipsov4_add_std()
203 doi_def->map.std->lvl.local[iter] = CIPSO_V4_INV_LVL; in netlbl_cipsov4_add_std()
204 for (iter = 0; iter < doi_def->map.std->lvl.cipso_size; iter++) in netlbl_cipsov4_add_std()
205 doi_def->map.std->lvl.cipso[iter] = CIPSO_V4_INV_LVL; in netlbl_cipsov4_add_std()
207 info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], in netlbl_cipsov4_add_std()
219 doi_def->map.std->lvl.local[nla_get_u32(lvl_loc)] = in netlbl_cipsov4_add_std()
221 doi_def->map.std->lvl.cipso[nla_get_u32(lvl_rem)] = in netlbl_cipsov4_add_std()
225 if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) { in netlbl_cipsov4_add_std()
226 if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSCATLST], in netlbl_cipsov4_add_std()
233 info->attrs[NLBL_CIPSOV4_A_MLSCATLST], in netlbl_cipsov4_add_std()
248 doi_def->map.std->cat.local_size) in netlbl_cipsov4_add_std()
249 doi_def->map.std->cat.local_size = in netlbl_cipsov4_add_std()
257 doi_def->map.std->cat.cipso_size) in netlbl_cipsov4_add_std()
258 doi_def->map.std->cat.cipso_size = in netlbl_cipsov4_add_std()
263 doi_def->map.std->cat.local = kcalloc( in netlbl_cipsov4_add_std()
264 doi_def->map.std->cat.local_size, in netlbl_cipsov4_add_std()
267 if (doi_def->map.std->cat.local == NULL) { in netlbl_cipsov4_add_std()
268 ret_val = -ENOMEM; in netlbl_cipsov4_add_std()
271 doi_def->map.std->cat.cipso = kcalloc( in netlbl_cipsov4_add_std()
272 doi_def->map.std->cat.cipso_size, in netlbl_cipsov4_add_std()
275 if (doi_def->map.std->cat.cipso == NULL) { in netlbl_cipsov4_add_std()
276 ret_val = -ENOMEM; in netlbl_cipsov4_add_std()
279 for (iter = 0; iter < doi_def->map.std->cat.local_size; iter++) in netlbl_cipsov4_add_std()
280 doi_def->map.std->cat.local[iter] = CIPSO_V4_INV_CAT; in netlbl_cipsov4_add_std()
281 for (iter = 0; iter < doi_def->map.std->cat.cipso_size; iter++) in netlbl_cipsov4_add_std()
282 doi_def->map.std->cat.cipso[iter] = CIPSO_V4_INV_CAT; in netlbl_cipsov4_add_std()
284 info->attrs[NLBL_CIPSOV4_A_MLSCATLST], in netlbl_cipsov4_add_std()
296 doi_def->map.std->cat.local[ in netlbl_cipsov4_add_std()
299 doi_def->map.std->cat.cipso[ in netlbl_cipsov4_add_std()
316 * netlbl_cipsov4_add_pass - Adds a CIPSO V4 DOI definition
321 * Create a new CIPSO_V4_MAP_PASS DOI definition based on the given ADD message
322 * and add it to the CIPSO V4 engine. Return zero on success and non-zero on
332 if (!info->attrs[NLBL_CIPSOV4_A_TAGLST]) in netlbl_cipsov4_add_pass()
333 return -EINVAL; in netlbl_cipsov4_add_pass()
337 return -ENOMEM; in netlbl_cipsov4_add_pass()
338 doi_def->type = CIPSO_V4_MAP_PASS; in netlbl_cipsov4_add_pass()
355 * netlbl_cipsov4_add_local - Adds a CIPSO V4 DOI definition
360 * Create a new CIPSO_V4_MAP_LOCAL DOI definition based on the given ADD
361 * message and add it to the CIPSO V4 engine. Return zero on success and
362 * non-zero on error.
371 if (!info->attrs[NLBL_CIPSOV4_A_TAGLST]) in netlbl_cipsov4_add_local()
372 return -EINVAL; in netlbl_cipsov4_add_local()
376 return -ENOMEM; in netlbl_cipsov4_add_local()
377 doi_def->type = CIPSO_V4_MAP_LOCAL; in netlbl_cipsov4_add_local()
394 * netlbl_cipsov4_add - Handle an ADD message
399 * Create a new DOI definition based on the given ADD message and add it to the
400 * CIPSO V4 engine. Returns zero on success, negative values on failure.
406 int ret_val = -EINVAL; in netlbl_cipsov4_add()
409 if (!info->attrs[NLBL_CIPSOV4_A_DOI] || in netlbl_cipsov4_add()
410 !info->attrs[NLBL_CIPSOV4_A_MTYPE]) in netlbl_cipsov4_add()
411 return -EINVAL; in netlbl_cipsov4_add()
414 switch (nla_get_u32(info->attrs[NLBL_CIPSOV4_A_MTYPE])) { in netlbl_cipsov4_add()
432 * netlbl_cipsov4_list - Handle a LIST message
444 * give up and just send an error message. Returns zero on success and
460 if (!info->attrs[NLBL_CIPSOV4_A_DOI]) { in netlbl_cipsov4_list()
461 ret_val = -EINVAL; in netlbl_cipsov4_list()
468 ret_val = -ENOMEM; in netlbl_cipsov4_list()
474 ret_val = -ENOMEM; in netlbl_cipsov4_list()
478 doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); in netlbl_cipsov4_list()
483 ret_val = -EINVAL; in netlbl_cipsov4_list()
487 ret_val = nla_put_u32(ans_skb, NLBL_CIPSOV4_A_MTYPE, doi_def->type); in netlbl_cipsov4_list()
493 ret_val = -ENOMEM; in netlbl_cipsov4_list()
498 doi_def->tags[iter] != CIPSO_V4_TAG_INVALID; in netlbl_cipsov4_list()
502 doi_def->tags[iter]); in netlbl_cipsov4_list()
508 switch (doi_def->type) { in netlbl_cipsov4_list()
513 ret_val = -ENOMEM; in netlbl_cipsov4_list()
517 iter < doi_def->map.std->lvl.local_size; in netlbl_cipsov4_list()
519 if (doi_def->map.std->lvl.local[iter] == in netlbl_cipsov4_list()
526 ret_val = -ENOMEM; in netlbl_cipsov4_list()
536 doi_def->map.std->lvl.local[iter]); in netlbl_cipsov4_list()
546 ret_val = -ENOMEM; in netlbl_cipsov4_list()
550 iter < doi_def->map.std->cat.local_size; in netlbl_cipsov4_list()
552 if (doi_def->map.std->cat.local[iter] == in netlbl_cipsov4_list()
559 ret_val = -ENOMEM; in netlbl_cipsov4_list()
569 doi_def->map.std->cat.local[iter]); in netlbl_cipsov4_list()
585 /* XXX - this limit is a guesstimate */ in netlbl_cipsov4_list()
602 * netlbl_cipsov4_listall_cb - cipso_v4_doi_walk() callback for LISTALL
615 int ret_val = -ENOMEM; in netlbl_cipsov4_listall_cb()
619 data = genlmsg_put(cb_arg->skb, NETLINK_CB(cb_arg->nl_cb->skb).portid, in netlbl_cipsov4_listall_cb()
620 cb_arg->seq, &netlbl_cipsov4_gnl_family, in netlbl_cipsov4_listall_cb()
625 ret_val = nla_put_u32(cb_arg->skb, NLBL_CIPSOV4_A_DOI, doi_def->doi); in netlbl_cipsov4_listall_cb()
628 ret_val = nla_put_u32(cb_arg->skb, in netlbl_cipsov4_listall_cb()
630 doi_def->type); in netlbl_cipsov4_listall_cb()
634 genlmsg_end(cb_arg->skb, data); in netlbl_cipsov4_listall_cb()
638 genlmsg_cancel(cb_arg->skb, data); in netlbl_cipsov4_listall_cb()
643 * netlbl_cipsov4_listall - Handle a LISTALL message
649 * zero on success and negative values on error.
656 u32 doi_skip = cb->args[0]; in netlbl_cipsov4_listall()
660 cb_arg.seq = cb->nlh->nlmsg_seq; in netlbl_cipsov4_listall()
664 cb->args[0] = doi_skip; in netlbl_cipsov4_listall()
665 return skb->len; in netlbl_cipsov4_listall()
669 * netlbl_cipsov4_remove_cb - netlbl_cipsov4_remove() callback for REMOVE
676 * which are associated with the CIPSO DOI specified in @arg. Returns zero on
684 if (entry->def.type == NETLBL_NLTYPE_CIPSOV4 && in netlbl_cipsov4_remove_cb()
685 entry->def.cipso->doi == cb_arg->doi) in netlbl_cipsov4_remove_cb()
686 return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info); in netlbl_cipsov4_remove_cb()
692 * netlbl_cipsov4_remove - Handle a REMOVE message
698 * zero on success, negative values on failure.
703 int ret_val = -EINVAL; in netlbl_cipsov4_remove()
709 if (!info->attrs[NLBL_CIPSOV4_A_DOI]) in netlbl_cipsov4_remove()
710 return -EINVAL; in netlbl_cipsov4_remove()
713 cb_arg.doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); in netlbl_cipsov4_remove()
717 if (ret_val == 0 || ret_val == -ENOENT) { in netlbl_cipsov4_remove()
778 * netlbl_cipsov4_genl_init - Register the CIPSOv4 NetLabel component
782 * mechanism. Returns zero on success, negative values on failure.