plugin: dot_draw: readme: make it clear, that it only opens an IPv4-socket, so a...
[olsrd.git] / src / gateway_list.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
4  * IPv4 performance optimization (c) 2006, sven-ola(gmx.de)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef _GW_LIST_H
43 #define _GW_LIST_H
44
45 #ifdef __linux__
46
47 #include "gateway.h"
48 #include "common/list.h"
49 #include "kernel_tunnel.h"
50 #include <stdint.h>
51 #include <stdbool.h>
52 #include <assert.h>
53
54 /** Holds the list head and list administration */
55 struct gw_list {
56                 struct list_node head; /**< The (ordered) list of entries */
57                 uint8_t count_max; /**< The maximum number of entries in the list */
58                 uint8_t count; /**< The number of entries in the list */
59 };
60
61 /** A container for a gateway and its tunnel */
62 struct gw_container_entry {
63                 struct gateway_entry * gw; /**< the gateway entry */
64                 struct olsr_iptunnel_entry * tunnel; /**< the gateway tunnel */
65                 uint64_t path_cost; /**< the gateway path costs */
66                 struct list_node list_node; /**< the list node */
67 };
68
69 /** Cast from list_node to gw_container_entry */
70 LISTNODE2STRUCT(olsr_gw_list_node2entry, struct gw_container_entry, list_node);
71
72 /** Deletion safe macro for gateway list traversal (do not delete the previous or next node, current node is ok) */
73 #define OLSR_FOR_ALL_GWS(head, gw) {\
74   struct list_node * _list_node; \
75   struct list_node * _next_list_node; \
76   for (_list_node = (head)->next; _list_node != (head); _list_node = _next_list_node) { \
77     _next_list_node = _list_node->next; \
78     gw = olsr_gw_list_node2entry(_list_node);
79 #define OLSR_FOR_ALL_GWS_END(gw) }}
80
81 /**
82  * @param list a pointer to the list
83  * @return true when multiple gateways mode is enabled
84  */
85 static inline bool olsr_gw_list_isModeMulti(struct gw_list * list) {
86         assert(list);
87         return (list->count_max > 1);
88 }
89
90 void olsr_gw_list_init(struct gw_list * list, uint8_t count);
91 void olsr_gw_list_cleanup(struct gw_list * list);
92
93 /**
94  * @param list a pointer to the list
95  * @return true if the list is empty
96  */
97 static inline bool olsr_gw_list_empty(struct gw_list * list) {
98         assert(list);
99         return (list->count == 0);
100 }
101
102 /**
103  * @param list a pointer to the list
104  * @return true if the list is full
105  */
106 static inline bool olsr_gw_list_full(struct gw_list * list) {
107         assert(list);
108         return (list->count >= list->count_max);
109 }
110
111 /**
112  * Get the best entry that is on the list
113  *
114  * @param list a pointer to the list
115  * @return a pointer to the best entry, or NULL when the list is empty
116  */
117 static inline struct gw_container_entry * olsr_gw_list_get_best_entry(struct gw_list * list) {
118         assert(list);
119
120         if (olsr_gw_list_empty(list)) {
121                 return NULL;
122         }
123
124         /* get the best (first) entry of the list */
125         return olsr_gw_list_node2entry(list->head.next);
126 }
127
128 /**
129  * Get the worst entry that is on the list
130  *
131  * @param list a pointer to the list
132  * @return a pointer to the worst entry
133  */
134 static inline struct gw_container_entry * olsr_gw_list_get_worst_entry(struct gw_list * list) {
135         assert(list);
136
137         if (olsr_gw_list_empty(list)) {
138                 return NULL;
139         }
140
141         /* get the worst (last) entry of the list */
142         return olsr_gw_list_node2entry(list->head.prev);
143 }
144
145 struct gw_container_entry * olsr_gw_list_find(struct gw_list * list, struct gateway_entry * entry);
146 struct gw_container_entry * olsr_gw_list_add(struct gw_list * list, struct gw_container_entry * entry);
147 struct gw_container_entry * olsr_gw_list_update(struct gw_list * list, struct gw_container_entry * entry,
148                 uint64_t gw_path_cost);
149 struct gw_container_entry * olsr_gw_list_remove(struct gw_list * list, struct gw_container_entry * entry);
150
151 #endif /* __linux__ */
152 #endif /* _GW_LIST_H */