18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * NetLabel Domain Hash Table 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This file manages the domain hash table that NetLabel uses to determine 68c2ecf20Sopenharmony_ci * which network labeling protocol to use for a given domain. The NetLabel 78c2ecf20Sopenharmony_ci * system manages static and dynamic label mappings for network protocols such 88c2ecf20Sopenharmony_ci * as CIPSO and RIPSO. 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * Author: Paul Moore <paul@paul-moore.com> 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* 148c2ecf20Sopenharmony_ci * (c) Copyright Hewlett-Packard Development Company, L.P., 2006, 2008 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#ifndef _NETLABEL_DOMAINHASH_H 188c2ecf20Sopenharmony_ci#define _NETLABEL_DOMAINHASH_H 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/types.h> 218c2ecf20Sopenharmony_ci#include <linux/rcupdate.h> 228c2ecf20Sopenharmony_ci#include <linux/list.h> 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include "netlabel_addrlist.h" 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci/* Domain hash table size */ 278c2ecf20Sopenharmony_ci/* XXX - currently this number is an uneducated guess */ 288c2ecf20Sopenharmony_ci#define NETLBL_DOMHSH_BITSIZE 7 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* Domain mapping definition structures */ 318c2ecf20Sopenharmony_cistruct netlbl_domaddr_map { 328c2ecf20Sopenharmony_ci struct list_head list4; 338c2ecf20Sopenharmony_ci struct list_head list6; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_cistruct netlbl_dommap_def { 368c2ecf20Sopenharmony_ci u32 type; 378c2ecf20Sopenharmony_ci union { 388c2ecf20Sopenharmony_ci struct netlbl_domaddr_map *addrsel; 398c2ecf20Sopenharmony_ci struct cipso_v4_doi *cipso; 408c2ecf20Sopenharmony_ci struct calipso_doi *calipso; 418c2ecf20Sopenharmony_ci }; 428c2ecf20Sopenharmony_ci}; 438c2ecf20Sopenharmony_ci#define netlbl_domhsh_addr4_entry(iter) \ 448c2ecf20Sopenharmony_ci container_of(iter, struct netlbl_domaddr4_map, list) 458c2ecf20Sopenharmony_cistruct netlbl_domaddr4_map { 468c2ecf20Sopenharmony_ci struct netlbl_dommap_def def; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci struct netlbl_af4list list; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci#define netlbl_domhsh_addr6_entry(iter) \ 518c2ecf20Sopenharmony_ci container_of(iter, struct netlbl_domaddr6_map, list) 528c2ecf20Sopenharmony_cistruct netlbl_domaddr6_map { 538c2ecf20Sopenharmony_ci struct netlbl_dommap_def def; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci struct netlbl_af6list list; 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistruct netlbl_dom_map { 598c2ecf20Sopenharmony_ci char *domain; 608c2ecf20Sopenharmony_ci u16 family; 618c2ecf20Sopenharmony_ci struct netlbl_dommap_def def; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci u32 valid; 648c2ecf20Sopenharmony_ci struct list_head list; 658c2ecf20Sopenharmony_ci struct rcu_head rcu; 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci/* init function */ 698c2ecf20Sopenharmony_ciint netlbl_domhsh_init(u32 size); 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* Manipulate the domain hash table */ 728c2ecf20Sopenharmony_ciint netlbl_domhsh_add(struct netlbl_dom_map *entry, 738c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 748c2ecf20Sopenharmony_ciint netlbl_domhsh_add_default(struct netlbl_dom_map *entry, 758c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 768c2ecf20Sopenharmony_ciint netlbl_domhsh_remove_entry(struct netlbl_dom_map *entry, 778c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 788c2ecf20Sopenharmony_ciint netlbl_domhsh_remove_af4(const char *domain, 798c2ecf20Sopenharmony_ci const struct in_addr *addr, 808c2ecf20Sopenharmony_ci const struct in_addr *mask, 818c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 828c2ecf20Sopenharmony_ciint netlbl_domhsh_remove_af6(const char *domain, 838c2ecf20Sopenharmony_ci const struct in6_addr *addr, 848c2ecf20Sopenharmony_ci const struct in6_addr *mask, 858c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 868c2ecf20Sopenharmony_ciint netlbl_domhsh_remove(const char *domain, u16 family, 878c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 888c2ecf20Sopenharmony_ciint netlbl_domhsh_remove_default(u16 family, struct netlbl_audit *audit_info); 898c2ecf20Sopenharmony_cistruct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain, u16 family); 908c2ecf20Sopenharmony_cistruct netlbl_dommap_def *netlbl_domhsh_getentry_af4(const char *domain, 918c2ecf20Sopenharmony_ci __be32 addr); 928c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_IPV6) 938c2ecf20Sopenharmony_cistruct netlbl_dommap_def *netlbl_domhsh_getentry_af6(const char *domain, 948c2ecf20Sopenharmony_ci const struct in6_addr *addr); 958c2ecf20Sopenharmony_ciint netlbl_domhsh_remove_af6(const char *domain, 968c2ecf20Sopenharmony_ci const struct in6_addr *addr, 978c2ecf20Sopenharmony_ci const struct in6_addr *mask, 988c2ecf20Sopenharmony_ci struct netlbl_audit *audit_info); 998c2ecf20Sopenharmony_ci#endif /* IPv6 */ 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ciint netlbl_domhsh_walk(u32 *skip_bkt, 1028c2ecf20Sopenharmony_ci u32 *skip_chain, 1038c2ecf20Sopenharmony_ci int (*callback) (struct netlbl_dom_map *entry, void *arg), 1048c2ecf20Sopenharmony_ci void *cb_arg); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci#endif 107