diff options
Diffstat (limited to 'net/tipc/bcast.h')
| -rw-r--r-- | net/tipc/bcast.h | 117 |
1 files changed, 7 insertions, 110 deletions
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index 4c1771e95c99..e8c2b81658c7 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h | |||
| @@ -72,41 +72,11 @@ struct tipc_node; | |||
| 72 | 72 | ||
| 73 | extern const char tipc_bclink_name[]; | 73 | extern const char tipc_bclink_name[]; |
| 74 | 74 | ||
| 75 | void tipc_nmap_add(struct tipc_node_map *nm_ptr, u32 node); | ||
| 76 | void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node); | ||
| 75 | 77 | ||
| 76 | /** | 78 | /** |
| 77 | * nmap_add - add a node to a node map | 79 | * tipc_nmap_equal - test for equality of node maps |
| 78 | */ | ||
| 79 | |||
| 80 | static inline void tipc_nmap_add(struct tipc_node_map *nm_ptr, u32 node) | ||
| 81 | { | ||
| 82 | int n = tipc_node(node); | ||
| 83 | int w = n / WSIZE; | ||
| 84 | u32 mask = (1 << (n % WSIZE)); | ||
| 85 | |||
| 86 | if ((nm_ptr->map[w] & mask) == 0) { | ||
| 87 | nm_ptr->count++; | ||
| 88 | nm_ptr->map[w] |= mask; | ||
| 89 | } | ||
| 90 | } | ||
| 91 | |||
| 92 | /** | ||
| 93 | * nmap_remove - remove a node from a node map | ||
| 94 | */ | ||
| 95 | |||
| 96 | static inline void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node) | ||
| 97 | { | ||
| 98 | int n = tipc_node(node); | ||
| 99 | int w = n / WSIZE; | ||
| 100 | u32 mask = (1 << (n % WSIZE)); | ||
| 101 | |||
| 102 | if ((nm_ptr->map[w] & mask) != 0) { | ||
| 103 | nm_ptr->map[w] &= ~mask; | ||
| 104 | nm_ptr->count--; | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 108 | /** | ||
| 109 | * nmap_equal - test for equality of node maps | ||
| 110 | */ | 80 | */ |
| 111 | 81 | ||
| 112 | static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b) | 82 | static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b) |
| @@ -114,84 +84,11 @@ static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_m | |||
| 114 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); | 84 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); |
| 115 | } | 85 | } |
| 116 | 86 | ||
| 117 | /** | 87 | void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, |
| 118 | * nmap_diff - find differences between node maps | 88 | struct tipc_node_map *nm_diff); |
| 119 | * @nm_a: input node map A | ||
| 120 | * @nm_b: input node map B | ||
| 121 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) | ||
| 122 | */ | ||
| 123 | |||
| 124 | static inline void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, | ||
| 125 | struct tipc_node_map *nm_diff) | ||
| 126 | { | ||
| 127 | int stop = ARRAY_SIZE(nm_a->map); | ||
| 128 | int w; | ||
| 129 | int b; | ||
| 130 | u32 map; | ||
| 131 | |||
| 132 | memset(nm_diff, 0, sizeof(*nm_diff)); | ||
| 133 | for (w = 0; w < stop; w++) { | ||
| 134 | map = nm_a->map[w] ^ (nm_a->map[w] & nm_b->map[w]); | ||
| 135 | nm_diff->map[w] = map; | ||
| 136 | if (map != 0) { | ||
| 137 | for (b = 0 ; b < WSIZE; b++) { | ||
| 138 | if (map & (1 << b)) | ||
| 139 | nm_diff->count++; | ||
| 140 | } | ||
| 141 | } | ||
| 142 | } | ||
| 143 | } | ||
| 144 | |||
| 145 | /** | ||
| 146 | * port_list_add - add a port to a port list, ensuring no duplicates | ||
| 147 | */ | ||
| 148 | |||
| 149 | static inline void tipc_port_list_add(struct port_list *pl_ptr, u32 port) | ||
| 150 | { | ||
| 151 | struct port_list *item = pl_ptr; | ||
| 152 | int i; | ||
| 153 | int item_sz = PLSIZE; | ||
| 154 | int cnt = pl_ptr->count; | ||
| 155 | |||
| 156 | for (; ; cnt -= item_sz, item = item->next) { | ||
| 157 | if (cnt < PLSIZE) | ||
| 158 | item_sz = cnt; | ||
| 159 | for (i = 0; i < item_sz; i++) | ||
| 160 | if (item->ports[i] == port) | ||
| 161 | return; | ||
| 162 | if (i < PLSIZE) { | ||
| 163 | item->ports[i] = port; | ||
| 164 | pl_ptr->count++; | ||
| 165 | return; | ||
| 166 | } | ||
| 167 | if (!item->next) { | ||
| 168 | item->next = kmalloc(sizeof(*item), GFP_ATOMIC); | ||
| 169 | if (!item->next) { | ||
| 170 | warn("Incomplete multicast delivery, no memory\n"); | ||
| 171 | return; | ||
| 172 | } | ||
| 173 | item->next->next = NULL; | ||
| 174 | } | ||
| 175 | } | ||
| 176 | } | ||
| 177 | |||
| 178 | /** | ||
| 179 | * port_list_free - free dynamically created entries in port_list chain | ||
| 180 | * | ||
| 181 | * Note: First item is on stack, so it doesn't need to be released | ||
| 182 | */ | ||
| 183 | |||
| 184 | static inline void tipc_port_list_free(struct port_list *pl_ptr) | ||
| 185 | { | ||
| 186 | struct port_list *item; | ||
| 187 | struct port_list *next; | ||
| 188 | |||
| 189 | for (item = pl_ptr->next; item; item = next) { | ||
| 190 | next = item->next; | ||
| 191 | kfree(item); | ||
| 192 | } | ||
| 193 | } | ||
| 194 | 89 | ||
| 90 | void tipc_port_list_add(struct port_list *pl_ptr, u32 port); | ||
| 91 | void tipc_port_list_free(struct port_list *pl_ptr); | ||
| 195 | 92 | ||
| 196 | int tipc_bclink_init(void); | 93 | int tipc_bclink_init(void); |
| 197 | void tipc_bclink_stop(void); | 94 | void tipc_bclink_stop(void); |
