|
@@ -80,6 +80,11 @@ int netlbl_cfg_map_del(const char *domain,
|
|
|
case AF_INET:
|
|
|
return netlbl_domhsh_remove_af4(domain, addr, mask,
|
|
|
audit_info);
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+ case AF_INET6:
|
|
|
+ return netlbl_domhsh_remove_af6(domain, addr, mask,
|
|
|
+ audit_info);
|
|
|
+#endif /* IPv6 */
|
|
|
default:
|
|
|
return -EPFNOSUPPORT;
|
|
|
}
|
|
@@ -403,6 +408,139 @@ out_entry:
|
|
|
return ret_val;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * netlbl_cfg_calipso_add - Add a new CALIPSO DOI definition
|
|
|
+ * @doi_def: CALIPSO DOI definition
|
|
|
+ * @audit_info: NetLabel audit information
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Add a new CALIPSO DOI definition as defined by @doi_def. Returns zero on
|
|
|
+ * success and negative values on failure.
|
|
|
+ *
|
|
|
+ */
|
|
|
+int netlbl_cfg_calipso_add(struct calipso_doi *doi_def,
|
|
|
+ struct netlbl_audit *audit_info)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+ return calipso_doi_add(doi_def, audit_info);
|
|
|
+#else /* IPv6 */
|
|
|
+ return -ENOSYS;
|
|
|
+#endif /* IPv6 */
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * netlbl_cfg_calipso_del - Remove an existing CALIPSO DOI definition
|
|
|
+ * @doi: CALIPSO DOI
|
|
|
+ * @audit_info: NetLabel audit information
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Remove an existing CALIPSO DOI definition matching @doi. Returns zero on
|
|
|
+ * success and negative values on failure.
|
|
|
+ *
|
|
|
+ */
|
|
|
+void netlbl_cfg_calipso_del(u32 doi, struct netlbl_audit *audit_info)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+ calipso_doi_remove(doi, audit_info);
|
|
|
+#endif /* IPv6 */
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * netlbl_cfg_calipso_map_add - Add a new CALIPSO DOI mapping
|
|
|
+ * @doi: the CALIPSO DOI
|
|
|
+ * @domain: the domain mapping to add
|
|
|
+ * @addr: IP address
|
|
|
+ * @mask: IP address mask
|
|
|
+ * @audit_info: NetLabel audit information
|
|
|
+ *
|
|
|
+ * Description:
|
|
|
+ * Add a new NetLabel/LSM domain mapping for the given CALIPSO DOI to the
|
|
|
+ * NetLabel subsystem. A @domain value of NULL adds a new default domain
|
|
|
+ * mapping. Returns zero on success, negative values on failure.
|
|
|
+ *
|
|
|
+ */
|
|
|
+int netlbl_cfg_calipso_map_add(u32 doi,
|
|
|
+ const char *domain,
|
|
|
+ const struct in6_addr *addr,
|
|
|
+ const struct in6_addr *mask,
|
|
|
+ struct netlbl_audit *audit_info)
|
|
|
+{
|
|
|
+#if IS_ENABLED(CONFIG_IPV6)
|
|
|
+ int ret_val = -ENOMEM;
|
|
|
+ struct calipso_doi *doi_def;
|
|
|
+ struct netlbl_dom_map *entry;
|
|
|
+ struct netlbl_domaddr_map *addrmap = NULL;
|
|
|
+ struct netlbl_domaddr6_map *addrinfo = NULL;
|
|
|
+
|
|
|
+ doi_def = calipso_doi_getdef(doi);
|
|
|
+ if (doi_def == NULL)
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
|
|
|
+ if (entry == NULL)
|
|
|
+ goto out_entry;
|
|
|
+ entry->family = AF_INET6;
|
|
|
+ if (domain != NULL) {
|
|
|
+ entry->domain = kstrdup(domain, GFP_ATOMIC);
|
|
|
+ if (entry->domain == NULL)
|
|
|
+ goto out_domain;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (addr == NULL && mask == NULL) {
|
|
|
+ entry->def.calipso = doi_def;
|
|
|
+ entry->def.type = NETLBL_NLTYPE_CALIPSO;
|
|
|
+ } else if (addr != NULL && mask != NULL) {
|
|
|
+ addrmap = kzalloc(sizeof(*addrmap), GFP_ATOMIC);
|
|
|
+ if (addrmap == NULL)
|
|
|
+ goto out_addrmap;
|
|
|
+ INIT_LIST_HEAD(&addrmap->list4);
|
|
|
+ INIT_LIST_HEAD(&addrmap->list6);
|
|
|
+
|
|
|
+ addrinfo = kzalloc(sizeof(*addrinfo), GFP_ATOMIC);
|
|
|
+ if (addrinfo == NULL)
|
|
|
+ goto out_addrinfo;
|
|
|
+ addrinfo->def.calipso = doi_def;
|
|
|
+ addrinfo->def.type = NETLBL_NLTYPE_CALIPSO;
|
|
|
+ addrinfo->list.addr = *addr;
|
|
|
+ addrinfo->list.addr.s6_addr32[0] &= mask->s6_addr32[0];
|
|
|
+ addrinfo->list.addr.s6_addr32[1] &= mask->s6_addr32[1];
|
|
|
+ addrinfo->list.addr.s6_addr32[2] &= mask->s6_addr32[2];
|
|
|
+ addrinfo->list.addr.s6_addr32[3] &= mask->s6_addr32[3];
|
|
|
+ addrinfo->list.mask = *mask;
|
|
|
+ addrinfo->list.valid = 1;
|
|
|
+ ret_val = netlbl_af6list_add(&addrinfo->list, &addrmap->list6);
|
|
|
+ if (ret_val != 0)
|
|
|
+ goto cfg_calipso_map_add_failure;
|
|
|
+
|
|
|
+ entry->def.addrsel = addrmap;
|
|
|
+ entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
|
|
|
+ } else {
|
|
|
+ ret_val = -EINVAL;
|
|
|
+ goto out_addrmap;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret_val = netlbl_domhsh_add(entry, audit_info);
|
|
|
+ if (ret_val != 0)
|
|
|
+ goto cfg_calipso_map_add_failure;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+cfg_calipso_map_add_failure:
|
|
|
+ kfree(addrinfo);
|
|
|
+out_addrinfo:
|
|
|
+ kfree(addrmap);
|
|
|
+out_addrmap:
|
|
|
+ kfree(entry->domain);
|
|
|
+out_domain:
|
|
|
+ kfree(entry);
|
|
|
+out_entry:
|
|
|
+ calipso_doi_putdef(doi_def);
|
|
|
+ return ret_val;
|
|
|
+#else /* IPv6 */
|
|
|
+ return -ENOSYS;
|
|
|
+#endif /* IPv6 */
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Security Attribute Functions
|
|
|
*/
|