2019-05-19 16:51:43 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2006-08-04 03:48:37 +04: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 15:10:33 +04:00
* Author : Paul Moore < paul @ paul - moore . com >
2006-08-04 03:48:37 +04:00
*/
/*
2008-10-10 18:16:32 +04:00
* ( c ) Copyright Hewlett - Packard Development Company , L . P . , 2006 , 2008
2006-08-04 03:48:37 +04:00
*/
# ifndef _NETLABEL_DOMAINHASH_H
# define _NETLABEL_DOMAINHASH_H
2006-08-30 04:56:04 +04:00
# include <linux/types.h>
# include <linux/rcupdate.h>
# include <linux/list.h>
2008-10-10 18:16:32 +04:00
# include "netlabel_addrlist.h"
2006-08-04 03:48:37 +04:00
/* Domain hash table size */
/* XXX - currently this number is an uneducated guess */
# define NETLBL_DOMHSH_BITSIZE 7
2008-10-10 18:16:32 +04:00
/* Domain mapping definition structures */
2013-08-02 22: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 22:02:49 +03:00
struct calipso_doi * calipso ;
2013-08-02 22:45:08 +04:00
} ;
} ;
2008-10-10 18: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 22:45:08 +04:00
struct netlbl_dommap_def def ;
2008-10-10 18: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 22:45:08 +04:00
struct netlbl_dommap_def def ;
2008-10-10 18:16:32 +04:00
struct netlbl_af6list list ;
} ;
2013-08-02 22:45:08 +04:00
2006-08-04 03:48:37 +04:00
struct netlbl_dom_map {
char * domain ;
2016-06-27 22:02:46 +03:00
u16 family ;
2013-08-02 22:45:08 +04:00
struct netlbl_dommap_def def ;
2006-08-04 03:48:37 +04: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-30 04:05:05 +04: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 18:16:31 +04:00
int netlbl_domhsh_remove_entry ( struct netlbl_dom_map * entry ,
struct netlbl_audit * audit_info ) ;
2008-12-31 20:54:11 +03: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 22:06:18 +03: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 22:02:46 +03: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 22: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 22:06:18 +03: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 22:45:08 +04:00
# endif /* IPv6 */
2006-09-26 02:56:09 +04: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-04 03:48:37 +04:00
# endif