diff options
-rw-r--r-- | net/tipc/bcast.c | 50 | ||||
-rw-r--r-- | net/tipc/bcast.h | 52 |
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 | |||
890 | void 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 | |||
924 | void 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 | |||
87 | void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, | 87 | void 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 | /** | 90 | void 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 | 91 | void tipc_port_list_free(struct port_list *pl_ptr); |
92 | */ | ||
93 | |||
94 | static 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 | |||
129 | static 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 | ||
141 | int tipc_bclink_init(void); | 93 | int tipc_bclink_init(void); |
142 | void tipc_bclink_stop(void); | 94 | void tipc_bclink_stop(void); |