2008-10-10 18:16:32 +04:00
/*
* NetLabel Network Address Lists
*
* This file contains network address list functions used to manage ordered
* lists of network addresses for use by the NetLabel subsystem . 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 >
2008-10-10 18:16:32 +04:00
*
*/
/*
* ( c ) Copyright Hewlett - Packard Development Company , L . P . , 2008
*
* 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 21:13:41 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2008-10-10 18:16:32 +04:00
*
*/
# ifndef _NETLABEL_ADDRLIST_H
# define _NETLABEL_ADDRLIST_H
# include <linux/types.h>
# include <linux/rcupdate.h>
# include <linux/list.h>
# include <linux/in6.h>
2008-10-10 18:16:32 +04:00
# include <linux/audit.h>
2008-10-10 18:16:32 +04:00
/**
* struct netlbl_af4list - NetLabel IPv4 address list
* @ addr : IPv4 address
* @ mask : IPv4 address mask
* @ valid : valid flag
* @ list : list structure , used internally
*/
struct netlbl_af4list {
__be32 addr ;
__be32 mask ;
u32 valid ;
struct list_head list ;
} ;
/**
* struct netlbl_af6list - NetLabel IPv6 address list
* @ addr : IPv6 address
* @ mask : IPv6 address mask
* @ valid : valid flag
* @ list : list structure , used internally
*/
struct netlbl_af6list {
struct in6_addr addr ;
struct in6_addr mask ;
u32 valid ;
struct list_head list ;
} ;
# define __af4list_entry(ptr) container_of(ptr, struct netlbl_af4list, list)
static inline struct netlbl_af4list * __af4list_valid ( struct list_head * s ,
struct list_head * h )
{
struct list_head * i = s ;
struct netlbl_af4list * n = __af4list_entry ( s ) ;
while ( i ! = h & & ! n - > valid ) {
i = i - > next ;
n = __af4list_entry ( i ) ;
}
return n ;
}
static inline struct netlbl_af4list * __af4list_valid_rcu ( struct list_head * s ,
struct list_head * h )
{
struct list_head * i = s ;
struct netlbl_af4list * n = __af4list_entry ( s ) ;
while ( i ! = h & & ! n - > valid ) {
2017-11-16 20:03:34 +03:00
i = rcu_dereference ( list_next_rcu ( i ) ) ;
2008-10-10 18:16:32 +04:00
n = __af4list_entry ( i ) ;
}
return n ;
}
# define netlbl_af4list_foreach(iter, head) \
for ( iter = __af4list_valid ( ( head ) - > next , head ) ; \
2011-05-23 03:51:43 +04:00
& iter - > list ! = ( head ) ; \
2008-10-10 18:16:32 +04:00
iter = __af4list_valid ( iter - > list . next , head ) )
# define netlbl_af4list_foreach_rcu(iter, head) \
for ( iter = __af4list_valid_rcu ( ( head ) - > next , head ) ; \
2011-05-23 03:51:43 +04:00
& iter - > list ! = ( head ) ; \
2008-10-10 18:16:32 +04:00
iter = __af4list_valid_rcu ( iter - > list . next , head ) )
# define netlbl_af4list_foreach_safe(iter, tmp, head) \
for ( iter = __af4list_valid ( ( head ) - > next , head ) , \
tmp = __af4list_valid ( iter - > list . next , head ) ; \
& iter - > list ! = ( head ) ; \
iter = tmp , tmp = __af4list_valid ( iter - > list . next , head ) )
int netlbl_af4list_add ( struct netlbl_af4list * entry ,
struct list_head * head ) ;
struct netlbl_af4list * netlbl_af4list_remove ( __be32 addr , __be32 mask ,
struct list_head * head ) ;
void netlbl_af4list_remove_entry ( struct netlbl_af4list * entry ) ;
struct netlbl_af4list * netlbl_af4list_search ( __be32 addr ,
struct list_head * head ) ;
2008-10-10 18:16:32 +04:00
struct netlbl_af4list * netlbl_af4list_search_exact ( __be32 addr ,
__be32 mask ,
struct list_head * head ) ;
2008-10-30 17:44:48 +03:00
# ifdef CONFIG_AUDIT
2008-10-10 18:16:32 +04:00
void netlbl_af4list_audit_addr ( struct audit_buffer * audit_buf ,
int src , const char * dev ,
__be32 addr , __be32 mask ) ;
2008-10-30 17:44:48 +03:00
# else
static inline void netlbl_af4list_audit_addr ( struct audit_buffer * audit_buf ,
int src , const char * dev ,
__be32 addr , __be32 mask )
{
}
# endif
2008-10-10 18:16:32 +04:00
2011-12-10 13:48:31 +04:00
# if IS_ENABLED(CONFIG_IPV6)
2008-10-10 18:16:32 +04:00
# define __af6list_entry(ptr) container_of(ptr, struct netlbl_af6list, list)
static inline struct netlbl_af6list * __af6list_valid ( struct list_head * s ,
struct list_head * h )
{
struct list_head * i = s ;
struct netlbl_af6list * n = __af6list_entry ( s ) ;
while ( i ! = h & & ! n - > valid ) {
i = i - > next ;
n = __af6list_entry ( i ) ;
}
return n ;
}
static inline struct netlbl_af6list * __af6list_valid_rcu ( struct list_head * s ,
struct list_head * h )
{
struct list_head * i = s ;
struct netlbl_af6list * n = __af6list_entry ( s ) ;
while ( i ! = h & & ! n - > valid ) {
2017-11-16 20:03:34 +03:00
i = rcu_dereference ( list_next_rcu ( i ) ) ;
2008-10-10 18:16:32 +04:00
n = __af6list_entry ( i ) ;
}
return n ;
}
# define netlbl_af6list_foreach(iter, head) \
for ( iter = __af6list_valid ( ( head ) - > next , head ) ; \
2011-05-23 03:51:43 +04:00
& iter - > list ! = ( head ) ; \
2008-10-10 18:16:32 +04:00
iter = __af6list_valid ( iter - > list . next , head ) )
# define netlbl_af6list_foreach_rcu(iter, head) \
for ( iter = __af6list_valid_rcu ( ( head ) - > next , head ) ; \
2011-05-23 03:51:43 +04:00
& iter - > list ! = ( head ) ; \
2008-10-10 18:16:32 +04:00
iter = __af6list_valid_rcu ( iter - > list . next , head ) )
# define netlbl_af6list_foreach_safe(iter, tmp, head) \
for ( iter = __af6list_valid ( ( head ) - > next , head ) , \
tmp = __af6list_valid ( iter - > list . next , head ) ; \
& iter - > list ! = ( head ) ; \
iter = tmp , tmp = __af6list_valid ( iter - > list . next , head ) )
int netlbl_af6list_add ( struct netlbl_af6list * entry ,
struct list_head * head ) ;
struct netlbl_af6list * netlbl_af6list_remove ( const struct in6_addr * addr ,
const struct in6_addr * mask ,
struct list_head * head ) ;
void netlbl_af6list_remove_entry ( struct netlbl_af6list * entry ) ;
struct netlbl_af6list * netlbl_af6list_search ( const struct in6_addr * addr ,
struct list_head * head ) ;
2008-10-10 18:16:32 +04:00
struct netlbl_af6list * netlbl_af6list_search_exact ( const struct in6_addr * addr ,
const struct in6_addr * mask ,
struct list_head * head ) ;
2008-10-30 17:44:48 +03:00
# ifdef CONFIG_AUDIT
2008-10-10 18:16:32 +04:00
void netlbl_af6list_audit_addr ( struct audit_buffer * audit_buf ,
int src ,
const char * dev ,
const struct in6_addr * addr ,
const struct in6_addr * mask ) ;
2008-10-30 17:44:48 +03:00
# else
static inline void netlbl_af6list_audit_addr ( struct audit_buffer * audit_buf ,
int src ,
const char * dev ,
const struct in6_addr * addr ,
const struct in6_addr * mask )
{
}
# endif
2008-10-10 18:16:32 +04:00
# endif /* IPV6 */
# endif