diff options
Diffstat (limited to 'net/tipc/bcast.c')
-rw-r--r-- | net/tipc/bcast.c | 98 |
1 files changed, 49 insertions, 49 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 730c5c47ed8..e7880172ef1 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * net/tipc/bcast.c: TIPC broadcast code | 2 | * net/tipc/bcast.c: TIPC broadcast code |
3 | * | 3 | * |
4 | * Copyright (c) 2004-2006, Ericsson AB | 4 | * Copyright (c) 2004-2006, Ericsson AB |
5 | * Copyright (c) 2004, Intel Corporation. | 5 | * Copyright (c) 2004, Intel Corporation. |
6 | * Copyright (c) 2005, Wind River Systems | 6 | * Copyright (c) 2005, Wind River Systems |
@@ -59,15 +59,15 @@ | |||
59 | * Loss rate for incoming broadcast frames; used to test retransmission code. | 59 | * Loss rate for incoming broadcast frames; used to test retransmission code. |
60 | * Set to N to cause every N'th frame to be discarded; 0 => don't discard any. | 60 | * Set to N to cause every N'th frame to be discarded; 0 => don't discard any. |
61 | */ | 61 | */ |
62 | 62 | ||
63 | #define TIPC_BCAST_LOSS_RATE 0 | 63 | #define TIPC_BCAST_LOSS_RATE 0 |
64 | 64 | ||
65 | /** | 65 | /** |
66 | * struct bcbearer_pair - a pair of bearers used by broadcast link | 66 | * struct bcbearer_pair - a pair of bearers used by broadcast link |
67 | * @primary: pointer to primary bearer | 67 | * @primary: pointer to primary bearer |
68 | * @secondary: pointer to secondary bearer | 68 | * @secondary: pointer to secondary bearer |
69 | * | 69 | * |
70 | * Bearers must have same priority and same set of reachable destinations | 70 | * Bearers must have same priority and same set of reachable destinations |
71 | * to be paired. | 71 | * to be paired. |
72 | */ | 72 | */ |
73 | 73 | ||
@@ -84,7 +84,7 @@ struct bcbearer_pair { | |||
84 | * @bpairs_temp: temporary array of bearer pairs used by tipc_bcbearer_sort() | 84 | * @bpairs_temp: temporary array of bearer pairs used by tipc_bcbearer_sort() |
85 | * @remains: temporary node map used by tipc_bcbearer_send() | 85 | * @remains: temporary node map used by tipc_bcbearer_send() |
86 | * @remains_new: temporary node map used tipc_bcbearer_send() | 86 | * @remains_new: temporary node map used tipc_bcbearer_send() |
87 | * | 87 | * |
88 | * Note: The fields labelled "temporary" are incorporated into the bearer | 88 | * Note: The fields labelled "temporary" are incorporated into the bearer |
89 | * to avoid consuming potentially limited stack space through the use of | 89 | * to avoid consuming potentially limited stack space through the use of |
90 | * large local variables within multicast routines. Concurrent access is | 90 | * large local variables within multicast routines. Concurrent access is |
@@ -104,7 +104,7 @@ struct bcbearer { | |||
104 | * struct bclink - link used for broadcast messages | 104 | * struct bclink - link used for broadcast messages |
105 | * @link: (non-standard) broadcast link structure | 105 | * @link: (non-standard) broadcast link structure |
106 | * @node: (non-standard) node structure representing b'cast link's peer node | 106 | * @node: (non-standard) node structure representing b'cast link's peer node |
107 | * | 107 | * |
108 | * Handles sequence numbering, fragmentation, bundling, etc. | 108 | * Handles sequence numbering, fragmentation, bundling, etc. |
109 | */ | 109 | */ |
110 | 110 | ||
@@ -125,7 +125,7 @@ char tipc_bclink_name[] = "multicast-link"; | |||
125 | static u32 buf_seqno(struct sk_buff *buf) | 125 | static u32 buf_seqno(struct sk_buff *buf) |
126 | { | 126 | { |
127 | return msg_seqno(buf_msg(buf)); | 127 | return msg_seqno(buf_msg(buf)); |
128 | } | 128 | } |
129 | 129 | ||
130 | static u32 bcbuf_acks(struct sk_buff *buf) | 130 | static u32 bcbuf_acks(struct sk_buff *buf) |
131 | { | 131 | { |
@@ -143,9 +143,9 @@ static void bcbuf_decr_acks(struct sk_buff *buf) | |||
143 | } | 143 | } |
144 | 144 | ||
145 | 145 | ||
146 | /** | 146 | /** |
147 | * bclink_set_gap - set gap according to contents of current deferred pkt queue | 147 | * bclink_set_gap - set gap according to contents of current deferred pkt queue |
148 | * | 148 | * |
149 | * Called with 'node' locked, bc_lock unlocked | 149 | * Called with 'node' locked, bc_lock unlocked |
150 | */ | 150 | */ |
151 | 151 | ||
@@ -159,14 +159,14 @@ static void bclink_set_gap(struct node *n_ptr) | |||
159 | n_ptr->bclink.gap_to = mod(buf_seqno(buf) - 1); | 159 | n_ptr->bclink.gap_to = mod(buf_seqno(buf) - 1); |
160 | } | 160 | } |
161 | 161 | ||
162 | /** | 162 | /** |
163 | * bclink_ack_allowed - test if ACK or NACK message can be sent at this moment | 163 | * bclink_ack_allowed - test if ACK or NACK message can be sent at this moment |
164 | * | 164 | * |
165 | * This mechanism endeavours to prevent all nodes in network from trying | 165 | * This mechanism endeavours to prevent all nodes in network from trying |
166 | * to ACK or NACK at the same time. | 166 | * to ACK or NACK at the same time. |
167 | * | 167 | * |
168 | * Note: TIPC uses a different trigger to distribute ACKs than it does to | 168 | * Note: TIPC uses a different trigger to distribute ACKs than it does to |
169 | * distribute NACKs, but tries to use the same spacing (divide by 16). | 169 | * distribute NACKs, but tries to use the same spacing (divide by 16). |
170 | */ | 170 | */ |
171 | 171 | ||
172 | static int bclink_ack_allowed(u32 n) | 172 | static int bclink_ack_allowed(u32 n) |
@@ -175,11 +175,11 @@ static int bclink_ack_allowed(u32 n) | |||
175 | } | 175 | } |
176 | 176 | ||
177 | 177 | ||
178 | /** | 178 | /** |
179 | * bclink_retransmit_pkt - retransmit broadcast packets | 179 | * bclink_retransmit_pkt - retransmit broadcast packets |
180 | * @after: sequence number of last packet to *not* retransmit | 180 | * @after: sequence number of last packet to *not* retransmit |
181 | * @to: sequence number of last packet to retransmit | 181 | * @to: sequence number of last packet to retransmit |
182 | * | 182 | * |
183 | * Called with bc_lock locked | 183 | * Called with bc_lock locked |
184 | */ | 184 | */ |
185 | 185 | ||
@@ -189,16 +189,16 @@ static void bclink_retransmit_pkt(u32 after, u32 to) | |||
189 | 189 | ||
190 | buf = bcl->first_out; | 190 | buf = bcl->first_out; |
191 | while (buf && less_eq(buf_seqno(buf), after)) { | 191 | while (buf && less_eq(buf_seqno(buf), after)) { |
192 | buf = buf->next; | 192 | buf = buf->next; |
193 | } | 193 | } |
194 | tipc_link_retransmit(bcl, buf, mod(to - after)); | 194 | tipc_link_retransmit(bcl, buf, mod(to - after)); |
195 | } | 195 | } |
196 | 196 | ||
197 | /** | 197 | /** |
198 | * tipc_bclink_acknowledge - handle acknowledgement of broadcast packets | 198 | * tipc_bclink_acknowledge - handle acknowledgement of broadcast packets |
199 | * @n_ptr: node that sent acknowledgement info | 199 | * @n_ptr: node that sent acknowledgement info |
200 | * @acked: broadcast sequence # that has been acknowledged | 200 | * @acked: broadcast sequence # that has been acknowledged |
201 | * | 201 | * |
202 | * Node is locked, bc_lock unlocked. | 202 | * Node is locked, bc_lock unlocked. |
203 | */ | 203 | */ |
204 | 204 | ||
@@ -244,9 +244,9 @@ void tipc_bclink_acknowledge(struct node *n_ptr, u32 acked) | |||
244 | spin_unlock_bh(&bc_lock); | 244 | spin_unlock_bh(&bc_lock); |
245 | } | 245 | } |
246 | 246 | ||
247 | /** | 247 | /** |
248 | * bclink_send_ack - unicast an ACK msg | 248 | * bclink_send_ack - unicast an ACK msg |
249 | * | 249 | * |
250 | * tipc_net_lock and node lock set | 250 | * tipc_net_lock and node lock set |
251 | */ | 251 | */ |
252 | 252 | ||
@@ -258,9 +258,9 @@ static void bclink_send_ack(struct node *n_ptr) | |||
258 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); | 258 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); |
259 | } | 259 | } |
260 | 260 | ||
261 | /** | 261 | /** |
262 | * bclink_send_nack- broadcast a NACK msg | 262 | * bclink_send_nack- broadcast a NACK msg |
263 | * | 263 | * |
264 | * tipc_net_lock and node lock set | 264 | * tipc_net_lock and node lock set |
265 | */ | 265 | */ |
266 | 266 | ||
@@ -278,7 +278,7 @@ static void bclink_send_nack(struct node *n_ptr) | |||
278 | msg_init(msg, BCAST_PROTOCOL, STATE_MSG, | 278 | msg_init(msg, BCAST_PROTOCOL, STATE_MSG, |
279 | TIPC_OK, INT_H_SIZE, n_ptr->addr); | 279 | TIPC_OK, INT_H_SIZE, n_ptr->addr); |
280 | msg_set_mc_netid(msg, tipc_net_id); | 280 | msg_set_mc_netid(msg, tipc_net_id); |
281 | msg_set_bcast_ack(msg, mod(n_ptr->bclink.last_in)); | 281 | msg_set_bcast_ack(msg, mod(n_ptr->bclink.last_in)); |
282 | msg_set_bcgap_after(msg, n_ptr->bclink.gap_after); | 282 | msg_set_bcgap_after(msg, n_ptr->bclink.gap_after); |
283 | msg_set_bcgap_to(msg, n_ptr->bclink.gap_to); | 283 | msg_set_bcgap_to(msg, n_ptr->bclink.gap_to); |
284 | msg_set_bcast_tag(msg, tipc_own_tag); | 284 | msg_set_bcast_tag(msg, tipc_own_tag); |
@@ -292,17 +292,17 @@ static void bclink_send_nack(struct node *n_ptr) | |||
292 | bcl->stats.bearer_congs++; | 292 | bcl->stats.bearer_congs++; |
293 | } | 293 | } |
294 | 294 | ||
295 | /* | 295 | /* |
296 | * Ensure we doesn't send another NACK msg to the node | 296 | * Ensure we doesn't send another NACK msg to the node |
297 | * until 16 more deferred messages arrive from it | 297 | * until 16 more deferred messages arrive from it |
298 | * (i.e. helps prevent all nodes from NACK'ing at same time) | 298 | * (i.e. helps prevent all nodes from NACK'ing at same time) |
299 | */ | 299 | */ |
300 | 300 | ||
301 | n_ptr->bclink.nack_sync = tipc_own_tag; | 301 | n_ptr->bclink.nack_sync = tipc_own_tag; |
302 | } | 302 | } |
303 | } | 303 | } |
304 | 304 | ||
305 | /** | 305 | /** |
306 | * tipc_bclink_check_gap - send a NACK if a sequence gap exists | 306 | * tipc_bclink_check_gap - send a NACK if a sequence gap exists |
307 | * | 307 | * |
308 | * tipc_net_lock and node lock set | 308 | * tipc_net_lock and node lock set |
@@ -320,9 +320,9 @@ void tipc_bclink_check_gap(struct node *n_ptr, u32 last_sent) | |||
320 | bclink_send_nack(n_ptr); | 320 | bclink_send_nack(n_ptr); |
321 | } | 321 | } |
322 | 322 | ||
323 | /** | 323 | /** |
324 | * tipc_bclink_peek_nack - process a NACK msg meant for another node | 324 | * tipc_bclink_peek_nack - process a NACK msg meant for another node |
325 | * | 325 | * |
326 | * Only tipc_net_lock set. | 326 | * Only tipc_net_lock set. |
327 | */ | 327 | */ |
328 | 328 | ||
@@ -349,7 +349,7 @@ static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 g | |||
349 | if (less_eq(my_to, gap_to)) | 349 | if (less_eq(my_to, gap_to)) |
350 | n_ptr->bclink.gap_to = gap_after; | 350 | n_ptr->bclink.gap_to = gap_after; |
351 | } else { | 351 | } else { |
352 | /* | 352 | /* |
353 | * Expand gap if missing bufs not in deferred queue: | 353 | * Expand gap if missing bufs not in deferred queue: |
354 | */ | 354 | */ |
355 | struct sk_buff *buf = n_ptr->bclink.deferred_head; | 355 | struct sk_buff *buf = n_ptr->bclink.deferred_head; |
@@ -371,7 +371,7 @@ static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 g | |||
371 | } | 371 | } |
372 | /* | 372 | /* |
373 | * Some nodes may send a complementary NACK now: | 373 | * Some nodes may send a complementary NACK now: |
374 | */ | 374 | */ |
375 | if (bclink_ack_allowed(sender_tag + 1)) { | 375 | if (bclink_ack_allowed(sender_tag + 1)) { |
376 | if (n_ptr->bclink.gap_to != n_ptr->bclink.gap_after) { | 376 | if (n_ptr->bclink.gap_to != n_ptr->bclink.gap_after) { |
377 | bclink_send_nack(n_ptr); | 377 | bclink_send_nack(n_ptr); |
@@ -408,7 +408,7 @@ int tipc_bclink_send_msg(struct sk_buff *buf) | |||
408 | 408 | ||
409 | /** | 409 | /** |
410 | * tipc_bclink_recv_pkt - receive a broadcast packet, and deliver upwards | 410 | * tipc_bclink_recv_pkt - receive a broadcast packet, and deliver upwards |
411 | * | 411 | * |
412 | * tipc_net_lock is read_locked, no other locks set | 412 | * tipc_net_lock is read_locked, no other locks set |
413 | */ | 413 | */ |
414 | 414 | ||
@@ -425,7 +425,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) | |||
425 | 425 | ||
426 | msg_dbg(msg, "<BC<<<"); | 426 | msg_dbg(msg, "<BC<<<"); |
427 | 427 | ||
428 | if (unlikely(!node || !tipc_node_is_up(node) || !node->bclink.supported || | 428 | if (unlikely(!node || !tipc_node_is_up(node) || !node->bclink.supported || |
429 | (msg_mc_netid(msg) != tipc_net_id))) { | 429 | (msg_mc_netid(msg) != tipc_net_id))) { |
430 | buf_discard(buf); | 430 | buf_discard(buf); |
431 | return; | 431 | return; |
@@ -443,7 +443,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf) | |||
443 | bclink_retransmit_pkt(msg_bcgap_after(msg), | 443 | bclink_retransmit_pkt(msg_bcgap_after(msg), |
444 | msg_bcgap_to(msg)); | 444 | msg_bcgap_to(msg)); |
445 | bcl->owner->next = NULL; | 445 | bcl->owner->next = NULL; |
446 | spin_unlock_bh(&bc_lock); | 446 | spin_unlock_bh(&bc_lock); |
447 | } else { | 447 | } else { |
448 | tipc_bclink_peek_nack(msg_destnode(msg), | 448 | tipc_bclink_peek_nack(msg_destnode(msg), |
449 | msg_bcast_tag(msg), | 449 | msg_bcast_tag(msg), |
@@ -547,10 +547,10 @@ u32 tipc_bclink_acks_missing(struct node *n_ptr) | |||
547 | 547 | ||
548 | /** | 548 | /** |
549 | * tipc_bcbearer_send - send a packet through the broadcast pseudo-bearer | 549 | * tipc_bcbearer_send - send a packet through the broadcast pseudo-bearer |
550 | * | 550 | * |
551 | * Send through as many bearers as necessary to reach all nodes | 551 | * Send through as many bearers as necessary to reach all nodes |
552 | * that support TIPC multicasting. | 552 | * that support TIPC multicasting. |
553 | * | 553 | * |
554 | * Returns 0 if packet sent successfully, non-zero if not | 554 | * Returns 0 if packet sent successfully, non-zero if not |
555 | */ | 555 | */ |
556 | 556 | ||
@@ -581,7 +581,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
581 | send_count = 0; | 581 | send_count = 0; |
582 | 582 | ||
583 | /* Send buffer over bearers until all targets reached */ | 583 | /* Send buffer over bearers until all targets reached */ |
584 | 584 | ||
585 | bcbearer->remains = tipc_cltr_bcast_nodes; | 585 | bcbearer->remains = tipc_cltr_bcast_nodes; |
586 | 586 | ||
587 | for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { | 587 | for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { |
@@ -615,7 +615,7 @@ update: | |||
615 | 615 | ||
616 | bcbearer->remains = bcbearer->remains_new; | 616 | bcbearer->remains = bcbearer->remains_new; |
617 | } | 617 | } |
618 | 618 | ||
619 | /* Unable to reach all targets */ | 619 | /* Unable to reach all targets */ |
620 | 620 | ||
621 | bcbearer->bearer.publ.blocked = 1; | 621 | bcbearer->bearer.publ.blocked = 1; |
@@ -682,7 +682,7 @@ void tipc_bcbearer_sort(void) | |||
682 | 682 | ||
683 | /** | 683 | /** |
684 | * tipc_bcbearer_push - resolve bearer congestion | 684 | * tipc_bcbearer_push - resolve bearer congestion |
685 | * | 685 | * |
686 | * Forces bclink to push out any unsent packets, until all packets are gone | 686 | * Forces bclink to push out any unsent packets, until all packets are gone |
687 | * or congestion reoccurs. | 687 | * or congestion reoccurs. |
688 | * No locks set when function called | 688 | * No locks set when function called |
@@ -714,27 +714,27 @@ int tipc_bclink_stats(char *buf, const u32 buf_size) | |||
714 | spin_lock_bh(&bc_lock); | 714 | spin_lock_bh(&bc_lock); |
715 | 715 | ||
716 | tipc_printf(&pb, "Link <%s>\n" | 716 | tipc_printf(&pb, "Link <%s>\n" |
717 | " Window:%u packets\n", | 717 | " Window:%u packets\n", |
718 | bcl->name, bcl->queue_limit[0]); | 718 | bcl->name, bcl->queue_limit[0]); |
719 | tipc_printf(&pb, " RX packets:%u fragments:%u/%u bundles:%u/%u\n", | 719 | tipc_printf(&pb, " RX packets:%u fragments:%u/%u bundles:%u/%u\n", |
720 | bcl->stats.recv_info, | 720 | bcl->stats.recv_info, |
721 | bcl->stats.recv_fragments, | 721 | bcl->stats.recv_fragments, |
722 | bcl->stats.recv_fragmented, | 722 | bcl->stats.recv_fragmented, |
723 | bcl->stats.recv_bundles, | 723 | bcl->stats.recv_bundles, |
724 | bcl->stats.recv_bundled); | 724 | bcl->stats.recv_bundled); |
725 | tipc_printf(&pb, " TX packets:%u fragments:%u/%u bundles:%u/%u\n", | 725 | tipc_printf(&pb, " TX packets:%u fragments:%u/%u bundles:%u/%u\n", |
726 | bcl->stats.sent_info, | 726 | bcl->stats.sent_info, |
727 | bcl->stats.sent_fragments, | 727 | bcl->stats.sent_fragments, |
728 | bcl->stats.sent_fragmented, | 728 | bcl->stats.sent_fragmented, |
729 | bcl->stats.sent_bundles, | 729 | bcl->stats.sent_bundles, |
730 | bcl->stats.sent_bundled); | 730 | bcl->stats.sent_bundled); |
731 | tipc_printf(&pb, " RX naks:%u defs:%u dups:%u\n", | 731 | tipc_printf(&pb, " RX naks:%u defs:%u dups:%u\n", |
732 | bcl->stats.recv_nacks, | 732 | bcl->stats.recv_nacks, |
733 | bcl->stats.deferred_recv, | 733 | bcl->stats.deferred_recv, |
734 | bcl->stats.duplicates); | 734 | bcl->stats.duplicates); |
735 | tipc_printf(&pb, " TX naks:%u acks:%u dups:%u\n", | 735 | tipc_printf(&pb, " TX naks:%u acks:%u dups:%u\n", |
736 | bcl->stats.sent_nacks, | 736 | bcl->stats.sent_nacks, |
737 | bcl->stats.sent_acks, | 737 | bcl->stats.sent_acks, |
738 | bcl->stats.retransmitted); | 738 | bcl->stats.retransmitted); |
739 | tipc_printf(&pb, " Congestion bearer:%u link:%u Send queue max:%u avg:%u\n", | 739 | tipc_printf(&pb, " Congestion bearer:%u link:%u Send queue max:%u avg:%u\n", |
740 | bcl->stats.bearer_congs, | 740 | bcl->stats.bearer_congs, |
@@ -778,7 +778,7 @@ int tipc_bclink_init(void) | |||
778 | bclink = kzalloc(sizeof(*bclink), GFP_ATOMIC); | 778 | bclink = kzalloc(sizeof(*bclink), GFP_ATOMIC); |
779 | if (!bcbearer || !bclink) { | 779 | if (!bcbearer || !bclink) { |
780 | nomem: | 780 | nomem: |
781 | warn("Multicast link creation failed, no memory\n"); | 781 | warn("Multicast link creation failed, no memory\n"); |
782 | kfree(bcbearer); | 782 | kfree(bcbearer); |
783 | bcbearer = NULL; | 783 | bcbearer = NULL; |
784 | kfree(bclink); | 784 | kfree(bclink); |
@@ -796,7 +796,7 @@ int tipc_bclink_init(void) | |||
796 | bcl->next_out_no = 1; | 796 | bcl->next_out_no = 1; |
797 | spin_lock_init(&bclink->node.lock); | 797 | spin_lock_init(&bclink->node.lock); |
798 | bcl->owner = &bclink->node; | 798 | bcl->owner = &bclink->node; |
799 | bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; | 799 | bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; |
800 | tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); | 800 | tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); |
801 | bcl->b_ptr = &bcbearer->bearer; | 801 | bcl->b_ptr = &bcbearer->bearer; |
802 | bcl->state = WORKING_WORKING; | 802 | bcl->state = WORKING_WORKING; |