aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/tipc/bcast.c50
-rw-r--r--net/tipc/bcast.h52
2 files changed, 52 insertions, 50 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 1ee6424ef3e0..a008c6689305 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -882,3 +882,53 @@ void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b,
882 } 882 }
883 } 883 }
884} 884}
885
886/**
887 * tipc_port_list_add - add a port to a port list, ensuring no duplicates
888 */
889
890void tipc_port_list_add(struct port_list *pl_ptr, u32 port)
891{
892 struct port_list *item = pl_ptr;
893 int i;
894 int item_sz = PLSIZE;
895 int cnt = pl_ptr->count;
896
897 for (; ; cnt -= item_sz, item = item->next) {
898 if (cnt < PLSIZE)
899 item_sz = cnt;
900 for (i = 0; i < item_sz; i++)
901 if (item->ports[i] == port)
902 return;
903 if (i < PLSIZE) {
904 item->ports[i] = port;
905 pl_ptr->count++;
906 return;
907 }
908 if (!item->next) {
909 item->next = kmalloc(sizeof(*item), GFP_ATOMIC);
910 if (!item->next) {
911 warn("Incomplete multicast delivery, no memory\n");
912 return;
913 }
914 item->next->next = NULL;
915 }
916 }
917}
918
919/**
920 * tipc_port_list_free - free dynamically created entries in port_list chain
921 *
922 */
923
924void tipc_port_list_free(struct port_list *pl_ptr)
925{
926 struct port_list *item;
927 struct port_list *next;
928
929 for (item = pl_ptr->next; item; item = next) {
930 next = item->next;
931 kfree(item);
932 }
933}
934
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h
index cd779816383f..e8c2b81658c7 100644
--- a/net/tipc/bcast.h
+++ b/net/tipc/bcast.h
@@ -87,56 +87,8 @@ static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_m
87void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, 87void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b,
88 struct tipc_node_map *nm_diff); 88 struct tipc_node_map *nm_diff);
89 89
90/** 90void tipc_port_list_add(struct port_list *pl_ptr, u32 port);
91 * tipc_port_list_add - add a port to a port list, ensuring no duplicates 91void tipc_port_list_free(struct port_list *pl_ptr);
92 */
93
94static inline void tipc_port_list_add(struct port_list *pl_ptr, u32 port)
95{
96 struct port_list *item = pl_ptr;
97 int i;
98 int item_sz = PLSIZE;
99 int cnt = pl_ptr->count;
100
101 for (; ; cnt -= item_sz, item = item->next) {
102 if (cnt < PLSIZE)
103 item_sz = cnt;
104 for (i = 0; i < item_sz; i++)
105 if (item->ports[i] == port)
106 return;
107 if (i < PLSIZE) {
108 item->ports[i] = port;
109 pl_ptr->count++;
110 return;
111 }
112 if (!item->next) {
113 item->next = kmalloc(sizeof(*item), GFP_ATOMIC);
114 if (!item->next) {
115 warn("Incomplete multicast delivery, no memory\n");
116 return;
117 }
118 item->next->next = NULL;
119 }
120 }
121}
122
123/**
124 * tipc_port_list_free - free dynamically created entries in port_list chain
125 *
126 * Note: First item is on stack, so it doesn't need to be released
127 */
128
129static inline void tipc_port_list_free(struct port_list *pl_ptr)
130{
131 struct port_list *item;
132 struct port_list *next;
133
134 for (item = pl_ptr->next; item; item = next) {
135 next = item->next;
136 kfree(item);
137 }
138}
139
140 92
141int tipc_bclink_init(void); 93int tipc_bclink_init(void);
142void tipc_bclink_stop(void); 94void tipc_bclink_stop(void);