xref: /openbmc/linux/net/netlabel/netlabel_addrlist.h (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*1ccea77eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
261e10682SPaul Moore /*
361e10682SPaul Moore  * NetLabel Network Address Lists
461e10682SPaul Moore  *
561e10682SPaul Moore  * This file contains network address list functions used to manage ordered
661e10682SPaul Moore  * lists of network addresses for use by the NetLabel subsystem.  The NetLabel
761e10682SPaul Moore  * system manages static and dynamic label mappings for network protocols such
861e10682SPaul Moore  * as CIPSO and RIPSO.
961e10682SPaul Moore  *
1082c21bfaSPaul Moore  * Author: Paul Moore <paul@paul-moore.com>
1161e10682SPaul Moore  */
1261e10682SPaul Moore 
1361e10682SPaul Moore /*
1461e10682SPaul Moore  * (c) Copyright Hewlett-Packard Development Company, L.P., 2008
1561e10682SPaul Moore  */
1661e10682SPaul Moore 
1761e10682SPaul Moore #ifndef _NETLABEL_ADDRLIST_H
1861e10682SPaul Moore #define _NETLABEL_ADDRLIST_H
1961e10682SPaul Moore 
2061e10682SPaul Moore #include <linux/types.h>
2161e10682SPaul Moore #include <linux/rcupdate.h>
2261e10682SPaul Moore #include <linux/list.h>
2361e10682SPaul Moore #include <linux/in6.h>
2463c41688SPaul Moore #include <linux/audit.h>
2561e10682SPaul Moore 
2661e10682SPaul Moore /**
2761e10682SPaul Moore  * struct netlbl_af4list - NetLabel IPv4 address list
2861e10682SPaul Moore  * @addr: IPv4 address
2961e10682SPaul Moore  * @mask: IPv4 address mask
3061e10682SPaul Moore  * @valid: valid flag
3161e10682SPaul Moore  * @list: list structure, used internally
3261e10682SPaul Moore  */
3361e10682SPaul Moore struct netlbl_af4list {
3461e10682SPaul Moore 	__be32 addr;
3561e10682SPaul Moore 	__be32 mask;
3661e10682SPaul Moore 
3761e10682SPaul Moore 	u32 valid;
3861e10682SPaul Moore 	struct list_head list;
3961e10682SPaul Moore };
4061e10682SPaul Moore 
4161e10682SPaul Moore /**
4261e10682SPaul Moore  * struct netlbl_af6list - NetLabel IPv6 address list
4361e10682SPaul Moore  * @addr: IPv6 address
4461e10682SPaul Moore  * @mask: IPv6 address mask
4561e10682SPaul Moore  * @valid: valid flag
4661e10682SPaul Moore  * @list: list structure, used internally
4761e10682SPaul Moore  */
4861e10682SPaul Moore struct netlbl_af6list {
4961e10682SPaul Moore 	struct in6_addr addr;
5061e10682SPaul Moore 	struct in6_addr mask;
5161e10682SPaul Moore 
5261e10682SPaul Moore 	u32 valid;
5361e10682SPaul Moore 	struct list_head list;
5461e10682SPaul Moore };
5561e10682SPaul Moore 
5661e10682SPaul Moore #define __af4list_entry(ptr) container_of(ptr, struct netlbl_af4list, list)
5761e10682SPaul Moore 
__af4list_valid(struct list_head * s,struct list_head * h)5861e10682SPaul Moore static inline struct netlbl_af4list *__af4list_valid(struct list_head *s,
5961e10682SPaul Moore 						     struct list_head *h)
6061e10682SPaul Moore {
6161e10682SPaul Moore 	struct list_head *i = s;
6261e10682SPaul Moore 	struct netlbl_af4list *n = __af4list_entry(s);
6361e10682SPaul Moore 	while (i != h && !n->valid) {
6461e10682SPaul Moore 		i = i->next;
6561e10682SPaul Moore 		n = __af4list_entry(i);
6661e10682SPaul Moore 	}
6761e10682SPaul Moore 	return n;
6861e10682SPaul Moore }
6961e10682SPaul Moore 
__af4list_valid_rcu(struct list_head * s,struct list_head * h)7061e10682SPaul Moore static inline struct netlbl_af4list *__af4list_valid_rcu(struct list_head *s,
7161e10682SPaul Moore 							 struct list_head *h)
7261e10682SPaul Moore {
7361e10682SPaul Moore 	struct list_head *i = s;
7461e10682SPaul Moore 	struct netlbl_af4list *n = __af4list_entry(s);
7561e10682SPaul Moore 	while (i != h && !n->valid) {
7617e48577STim Hansen 		i = rcu_dereference(list_next_rcu(i));
7761e10682SPaul Moore 		n = __af4list_entry(i);
7861e10682SPaul Moore 	}
7961e10682SPaul Moore 	return n;
8061e10682SPaul Moore }
8161e10682SPaul Moore 
8261e10682SPaul Moore #define netlbl_af4list_foreach(iter, head)				\
8361e10682SPaul Moore 	for (iter = __af4list_valid((head)->next, head);		\
84a1e4891fSLinus Torvalds 	     &iter->list != (head);					\
8561e10682SPaul Moore 	     iter = __af4list_valid(iter->list.next, head))
8661e10682SPaul Moore 
8761e10682SPaul Moore #define netlbl_af4list_foreach_rcu(iter, head)				\
8861e10682SPaul Moore 	for (iter = __af4list_valid_rcu((head)->next, head);		\
89a1e4891fSLinus Torvalds 	     &iter->list != (head);					\
9061e10682SPaul Moore 	     iter = __af4list_valid_rcu(iter->list.next, head))
9161e10682SPaul Moore 
9261e10682SPaul Moore #define netlbl_af4list_foreach_safe(iter, tmp, head)			\
9361e10682SPaul Moore 	for (iter = __af4list_valid((head)->next, head),		\
9461e10682SPaul Moore 		     tmp = __af4list_valid(iter->list.next, head);	\
9561e10682SPaul Moore 	     &iter->list != (head);					\
9661e10682SPaul Moore 	     iter = tmp, tmp = __af4list_valid(iter->list.next, head))
9761e10682SPaul Moore 
9861e10682SPaul Moore int netlbl_af4list_add(struct netlbl_af4list *entry,
9961e10682SPaul Moore 		       struct list_head *head);
10061e10682SPaul Moore struct netlbl_af4list *netlbl_af4list_remove(__be32 addr, __be32 mask,
10161e10682SPaul Moore 					     struct list_head *head);
10261e10682SPaul Moore void netlbl_af4list_remove_entry(struct netlbl_af4list *entry);
10361e10682SPaul Moore struct netlbl_af4list *netlbl_af4list_search(__be32 addr,
10461e10682SPaul Moore 					     struct list_head *head);
10563c41688SPaul Moore struct netlbl_af4list *netlbl_af4list_search_exact(__be32 addr,
10663c41688SPaul Moore 						   __be32 mask,
10763c41688SPaul Moore 						   struct list_head *head);
10847b676c0SManish Katiyar 
10947b676c0SManish Katiyar #ifdef CONFIG_AUDIT
11063c41688SPaul Moore void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf,
11163c41688SPaul Moore 			       int src, const char *dev,
11263c41688SPaul Moore 			       __be32 addr, __be32 mask);
11347b676c0SManish Katiyar #else
netlbl_af4list_audit_addr(struct audit_buffer * audit_buf,int src,const char * dev,__be32 addr,__be32 mask)11447b676c0SManish Katiyar static inline void netlbl_af4list_audit_addr(struct audit_buffer *audit_buf,
11547b676c0SManish Katiyar 					     int src, const char *dev,
11647b676c0SManish Katiyar 					     __be32 addr, __be32 mask)
11747b676c0SManish Katiyar {
11847b676c0SManish Katiyar }
11947b676c0SManish Katiyar #endif
12061e10682SPaul Moore 
121dfd56b8bSEric Dumazet #if IS_ENABLED(CONFIG_IPV6)
12261e10682SPaul Moore 
12361e10682SPaul Moore #define __af6list_entry(ptr) container_of(ptr, struct netlbl_af6list, list)
12461e10682SPaul Moore 
__af6list_valid(struct list_head * s,struct list_head * h)12561e10682SPaul Moore static inline struct netlbl_af6list *__af6list_valid(struct list_head *s,
12661e10682SPaul Moore 						     struct list_head *h)
12761e10682SPaul Moore {
12861e10682SPaul Moore 	struct list_head *i = s;
12961e10682SPaul Moore 	struct netlbl_af6list *n = __af6list_entry(s);
13061e10682SPaul Moore 	while (i != h && !n->valid) {
13161e10682SPaul Moore 		i = i->next;
13261e10682SPaul Moore 		n = __af6list_entry(i);
13361e10682SPaul Moore 	}
13461e10682SPaul Moore 	return n;
13561e10682SPaul Moore }
13661e10682SPaul Moore 
__af6list_valid_rcu(struct list_head * s,struct list_head * h)13761e10682SPaul Moore static inline struct netlbl_af6list *__af6list_valid_rcu(struct list_head *s,
13861e10682SPaul Moore 							 struct list_head *h)
13961e10682SPaul Moore {
14061e10682SPaul Moore 	struct list_head *i = s;
14161e10682SPaul Moore 	struct netlbl_af6list *n = __af6list_entry(s);
14261e10682SPaul Moore 	while (i != h && !n->valid) {
14317e48577STim Hansen 		i = rcu_dereference(list_next_rcu(i));
14461e10682SPaul Moore 		n = __af6list_entry(i);
14561e10682SPaul Moore 	}
14661e10682SPaul Moore 	return n;
14761e10682SPaul Moore }
14861e10682SPaul Moore 
14961e10682SPaul Moore #define netlbl_af6list_foreach(iter, head)				\
15061e10682SPaul Moore 	for (iter = __af6list_valid((head)->next, head);		\
151a1e4891fSLinus Torvalds 	     &iter->list != (head);					\
15261e10682SPaul Moore 	     iter = __af6list_valid(iter->list.next, head))
15361e10682SPaul Moore 
15461e10682SPaul Moore #define netlbl_af6list_foreach_rcu(iter, head)				\
15561e10682SPaul Moore 	for (iter = __af6list_valid_rcu((head)->next, head);		\
156a1e4891fSLinus Torvalds 	     &iter->list != (head);					\
15761e10682SPaul Moore 	     iter = __af6list_valid_rcu(iter->list.next, head))
15861e10682SPaul Moore 
15961e10682SPaul Moore #define netlbl_af6list_foreach_safe(iter, tmp, head)			\
16061e10682SPaul Moore 	for (iter = __af6list_valid((head)->next, head),		\
16161e10682SPaul Moore 		     tmp = __af6list_valid(iter->list.next, head);	\
16261e10682SPaul Moore 	     &iter->list != (head);					\
16361e10682SPaul Moore 	     iter = tmp, tmp = __af6list_valid(iter->list.next, head))
16461e10682SPaul Moore 
16561e10682SPaul Moore int netlbl_af6list_add(struct netlbl_af6list *entry,
16661e10682SPaul Moore 		       struct list_head *head);
16761e10682SPaul Moore struct netlbl_af6list *netlbl_af6list_remove(const struct in6_addr *addr,
16861e10682SPaul Moore 					     const struct in6_addr *mask,
16961e10682SPaul Moore 					     struct list_head *head);
17061e10682SPaul Moore void netlbl_af6list_remove_entry(struct netlbl_af6list *entry);
17161e10682SPaul Moore struct netlbl_af6list *netlbl_af6list_search(const struct in6_addr *addr,
17261e10682SPaul Moore 					     struct list_head *head);
17363c41688SPaul Moore struct netlbl_af6list *netlbl_af6list_search_exact(const struct in6_addr *addr,
17463c41688SPaul Moore 						   const struct in6_addr *mask,
17563c41688SPaul Moore 						   struct list_head *head);
17647b676c0SManish Katiyar 
17747b676c0SManish Katiyar #ifdef CONFIG_AUDIT
17863c41688SPaul Moore void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
17963c41688SPaul Moore 			       int src,
18063c41688SPaul Moore 			       const char *dev,
18163c41688SPaul Moore 			       const struct in6_addr *addr,
18263c41688SPaul Moore 			       const struct in6_addr *mask);
18347b676c0SManish Katiyar #else
netlbl_af6list_audit_addr(struct audit_buffer * audit_buf,int src,const char * dev,const struct in6_addr * addr,const struct in6_addr * mask)18447b676c0SManish Katiyar static inline void netlbl_af6list_audit_addr(struct audit_buffer *audit_buf,
18547b676c0SManish Katiyar 					     int src,
18647b676c0SManish Katiyar 					     const char *dev,
18747b676c0SManish Katiyar 					     const struct in6_addr *addr,
18847b676c0SManish Katiyar 					     const struct in6_addr *mask)
18947b676c0SManish Katiyar {
19047b676c0SManish Katiyar }
19147b676c0SManish Katiyar #endif
19261e10682SPaul Moore #endif /* IPV6 */
19361e10682SPaul Moore 
19461e10682SPaul Moore #endif
195