diff options
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r-- | net/tipc/bcast.c | 50 |
1 files changed, 50 insertions, 0 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 | |||