diff options
-rw-r--r-- | net/tipc/bcast.c | 60 | ||||
-rw-r--r-- | net/tipc/bcast.h | 63 |
2 files changed, 64 insertions, 59 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index a8f22e78c3f3..1ee6424ef3e0 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -822,3 +822,63 @@ void tipc_bclink_stop(void) | |||
822 | spin_unlock_bh(&bc_lock); | 822 | spin_unlock_bh(&bc_lock); |
823 | } | 823 | } |
824 | 824 | ||
825 | |||
826 | /** | ||
827 | * tipc_nmap_add - add a node to a node map | ||
828 | */ | ||
829 | |||
830 | void tipc_nmap_add(struct tipc_node_map *nm_ptr, u32 node) | ||
831 | { | ||
832 | int n = tipc_node(node); | ||
833 | int w = n / WSIZE; | ||
834 | u32 mask = (1 << (n % WSIZE)); | ||
835 | |||
836 | if ((nm_ptr->map[w] & mask) == 0) { | ||
837 | nm_ptr->count++; | ||
838 | nm_ptr->map[w] |= mask; | ||
839 | } | ||
840 | } | ||
841 | |||
842 | /** | ||
843 | * tipc_nmap_remove - remove a node from a node map | ||
844 | */ | ||
845 | |||
846 | void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node) | ||
847 | { | ||
848 | int n = tipc_node(node); | ||
849 | int w = n / WSIZE; | ||
850 | u32 mask = (1 << (n % WSIZE)); | ||
851 | |||
852 | if ((nm_ptr->map[w] & mask) != 0) { | ||
853 | nm_ptr->map[w] &= ~mask; | ||
854 | nm_ptr->count--; | ||
855 | } | ||
856 | } | ||
857 | |||
858 | /** | ||
859 | * tipc_nmap_diff - find differences between node maps | ||
860 | * @nm_a: input node map A | ||
861 | * @nm_b: input node map B | ||
862 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) | ||
863 | */ | ||
864 | |||
865 | void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, | ||
866 | struct tipc_node_map *nm_diff) | ||
867 | { | ||
868 | int stop = ARRAY_SIZE(nm_a->map); | ||
869 | int w; | ||
870 | int b; | ||
871 | u32 map; | ||
872 | |||
873 | memset(nm_diff, 0, sizeof(*nm_diff)); | ||
874 | for (w = 0; w < stop; w++) { | ||
875 | map = nm_a->map[w] ^ (nm_a->map[w] & nm_b->map[w]); | ||
876 | nm_diff->map[w] = map; | ||
877 | if (map != 0) { | ||
878 | for (b = 0 ; b < WSIZE; b++) { | ||
879 | if (map & (1 << b)) | ||
880 | nm_diff->count++; | ||
881 | } | ||
882 | } | ||
883 | } | ||
884 | } | ||
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index 2b1c4a755dfa..cd779816383f 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h | |||
@@ -72,38 +72,8 @@ struct tipc_node; | |||
72 | 72 | ||
73 | extern const char tipc_bclink_name[]; | 73 | extern const char tipc_bclink_name[]; |
74 | 74 | ||
75 | 75 | void tipc_nmap_add(struct tipc_node_map *nm_ptr, u32 node); | |
76 | /** | 76 | void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node); |
77 | * tipc_nmap_add - add a node to a node map | ||
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 | * tipc_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 | 77 | ||
108 | /** | 78 | /** |
109 | * tipc_nmap_equal - test for equality of node maps | 79 | * tipc_nmap_equal - test for equality of node maps |
@@ -114,33 +84,8 @@ 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 | * tipc_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 | 89 | ||
145 | /** | 90 | /** |
146 | * tipc_port_list_add - add a port to a port list, ensuring no duplicates | 91 | * tipc_port_list_add - add a port to a port list, ensuring no duplicates |