|
@@ -84,15 +84,15 @@ static void netlbl_domhsh_free_entry(struct rcu_head *entry)
|
|
|
#endif /* IPv6 */
|
|
|
|
|
|
ptr = container_of(entry, struct netlbl_dom_map, rcu);
|
|
|
- if (ptr->type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
+ if (ptr->def.type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
netlbl_af4list_foreach_safe(iter4, tmp4,
|
|
|
- &ptr->type_def.addrsel->list4) {
|
|
|
+ &ptr->def.addrsel->list4) {
|
|
|
netlbl_af4list_remove_entry(iter4);
|
|
|
kfree(netlbl_domhsh_addr4_entry(iter4));
|
|
|
}
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
netlbl_af6list_foreach_safe(iter6, tmp6,
|
|
|
- &ptr->type_def.addrsel->list6) {
|
|
|
+ &ptr->def.addrsel->list6) {
|
|
|
netlbl_af6list_remove_entry(iter6);
|
|
|
kfree(netlbl_domhsh_addr6_entry(iter6));
|
|
|
}
|
|
@@ -213,21 +213,21 @@ static void netlbl_domhsh_audit_add(struct netlbl_dom_map *entry,
|
|
|
if (addr4 != NULL) {
|
|
|
struct netlbl_domaddr4_map *map4;
|
|
|
map4 = netlbl_domhsh_addr4_entry(addr4);
|
|
|
- type = map4->type;
|
|
|
- cipsov4 = map4->type_def.cipsov4;
|
|
|
+ type = map4->def.type;
|
|
|
+ cipsov4 = map4->def.cipso;
|
|
|
netlbl_af4list_audit_addr(audit_buf, 0, NULL,
|
|
|
addr4->addr, addr4->mask);
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
} else if (addr6 != NULL) {
|
|
|
struct netlbl_domaddr6_map *map6;
|
|
|
map6 = netlbl_domhsh_addr6_entry(addr6);
|
|
|
- type = map6->type;
|
|
|
+ type = map6->def.type;
|
|
|
netlbl_af6list_audit_addr(audit_buf, 0, NULL,
|
|
|
&addr6->addr, &addr6->mask);
|
|
|
#endif /* IPv6 */
|
|
|
} else {
|
|
|
- type = entry->type;
|
|
|
- cipsov4 = entry->type_def.cipsov4;
|
|
|
+ type = entry->def.type;
|
|
|
+ cipsov4 = entry->def.cipso;
|
|
|
}
|
|
|
switch (type) {
|
|
|
case NETLBL_NLTYPE_UNLABELED:
|
|
@@ -265,26 +265,25 @@ static int netlbl_domhsh_validate(const struct netlbl_dom_map *entry)
|
|
|
if (entry == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- switch (entry->type) {
|
|
|
+ switch (entry->def.type) {
|
|
|
case NETLBL_NLTYPE_UNLABELED:
|
|
|
- if (entry->type_def.cipsov4 != NULL ||
|
|
|
- entry->type_def.addrsel != NULL)
|
|
|
+ if (entry->def.cipso != NULL || entry->def.addrsel != NULL)
|
|
|
return -EINVAL;
|
|
|
break;
|
|
|
case NETLBL_NLTYPE_CIPSOV4:
|
|
|
- if (entry->type_def.cipsov4 == NULL)
|
|
|
+ if (entry->def.cipso == NULL)
|
|
|
return -EINVAL;
|
|
|
break;
|
|
|
case NETLBL_NLTYPE_ADDRSELECT:
|
|
|
- netlbl_af4list_foreach(iter4, &entry->type_def.addrsel->list4) {
|
|
|
+ netlbl_af4list_foreach(iter4, &entry->def.addrsel->list4) {
|
|
|
map4 = netlbl_domhsh_addr4_entry(iter4);
|
|
|
- switch (map4->type) {
|
|
|
+ switch (map4->def.type) {
|
|
|
case NETLBL_NLTYPE_UNLABELED:
|
|
|
- if (map4->type_def.cipsov4 != NULL)
|
|
|
+ if (map4->def.cipso != NULL)
|
|
|
return -EINVAL;
|
|
|
break;
|
|
|
case NETLBL_NLTYPE_CIPSOV4:
|
|
|
- if (map4->type_def.cipsov4 == NULL)
|
|
|
+ if (map4->def.cipso == NULL)
|
|
|
return -EINVAL;
|
|
|
break;
|
|
|
default:
|
|
@@ -292,9 +291,9 @@ static int netlbl_domhsh_validate(const struct netlbl_dom_map *entry)
|
|
|
}
|
|
|
}
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
- netlbl_af6list_foreach(iter6, &entry->type_def.addrsel->list6) {
|
|
|
+ netlbl_af6list_foreach(iter6, &entry->def.addrsel->list6) {
|
|
|
map6 = netlbl_domhsh_addr6_entry(iter6);
|
|
|
- switch (map6->type) {
|
|
|
+ switch (map6->def.type) {
|
|
|
case NETLBL_NLTYPE_UNLABELED:
|
|
|
break;
|
|
|
default:
|
|
@@ -402,32 +401,31 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
|
|
|
rcu_assign_pointer(netlbl_domhsh_def, entry);
|
|
|
}
|
|
|
|
|
|
- if (entry->type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
+ if (entry->def.type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
netlbl_af4list_foreach_rcu(iter4,
|
|
|
- &entry->type_def.addrsel->list4)
|
|
|
+ &entry->def.addrsel->list4)
|
|
|
netlbl_domhsh_audit_add(entry, iter4, NULL,
|
|
|
ret_val, audit_info);
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
netlbl_af6list_foreach_rcu(iter6,
|
|
|
- &entry->type_def.addrsel->list6)
|
|
|
+ &entry->def.addrsel->list6)
|
|
|
netlbl_domhsh_audit_add(entry, NULL, iter6,
|
|
|
ret_val, audit_info);
|
|
|
#endif /* IPv6 */
|
|
|
} else
|
|
|
netlbl_domhsh_audit_add(entry, NULL, NULL,
|
|
|
ret_val, audit_info);
|
|
|
- } else if (entry_old->type == NETLBL_NLTYPE_ADDRSELECT &&
|
|
|
- entry->type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
+ } else if (entry_old->def.type == NETLBL_NLTYPE_ADDRSELECT &&
|
|
|
+ entry->def.type == NETLBL_NLTYPE_ADDRSELECT) {
|
|
|
struct list_head *old_list4;
|
|
|
struct list_head *old_list6;
|
|
|
|
|
|
- old_list4 = &entry_old->type_def.addrsel->list4;
|
|
|
- old_list6 = &entry_old->type_def.addrsel->list6;
|
|
|
+ old_list4 = &entry_old->def.addrsel->list4;
|
|
|
+ old_list6 = &entry_old->def.addrsel->list6;
|
|
|
|
|
|
/* we only allow the addition of address selectors if all of
|
|
|
* the selectors do not exist in the existing domain map */
|
|
|
- netlbl_af4list_foreach_rcu(iter4,
|
|
|
- &entry->type_def.addrsel->list4)
|
|
|
+ netlbl_af4list_foreach_rcu(iter4, &entry->def.addrsel->list4)
|
|
|
if (netlbl_af4list_search_exact(iter4->addr,
|
|
|
iter4->mask,
|
|
|
old_list4)) {
|
|
@@ -435,8 +433,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
|
|
|
goto add_return;
|
|
|
}
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
- netlbl_af6list_foreach_rcu(iter6,
|
|
|
- &entry->type_def.addrsel->list6)
|
|
|
+ netlbl_af6list_foreach_rcu(iter6, &entry->def.addrsel->list6)
|
|
|
if (netlbl_af6list_search_exact(&iter6->addr,
|
|
|
&iter6->mask,
|
|
|
old_list6)) {
|
|
@@ -446,7 +443,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
|
|
|
#endif /* IPv6 */
|
|
|
|
|
|
netlbl_af4list_foreach_safe(iter4, tmp4,
|
|
|
- &entry->type_def.addrsel->list4) {
|
|
|
+ &entry->def.addrsel->list4) {
|
|
|
netlbl_af4list_remove_entry(iter4);
|
|
|
iter4->valid = 1;
|
|
|
ret_val = netlbl_af4list_add(iter4, old_list4);
|
|
@@ -457,7 +454,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
|
|
|
}
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
netlbl_af6list_foreach_safe(iter6, tmp6,
|
|
|
- &entry->type_def.addrsel->list6) {
|
|
|
+ &entry->def.addrsel->list6) {
|
|
|
netlbl_af6list_remove_entry(iter6);
|
|
|
iter6->valid = 1;
|
|
|
ret_val = netlbl_af6list_add(iter6, old_list6);
|
|
@@ -538,18 +535,18 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map *entry,
|
|
|
struct netlbl_af4list *iter4;
|
|
|
struct netlbl_domaddr4_map *map4;
|
|
|
|
|
|
- switch (entry->type) {
|
|
|
+ switch (entry->def.type) {
|
|
|
case NETLBL_NLTYPE_ADDRSELECT:
|
|
|
netlbl_af4list_foreach_rcu(iter4,
|
|
|
- &entry->type_def.addrsel->list4) {
|
|
|
+ &entry->def.addrsel->list4) {
|
|
|
map4 = netlbl_domhsh_addr4_entry(iter4);
|
|
|
- cipso_v4_doi_putdef(map4->type_def.cipsov4);
|
|
|
+ cipso_v4_doi_putdef(map4->def.cipso);
|
|
|
}
|
|
|
/* no need to check the IPv6 list since we currently
|
|
|
* support only unlabeled protocols for IPv6 */
|
|
|
break;
|
|
|
case NETLBL_NLTYPE_CIPSOV4:
|
|
|
- cipso_v4_doi_putdef(entry->type_def.cipsov4);
|
|
|
+ cipso_v4_doi_putdef(entry->def.cipso);
|
|
|
break;
|
|
|
}
|
|
|
call_rcu(&entry->rcu, netlbl_domhsh_free_entry);
|
|
@@ -590,20 +587,21 @@ int netlbl_domhsh_remove_af4(const char *domain,
|
|
|
entry_map = netlbl_domhsh_search(domain);
|
|
|
else
|
|
|
entry_map = netlbl_domhsh_search_def(domain);
|
|
|
- if (entry_map == NULL || entry_map->type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
+ if (entry_map == NULL ||
|
|
|
+ entry_map->def.type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
goto remove_af4_failure;
|
|
|
|
|
|
spin_lock(&netlbl_domhsh_lock);
|
|
|
entry_addr = netlbl_af4list_remove(addr->s_addr, mask->s_addr,
|
|
|
- &entry_map->type_def.addrsel->list4);
|
|
|
+ &entry_map->def.addrsel->list4);
|
|
|
spin_unlock(&netlbl_domhsh_lock);
|
|
|
|
|
|
if (entry_addr == NULL)
|
|
|
goto remove_af4_failure;
|
|
|
- netlbl_af4list_foreach_rcu(iter4, &entry_map->type_def.addrsel->list4)
|
|
|
+ netlbl_af4list_foreach_rcu(iter4, &entry_map->def.addrsel->list4)
|
|
|
goto remove_af4_single_addr;
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
- netlbl_af6list_foreach_rcu(iter6, &entry_map->type_def.addrsel->list6)
|
|
|
+ netlbl_af6list_foreach_rcu(iter6, &entry_map->def.addrsel->list6)
|
|
|
goto remove_af4_single_addr;
|
|
|
#endif /* IPv6 */
|
|
|
/* the domain mapping is empty so remove it from the mapping table */
|
|
@@ -616,7 +614,7 @@ remove_af4_single_addr:
|
|
|
* shouldn't be a problem */
|
|
|
synchronize_rcu();
|
|
|
entry = netlbl_domhsh_addr4_entry(entry_addr);
|
|
|
- cipso_v4_doi_putdef(entry->type_def.cipsov4);
|
|
|
+ cipso_v4_doi_putdef(entry->def.cipso);
|
|
|
kfree(entry);
|
|
|
return 0;
|
|
|
|
|
@@ -693,8 +691,8 @@ struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain)
|
|
|
* responsible for ensuring that rcu_read_[un]lock() is called.
|
|
|
*
|
|
|
*/
|
|
|
-struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain,
|
|
|
- __be32 addr)
|
|
|
+struct netlbl_dommap_def *netlbl_domhsh_getentry_af4(const char *domain,
|
|
|
+ __be32 addr)
|
|
|
{
|
|
|
struct netlbl_dom_map *dom_iter;
|
|
|
struct netlbl_af4list *addr_iter;
|
|
@@ -702,15 +700,13 @@ struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain,
|
|
|
dom_iter = netlbl_domhsh_search_def(domain);
|
|
|
if (dom_iter == NULL)
|
|
|
return NULL;
|
|
|
- if (dom_iter->type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
- return NULL;
|
|
|
|
|
|
- addr_iter = netlbl_af4list_search(addr,
|
|
|
- &dom_iter->type_def.addrsel->list4);
|
|
|
+ if (dom_iter->def.type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
+ return &dom_iter->def;
|
|
|
+ addr_iter = netlbl_af4list_search(addr, &dom_iter->def.addrsel->list4);
|
|
|
if (addr_iter == NULL)
|
|
|
return NULL;
|
|
|
-
|
|
|
- return netlbl_domhsh_addr4_entry(addr_iter);
|
|
|
+ return &(netlbl_domhsh_addr4_entry(addr_iter)->def);
|
|
|
}
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
@@ -725,7 +721,7 @@ struct netlbl_domaddr4_map *netlbl_domhsh_getentry_af4(const char *domain,
|
|
|
* responsible for ensuring that rcu_read_[un]lock() is called.
|
|
|
*
|
|
|
*/
|
|
|
-struct netlbl_domaddr6_map *netlbl_domhsh_getentry_af6(const char *domain,
|
|
|
+struct netlbl_dommap_def *netlbl_domhsh_getentry_af6(const char *domain,
|
|
|
const struct in6_addr *addr)
|
|
|
{
|
|
|
struct netlbl_dom_map *dom_iter;
|
|
@@ -734,15 +730,13 @@ struct netlbl_domaddr6_map *netlbl_domhsh_getentry_af6(const char *domain,
|
|
|
dom_iter = netlbl_domhsh_search_def(domain);
|
|
|
if (dom_iter == NULL)
|
|
|
return NULL;
|
|
|
- if (dom_iter->type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
- return NULL;
|
|
|
|
|
|
- addr_iter = netlbl_af6list_search(addr,
|
|
|
- &dom_iter->type_def.addrsel->list6);
|
|
|
+ if (dom_iter->def.type != NETLBL_NLTYPE_ADDRSELECT)
|
|
|
+ return &dom_iter->def;
|
|
|
+ addr_iter = netlbl_af6list_search(addr, &dom_iter->def.addrsel->list6);
|
|
|
if (addr_iter == NULL)
|
|
|
return NULL;
|
|
|
-
|
|
|
- return netlbl_domhsh_addr6_entry(addr_iter);
|
|
|
+ return &(netlbl_domhsh_addr6_entry(addr_iter)->def);
|
|
|
}
|
|
|
#endif /* IPv6 */
|
|
|
|