|
@@ -53,6 +53,12 @@ struct netlbl_calipso_doiwalk_arg {
|
|
|
u32 seq;
|
|
|
};
|
|
|
|
|
|
+/* Argument struct for netlbl_domhsh_walk() */
|
|
|
+struct netlbl_domhsh_walk_arg {
|
|
|
+ struct netlbl_audit *audit_info;
|
|
|
+ u32 doi;
|
|
|
+};
|
|
|
+
|
|
|
/* NetLabel Generic NETLINK CALIPSO family */
|
|
|
static struct genl_family netlbl_calipso_gnl_family = {
|
|
|
.id = GENL_ID_GENERATE,
|
|
@@ -257,6 +263,64 @@ static int netlbl_calipso_listall(struct sk_buff *skb,
|
|
|
return skb->len;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * netlbl_calipso_remove_cb - netlbl_calipso_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_calipso_remove() as the callback
|
|
|
+ * for the netlbl_domhsh_walk() function; it removes LSM domain map entries
|
|
|
+ * which are associated with the CALIPSO DOI specified in @arg. Returns zero on
|
|
|
+ * success, negative values on failure.
|
|
|
+ *
|
|
|
+ */
|
|
|
+static int netlbl_calipso_remove_cb(struct netlbl_dom_map *entry, void *arg)
|
|
|
+{
|
|
|
+ struct netlbl_domhsh_walk_arg *cb_arg = arg;
|
|
|
+
|
|
|
+ if (entry->def.type == NETLBL_NLTYPE_CALIPSO &&
|
|
|
+ entry->def.calipso->doi == cb_arg->doi)
|
|
|
+ return netlbl_domhsh_remove_entry(entry, cb_arg->audit_info);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * netlbl_calipso_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_calipso_remove(struct sk_buff *skb, struct genl_info *info)
|
|
|
+{
|
|
|
+ int ret_val = -EINVAL;
|
|
|
+ struct netlbl_domhsh_walk_arg cb_arg;
|
|
|
+ struct netlbl_audit audit_info;
|
|
|
+ u32 skip_bkt = 0;
|
|
|
+ u32 skip_chain = 0;
|
|
|
+
|
|
|
+ if (!info->attrs[NLBL_CALIPSO_A_DOI])
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ netlbl_netlink_auditinfo(skb, &audit_info);
|
|
|
+ cb_arg.doi = nla_get_u32(info->attrs[NLBL_CALIPSO_A_DOI]);
|
|
|
+ cb_arg.audit_info = &audit_info;
|
|
|
+ ret_val = netlbl_domhsh_walk(&skip_bkt, &skip_chain,
|
|
|
+ netlbl_calipso_remove_cb, &cb_arg);
|
|
|
+ if (ret_val == 0 || ret_val == -ENOENT) {
|
|
|
+ ret_val = calipso_doi_remove(cb_arg.doi, &audit_info);
|
|
|
+ if (ret_val == 0)
|
|
|
+ atomic_dec(&netlabel_mgmt_protocount);
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret_val;
|
|
|
+}
|
|
|
+
|
|
|
/* NetLabel Generic NETLINK Command Definitions
|
|
|
*/
|
|
|
|
|
@@ -269,6 +333,13 @@ static const struct genl_ops netlbl_calipso_ops[] = {
|
|
|
.dumpit = NULL,
|
|
|
},
|
|
|
{
|
|
|
+ .cmd = NLBL_CALIPSO_C_REMOVE,
|
|
|
+ .flags = GENL_ADMIN_PERM,
|
|
|
+ .policy = calipso_genl_policy,
|
|
|
+ .doit = netlbl_calipso_remove,
|
|
|
+ .dumpit = NULL,
|
|
|
+ },
|
|
|
+ {
|
|
|
.cmd = NLBL_CALIPSO_C_LIST,
|
|
|
.flags = 0,
|
|
|
.policy = calipso_genl_policy,
|
|
@@ -362,6 +433,27 @@ void calipso_doi_free(struct calipso_doi *doi_def)
|
|
|
ops->doi_free(doi_def);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * calipso_doi_remove - Remove an existing DOI from the CALIPSO protocol engine
|
|
|
+ * @doi: the DOI value
|
|
|
+ * @audit_secid: the LSM secid to use in the audit message
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Removes a DOI definition from the CALIPSO engine. The NetLabel routines will
|
|
|
+ * be called to release their own LSM domain mappings as well as our own
|
|
|
+ * domain list. Returns zero on success and negative values on failure.
|
|
|
+ *
|
|
|
+ */
|
|
|
+int calipso_doi_remove(u32 doi, struct netlbl_audit *audit_info)
|
|
|
+{
|
|
|
+ int ret_val = -ENOMSG;
|
|
|
+ const struct netlbl_calipso_ops *ops = netlbl_calipso_ops_get();
|
|
|
+
|
|
|
+ if (ops)
|
|
|
+ ret_val = ops->doi_remove(doi, audit_info);
|
|
|
+ return ret_val;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* calipso_doi_getdef - Returns a reference to a valid DOI definition
|
|
|
* @doi: the DOI value
|