2006-08-03 16:48:37 -07:00
/*
* NetLabel Domain Hash Table
*
* This file manages the domain hash table that NetLabel uses to determine
* which network labeling protocol to use for a given domain . The NetLabel
* system manages static and dynamic label mappings for network protocols such
* as CIPSO and RIPSO .
*
2011-08-01 11:10:33 +00:00
* Author : Paul Moore < paul @ paul - moore . com >
2006-08-03 16:48:37 -07:00
*
*/
/*
2008-10-10 10:16:32 -04:00
* ( c ) Copyright Hewlett - Packard Development Company , L . P . , 2006 , 2008
2006-08-03 16:48:37 -07:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See
* the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2013-12-06 09:13:41 -08:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2006-08-03 16:48:37 -07:00
*
*/
# ifndef _NETLABEL_DOMAINHASH_H
# define _NETLABEL_DOMAINHASH_H
2006-08-29 17:56:04 -07:00
# include <linux/types.h>
# include <linux/rcupdate.h>
# include <linux/list.h>
2008-10-10 10:16:32 -04:00
# include "netlabel_addrlist.h"
2006-08-03 16:48:37 -07:00
/* Domain hash table size */
/* XXX - currently this number is an uneducated guess */
# define NETLBL_DOMHSH_BITSIZE 7
2008-10-10 10:16:32 -04:00
/* Domain mapping definition structures */
2013-08-02 14:45:08 -04:00
struct netlbl_domaddr_map {
struct list_head list4 ;
struct list_head list6 ;
} ;
struct netlbl_dommap_def {
u32 type ;
union {
struct netlbl_domaddr_map * addrsel ;
struct cipso_v4_doi * cipso ;
2016-06-27 15:02:49 -04:00
struct calipso_doi * calipso ;
2013-08-02 14:45:08 -04:00
} ;
} ;
2008-10-10 10:16:32 -04:00
# define netlbl_domhsh_addr4_entry(iter) \
container_of ( iter , struct netlbl_domaddr4_map , list )
struct netlbl_domaddr4_map {
2013-08-02 14:45:08 -04:00
struct netlbl_dommap_def def ;
2008-10-10 10:16:32 -04:00
struct netlbl_af4list list ;
} ;
# define netlbl_domhsh_addr6_entry(iter) \
container_of ( iter , struct netlbl_domaddr6_map , list )
struct netlbl_domaddr6_map {
2013-08-02 14:45:08 -04:00
struct netlbl_dommap_def def ;
2008-10-10 10:16:32 -04:00
struct netlbl_af6list list ;
} ;
2013-08-02 14:45:08 -04:00
2006-08-03 16:48:37 -07:00
struct netlbl_dom_map {
char * domain ;
2016-06-27 15:02:46 -04:00
u16 family ;
2013-08-02 14:45:08 -04:00
struct netlbl_dommap_def def ;
2006-08-03 16:48:37 -07:00
u32 valid ;
struct list_head list ;
struct rcu_head rcu ;
} ;
/* init function */
int netlbl_domhsh_init ( u32 size ) ;
/* Manipulate the domain hash table */
2006-09-29 17:05:05 -07:00
int netlbl_domhsh_add ( struct netlbl_dom_map * entry ,
struct netlbl_audit * audit_info ) ;
int netlbl_domhsh_add_default ( struct netlbl_dom_map * entry ,
struct netlbl_audit * audit_info ) ;
2008-10-10 10:16:31 -04:00
int netlbl_domhsh_remove_entry ( struct netlbl_dom_map * entry ,
struct netlbl_audit * audit_info ) ;
2008-12-31 12:54:11 -05:00
int netlbl_domhsh_remove_af4 ( const char * domain ,
const struct in_addr * addr ,
const struct in_addr * mask ,
struct netlbl_audit * audit_info ) ;
2016-06-27 15:06:18 -04:00
int netlbl_domhsh_remove_af6 ( const char * domain ,
const struct in6_addr * addr ,
const struct in6_addr * mask ,
struct netlbl_audit * audit_info ) ;
2016-06-27 15:02:46 -04:00
int netlbl_domhsh_remove ( const char * domain , u16 family ,
struct netlbl_audit * audit_info ) ;
int netlbl_domhsh_remove_default ( u16 family , struct netlbl_audit * audit_info ) ;
struct netlbl_dom_map * netlbl_domhsh_getentry ( const char * domain , u16 family ) ;
2013-08-02 14:45:08 -04:00
struct netlbl_dommap_def * netlbl_domhsh_getentry_af4 ( const char * domain ,
__be32 addr ) ;
# if IS_ENABLED(CONFIG_IPV6)
struct netlbl_dommap_def * netlbl_domhsh_getentry_af6 ( const char * domain ,
const struct in6_addr * addr ) ;
2016-06-27 15:06:18 -04:00
int netlbl_domhsh_remove_af6 ( const char * domain ,
const struct in6_addr * addr ,
const struct in6_addr * mask ,
struct netlbl_audit * audit_info ) ;
2013-08-02 14:45:08 -04:00
# endif /* IPv6 */
2006-09-25 15:56:09 -07:00
int netlbl_domhsh_walk ( u32 * skip_bkt ,
u32 * skip_chain ,
int ( * callback ) ( struct netlbl_dom_map * entry , void * arg ) ,
void * cb_arg ) ;
2006-08-03 16:48:37 -07:00
# endif