diff options
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/addr.c | 7 | ||||
-rw-r--r-- | net/tipc/bcast.c | 51 | ||||
-rw-r--r-- | net/tipc/bcast.h | 3 | ||||
-rw-r--r-- | net/tipc/bearer.c | 42 | ||||
-rw-r--r-- | net/tipc/cluster.c | 21 | ||||
-rw-r--r-- | net/tipc/cluster.h | 2 | ||||
-rw-r--r-- | net/tipc/config.c | 148 | ||||
-rw-r--r-- | net/tipc/config.h | 6 | ||||
-rw-r--r-- | net/tipc/core.c | 38 | ||||
-rw-r--r-- | net/tipc/core.h | 9 | ||||
-rw-r--r-- | net/tipc/dbg.c | 17 | ||||
-rw-r--r-- | net/tipc/dbg.h | 3 | ||||
-rw-r--r-- | net/tipc/discover.c | 44 | ||||
-rw-r--r-- | net/tipc/discover.h | 5 | ||||
-rw-r--r-- | net/tipc/eth_media.c | 48 | ||||
-rw-r--r-- | net/tipc/link.c | 188 | ||||
-rw-r--r-- | net/tipc/link.h | 24 | ||||
-rw-r--r-- | net/tipc/msg.c | 2 | ||||
-rw-r--r-- | net/tipc/msg.h | 6 | ||||
-rw-r--r-- | net/tipc/name_distr.c | 2 | ||||
-rw-r--r-- | net/tipc/name_table.c | 67 | ||||
-rw-r--r-- | net/tipc/net.c | 10 | ||||
-rw-r--r-- | net/tipc/node.c | 73 | ||||
-rw-r--r-- | net/tipc/node.h | 3 | ||||
-rw-r--r-- | net/tipc/port.c | 295 | ||||
-rw-r--r-- | net/tipc/port.h | 4 | ||||
-rw-r--r-- | net/tipc/ref.c | 17 | ||||
-rw-r--r-- | net/tipc/ref.h | 1 | ||||
-rw-r--r-- | net/tipc/socket.c | 83 | ||||
-rw-r--r-- | net/tipc/subscr.c | 9 | ||||
-rw-r--r-- | net/tipc/zone.c | 11 | ||||
-rw-r--r-- | net/tipc/zone.h | 1 |
32 files changed, 306 insertions, 934 deletions
diff --git a/net/tipc/addr.c b/net/tipc/addr.c index c048543ffbeb..8a2e89bffde5 100644 --- a/net/tipc/addr.c +++ b/net/tipc/addr.c | |||
@@ -41,11 +41,6 @@ | |||
41 | #include "cluster.h" | 41 | #include "cluster.h" |
42 | #include "net.h" | 42 | #include "net.h" |
43 | 43 | ||
44 | u32 tipc_get_addr(void) | ||
45 | { | ||
46 | return tipc_own_addr; | ||
47 | } | ||
48 | |||
49 | /** | 44 | /** |
50 | * tipc_addr_domain_valid - validates a network domain address | 45 | * tipc_addr_domain_valid - validates a network domain address |
51 | * | 46 | * |
@@ -89,7 +84,7 @@ int tipc_addr_domain_valid(u32 addr) | |||
89 | 84 | ||
90 | int tipc_addr_node_valid(u32 addr) | 85 | int tipc_addr_node_valid(u32 addr) |
91 | { | 86 | { |
92 | return (tipc_addr_domain_valid(addr) && tipc_node(addr)); | 87 | return tipc_addr_domain_valid(addr) && tipc_node(addr); |
93 | } | 88 | } |
94 | 89 | ||
95 | int tipc_in_scope(u32 domain, u32 addr) | 90 | int tipc_in_scope(u32 domain, u32 addr) |
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index a008c6689305..22a60fc98392 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -121,6 +121,9 @@ static DEFINE_SPINLOCK(bc_lock); | |||
121 | 121 | ||
122 | const char tipc_bclink_name[] = "broadcast-link"; | 122 | const char tipc_bclink_name[] = "broadcast-link"; |
123 | 123 | ||
124 | static void tipc_nmap_diff(struct tipc_node_map *nm_a, | ||
125 | struct tipc_node_map *nm_b, | ||
126 | struct tipc_node_map *nm_diff); | ||
124 | 127 | ||
125 | static u32 buf_seqno(struct sk_buff *buf) | 128 | static u32 buf_seqno(struct sk_buff *buf) |
126 | { | 129 | { |
@@ -143,6 +146,19 @@ static void bcbuf_decr_acks(struct sk_buff *buf) | |||
143 | } | 146 | } |
144 | 147 | ||
145 | 148 | ||
149 | static void bclink_set_last_sent(void) | ||
150 | { | ||
151 | if (bcl->next_out) | ||
152 | bcl->fsm_msg_cnt = mod(buf_seqno(bcl->next_out) - 1); | ||
153 | else | ||
154 | bcl->fsm_msg_cnt = mod(bcl->next_out_no - 1); | ||
155 | } | ||
156 | |||
157 | u32 tipc_bclink_get_last_sent(void) | ||
158 | { | ||
159 | return bcl->fsm_msg_cnt; | ||
160 | } | ||
161 | |||
146 | /** | 162 | /** |
147 | * bclink_set_gap - set gap according to contents of current deferred pkt queue | 163 | * bclink_set_gap - set gap according to contents of current deferred pkt queue |
148 | * | 164 | * |
@@ -171,7 +187,7 @@ static void bclink_set_gap(struct tipc_node *n_ptr) | |||
171 | 187 | ||
172 | static int bclink_ack_allowed(u32 n) | 188 | static int bclink_ack_allowed(u32 n) |
173 | { | 189 | { |
174 | return((n % TIPC_MIN_LINK_WIN) == tipc_own_tag); | 190 | return (n % TIPC_MIN_LINK_WIN) == tipc_own_tag; |
175 | } | 191 | } |
176 | 192 | ||
177 | 193 | ||
@@ -237,8 +253,10 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) | |||
237 | 253 | ||
238 | /* Try resolving broadcast link congestion, if necessary */ | 254 | /* Try resolving broadcast link congestion, if necessary */ |
239 | 255 | ||
240 | if (unlikely(bcl->next_out)) | 256 | if (unlikely(bcl->next_out)) { |
241 | tipc_link_push_queue(bcl); | 257 | tipc_link_push_queue(bcl); |
258 | bclink_set_last_sent(); | ||
259 | } | ||
242 | if (unlikely(released && !list_empty(&bcl->waiting_ports))) | 260 | if (unlikely(released && !list_empty(&bcl->waiting_ports))) |
243 | tipc_link_wakeup_ports(bcl, 0); | 261 | tipc_link_wakeup_ports(bcl, 0); |
244 | spin_unlock_bh(&bc_lock); | 262 | spin_unlock_bh(&bc_lock); |
@@ -272,7 +290,7 @@ static void bclink_send_nack(struct tipc_node *n_ptr) | |||
272 | if (!less(n_ptr->bclink.gap_after, n_ptr->bclink.gap_to)) | 290 | if (!less(n_ptr->bclink.gap_after, n_ptr->bclink.gap_to)) |
273 | return; | 291 | return; |
274 | 292 | ||
275 | buf = buf_acquire(INT_H_SIZE); | 293 | buf = tipc_buf_acquire(INT_H_SIZE); |
276 | if (buf) { | 294 | if (buf) { |
277 | msg = buf_msg(buf); | 295 | msg = buf_msg(buf); |
278 | tipc_msg_init(msg, BCAST_PROTOCOL, STATE_MSG, | 296 | tipc_msg_init(msg, BCAST_PROTOCOL, STATE_MSG, |
@@ -395,7 +413,7 @@ int tipc_bclink_send_msg(struct sk_buff *buf) | |||
395 | if (unlikely(res == -ELINKCONG)) | 413 | if (unlikely(res == -ELINKCONG)) |
396 | buf_discard(buf); | 414 | buf_discard(buf); |
397 | else | 415 | else |
398 | bcl->stats.sent_info++; | 416 | bclink_set_last_sent(); |
399 | 417 | ||
400 | if (bcl->out_queue_size > bcl->stats.max_queue_sz) | 418 | if (bcl->out_queue_size > bcl->stats.max_queue_sz) |
401 | bcl->stats.max_queue_sz = bcl->out_queue_size; | 419 | bcl->stats.max_queue_sz = bcl->out_queue_size; |
@@ -529,15 +547,6 @@ receive: | |||
529 | tipc_node_unlock(node); | 547 | tipc_node_unlock(node); |
530 | } | 548 | } |
531 | 549 | ||
532 | u32 tipc_bclink_get_last_sent(void) | ||
533 | { | ||
534 | u32 last_sent = mod(bcl->next_out_no - 1); | ||
535 | |||
536 | if (bcl->next_out) | ||
537 | last_sent = mod(buf_seqno(bcl->next_out) - 1); | ||
538 | return last_sent; | ||
539 | } | ||
540 | |||
541 | u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr) | 550 | u32 tipc_bclink_acks_missing(struct tipc_node *n_ptr) |
542 | { | 551 | { |
543 | return (n_ptr->bclink.supported && | 552 | return (n_ptr->bclink.supported && |
@@ -570,6 +579,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
570 | msg = buf_msg(buf); | 579 | msg = buf_msg(buf); |
571 | msg_set_non_seq(msg, 1); | 580 | msg_set_non_seq(msg, 1); |
572 | msg_set_mc_netid(msg, tipc_net_id); | 581 | msg_set_mc_netid(msg, tipc_net_id); |
582 | bcl->stats.sent_info++; | ||
573 | } | 583 | } |
574 | 584 | ||
575 | /* Send buffer over bearers until all targets reached */ | 585 | /* Send buffer over bearers until all targets reached */ |
@@ -609,11 +619,13 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
609 | bcbearer->remains = bcbearer->remains_new; | 619 | bcbearer->remains = bcbearer->remains_new; |
610 | } | 620 | } |
611 | 621 | ||
612 | /* Unable to reach all targets */ | 622 | /* |
623 | * Unable to reach all targets (indicate success, since currently | ||
624 | * there isn't code in place to properly block & unblock the | ||
625 | * pseudo-bearer used by the broadcast link) | ||
626 | */ | ||
613 | 627 | ||
614 | bcbearer->bearer.publ.blocked = 1; | 628 | return TIPC_OK; |
615 | bcl->stats.bearer_congs++; | ||
616 | return 1; | ||
617 | } | 629 | } |
618 | 630 | ||
619 | /** | 631 | /** |
@@ -862,8 +874,9 @@ void tipc_nmap_remove(struct tipc_node_map *nm_ptr, u32 node) | |||
862 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) | 874 | * @nm_diff: output node map A-B (i.e. nodes of A that are not in B) |
863 | */ | 875 | */ |
864 | 876 | ||
865 | void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, | 877 | static void tipc_nmap_diff(struct tipc_node_map *nm_a, |
866 | struct tipc_node_map *nm_diff) | 878 | struct tipc_node_map *nm_b, |
879 | struct tipc_node_map *nm_diff) | ||
867 | { | 880 | { |
868 | int stop = ARRAY_SIZE(nm_a->map); | 881 | int stop = ARRAY_SIZE(nm_a->map); |
869 | int w; | 882 | int w; |
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index e8c2b81658c7..011c03f0a4ab 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h | |||
@@ -84,9 +84,6 @@ static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_m | |||
84 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); | 84 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); |
85 | } | 85 | } |
86 | 86 | ||
87 | void tipc_nmap_diff(struct tipc_node_map *nm_a, struct tipc_node_map *nm_b, | ||
88 | struct tipc_node_map *nm_diff); | ||
89 | |||
90 | void tipc_port_list_add(struct port_list *pl_ptr, u32 port); | 87 | void tipc_port_list_add(struct port_list *pl_ptr, u32 port); |
91 | void tipc_port_list_free(struct port_list *pl_ptr); | 88 | void tipc_port_list_free(struct port_list *pl_ptr); |
92 | 89 | ||
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 52ae17b2583e..9927d1d56c4f 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -63,7 +63,7 @@ static int media_name_valid(const char *name) | |||
63 | len = strlen(name); | 63 | len = strlen(name); |
64 | if ((len + 1) > TIPC_MAX_MEDIA_NAME) | 64 | if ((len + 1) > TIPC_MAX_MEDIA_NAME) |
65 | return 0; | 65 | return 0; |
66 | return (strspn(name, tipc_alphabet) == len); | 66 | return strspn(name, tipc_alphabet) == len; |
67 | } | 67 | } |
68 | 68 | ||
69 | /** | 69 | /** |
@@ -288,9 +288,6 @@ static struct bearer *bearer_find(const char *name) | |||
288 | struct bearer *b_ptr; | 288 | struct bearer *b_ptr; |
289 | u32 i; | 289 | u32 i; |
290 | 290 | ||
291 | if (tipc_mode != TIPC_NET_MODE) | ||
292 | return NULL; | ||
293 | |||
294 | for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) { | 291 | for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) { |
295 | if (b_ptr->active && (!strcmp(b_ptr->publ.name, name))) | 292 | if (b_ptr->active && (!strcmp(b_ptr->publ.name, name))) |
296 | return b_ptr; | 293 | return b_ptr; |
@@ -559,8 +556,6 @@ restart: | |||
559 | } | 556 | } |
560 | 557 | ||
561 | b_ptr = &tipc_bearers[bearer_id]; | 558 | b_ptr = &tipc_bearers[bearer_id]; |
562 | memset(b_ptr, 0, sizeof(struct bearer)); | ||
563 | |||
564 | strcpy(b_ptr->publ.name, name); | 559 | strcpy(b_ptr->publ.name, name); |
565 | res = m_ptr->enable_bearer(&b_ptr->publ); | 560 | res = m_ptr->enable_bearer(&b_ptr->publ); |
566 | if (res) { | 561 | if (res) { |
@@ -630,30 +625,17 @@ int tipc_block_bearer(const char *name) | |||
630 | * Note: This routine assumes caller holds tipc_net_lock. | 625 | * Note: This routine assumes caller holds tipc_net_lock. |
631 | */ | 626 | */ |
632 | 627 | ||
633 | static int bearer_disable(const char *name) | 628 | static int bearer_disable(struct bearer *b_ptr) |
634 | { | 629 | { |
635 | struct bearer *b_ptr; | ||
636 | struct link *l_ptr; | 630 | struct link *l_ptr; |
637 | struct link *temp_l_ptr; | 631 | struct link *temp_l_ptr; |
638 | 632 | ||
639 | b_ptr = bearer_find(name); | 633 | info("Disabling bearer <%s>\n", b_ptr->publ.name); |
640 | if (!b_ptr) { | ||
641 | warn("Attempt to disable unknown bearer <%s>\n", name); | ||
642 | return -EINVAL; | ||
643 | } | ||
644 | |||
645 | info("Disabling bearer <%s>\n", name); | ||
646 | tipc_disc_stop_link_req(b_ptr->link_req); | 634 | tipc_disc_stop_link_req(b_ptr->link_req); |
647 | spin_lock_bh(&b_ptr->publ.lock); | 635 | spin_lock_bh(&b_ptr->publ.lock); |
648 | b_ptr->link_req = NULL; | 636 | b_ptr->link_req = NULL; |
649 | b_ptr->publ.blocked = 1; | 637 | b_ptr->publ.blocked = 1; |
650 | if (b_ptr->media->disable_bearer) { | 638 | b_ptr->media->disable_bearer(&b_ptr->publ); |
651 | spin_unlock_bh(&b_ptr->publ.lock); | ||
652 | write_unlock_bh(&tipc_net_lock); | ||
653 | b_ptr->media->disable_bearer(&b_ptr->publ); | ||
654 | write_lock_bh(&tipc_net_lock); | ||
655 | spin_lock_bh(&b_ptr->publ.lock); | ||
656 | } | ||
657 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { | 639 | list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) { |
658 | tipc_link_delete(l_ptr); | 640 | tipc_link_delete(l_ptr); |
659 | } | 641 | } |
@@ -664,10 +646,16 @@ static int bearer_disable(const char *name) | |||
664 | 646 | ||
665 | int tipc_disable_bearer(const char *name) | 647 | int tipc_disable_bearer(const char *name) |
666 | { | 648 | { |
649 | struct bearer *b_ptr; | ||
667 | int res; | 650 | int res; |
668 | 651 | ||
669 | write_lock_bh(&tipc_net_lock); | 652 | write_lock_bh(&tipc_net_lock); |
670 | res = bearer_disable(name); | 653 | b_ptr = bearer_find(name); |
654 | if (b_ptr == NULL) { | ||
655 | warn("Attempt to disable unknown bearer <%s>\n", name); | ||
656 | res = -EINVAL; | ||
657 | } else | ||
658 | res = bearer_disable(b_ptr); | ||
671 | write_unlock_bh(&tipc_net_lock); | 659 | write_unlock_bh(&tipc_net_lock); |
672 | return res; | 660 | return res; |
673 | } | 661 | } |
@@ -680,13 +668,7 @@ void tipc_bearer_stop(void) | |||
680 | 668 | ||
681 | for (i = 0; i < MAX_BEARERS; i++) { | 669 | for (i = 0; i < MAX_BEARERS; i++) { |
682 | if (tipc_bearers[i].active) | 670 | if (tipc_bearers[i].active) |
683 | tipc_bearers[i].publ.blocked = 1; | 671 | bearer_disable(&tipc_bearers[i]); |
684 | } | ||
685 | for (i = 0; i < MAX_BEARERS; i++) { | ||
686 | if (tipc_bearers[i].active) | ||
687 | bearer_disable(tipc_bearers[i].publ.name); | ||
688 | } | 672 | } |
689 | media_count = 0; | 673 | media_count = 0; |
690 | } | 674 | } |
691 | |||
692 | |||
diff --git a/net/tipc/cluster.c b/net/tipc/cluster.c index e68f705381bc..7fea14b98b97 100644 --- a/net/tipc/cluster.c +++ b/net/tipc/cluster.c | |||
@@ -113,25 +113,6 @@ void tipc_cltr_delete(struct cluster *c_ptr) | |||
113 | kfree(c_ptr); | 113 | kfree(c_ptr); |
114 | } | 114 | } |
115 | 115 | ||
116 | u32 tipc_cltr_next_node(struct cluster *c_ptr, u32 addr) | ||
117 | { | ||
118 | struct tipc_node *n_ptr; | ||
119 | u32 n_num = tipc_node(addr) + 1; | ||
120 | |||
121 | if (!c_ptr) | ||
122 | return addr; | ||
123 | for (; n_num <= c_ptr->highest_node; n_num++) { | ||
124 | n_ptr = c_ptr->nodes[n_num]; | ||
125 | if (n_ptr && tipc_node_has_active_links(n_ptr)) | ||
126 | return n_ptr->addr; | ||
127 | } | ||
128 | for (n_num = 1; n_num < tipc_node(addr); n_num++) { | ||
129 | n_ptr = c_ptr->nodes[n_num]; | ||
130 | if (n_ptr && tipc_node_has_active_links(n_ptr)) | ||
131 | return n_ptr->addr; | ||
132 | } | ||
133 | return 0; | ||
134 | } | ||
135 | 116 | ||
136 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr) | 117 | void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr) |
137 | { | 118 | { |
@@ -232,7 +213,7 @@ struct tipc_node *tipc_cltr_select_node(struct cluster *c_ptr, u32 selector) | |||
232 | static struct sk_buff *tipc_cltr_prepare_routing_msg(u32 data_size, u32 dest) | 213 | static struct sk_buff *tipc_cltr_prepare_routing_msg(u32 data_size, u32 dest) |
233 | { | 214 | { |
234 | u32 size = INT_H_SIZE + data_size; | 215 | u32 size = INT_H_SIZE + data_size; |
235 | struct sk_buff *buf = buf_acquire(size); | 216 | struct sk_buff *buf = tipc_buf_acquire(size); |
236 | struct tipc_msg *msg; | 217 | struct tipc_msg *msg; |
237 | 218 | ||
238 | if (buf) { | 219 | if (buf) { |
diff --git a/net/tipc/cluster.h b/net/tipc/cluster.h index 333efb0b9c44..32636d98c9c6 100644 --- a/net/tipc/cluster.h +++ b/net/tipc/cluster.h | |||
@@ -75,7 +75,7 @@ void tipc_cltr_attach_node(struct cluster *c_ptr, struct tipc_node *n_ptr); | |||
75 | void tipc_cltr_send_slave_routes(struct cluster *c_ptr, u32 dest); | 75 | void tipc_cltr_send_slave_routes(struct cluster *c_ptr, u32 dest); |
76 | void tipc_cltr_broadcast(struct sk_buff *buf); | 76 | void tipc_cltr_broadcast(struct sk_buff *buf); |
77 | int tipc_cltr_init(void); | 77 | int tipc_cltr_init(void); |
78 | u32 tipc_cltr_next_node(struct cluster *c_ptr, u32 addr); | 78 | |
79 | void tipc_cltr_bcast_new_route(struct cluster *c_ptr, u32 dest, u32 lo, u32 hi); | 79 | void tipc_cltr_bcast_new_route(struct cluster *c_ptr, u32 dest, u32 lo, u32 hi); |
80 | void tipc_cltr_send_local_routes(struct cluster *c_ptr, u32 dest); | 80 | void tipc_cltr_send_local_routes(struct cluster *c_ptr, u32 dest); |
81 | void tipc_cltr_bcast_lost_route(struct cluster *c_ptr, u32 dest, u32 lo, u32 hi); | 81 | void tipc_cltr_bcast_lost_route(struct cluster *c_ptr, u32 dest, u32 lo, u32 hi); |
diff --git a/net/tipc/config.c b/net/tipc/config.c index 961d1b097146..50a6133a3668 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c | |||
@@ -95,7 +95,7 @@ int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type, | |||
95 | return 1; | 95 | return 1; |
96 | } | 96 | } |
97 | 97 | ||
98 | struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value) | 98 | static struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value) |
99 | { | 99 | { |
100 | struct sk_buff *buf; | 100 | struct sk_buff *buf; |
101 | __be32 value_net; | 101 | __be32 value_net; |
@@ -109,6 +109,11 @@ struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value) | |||
109 | return buf; | 109 | return buf; |
110 | } | 110 | } |
111 | 111 | ||
112 | static struct sk_buff *tipc_cfg_reply_unsigned(u32 value) | ||
113 | { | ||
114 | return tipc_cfg_reply_unsigned_type(TIPC_TLV_UNSIGNED, value); | ||
115 | } | ||
116 | |||
112 | struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string) | 117 | struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string) |
113 | { | 118 | { |
114 | struct sk_buff *buf; | 119 | struct sk_buff *buf; |
@@ -120,139 +125,6 @@ struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string) | |||
120 | return buf; | 125 | return buf; |
121 | } | 126 | } |
122 | 127 | ||
123 | |||
124 | #if 0 | ||
125 | |||
126 | /* Now obsolete code for handling commands not yet implemented the new way */ | ||
127 | |||
128 | /* | ||
129 | * Some of this code assumed that the manager structure contains two added | ||
130 | * fields: | ||
131 | * u32 link_subscriptions; | ||
132 | * struct list_head link_subscribers; | ||
133 | * which are currently not present. These fields may need to be re-introduced | ||
134 | * if and when support for link subscriptions is added. | ||
135 | */ | ||
136 | |||
137 | void tipc_cfg_link_event(u32 addr, char *name, int up) | ||
138 | { | ||
139 | /* TIPC DOESN'T HANDLE LINK EVENT SUBSCRIPTIONS AT THE MOMENT */ | ||
140 | } | ||
141 | |||
142 | int tipc_cfg_cmd(const struct tipc_cmd_msg * msg, | ||
143 | char *data, | ||
144 | u32 sz, | ||
145 | u32 *ret_size, | ||
146 | struct tipc_portid *orig) | ||
147 | { | ||
148 | int rv = -EINVAL; | ||
149 | u32 cmd = msg->cmd; | ||
150 | |||
151 | *ret_size = 0; | ||
152 | switch (cmd) { | ||
153 | case TIPC_REMOVE_LINK: | ||
154 | case TIPC_CMD_BLOCK_LINK: | ||
155 | case TIPC_CMD_UNBLOCK_LINK: | ||
156 | if (!cfg_check_connection(orig)) | ||
157 | rv = link_control(msg->argv.link_name, msg->cmd, 0); | ||
158 | break; | ||
159 | case TIPC_ESTABLISH: | ||
160 | { | ||
161 | int connected; | ||
162 | |||
163 | tipc_isconnected(mng.conn_port_ref, &connected); | ||
164 | if (connected || !orig) { | ||
165 | rv = TIPC_FAILURE; | ||
166 | break; | ||
167 | } | ||
168 | rv = tipc_connect2port(mng.conn_port_ref, orig); | ||
169 | if (rv == TIPC_OK) | ||
170 | orig = 0; | ||
171 | break; | ||
172 | } | ||
173 | case TIPC_GET_PEER_ADDRESS: | ||
174 | *ret_size = link_peer_addr(msg->argv.link_name, data, sz); | ||
175 | break; | ||
176 | case TIPC_GET_ROUTES: | ||
177 | rv = TIPC_OK; | ||
178 | break; | ||
179 | default: {} | ||
180 | } | ||
181 | if (*ret_size) | ||
182 | rv = TIPC_OK; | ||
183 | return rv; | ||
184 | } | ||
185 | |||
186 | static void cfg_cmd_event(struct tipc_cmd_msg *msg, | ||
187 | char *data, | ||
188 | u32 sz, | ||
189 | struct tipc_portid const *orig) | ||
190 | { | ||
191 | int rv = -EINVAL; | ||
192 | struct tipc_cmd_result_msg rmsg; | ||
193 | struct iovec msg_sect[2]; | ||
194 | int *arg; | ||
195 | |||
196 | msg->cmd = ntohl(msg->cmd); | ||
197 | |||
198 | cfg_prepare_res_msg(msg->cmd, msg->usr_handle, rv, &rmsg, msg_sect, | ||
199 | data, 0); | ||
200 | if (ntohl(msg->magic) != TIPC_MAGIC) | ||
201 | goto exit; | ||
202 | |||
203 | switch (msg->cmd) { | ||
204 | case TIPC_CREATE_LINK: | ||
205 | if (!cfg_check_connection(orig)) | ||
206 | rv = disc_create_link(&msg->argv.create_link); | ||
207 | break; | ||
208 | case TIPC_LINK_SUBSCRIBE: | ||
209 | { | ||
210 | struct subscr_data *sub; | ||
211 | |||
212 | if (mng.link_subscriptions > 64) | ||
213 | break; | ||
214 | sub = kmalloc(sizeof(*sub), | ||
215 | GFP_ATOMIC); | ||
216 | if (sub == NULL) { | ||
217 | warn("Memory squeeze; dropped remote link subscription\n"); | ||
218 | break; | ||
219 | } | ||
220 | INIT_LIST_HEAD(&sub->subd_list); | ||
221 | tipc_createport(mng.user_ref, | ||
222 | (void *)sub, | ||
223 | TIPC_HIGH_IMPORTANCE, | ||
224 | 0, | ||
225 | 0, | ||
226 | (tipc_conn_shutdown_event)cfg_linksubscr_cancel, | ||
227 | 0, | ||
228 | 0, | ||
229 | (tipc_conn_msg_event)cfg_linksubscr_cancel, | ||
230 | 0, | ||
231 | &sub->port_ref); | ||
232 | if (!sub->port_ref) { | ||
233 | kfree(sub); | ||
234 | break; | ||
235 | } | ||
236 | memcpy(sub->usr_handle,msg->usr_handle, | ||
237 | sizeof(sub->usr_handle)); | ||
238 | sub->domain = msg->argv.domain; | ||
239 | list_add_tail(&sub->subd_list, &mng.link_subscribers); | ||
240 | tipc_connect2port(sub->port_ref, orig); | ||
241 | rmsg.retval = TIPC_OK; | ||
242 | tipc_send(sub->port_ref, 2u, msg_sect); | ||
243 | mng.link_subscriptions++; | ||
244 | return; | ||
245 | } | ||
246 | default: | ||
247 | rv = tipc_cfg_cmd(msg, data, sz, (u32 *)&msg_sect[1].iov_len, orig); | ||
248 | } | ||
249 | exit: | ||
250 | rmsg.result_len = htonl(msg_sect[1].iov_len); | ||
251 | rmsg.retval = htonl(rv); | ||
252 | tipc_cfg_respond(msg_sect, 2u, orig); | ||
253 | } | ||
254 | #endif | ||
255 | |||
256 | #define MAX_STATS_INFO 2000 | 128 | #define MAX_STATS_INFO 2000 |
257 | 129 | ||
258 | static struct sk_buff *tipc_show_stats(void) | 130 | static struct sk_buff *tipc_show_stats(void) |
@@ -557,14 +429,6 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area | |||
557 | case TIPC_CMD_SHOW_PORTS: | 429 | case TIPC_CMD_SHOW_PORTS: |
558 | rep_tlv_buf = tipc_port_get_ports(); | 430 | rep_tlv_buf = tipc_port_get_ports(); |
559 | break; | 431 | break; |
560 | #if 0 | ||
561 | case TIPC_CMD_SHOW_PORT_STATS: | ||
562 | rep_tlv_buf = port_show_stats(req_tlv_area, req_tlv_space); | ||
563 | break; | ||
564 | case TIPC_CMD_RESET_PORT_STATS: | ||
565 | rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED); | ||
566 | break; | ||
567 | #endif | ||
568 | case TIPC_CMD_SET_LOG_SIZE: | 432 | case TIPC_CMD_SET_LOG_SIZE: |
569 | rep_tlv_buf = tipc_log_resize_cmd(req_tlv_area, req_tlv_space); | 433 | rep_tlv_buf = tipc_log_resize_cmd(req_tlv_area, req_tlv_space); |
570 | break; | 434 | break; |
diff --git a/net/tipc/config.h b/net/tipc/config.h index 5cd7cc56c54d..481e12ece715 100644 --- a/net/tipc/config.h +++ b/net/tipc/config.h | |||
@@ -45,7 +45,6 @@ | |||
45 | struct sk_buff *tipc_cfg_reply_alloc(int payload_size); | 45 | struct sk_buff *tipc_cfg_reply_alloc(int payload_size); |
46 | int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type, | 46 | int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type, |
47 | void *tlv_data, int tlv_data_size); | 47 | void *tlv_data, int tlv_data_size); |
48 | struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value); | ||
49 | struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string); | 48 | struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string); |
50 | 49 | ||
51 | static inline struct sk_buff *tipc_cfg_reply_none(void) | 50 | static inline struct sk_buff *tipc_cfg_reply_none(void) |
@@ -53,11 +52,6 @@ static inline struct sk_buff *tipc_cfg_reply_none(void) | |||
53 | return tipc_cfg_reply_alloc(0); | 52 | return tipc_cfg_reply_alloc(0); |
54 | } | 53 | } |
55 | 54 | ||
56 | static inline struct sk_buff *tipc_cfg_reply_unsigned(u32 value) | ||
57 | { | ||
58 | return tipc_cfg_reply_unsigned_type(TIPC_TLV_UNSIGNED, value); | ||
59 | } | ||
60 | |||
61 | static inline struct sk_buff *tipc_cfg_reply_error_string(char *string) | 55 | static inline struct sk_buff *tipc_cfg_reply_error_string(char *string) |
62 | { | 56 | { |
63 | return tipc_cfg_reply_string_type(TIPC_TLV_ERROR_STRING, string); | 57 | return tipc_cfg_reply_string_type(TIPC_TLV_ERROR_STRING, string); |
diff --git a/net/tipc/core.c b/net/tipc/core.c index 696468117985..e2a09eb8efd4 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c | |||
@@ -96,13 +96,8 @@ int tipc_net_id; | |||
96 | int tipc_remote_management; | 96 | int tipc_remote_management; |
97 | 97 | ||
98 | 98 | ||
99 | int tipc_get_mode(void) | ||
100 | { | ||
101 | return tipc_mode; | ||
102 | } | ||
103 | |||
104 | /** | 99 | /** |
105 | * buf_acquire - creates a TIPC message buffer | 100 | * tipc_buf_acquire - creates a TIPC message buffer |
106 | * @size: message size (including TIPC header) | 101 | * @size: message size (including TIPC header) |
107 | * | 102 | * |
108 | * Returns a new buffer with data pointers set to the specified size. | 103 | * Returns a new buffer with data pointers set to the specified size. |
@@ -111,7 +106,7 @@ int tipc_get_mode(void) | |||
111 | * There may also be unrequested tailroom present at the buffer's end. | 106 | * There may also be unrequested tailroom present at the buffer's end. |
112 | */ | 107 | */ |
113 | 108 | ||
114 | struct sk_buff *buf_acquire(u32 size) | 109 | struct sk_buff *tipc_buf_acquire(u32 size) |
115 | { | 110 | { |
116 | struct sk_buff *skb; | 111 | struct sk_buff *skb; |
117 | unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; | 112 | unsigned int buf_size = (BUF_HEADROOM + size + 3) & ~3u; |
@@ -129,7 +124,7 @@ struct sk_buff *buf_acquire(u32 size) | |||
129 | * tipc_core_stop_net - shut down TIPC networking sub-systems | 124 | * tipc_core_stop_net - shut down TIPC networking sub-systems |
130 | */ | 125 | */ |
131 | 126 | ||
132 | void tipc_core_stop_net(void) | 127 | static void tipc_core_stop_net(void) |
133 | { | 128 | { |
134 | tipc_eth_media_stop(); | 129 | tipc_eth_media_stop(); |
135 | tipc_net_stop(); | 130 | tipc_net_stop(); |
@@ -154,7 +149,7 @@ int tipc_core_start_net(unsigned long addr) | |||
154 | * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode | 149 | * tipc_core_stop - switch TIPC from SINGLE NODE to NOT RUNNING mode |
155 | */ | 150 | */ |
156 | 151 | ||
157 | void tipc_core_stop(void) | 152 | static void tipc_core_stop(void) |
158 | { | 153 | { |
159 | if (tipc_mode != TIPC_NODE_MODE) | 154 | if (tipc_mode != TIPC_NODE_MODE) |
160 | return; | 155 | return; |
@@ -169,13 +164,14 @@ void tipc_core_stop(void) | |||
169 | tipc_nametbl_stop(); | 164 | tipc_nametbl_stop(); |
170 | tipc_ref_table_stop(); | 165 | tipc_ref_table_stop(); |
171 | tipc_socket_stop(); | 166 | tipc_socket_stop(); |
167 | tipc_log_resize(0); | ||
172 | } | 168 | } |
173 | 169 | ||
174 | /** | 170 | /** |
175 | * tipc_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode | 171 | * tipc_core_start - switch TIPC from NOT RUNNING to SINGLE NODE mode |
176 | */ | 172 | */ |
177 | 173 | ||
178 | int tipc_core_start(void) | 174 | static int tipc_core_start(void) |
179 | { | 175 | { |
180 | int res; | 176 | int res; |
181 | 177 | ||
@@ -203,7 +199,9 @@ static int __init tipc_init(void) | |||
203 | { | 199 | { |
204 | int res; | 200 | int res; |
205 | 201 | ||
206 | tipc_log_resize(CONFIG_TIPC_LOG); | 202 | if (tipc_log_resize(CONFIG_TIPC_LOG) != 0) |
203 | warn("Unable to create log buffer\n"); | ||
204 | |||
207 | info("Activated (version " TIPC_MOD_VER | 205 | info("Activated (version " TIPC_MOD_VER |
208 | " compiled " __DATE__ " " __TIME__ ")\n"); | 206 | " compiled " __DATE__ " " __TIME__ ")\n"); |
209 | 207 | ||
@@ -230,7 +228,6 @@ static void __exit tipc_exit(void) | |||
230 | tipc_core_stop_net(); | 228 | tipc_core_stop_net(); |
231 | tipc_core_stop(); | 229 | tipc_core_stop(); |
232 | info("Deactivated\n"); | 230 | info("Deactivated\n"); |
233 | tipc_log_resize(0); | ||
234 | } | 231 | } |
235 | 232 | ||
236 | module_init(tipc_init); | 233 | module_init(tipc_init); |
@@ -244,8 +241,6 @@ MODULE_VERSION(TIPC_MOD_VER); | |||
244 | 241 | ||
245 | EXPORT_SYMBOL(tipc_attach); | 242 | EXPORT_SYMBOL(tipc_attach); |
246 | EXPORT_SYMBOL(tipc_detach); | 243 | EXPORT_SYMBOL(tipc_detach); |
247 | EXPORT_SYMBOL(tipc_get_addr); | ||
248 | EXPORT_SYMBOL(tipc_get_mode); | ||
249 | EXPORT_SYMBOL(tipc_createport); | 244 | EXPORT_SYMBOL(tipc_createport); |
250 | EXPORT_SYMBOL(tipc_deleteport); | 245 | EXPORT_SYMBOL(tipc_deleteport); |
251 | EXPORT_SYMBOL(tipc_ownidentity); | 246 | EXPORT_SYMBOL(tipc_ownidentity); |
@@ -260,23 +255,10 @@ EXPORT_SYMBOL(tipc_withdraw); | |||
260 | EXPORT_SYMBOL(tipc_connect2port); | 255 | EXPORT_SYMBOL(tipc_connect2port); |
261 | EXPORT_SYMBOL(tipc_disconnect); | 256 | EXPORT_SYMBOL(tipc_disconnect); |
262 | EXPORT_SYMBOL(tipc_shutdown); | 257 | EXPORT_SYMBOL(tipc_shutdown); |
263 | EXPORT_SYMBOL(tipc_isconnected); | ||
264 | EXPORT_SYMBOL(tipc_peer); | ||
265 | EXPORT_SYMBOL(tipc_ref_valid); | ||
266 | EXPORT_SYMBOL(tipc_send); | 258 | EXPORT_SYMBOL(tipc_send); |
267 | EXPORT_SYMBOL(tipc_send_buf); | ||
268 | EXPORT_SYMBOL(tipc_send2name); | 259 | EXPORT_SYMBOL(tipc_send2name); |
269 | EXPORT_SYMBOL(tipc_forward2name); | ||
270 | EXPORT_SYMBOL(tipc_send_buf2name); | ||
271 | EXPORT_SYMBOL(tipc_forward_buf2name); | ||
272 | EXPORT_SYMBOL(tipc_send2port); | 260 | EXPORT_SYMBOL(tipc_send2port); |
273 | EXPORT_SYMBOL(tipc_forward2port); | ||
274 | EXPORT_SYMBOL(tipc_send_buf2port); | ||
275 | EXPORT_SYMBOL(tipc_forward_buf2port); | ||
276 | EXPORT_SYMBOL(tipc_multicast); | 261 | EXPORT_SYMBOL(tipc_multicast); |
277 | /* EXPORT_SYMBOL(tipc_multicast_buf); not available yet */ | ||
278 | EXPORT_SYMBOL(tipc_ispublished); | ||
279 | EXPORT_SYMBOL(tipc_available_nodes); | ||
280 | 262 | ||
281 | /* TIPC API for external bearers (see tipc_bearer.h) */ | 263 | /* TIPC API for external bearers (see tipc_bearer.h) */ |
282 | 264 | ||
@@ -293,6 +275,4 @@ EXPORT_SYMBOL(tipc_createport_raw); | |||
293 | EXPORT_SYMBOL(tipc_reject_msg); | 275 | EXPORT_SYMBOL(tipc_reject_msg); |
294 | EXPORT_SYMBOL(tipc_send_buf_fast); | 276 | EXPORT_SYMBOL(tipc_send_buf_fast); |
295 | EXPORT_SYMBOL(tipc_acknowledge); | 277 | EXPORT_SYMBOL(tipc_acknowledge); |
296 | EXPORT_SYMBOL(tipc_get_port); | ||
297 | EXPORT_SYMBOL(tipc_get_handle); | ||
298 | 278 | ||
diff --git a/net/tipc/core.h b/net/tipc/core.h index 188799017abd..e19389e57227 100644 --- a/net/tipc/core.h +++ b/net/tipc/core.h | |||
@@ -83,9 +83,7 @@ | |||
83 | * Note: TIPC_LOG is configured to echo its output to the system console; | 83 | * Note: TIPC_LOG is configured to echo its output to the system console; |
84 | * user-defined buffers can be configured to do the same thing. | 84 | * user-defined buffers can be configured to do the same thing. |
85 | */ | 85 | */ |
86 | |||
87 | extern struct print_buf *const TIPC_NULL; | 86 | extern struct print_buf *const TIPC_NULL; |
88 | extern struct print_buf *const TIPC_CONS; | ||
89 | extern struct print_buf *const TIPC_LOG; | 87 | extern struct print_buf *const TIPC_LOG; |
90 | 88 | ||
91 | void tipc_printf(struct print_buf *, const char *fmt, ...); | 89 | void tipc_printf(struct print_buf *, const char *fmt, ...); |
@@ -204,10 +202,7 @@ extern atomic_t tipc_user_count; | |||
204 | * Routines available to privileged subsystems | 202 | * Routines available to privileged subsystems |
205 | */ | 203 | */ |
206 | 204 | ||
207 | extern int tipc_core_start(void); | 205 | extern int tipc_core_start_net(unsigned long); |
208 | extern void tipc_core_stop(void); | ||
209 | extern int tipc_core_start_net(unsigned long addr); | ||
210 | extern void tipc_core_stop_net(void); | ||
211 | extern int tipc_handler_start(void); | 206 | extern int tipc_handler_start(void); |
212 | extern void tipc_handler_stop(void); | 207 | extern void tipc_handler_stop(void); |
213 | extern int tipc_netlink_start(void); | 208 | extern int tipc_netlink_start(void); |
@@ -328,7 +323,7 @@ static inline struct tipc_msg *buf_msg(struct sk_buff *skb) | |||
328 | return (struct tipc_msg *)skb->data; | 323 | return (struct tipc_msg *)skb->data; |
329 | } | 324 | } |
330 | 325 | ||
331 | extern struct sk_buff *buf_acquire(u32 size); | 326 | extern struct sk_buff *tipc_buf_acquire(u32 size); |
332 | 327 | ||
333 | /** | 328 | /** |
334 | * buf_discard - frees a TIPC message buffer | 329 | * buf_discard - frees a TIPC message buffer |
diff --git a/net/tipc/dbg.c b/net/tipc/dbg.c index 1885a7edb0c8..46f51d208e5e 100644 --- a/net/tipc/dbg.c +++ b/net/tipc/dbg.c | |||
@@ -52,7 +52,7 @@ static struct print_buf null_buf = { NULL, 0, NULL, 0 }; | |||
52 | struct print_buf *const TIPC_NULL = &null_buf; | 52 | struct print_buf *const TIPC_NULL = &null_buf; |
53 | 53 | ||
54 | static struct print_buf cons_buf = { NULL, 0, NULL, 1 }; | 54 | static struct print_buf cons_buf = { NULL, 0, NULL, 1 }; |
55 | struct print_buf *const TIPC_CONS = &cons_buf; | 55 | static struct print_buf *const TIPC_CONS = &cons_buf; |
56 | 56 | ||
57 | static struct print_buf log_buf = { NULL, 0, NULL, 1 }; | 57 | static struct print_buf log_buf = { NULL, 0, NULL, 1 }; |
58 | struct print_buf *const TIPC_LOG = &log_buf; | 58 | struct print_buf *const TIPC_LOG = &log_buf; |
@@ -76,6 +76,10 @@ struct print_buf *const TIPC_LOG = &log_buf; | |||
76 | static char print_string[TIPC_PB_MAX_STR]; | 76 | static char print_string[TIPC_PB_MAX_STR]; |
77 | static DEFINE_SPINLOCK(print_lock); | 77 | static DEFINE_SPINLOCK(print_lock); |
78 | 78 | ||
79 | static void tipc_printbuf_reset(struct print_buf *pb); | ||
80 | static int tipc_printbuf_empty(struct print_buf *pb); | ||
81 | static void tipc_printbuf_move(struct print_buf *pb_to, | ||
82 | struct print_buf *pb_from); | ||
79 | 83 | ||
80 | #define FORMAT(PTR,LEN,FMT) \ | 84 | #define FORMAT(PTR,LEN,FMT) \ |
81 | {\ | 85 | {\ |
@@ -116,7 +120,7 @@ void tipc_printbuf_init(struct print_buf *pb, char *raw, u32 size) | |||
116 | * @pb: pointer to print buffer structure | 120 | * @pb: pointer to print buffer structure |
117 | */ | 121 | */ |
118 | 122 | ||
119 | void tipc_printbuf_reset(struct print_buf *pb) | 123 | static void tipc_printbuf_reset(struct print_buf *pb) |
120 | { | 124 | { |
121 | if (pb->buf) { | 125 | if (pb->buf) { |
122 | pb->crs = pb->buf; | 126 | pb->crs = pb->buf; |
@@ -132,9 +136,9 @@ void tipc_printbuf_reset(struct print_buf *pb) | |||
132 | * Returns non-zero if print buffer is empty. | 136 | * Returns non-zero if print buffer is empty. |
133 | */ | 137 | */ |
134 | 138 | ||
135 | int tipc_printbuf_empty(struct print_buf *pb) | 139 | static int tipc_printbuf_empty(struct print_buf *pb) |
136 | { | 140 | { |
137 | return (!pb->buf || (pb->crs == pb->buf)); | 141 | return !pb->buf || (pb->crs == pb->buf); |
138 | } | 142 | } |
139 | 143 | ||
140 | /** | 144 | /** |
@@ -169,7 +173,7 @@ int tipc_printbuf_validate(struct print_buf *pb) | |||
169 | tipc_printf(pb, err); | 173 | tipc_printf(pb, err); |
170 | } | 174 | } |
171 | } | 175 | } |
172 | return (pb->crs - pb->buf + 1); | 176 | return pb->crs - pb->buf + 1; |
173 | } | 177 | } |
174 | 178 | ||
175 | /** | 179 | /** |
@@ -181,7 +185,8 @@ int tipc_printbuf_validate(struct print_buf *pb) | |||
181 | * Source print buffer becomes empty if a successful move occurs. | 185 | * Source print buffer becomes empty if a successful move occurs. |
182 | */ | 186 | */ |
183 | 187 | ||
184 | void tipc_printbuf_move(struct print_buf *pb_to, struct print_buf *pb_from) | 188 | static void tipc_printbuf_move(struct print_buf *pb_to, |
189 | struct print_buf *pb_from) | ||
185 | { | 190 | { |
186 | int len; | 191 | int len; |
187 | 192 | ||
diff --git a/net/tipc/dbg.h b/net/tipc/dbg.h index 5ef1bc8f64ef..3ba6ba8b434a 100644 --- a/net/tipc/dbg.h +++ b/net/tipc/dbg.h | |||
@@ -56,10 +56,7 @@ struct print_buf { | |||
56 | #define TIPC_PB_MAX_STR 512 /* max printable string (with trailing NUL) */ | 56 | #define TIPC_PB_MAX_STR 512 /* max printable string (with trailing NUL) */ |
57 | 57 | ||
58 | void tipc_printbuf_init(struct print_buf *pb, char *buf, u32 size); | 58 | void tipc_printbuf_init(struct print_buf *pb, char *buf, u32 size); |
59 | void tipc_printbuf_reset(struct print_buf *pb); | ||
60 | int tipc_printbuf_empty(struct print_buf *pb); | ||
61 | int tipc_printbuf_validate(struct print_buf *pb); | 59 | int tipc_printbuf_validate(struct print_buf *pb); |
62 | void tipc_printbuf_move(struct print_buf *pb_to, struct print_buf *pb_from); | ||
63 | 60 | ||
64 | int tipc_log_resize(int log_size); | 61 | int tipc_log_resize(int log_size); |
65 | 62 | ||
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index fc1fcf5e6b53..4a7cd3719b78 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
@@ -46,16 +46,6 @@ | |||
46 | #define TIPC_LINK_REQ_FAST 2000 /* normal delay if bearer has no links */ | 46 | #define TIPC_LINK_REQ_FAST 2000 /* normal delay if bearer has no links */ |
47 | #define TIPC_LINK_REQ_SLOW 600000 /* normal delay if bearer has links */ | 47 | #define TIPC_LINK_REQ_SLOW 600000 /* normal delay if bearer has links */ |
48 | 48 | ||
49 | #if 0 | ||
50 | #define GET_NODE_INFO 300 | ||
51 | #define GET_NODE_INFO_RESULT 301 | ||
52 | #define FORWARD_LINK_PROBE 302 | ||
53 | #define LINK_REQUEST_REJECTED 303 | ||
54 | #define LINK_REQUEST_ACCEPTED 304 | ||
55 | #define DROP_LINK_REQUEST 305 | ||
56 | #define CHECK_LINK_COUNT 306 | ||
57 | #endif | ||
58 | |||
59 | /* | 49 | /* |
60 | * TODO: Most of the inter-cluster setup stuff should be | 50 | * TODO: Most of the inter-cluster setup stuff should be |
61 | * rewritten, and be made conformant with specification. | 51 | * rewritten, and be made conformant with specification. |
@@ -78,30 +68,6 @@ struct link_req { | |||
78 | unsigned int timer_intv; | 68 | unsigned int timer_intv; |
79 | }; | 69 | }; |
80 | 70 | ||
81 | |||
82 | #if 0 | ||
83 | int disc_create_link(const struct tipc_link_create *argv) | ||
84 | { | ||
85 | /* | ||
86 | * Code for inter cluster link setup here | ||
87 | */ | ||
88 | return TIPC_OK; | ||
89 | } | ||
90 | #endif | ||
91 | |||
92 | /* | ||
93 | * disc_lost_link(): A link has lost contact | ||
94 | */ | ||
95 | |||
96 | void tipc_disc_link_event(u32 addr, char *name, int up) | ||
97 | { | ||
98 | if (in_own_cluster(addr)) | ||
99 | return; | ||
100 | /* | ||
101 | * Code for inter cluster link setup here | ||
102 | */ | ||
103 | } | ||
104 | |||
105 | /** | 71 | /** |
106 | * tipc_disc_init_msg - initialize a link setup message | 72 | * tipc_disc_init_msg - initialize a link setup message |
107 | * @type: message type (request or response) | 73 | * @type: message type (request or response) |
@@ -115,7 +81,7 @@ static struct sk_buff *tipc_disc_init_msg(u32 type, | |||
115 | u32 dest_domain, | 81 | u32 dest_domain, |
116 | struct bearer *b_ptr) | 82 | struct bearer *b_ptr) |
117 | { | 83 | { |
118 | struct sk_buff *buf = buf_acquire(DSC_H_SIZE); | 84 | struct sk_buff *buf = tipc_buf_acquire(DSC_H_SIZE); |
119 | struct tipc_msg *msg; | 85 | struct tipc_msg *msg; |
120 | 86 | ||
121 | if (buf) { | 87 | if (buf) { |
@@ -203,6 +169,14 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct bearer *b_ptr) | |||
203 | return; | 169 | return; |
204 | } | 170 | } |
205 | spin_lock_bh(&n_ptr->lock); | 171 | spin_lock_bh(&n_ptr->lock); |
172 | |||
173 | /* Don't talk to neighbor during cleanup after last session */ | ||
174 | |||
175 | if (n_ptr->cleanup_required) { | ||
176 | spin_unlock_bh(&n_ptr->lock); | ||
177 | return; | ||
178 | } | ||
179 | |||
206 | link = n_ptr->links[b_ptr->identity]; | 180 | link = n_ptr->links[b_ptr->identity]; |
207 | if (!link) { | 181 | if (!link) { |
208 | dbg("creating link\n"); | 182 | dbg("creating link\n"); |
diff --git a/net/tipc/discover.h b/net/tipc/discover.h index c36eaeb7d5d0..f8e750636123 100644 --- a/net/tipc/discover.h +++ b/net/tipc/discover.h | |||
@@ -50,9 +50,4 @@ void tipc_disc_stop_link_req(struct link_req *req); | |||
50 | 50 | ||
51 | void tipc_disc_recv_msg(struct sk_buff *buf, struct bearer *b_ptr); | 51 | void tipc_disc_recv_msg(struct sk_buff *buf, struct bearer *b_ptr); |
52 | 52 | ||
53 | void tipc_disc_link_event(u32 addr, char *name, int up); | ||
54 | #if 0 | ||
55 | int disc_create_link(const struct tipc_link_create *argv); | ||
56 | #endif | ||
57 | |||
58 | #endif | 53 | #endif |
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index 6230d16020c4..6e988ba485fd 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
@@ -72,17 +72,26 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | |||
72 | { | 72 | { |
73 | struct sk_buff *clone; | 73 | struct sk_buff *clone; |
74 | struct net_device *dev; | 74 | struct net_device *dev; |
75 | int delta; | ||
75 | 76 | ||
76 | clone = skb_clone(buf, GFP_ATOMIC); | 77 | clone = skb_clone(buf, GFP_ATOMIC); |
77 | if (clone) { | 78 | if (!clone) |
78 | skb_reset_network_header(clone); | 79 | return 0; |
79 | dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; | 80 | |
80 | clone->dev = dev; | 81 | dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev; |
81 | dev_hard_header(clone, dev, ETH_P_TIPC, | 82 | delta = dev->hard_header_len - skb_headroom(buf); |
82 | &dest->dev_addr.eth_addr, | 83 | |
83 | dev->dev_addr, clone->len); | 84 | if ((delta > 0) && |
84 | dev_queue_xmit(clone); | 85 | pskb_expand_head(clone, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) { |
86 | kfree_skb(clone); | ||
87 | return 0; | ||
85 | } | 88 | } |
89 | |||
90 | skb_reset_network_header(clone); | ||
91 | clone->dev = dev; | ||
92 | dev_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr, | ||
93 | dev->dev_addr, clone->len); | ||
94 | dev_queue_xmit(clone); | ||
86 | return 0; | 95 | return 0; |
87 | } | 96 | } |
88 | 97 | ||
@@ -92,15 +101,12 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | |||
92 | * Accept only packets explicitly sent to this node, or broadcast packets; | 101 | * Accept only packets explicitly sent to this node, or broadcast packets; |
93 | * ignores packets sent using Ethernet multicast, and traffic sent to other | 102 | * ignores packets sent using Ethernet multicast, and traffic sent to other |
94 | * nodes (which can happen if interface is running in promiscuous mode). | 103 | * nodes (which can happen if interface is running in promiscuous mode). |
95 | * Routine truncates any Ethernet padding/CRC appended to the message, | ||
96 | * and ensures message size matches actual length | ||
97 | */ | 104 | */ |
98 | 105 | ||
99 | static int recv_msg(struct sk_buff *buf, struct net_device *dev, | 106 | static int recv_msg(struct sk_buff *buf, struct net_device *dev, |
100 | struct packet_type *pt, struct net_device *orig_dev) | 107 | struct packet_type *pt, struct net_device *orig_dev) |
101 | { | 108 | { |
102 | struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv; | 109 | struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv; |
103 | u32 size; | ||
104 | 110 | ||
105 | if (!net_eq(dev_net(dev), &init_net)) { | 111 | if (!net_eq(dev_net(dev), &init_net)) { |
106 | kfree_skb(buf); | 112 | kfree_skb(buf); |
@@ -109,13 +115,9 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev, | |||
109 | 115 | ||
110 | if (likely(eb_ptr->bearer)) { | 116 | if (likely(eb_ptr->bearer)) { |
111 | if (likely(buf->pkt_type <= PACKET_BROADCAST)) { | 117 | if (likely(buf->pkt_type <= PACKET_BROADCAST)) { |
112 | size = msg_size((struct tipc_msg *)buf->data); | 118 | buf->next = NULL; |
113 | skb_trim(buf, size); | 119 | tipc_recv_msg(buf, eb_ptr->bearer); |
114 | if (likely(buf->len == size)) { | 120 | return 0; |
115 | buf->next = NULL; | ||
116 | tipc_recv_msg(buf, eb_ptr->bearer); | ||
117 | return 0; | ||
118 | } | ||
119 | } | 121 | } |
120 | } | 122 | } |
121 | kfree_skb(buf); | 123 | kfree_skb(buf); |
@@ -133,6 +135,16 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) | |||
133 | struct eth_bearer *eb_ptr = ð_bearers[0]; | 135 | struct eth_bearer *eb_ptr = ð_bearers[0]; |
134 | struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS]; | 136 | struct eth_bearer *stop = ð_bearers[MAX_ETH_BEARERS]; |
135 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; | 137 | char *driver_name = strchr((const char *)tb_ptr->name, ':') + 1; |
138 | int pending_dev = 0; | ||
139 | |||
140 | /* Find unused Ethernet bearer structure */ | ||
141 | |||
142 | while (eb_ptr->dev) { | ||
143 | if (!eb_ptr->bearer) | ||
144 | pending_dev++; | ||
145 | if (++eb_ptr == stop) | ||
146 | return pending_dev ? -EAGAIN : -EDQUOT; | ||
147 | } | ||
136 | 148 | ||
137 | /* Find device with specified name */ | 149 | /* Find device with specified name */ |
138 | 150 | ||
diff --git a/net/tipc/link.c b/net/tipc/link.c index a3616b99529b..b31992ccd5d3 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -99,23 +99,6 @@ struct link_name { | |||
99 | char if_peer[TIPC_MAX_IF_NAME]; | 99 | char if_peer[TIPC_MAX_IF_NAME]; |
100 | }; | 100 | }; |
101 | 101 | ||
102 | #if 0 | ||
103 | |||
104 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ | ||
105 | |||
106 | /** | ||
107 | * struct link_event - link up/down event notification | ||
108 | */ | ||
109 | |||
110 | struct link_event { | ||
111 | u32 addr; | ||
112 | int up; | ||
113 | void (*fcn)(u32, char *, int); | ||
114 | char name[TIPC_MAX_LINK_NAME]; | ||
115 | }; | ||
116 | |||
117 | #endif | ||
118 | |||
119 | static void link_handle_out_of_seq_msg(struct link *l_ptr, | 102 | static void link_handle_out_of_seq_msg(struct link *l_ptr, |
120 | struct sk_buff *buf); | 103 | struct sk_buff *buf); |
121 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); | 104 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); |
@@ -129,6 +112,9 @@ static void link_state_event(struct link *l_ptr, u32 event); | |||
129 | static void link_reset_statistics(struct link *l_ptr); | 112 | static void link_reset_statistics(struct link *l_ptr); |
130 | static void link_print(struct link *l_ptr, struct print_buf *buf, | 113 | static void link_print(struct link *l_ptr, struct print_buf *buf, |
131 | const char *str); | 114 | const char *str); |
115 | static void link_start(struct link *l_ptr); | ||
116 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf); | ||
117 | |||
132 | 118 | ||
133 | /* | 119 | /* |
134 | * Debugging code used by link routines only | 120 | * Debugging code used by link routines only |
@@ -239,13 +225,13 @@ int tipc_link_is_up(struct link *l_ptr) | |||
239 | { | 225 | { |
240 | if (!l_ptr) | 226 | if (!l_ptr) |
241 | return 0; | 227 | return 0; |
242 | return (link_working_working(l_ptr) || link_working_unknown(l_ptr)); | 228 | return link_working_working(l_ptr) || link_working_unknown(l_ptr); |
243 | } | 229 | } |
244 | 230 | ||
245 | int tipc_link_is_active(struct link *l_ptr) | 231 | int tipc_link_is_active(struct link *l_ptr) |
246 | { | 232 | { |
247 | return ((l_ptr->owner->active_links[0] == l_ptr) || | 233 | return (l_ptr->owner->active_links[0] == l_ptr) || |
248 | (l_ptr->owner->active_links[1] == l_ptr)); | 234 | (l_ptr->owner->active_links[1] == l_ptr); |
249 | } | 235 | } |
250 | 236 | ||
251 | /** | 237 | /** |
@@ -459,7 +445,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer, | |||
459 | 445 | ||
460 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); | 446 | k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); |
461 | list_add_tail(&l_ptr->link_list, &b_ptr->links); | 447 | list_add_tail(&l_ptr->link_list, &b_ptr->links); |
462 | tipc_k_signal((Handler)tipc_link_start, (unsigned long)l_ptr); | 448 | tipc_k_signal((Handler)link_start, (unsigned long)l_ptr); |
463 | 449 | ||
464 | dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n", | 450 | dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n", |
465 | l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit); | 451 | l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit); |
@@ -499,9 +485,9 @@ void tipc_link_delete(struct link *l_ptr) | |||
499 | kfree(l_ptr); | 485 | kfree(l_ptr); |
500 | } | 486 | } |
501 | 487 | ||
502 | void tipc_link_start(struct link *l_ptr) | 488 | static void link_start(struct link *l_ptr) |
503 | { | 489 | { |
504 | dbg("tipc_link_start %x\n", l_ptr); | 490 | dbg("link_start %x\n", l_ptr); |
505 | link_state_event(l_ptr, STARTING_EVT); | 491 | link_state_event(l_ptr, STARTING_EVT); |
506 | } | 492 | } |
507 | 493 | ||
@@ -634,39 +620,9 @@ void tipc_link_stop(struct link *l_ptr) | |||
634 | l_ptr->proto_msg_queue = NULL; | 620 | l_ptr->proto_msg_queue = NULL; |
635 | } | 621 | } |
636 | 622 | ||
637 | #if 0 | ||
638 | |||
639 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ | 623 | /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ |
640 | |||
641 | static void link_recv_event(struct link_event *ev) | ||
642 | { | ||
643 | ev->fcn(ev->addr, ev->name, ev->up); | ||
644 | kfree(ev); | ||
645 | } | ||
646 | |||
647 | static void link_send_event(void (*fcn)(u32 a, char *n, int up), | ||
648 | struct link *l_ptr, int up) | ||
649 | { | ||
650 | struct link_event *ev; | ||
651 | |||
652 | ev = kmalloc(sizeof(*ev), GFP_ATOMIC); | ||
653 | if (!ev) { | ||
654 | warn("Link event allocation failure\n"); | ||
655 | return; | ||
656 | } | ||
657 | ev->addr = l_ptr->addr; | ||
658 | ev->up = up; | ||
659 | ev->fcn = fcn; | ||
660 | memcpy(ev->name, l_ptr->name, TIPC_MAX_LINK_NAME); | ||
661 | tipc_k_signal((Handler)link_recv_event, (unsigned long)ev); | ||
662 | } | ||
663 | |||
664 | #else | ||
665 | |||
666 | #define link_send_event(fcn, l_ptr, up) do { } while (0) | 624 | #define link_send_event(fcn, l_ptr, up) do { } while (0) |
667 | 625 | ||
668 | #endif | ||
669 | |||
670 | void tipc_link_reset(struct link *l_ptr) | 626 | void tipc_link_reset(struct link *l_ptr) |
671 | { | 627 | { |
672 | struct sk_buff *buf; | 628 | struct sk_buff *buf; |
@@ -690,10 +646,7 @@ void tipc_link_reset(struct link *l_ptr) | |||
690 | 646 | ||
691 | tipc_node_link_down(l_ptr->owner, l_ptr); | 647 | tipc_node_link_down(l_ptr->owner, l_ptr); |
692 | tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); | 648 | tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); |
693 | #if 0 | 649 | |
694 | tipc_printf(TIPC_CONS, "\nReset link <%s>\n", l_ptr->name); | ||
695 | dbg_link_dump(); | ||
696 | #endif | ||
697 | if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && | 650 | if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && |
698 | l_ptr->owner->permit_changeover) { | 651 | l_ptr->owner->permit_changeover) { |
699 | l_ptr->reset_checkpoint = checkpoint; | 652 | l_ptr->reset_checkpoint = checkpoint; |
@@ -1050,7 +1003,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
1050 | /* Fragmentation needed ? */ | 1003 | /* Fragmentation needed ? */ |
1051 | 1004 | ||
1052 | if (size > max_packet) | 1005 | if (size > max_packet) |
1053 | return tipc_link_send_long_buf(l_ptr, buf); | 1006 | return link_send_long_buf(l_ptr, buf); |
1054 | 1007 | ||
1055 | /* Packet can be queued or sent: */ | 1008 | /* Packet can be queued or sent: */ |
1056 | 1009 | ||
@@ -1086,7 +1039,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
1086 | /* Try creating a new bundle */ | 1039 | /* Try creating a new bundle */ |
1087 | 1040 | ||
1088 | if (size <= max_packet * 2 / 3) { | 1041 | if (size <= max_packet * 2 / 3) { |
1089 | struct sk_buff *bundler = buf_acquire(max_packet); | 1042 | struct sk_buff *bundler = tipc_buf_acquire(max_packet); |
1090 | struct tipc_msg bundler_hdr; | 1043 | struct tipc_msg bundler_hdr; |
1091 | 1044 | ||
1092 | if (bundler) { | 1045 | if (bundler) { |
@@ -1362,7 +1315,7 @@ again: | |||
1362 | 1315 | ||
1363 | /* Prepare header of first fragment: */ | 1316 | /* Prepare header of first fragment: */ |
1364 | 1317 | ||
1365 | buf_chain = buf = buf_acquire(max_pkt); | 1318 | buf_chain = buf = tipc_buf_acquire(max_pkt); |
1366 | if (!buf) | 1319 | if (!buf) |
1367 | return -ENOMEM; | 1320 | return -ENOMEM; |
1368 | buf->next = NULL; | 1321 | buf->next = NULL; |
@@ -1419,7 +1372,7 @@ error: | |||
1419 | msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); | 1372 | msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); |
1420 | msg_set_fragm_no(&fragm_hdr, ++fragm_no); | 1373 | msg_set_fragm_no(&fragm_hdr, ++fragm_no); |
1421 | prev = buf; | 1374 | prev = buf; |
1422 | buf = buf_acquire(fragm_sz + INT_H_SIZE); | 1375 | buf = tipc_buf_acquire(fragm_sz + INT_H_SIZE); |
1423 | if (!buf) | 1376 | if (!buf) |
1424 | goto error; | 1377 | goto error; |
1425 | 1378 | ||
@@ -1802,6 +1755,15 @@ static int link_recv_buf_validate(struct sk_buff *buf) | |||
1802 | return pskb_may_pull(buf, hdr_size); | 1755 | return pskb_may_pull(buf, hdr_size); |
1803 | } | 1756 | } |
1804 | 1757 | ||
1758 | /** | ||
1759 | * tipc_recv_msg - process TIPC messages arriving from off-node | ||
1760 | * @head: pointer to message buffer chain | ||
1761 | * @tb_ptr: pointer to bearer message arrived on | ||
1762 | * | ||
1763 | * Invoked with no locks held. Bearer pointer must point to a valid bearer | ||
1764 | * structure (i.e. cannot be NULL), but bearer can be inactive. | ||
1765 | */ | ||
1766 | |||
1805 | void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | 1767 | void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) |
1806 | { | 1768 | { |
1807 | read_lock_bh(&tipc_net_lock); | 1769 | read_lock_bh(&tipc_net_lock); |
@@ -1819,6 +1781,11 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||
1819 | 1781 | ||
1820 | head = head->next; | 1782 | head = head->next; |
1821 | 1783 | ||
1784 | /* Ensure bearer is still enabled */ | ||
1785 | |||
1786 | if (unlikely(!b_ptr->active)) | ||
1787 | goto cont; | ||
1788 | |||
1822 | /* Ensure message is well-formed */ | 1789 | /* Ensure message is well-formed */ |
1823 | 1790 | ||
1824 | if (unlikely(!link_recv_buf_validate(buf))) | 1791 | if (unlikely(!link_recv_buf_validate(buf))) |
@@ -1855,13 +1822,22 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) | |||
1855 | goto cont; | 1822 | goto cont; |
1856 | } | 1823 | } |
1857 | 1824 | ||
1858 | /* Locate unicast link endpoint that should handle message */ | 1825 | /* Locate neighboring node that sent message */ |
1859 | 1826 | ||
1860 | n_ptr = tipc_node_find(msg_prevnode(msg)); | 1827 | n_ptr = tipc_node_find(msg_prevnode(msg)); |
1861 | if (unlikely(!n_ptr)) | 1828 | if (unlikely(!n_ptr)) |
1862 | goto cont; | 1829 | goto cont; |
1863 | tipc_node_lock(n_ptr); | 1830 | tipc_node_lock(n_ptr); |
1864 | 1831 | ||
1832 | /* Don't talk to neighbor during cleanup after last session */ | ||
1833 | |||
1834 | if (n_ptr->cleanup_required) { | ||
1835 | tipc_node_unlock(n_ptr); | ||
1836 | goto cont; | ||
1837 | } | ||
1838 | |||
1839 | /* Locate unicast link endpoint that should handle message */ | ||
1840 | |||
1865 | l_ptr = n_ptr->links[b_ptr->identity]; | 1841 | l_ptr = n_ptr->links[b_ptr->identity]; |
1866 | if (unlikely(!l_ptr)) { | 1842 | if (unlikely(!l_ptr)) { |
1867 | tipc_node_unlock(n_ptr); | 1843 | tipc_node_unlock(n_ptr); |
@@ -2172,7 +2148,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
2172 | if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { | 2148 | if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { |
2173 | if (!l_ptr->proto_msg_queue) { | 2149 | if (!l_ptr->proto_msg_queue) { |
2174 | l_ptr->proto_msg_queue = | 2150 | l_ptr->proto_msg_queue = |
2175 | buf_acquire(sizeof(l_ptr->proto_msg)); | 2151 | tipc_buf_acquire(sizeof(l_ptr->proto_msg)); |
2176 | } | 2152 | } |
2177 | buf = l_ptr->proto_msg_queue; | 2153 | buf = l_ptr->proto_msg_queue; |
2178 | if (!buf) | 2154 | if (!buf) |
@@ -2186,7 +2162,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
2186 | 2162 | ||
2187 | msg_dbg(msg, ">>"); | 2163 | msg_dbg(msg, ">>"); |
2188 | 2164 | ||
2189 | buf = buf_acquire(msg_size); | 2165 | buf = tipc_buf_acquire(msg_size); |
2190 | if (!buf) | 2166 | if (!buf) |
2191 | return; | 2167 | return; |
2192 | 2168 | ||
@@ -2345,10 +2321,10 @@ exit: | |||
2345 | * tipc_link_tunnel(): Send one message via a link belonging to | 2321 | * tipc_link_tunnel(): Send one message via a link belonging to |
2346 | * another bearer. Owner node is locked. | 2322 | * another bearer. Owner node is locked. |
2347 | */ | 2323 | */ |
2348 | void tipc_link_tunnel(struct link *l_ptr, | 2324 | static void tipc_link_tunnel(struct link *l_ptr, |
2349 | struct tipc_msg *tunnel_hdr, | 2325 | struct tipc_msg *tunnel_hdr, |
2350 | struct tipc_msg *msg, | 2326 | struct tipc_msg *msg, |
2351 | u32 selector) | 2327 | u32 selector) |
2352 | { | 2328 | { |
2353 | struct link *tunnel; | 2329 | struct link *tunnel; |
2354 | struct sk_buff *buf; | 2330 | struct sk_buff *buf; |
@@ -2361,7 +2337,7 @@ void tipc_link_tunnel(struct link *l_ptr, | |||
2361 | return; | 2337 | return; |
2362 | } | 2338 | } |
2363 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); | 2339 | msg_set_size(tunnel_hdr, length + INT_H_SIZE); |
2364 | buf = buf_acquire(length + INT_H_SIZE); | 2340 | buf = tipc_buf_acquire(length + INT_H_SIZE); |
2365 | if (!buf) { | 2341 | if (!buf) { |
2366 | warn("Link changeover error, " | 2342 | warn("Link changeover error, " |
2367 | "unable to send tunnel msg\n"); | 2343 | "unable to send tunnel msg\n"); |
@@ -2407,7 +2383,7 @@ void tipc_link_changeover(struct link *l_ptr) | |||
2407 | if (!l_ptr->first_out) { | 2383 | if (!l_ptr->first_out) { |
2408 | struct sk_buff *buf; | 2384 | struct sk_buff *buf; |
2409 | 2385 | ||
2410 | buf = buf_acquire(INT_H_SIZE); | 2386 | buf = tipc_buf_acquire(INT_H_SIZE); |
2411 | if (buf) { | 2387 | if (buf) { |
2412 | skb_copy_to_linear_data(buf, &tunnel_hdr, INT_H_SIZE); | 2388 | skb_copy_to_linear_data(buf, &tunnel_hdr, INT_H_SIZE); |
2413 | msg_set_size(&tunnel_hdr, INT_H_SIZE); | 2389 | msg_set_size(&tunnel_hdr, INT_H_SIZE); |
@@ -2468,7 +2444,7 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel) | |||
2468 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); /* Update */ | 2444 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); /* Update */ |
2469 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); | 2445 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); |
2470 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); | 2446 | msg_set_size(&tunnel_hdr, length + INT_H_SIZE); |
2471 | outbuf = buf_acquire(length + INT_H_SIZE); | 2447 | outbuf = tipc_buf_acquire(length + INT_H_SIZE); |
2472 | if (outbuf == NULL) { | 2448 | if (outbuf == NULL) { |
2473 | warn("Link changeover error, " | 2449 | warn("Link changeover error, " |
2474 | "unable to send duplicate msg\n"); | 2450 | "unable to send duplicate msg\n"); |
@@ -2504,7 +2480,7 @@ static struct sk_buff *buf_extract(struct sk_buff *skb, u32 from_pos) | |||
2504 | u32 size = msg_size(msg); | 2480 | u32 size = msg_size(msg); |
2505 | struct sk_buff *eb; | 2481 | struct sk_buff *eb; |
2506 | 2482 | ||
2507 | eb = buf_acquire(size); | 2483 | eb = tipc_buf_acquire(size); |
2508 | if (eb) | 2484 | if (eb) |
2509 | skb_copy_to_linear_data(eb, msg, size); | 2485 | skb_copy_to_linear_data(eb, msg, size); |
2510 | return eb; | 2486 | return eb; |
@@ -2632,11 +2608,11 @@ void tipc_link_recv_bundle(struct sk_buff *buf) | |||
2632 | 2608 | ||
2633 | 2609 | ||
2634 | /* | 2610 | /* |
2635 | * tipc_link_send_long_buf: Entry for buffers needing fragmentation. | 2611 | * link_send_long_buf: Entry for buffers needing fragmentation. |
2636 | * The buffer is complete, inclusive total message length. | 2612 | * The buffer is complete, inclusive total message length. |
2637 | * Returns user data length. | 2613 | * Returns user data length. |
2638 | */ | 2614 | */ |
2639 | int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) | 2615 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) |
2640 | { | 2616 | { |
2641 | struct tipc_msg *inmsg = buf_msg(buf); | 2617 | struct tipc_msg *inmsg = buf_msg(buf); |
2642 | struct tipc_msg fragm_hdr; | 2618 | struct tipc_msg fragm_hdr; |
@@ -2675,7 +2651,7 @@ int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) | |||
2675 | fragm_sz = rest; | 2651 | fragm_sz = rest; |
2676 | msg_set_type(&fragm_hdr, LAST_FRAGMENT); | 2652 | msg_set_type(&fragm_hdr, LAST_FRAGMENT); |
2677 | } | 2653 | } |
2678 | fragm = buf_acquire(fragm_sz + INT_H_SIZE); | 2654 | fragm = tipc_buf_acquire(fragm_sz + INT_H_SIZE); |
2679 | if (fragm == NULL) { | 2655 | if (fragm == NULL) { |
2680 | warn("Link unable to fragment message\n"); | 2656 | warn("Link unable to fragment message\n"); |
2681 | dsz = -ENOMEM; | 2657 | dsz = -ENOMEM; |
@@ -2780,7 +2756,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
2780 | buf_discard(fbuf); | 2756 | buf_discard(fbuf); |
2781 | return 0; | 2757 | return 0; |
2782 | } | 2758 | } |
2783 | pbuf = buf_acquire(msg_size(imsg)); | 2759 | pbuf = tipc_buf_acquire(msg_size(imsg)); |
2784 | if (pbuf != NULL) { | 2760 | if (pbuf != NULL) { |
2785 | pbuf->next = *pending; | 2761 | pbuf->next = *pending; |
2786 | *pending = pbuf; | 2762 | *pending = pbuf; |
@@ -3174,44 +3150,6 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s | |||
3174 | return buf; | 3150 | return buf; |
3175 | } | 3151 | } |
3176 | 3152 | ||
3177 | #if 0 | ||
3178 | int link_control(const char *name, u32 op, u32 val) | ||
3179 | { | ||
3180 | int res = -EINVAL; | ||
3181 | struct link *l_ptr; | ||
3182 | u32 bearer_id; | ||
3183 | struct tipc_node * node; | ||
3184 | u32 a; | ||
3185 | |||
3186 | a = link_name2addr(name, &bearer_id); | ||
3187 | read_lock_bh(&tipc_net_lock); | ||
3188 | node = tipc_node_find(a); | ||
3189 | if (node) { | ||
3190 | tipc_node_lock(node); | ||
3191 | l_ptr = node->links[bearer_id]; | ||
3192 | if (l_ptr) { | ||
3193 | if (op == TIPC_REMOVE_LINK) { | ||
3194 | struct bearer *b_ptr = l_ptr->b_ptr; | ||
3195 | spin_lock_bh(&b_ptr->publ.lock); | ||
3196 | tipc_link_delete(l_ptr); | ||
3197 | spin_unlock_bh(&b_ptr->publ.lock); | ||
3198 | } | ||
3199 | if (op == TIPC_CMD_BLOCK_LINK) { | ||
3200 | tipc_link_reset(l_ptr); | ||
3201 | l_ptr->blocked = 1; | ||
3202 | } | ||
3203 | if (op == TIPC_CMD_UNBLOCK_LINK) { | ||
3204 | l_ptr->blocked = 0; | ||
3205 | } | ||
3206 | res = 0; | ||
3207 | } | ||
3208 | tipc_node_unlock(node); | ||
3209 | } | ||
3210 | read_unlock_bh(&tipc_net_lock); | ||
3211 | return res; | ||
3212 | } | ||
3213 | #endif | ||
3214 | |||
3215 | /** | 3153 | /** |
3216 | * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination | 3154 | * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination |
3217 | * @dest: network address of destination node | 3155 | * @dest: network address of destination node |
@@ -3242,28 +3180,6 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | |||
3242 | return res; | 3180 | return res; |
3243 | } | 3181 | } |
3244 | 3182 | ||
3245 | #if 0 | ||
3246 | static void link_dump_rec_queue(struct link *l_ptr) | ||
3247 | { | ||
3248 | struct sk_buff *crs; | ||
3249 | |||
3250 | if (!l_ptr->oldest_deferred_in) { | ||
3251 | info("Reception queue empty\n"); | ||
3252 | return; | ||
3253 | } | ||
3254 | info("Contents of Reception queue:\n"); | ||
3255 | crs = l_ptr->oldest_deferred_in; | ||
3256 | while (crs) { | ||
3257 | if (crs->data == (void *)0x0000a3a3) { | ||
3258 | info("buffer %x invalid\n", crs); | ||
3259 | return; | ||
3260 | } | ||
3261 | msg_dbg(buf_msg(crs), "In rec queue:\n"); | ||
3262 | crs = crs->next; | ||
3263 | } | ||
3264 | } | ||
3265 | #endif | ||
3266 | |||
3267 | static void link_dump_send_queue(struct link *l_ptr) | 3183 | static void link_dump_send_queue(struct link *l_ptr) |
3268 | { | 3184 | { |
3269 | if (l_ptr->next_out) { | 3185 | if (l_ptr->next_out) { |
diff --git a/net/tipc/link.h b/net/tipc/link.h index 2e5385c47d30..f98bc613de67 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h | |||
@@ -210,10 +210,6 @@ struct link { | |||
210 | u32 msg_length_counts; | 210 | u32 msg_length_counts; |
211 | u32 msg_lengths_total; | 211 | u32 msg_lengths_total; |
212 | u32 msg_length_profile[7]; | 212 | u32 msg_length_profile[7]; |
213 | #if 0 | ||
214 | u32 sent_tunneled; | ||
215 | u32 recv_tunneled; | ||
216 | #endif | ||
217 | } stats; | 213 | } stats; |
218 | 214 | ||
219 | struct print_buf print_buf; | 215 | struct print_buf print_buf; |
@@ -229,7 +225,6 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *dest); | |||
229 | void tipc_link_reset_fragments(struct link *l_ptr); | 225 | void tipc_link_reset_fragments(struct link *l_ptr); |
230 | int tipc_link_is_up(struct link *l_ptr); | 226 | int tipc_link_is_up(struct link *l_ptr); |
231 | int tipc_link_is_active(struct link *l_ptr); | 227 | int tipc_link_is_active(struct link *l_ptr); |
232 | void tipc_link_start(struct link *l_ptr); | ||
233 | u32 tipc_link_push_packet(struct link *l_ptr); | 228 | u32 tipc_link_push_packet(struct link *l_ptr); |
234 | void tipc_link_stop(struct link *l_ptr); | 229 | void tipc_link_stop(struct link *l_ptr); |
235 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd); | 230 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd); |
@@ -243,9 +238,6 @@ int tipc_link_send_sections_fast(struct port* sender, | |||
243 | struct iovec const *msg_sect, | 238 | struct iovec const *msg_sect, |
244 | const u32 num_sect, | 239 | const u32 num_sect, |
245 | u32 destnode); | 240 | u32 destnode); |
246 | int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf); | ||
247 | void tipc_link_tunnel(struct link *l_ptr, struct tipc_msg *tnl_hdr, | ||
248 | struct tipc_msg *msg, u32 selector); | ||
249 | void tipc_link_recv_bundle(struct sk_buff *buf); | 241 | void tipc_link_recv_bundle(struct sk_buff *buf); |
250 | int tipc_link_recv_fragment(struct sk_buff **pending, | 242 | int tipc_link_recv_fragment(struct sk_buff **pending, |
251 | struct sk_buff **fb, | 243 | struct sk_buff **fb, |
@@ -279,12 +271,12 @@ static inline int between(u32 lower, u32 upper, u32 n) | |||
279 | 271 | ||
280 | static inline int less_eq(u32 left, u32 right) | 272 | static inline int less_eq(u32 left, u32 right) |
281 | { | 273 | { |
282 | return (mod(right - left) < 32768u); | 274 | return mod(right - left) < 32768u; |
283 | } | 275 | } |
284 | 276 | ||
285 | static inline int less(u32 left, u32 right) | 277 | static inline int less(u32 left, u32 right) |
286 | { | 278 | { |
287 | return (less_eq(left, right) && (mod(right) != mod(left))); | 279 | return less_eq(left, right) && (mod(right) != mod(left)); |
288 | } | 280 | } |
289 | 281 | ||
290 | static inline u32 lesser(u32 left, u32 right) | 282 | static inline u32 lesser(u32 left, u32 right) |
@@ -299,32 +291,32 @@ static inline u32 lesser(u32 left, u32 right) | |||
299 | 291 | ||
300 | static inline int link_working_working(struct link *l_ptr) | 292 | static inline int link_working_working(struct link *l_ptr) |
301 | { | 293 | { |
302 | return (l_ptr->state == WORKING_WORKING); | 294 | return l_ptr->state == WORKING_WORKING; |
303 | } | 295 | } |
304 | 296 | ||
305 | static inline int link_working_unknown(struct link *l_ptr) | 297 | static inline int link_working_unknown(struct link *l_ptr) |
306 | { | 298 | { |
307 | return (l_ptr->state == WORKING_UNKNOWN); | 299 | return l_ptr->state == WORKING_UNKNOWN; |
308 | } | 300 | } |
309 | 301 | ||
310 | static inline int link_reset_unknown(struct link *l_ptr) | 302 | static inline int link_reset_unknown(struct link *l_ptr) |
311 | { | 303 | { |
312 | return (l_ptr->state == RESET_UNKNOWN); | 304 | return l_ptr->state == RESET_UNKNOWN; |
313 | } | 305 | } |
314 | 306 | ||
315 | static inline int link_reset_reset(struct link *l_ptr) | 307 | static inline int link_reset_reset(struct link *l_ptr) |
316 | { | 308 | { |
317 | return (l_ptr->state == RESET_RESET); | 309 | return l_ptr->state == RESET_RESET; |
318 | } | 310 | } |
319 | 311 | ||
320 | static inline int link_blocked(struct link *l_ptr) | 312 | static inline int link_blocked(struct link *l_ptr) |
321 | { | 313 | { |
322 | return (l_ptr->exp_msg_count || l_ptr->blocked); | 314 | return l_ptr->exp_msg_count || l_ptr->blocked; |
323 | } | 315 | } |
324 | 316 | ||
325 | static inline int link_congested(struct link *l_ptr) | 317 | static inline int link_congested(struct link *l_ptr) |
326 | { | 318 | { |
327 | return (l_ptr->out_queue_size >= l_ptr->queue_limit[0]); | 319 | return l_ptr->out_queue_size >= l_ptr->queue_limit[0]; |
328 | } | 320 | } |
329 | 321 | ||
330 | #endif | 322 | #endif |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 381063817b41..ecb532fb0351 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -112,7 +112,7 @@ int tipc_msg_build(struct tipc_msg *hdr, | |||
112 | return dsz; | 112 | return dsz; |
113 | } | 113 | } |
114 | 114 | ||
115 | *buf = buf_acquire(sz); | 115 | *buf = tipc_buf_acquire(sz); |
116 | if (!(*buf)) | 116 | if (!(*buf)) |
117 | return -ENOMEM; | 117 | return -ENOMEM; |
118 | skb_copy_to_linear_data(*buf, hdr, hsz); | 118 | skb_copy_to_linear_data(*buf, hdr, hsz); |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index 995d2da35b01..031aad18efce 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
@@ -104,7 +104,7 @@ static inline u32 msg_user(struct tipc_msg *m) | |||
104 | 104 | ||
105 | static inline u32 msg_isdata(struct tipc_msg *m) | 105 | static inline u32 msg_isdata(struct tipc_msg *m) |
106 | { | 106 | { |
107 | return (msg_user(m) <= TIPC_CRITICAL_IMPORTANCE); | 107 | return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE; |
108 | } | 108 | } |
109 | 109 | ||
110 | static inline void msg_set_user(struct tipc_msg *m, u32 n) | 110 | static inline void msg_set_user(struct tipc_msg *m, u32 n) |
@@ -289,7 +289,7 @@ static inline void msg_set_destnode(struct tipc_msg *m, u32 a) | |||
289 | 289 | ||
290 | static inline int msg_is_dest(struct tipc_msg *m, u32 d) | 290 | static inline int msg_is_dest(struct tipc_msg *m, u32 d) |
291 | { | 291 | { |
292 | return(msg_short(m) || (msg_destnode(m) == d)); | 292 | return msg_short(m) || (msg_destnode(m) == d); |
293 | } | 293 | } |
294 | 294 | ||
295 | static inline u32 msg_routed(struct tipc_msg *m) | 295 | static inline u32 msg_routed(struct tipc_msg *m) |
@@ -632,7 +632,7 @@ static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n) | |||
632 | 632 | ||
633 | static inline u32 msg_max_pkt(struct tipc_msg *m) | 633 | static inline u32 msg_max_pkt(struct tipc_msg *m) |
634 | { | 634 | { |
635 | return (msg_bits(m, 9, 16, 0xffff) * 4); | 635 | return msg_bits(m, 9, 16, 0xffff) * 4; |
636 | } | 636 | } |
637 | 637 | ||
638 | static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) | 638 | static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) |
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index 6ac3c543250b..7b907171f879 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c | |||
@@ -98,7 +98,7 @@ static void publ_to_item(struct distr_item *i, struct publication *p) | |||
98 | 98 | ||
99 | static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest) | 99 | static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest) |
100 | { | 100 | { |
101 | struct sk_buff *buf = buf_acquire(LONG_H_SIZE + size); | 101 | struct sk_buff *buf = tipc_buf_acquire(LONG_H_SIZE + size); |
102 | struct tipc_msg *msg; | 102 | struct tipc_msg *msg; |
103 | 103 | ||
104 | if (buf != NULL) { | 104 | if (buf != NULL) { |
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index 8ba79620db3f..3a8de4334da1 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c | |||
@@ -116,7 +116,7 @@ DEFINE_RWLOCK(tipc_nametbl_lock); | |||
116 | 116 | ||
117 | static int hash(int x) | 117 | static int hash(int x) |
118 | { | 118 | { |
119 | return(x & (tipc_nametbl_size - 1)); | 119 | return x & (tipc_nametbl_size - 1); |
120 | } | 120 | } |
121 | 121 | ||
122 | /** | 122 | /** |
@@ -613,8 +613,7 @@ struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, | |||
613 | } | 613 | } |
614 | 614 | ||
615 | /* | 615 | /* |
616 | * tipc_nametbl_translate(): Translate tipc_name -> tipc_portid. | 616 | * tipc_nametbl_translate - translate name to port id |
617 | * Very time-critical. | ||
618 | * | 617 | * |
619 | * Note: on entry 'destnode' is the search domain used during translation; | 618 | * Note: on entry 'destnode' is the search domain used during translation; |
620 | * on exit it passes back the node address of the matching port (if any) | 619 | * on exit it passes back the node address of the matching port (if any) |
@@ -685,7 +684,6 @@ found: | |||
685 | } | 684 | } |
686 | spin_unlock_bh(&seq->lock); | 685 | spin_unlock_bh(&seq->lock); |
687 | not_found: | 686 | not_found: |
688 | *destnode = 0; | ||
689 | read_unlock_bh(&tipc_nametbl_lock); | 687 | read_unlock_bh(&tipc_nametbl_lock); |
690 | return 0; | 688 | return 0; |
691 | } | 689 | } |
@@ -877,7 +875,7 @@ static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth, | |||
877 | u32 index) | 875 | u32 index) |
878 | { | 876 | { |
879 | char portIdStr[27]; | 877 | char portIdStr[27]; |
880 | char *scopeStr; | 878 | const char *scope_str[] = {"", " zone", " cluster", " node"}; |
881 | struct publication *publ = sseq->zone_list; | 879 | struct publication *publ = sseq->zone_list; |
882 | 880 | ||
883 | tipc_printf(buf, "%-10u %-10u ", sseq->lower, sseq->upper); | 881 | tipc_printf(buf, "%-10u %-10u ", sseq->lower, sseq->upper); |
@@ -893,15 +891,8 @@ static void subseq_list(struct sub_seq *sseq, struct print_buf *buf, u32 depth, | |||
893 | tipc_node(publ->node), publ->ref); | 891 | tipc_node(publ->node), publ->ref); |
894 | tipc_printf(buf, "%-26s ", portIdStr); | 892 | tipc_printf(buf, "%-26s ", portIdStr); |
895 | if (depth > 3) { | 893 | if (depth > 3) { |
896 | if (publ->node != tipc_own_addr) | 894 | tipc_printf(buf, "%-10u %s", publ->key, |
897 | scopeStr = ""; | 895 | scope_str[publ->scope]); |
898 | else if (publ->scope == TIPC_NODE_SCOPE) | ||
899 | scopeStr = "node"; | ||
900 | else if (publ->scope == TIPC_CLUSTER_SCOPE) | ||
901 | scopeStr = "cluster"; | ||
902 | else | ||
903 | scopeStr = "zone"; | ||
904 | tipc_printf(buf, "%-10u %s", publ->key, scopeStr); | ||
905 | } | 896 | } |
906 | 897 | ||
907 | publ = publ->zone_list_next; | 898 | publ = publ->zone_list_next; |
@@ -951,24 +942,19 @@ static void nameseq_list(struct name_seq *seq, struct print_buf *buf, u32 depth, | |||
951 | 942 | ||
952 | static void nametbl_header(struct print_buf *buf, u32 depth) | 943 | static void nametbl_header(struct print_buf *buf, u32 depth) |
953 | { | 944 | { |
954 | tipc_printf(buf, "Type "); | 945 | const char *header[] = { |
955 | 946 | "Type ", | |
956 | if (depth > 1) | 947 | "Lower Upper ", |
957 | tipc_printf(buf, "Lower Upper "); | 948 | "Port Identity ", |
958 | if (depth > 2) | 949 | "Publication Scope" |
959 | tipc_printf(buf, "Port Identity "); | 950 | }; |
960 | if (depth > 3) | 951 | |
961 | tipc_printf(buf, "Publication"); | 952 | int i; |
962 | 953 | ||
963 | tipc_printf(buf, "\n-----------"); | 954 | if (depth > 4) |
964 | 955 | depth = 4; | |
965 | if (depth > 1) | 956 | for (i = 0; i < depth; i++) |
966 | tipc_printf(buf, "--------------------- "); | 957 | tipc_printf(buf, header[i]); |
967 | if (depth > 2) | ||
968 | tipc_printf(buf, "-------------------------- "); | ||
969 | if (depth > 3) | ||
970 | tipc_printf(buf, "------------------"); | ||
971 | |||
972 | tipc_printf(buf, "\n"); | 958 | tipc_printf(buf, "\n"); |
973 | } | 959 | } |
974 | 960 | ||
@@ -1023,16 +1009,6 @@ static void nametbl_list(struct print_buf *buf, u32 depth_info, | |||
1023 | } | 1009 | } |
1024 | } | 1010 | } |
1025 | 1011 | ||
1026 | #if 0 | ||
1027 | void tipc_nametbl_print(struct print_buf *buf, const char *str) | ||
1028 | { | ||
1029 | tipc_printf(buf, str); | ||
1030 | read_lock_bh(&tipc_nametbl_lock); | ||
1031 | nametbl_list(buf, 0, 0, 0, 0); | ||
1032 | read_unlock_bh(&tipc_nametbl_lock); | ||
1033 | } | ||
1034 | #endif | ||
1035 | |||
1036 | #define MAX_NAME_TBL_QUERY 32768 | 1012 | #define MAX_NAME_TBL_QUERY 32768 |
1037 | 1013 | ||
1038 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) | 1014 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) |
@@ -1065,13 +1041,6 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space) | |||
1065 | return buf; | 1041 | return buf; |
1066 | } | 1042 | } |
1067 | 1043 | ||
1068 | #if 0 | ||
1069 | void tipc_nametbl_dump(void) | ||
1070 | { | ||
1071 | nametbl_list(TIPC_CONS, 0, 0, 0, 0); | ||
1072 | } | ||
1073 | #endif | ||
1074 | |||
1075 | int tipc_nametbl_init(void) | 1044 | int tipc_nametbl_init(void) |
1076 | { | 1045 | { |
1077 | table.types = kcalloc(tipc_nametbl_size, sizeof(struct hlist_head), | 1046 | table.types = kcalloc(tipc_nametbl_size, sizeof(struct hlist_head), |
diff --git a/net/tipc/net.c b/net/tipc/net.c index f61b7694138b..1a621cfd6604 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c | |||
@@ -129,15 +129,6 @@ u32 tipc_net_select_router(u32 addr, u32 ref) | |||
129 | return tipc_zone_select_router(tipc_net.zones[tipc_zone(addr)], addr, ref); | 129 | return tipc_zone_select_router(tipc_net.zones[tipc_zone(addr)], addr, ref); |
130 | } | 130 | } |
131 | 131 | ||
132 | #if 0 | ||
133 | u32 tipc_net_next_node(u32 a) | ||
134 | { | ||
135 | if (tipc_net.zones[tipc_zone(a)]) | ||
136 | return tipc_zone_next_node(a); | ||
137 | return 0; | ||
138 | } | ||
139 | #endif | ||
140 | |||
141 | void tipc_net_remove_as_router(u32 router) | 132 | void tipc_net_remove_as_router(u32 router) |
142 | { | 133 | { |
143 | u32 z_num; | 134 | u32 z_num; |
@@ -248,6 +239,7 @@ void tipc_net_route_msg(struct sk_buff *buf) | |||
248 | 239 | ||
249 | /* Handle message for another node */ | 240 | /* Handle message for another node */ |
250 | msg_dbg(msg, "NET>SEND>: "); | 241 | msg_dbg(msg, "NET>SEND>: "); |
242 | skb_trim(buf, msg_size(msg)); | ||
251 | tipc_link_send(buf, dnode, msg_link_selector(msg)); | 243 | tipc_link_send(buf, dnode, msg_link_selector(msg)); |
252 | } | 244 | } |
253 | 245 | ||
diff --git a/net/tipc/node.c b/net/tipc/node.c index b634942caba5..b4d87eb2dc5d 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -50,7 +50,8 @@ void node_print(struct print_buf *buf, struct tipc_node *n_ptr, char *str); | |||
50 | static void node_lost_contact(struct tipc_node *n_ptr); | 50 | static void node_lost_contact(struct tipc_node *n_ptr); |
51 | static void node_established_contact(struct tipc_node *n_ptr); | 51 | static void node_established_contact(struct tipc_node *n_ptr); |
52 | 52 | ||
53 | struct tipc_node *tipc_nodes = NULL; /* sorted list of nodes within cluster */ | 53 | /* sorted list of nodes within cluster */ |
54 | static struct tipc_node *tipc_nodes = NULL; | ||
54 | 55 | ||
55 | static DEFINE_SPINLOCK(node_create_lock); | 56 | static DEFINE_SPINLOCK(node_create_lock); |
56 | 57 | ||
@@ -125,16 +126,6 @@ void tipc_node_delete(struct tipc_node *n_ptr) | |||
125 | if (!n_ptr) | 126 | if (!n_ptr) |
126 | return; | 127 | return; |
127 | 128 | ||
128 | #if 0 | ||
129 | /* Not needed because links are already deleted via tipc_bearer_stop() */ | ||
130 | |||
131 | u32 l_num; | ||
132 | |||
133 | for (l_num = 0; l_num < MAX_BEARERS; l_num++) { | ||
134 | link_delete(n_ptr->links[l_num]); | ||
135 | } | ||
136 | #endif | ||
137 | |||
138 | dbg("node %x deleted\n", n_ptr->addr); | 129 | dbg("node %x deleted\n", n_ptr->addr); |
139 | kfree(n_ptr); | 130 | kfree(n_ptr); |
140 | } | 131 | } |
@@ -237,23 +228,22 @@ void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr) | |||
237 | 228 | ||
238 | int tipc_node_has_active_links(struct tipc_node *n_ptr) | 229 | int tipc_node_has_active_links(struct tipc_node *n_ptr) |
239 | { | 230 | { |
240 | return (n_ptr && | 231 | return n_ptr->active_links[0] != NULL; |
241 | ((n_ptr->active_links[0]) || (n_ptr->active_links[1]))); | ||
242 | } | 232 | } |
243 | 233 | ||
244 | int tipc_node_has_redundant_links(struct tipc_node *n_ptr) | 234 | int tipc_node_has_redundant_links(struct tipc_node *n_ptr) |
245 | { | 235 | { |
246 | return (n_ptr->working_links > 1); | 236 | return n_ptr->working_links > 1; |
247 | } | 237 | } |
248 | 238 | ||
249 | static int tipc_node_has_active_routes(struct tipc_node *n_ptr) | 239 | static int tipc_node_has_active_routes(struct tipc_node *n_ptr) |
250 | { | 240 | { |
251 | return (n_ptr && (n_ptr->last_router >= 0)); | 241 | return n_ptr && (n_ptr->last_router >= 0); |
252 | } | 242 | } |
253 | 243 | ||
254 | int tipc_node_is_up(struct tipc_node *n_ptr) | 244 | int tipc_node_is_up(struct tipc_node *n_ptr) |
255 | { | 245 | { |
256 | return (tipc_node_has_active_links(n_ptr) || tipc_node_has_active_routes(n_ptr)); | 246 | return tipc_node_has_active_links(n_ptr) || tipc_node_has_active_routes(n_ptr); |
257 | } | 247 | } |
258 | 248 | ||
259 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr) | 249 | struct tipc_node *tipc_node_attach_link(struct link *l_ptr) |
@@ -384,6 +374,20 @@ static void node_established_contact(struct tipc_node *n_ptr) | |||
384 | tipc_highest_allowed_slave); | 374 | tipc_highest_allowed_slave); |
385 | } | 375 | } |
386 | 376 | ||
377 | static void node_cleanup_finished(unsigned long node_addr) | ||
378 | { | ||
379 | struct tipc_node *n_ptr; | ||
380 | |||
381 | read_lock_bh(&tipc_net_lock); | ||
382 | n_ptr = tipc_node_find(node_addr); | ||
383 | if (n_ptr) { | ||
384 | tipc_node_lock(n_ptr); | ||
385 | n_ptr->cleanup_required = 0; | ||
386 | tipc_node_unlock(n_ptr); | ||
387 | } | ||
388 | read_unlock_bh(&tipc_net_lock); | ||
389 | } | ||
390 | |||
387 | static void node_lost_contact(struct tipc_node *n_ptr) | 391 | static void node_lost_contact(struct tipc_node *n_ptr) |
388 | { | 392 | { |
389 | struct cluster *c_ptr; | 393 | struct cluster *c_ptr; |
@@ -458,6 +462,11 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
458 | tipc_k_signal((Handler)ns->handle_node_down, | 462 | tipc_k_signal((Handler)ns->handle_node_down, |
459 | (unsigned long)ns->usr_handle); | 463 | (unsigned long)ns->usr_handle); |
460 | } | 464 | } |
465 | |||
466 | /* Prevent re-contact with node until all cleanup is done */ | ||
467 | |||
468 | n_ptr->cleanup_required = 1; | ||
469 | tipc_k_signal((Handler)node_cleanup_finished, n_ptr->addr); | ||
461 | } | 470 | } |
462 | 471 | ||
463 | /** | 472 | /** |
@@ -579,38 +588,6 @@ void tipc_node_remove_router(struct tipc_node *n_ptr, u32 router) | |||
579 | node_lost_contact(n_ptr); | 588 | node_lost_contact(n_ptr); |
580 | } | 589 | } |
581 | 590 | ||
582 | #if 0 | ||
583 | void node_print(struct print_buf *buf, struct tipc_node *n_ptr, char *str) | ||
584 | { | ||
585 | u32 i; | ||
586 | |||
587 | tipc_printf(buf, "\n\n%s", str); | ||
588 | for (i = 0; i < MAX_BEARERS; i++) { | ||
589 | if (!n_ptr->links[i]) | ||
590 | continue; | ||
591 | tipc_printf(buf, "Links[%u]: %x, ", i, n_ptr->links[i]); | ||
592 | } | ||
593 | tipc_printf(buf, "Active links: [%x,%x]\n", | ||
594 | n_ptr->active_links[0], n_ptr->active_links[1]); | ||
595 | } | ||
596 | #endif | ||
597 | |||
598 | u32 tipc_available_nodes(const u32 domain) | ||
599 | { | ||
600 | struct tipc_node *n_ptr; | ||
601 | u32 cnt = 0; | ||
602 | |||
603 | read_lock_bh(&tipc_net_lock); | ||
604 | for (n_ptr = tipc_nodes; n_ptr; n_ptr = n_ptr->next) { | ||
605 | if (!tipc_in_scope(domain, n_ptr->addr)) | ||
606 | continue; | ||
607 | if (tipc_node_is_up(n_ptr)) | ||
608 | cnt++; | ||
609 | } | ||
610 | read_unlock_bh(&tipc_net_lock); | ||
611 | return cnt; | ||
612 | } | ||
613 | |||
614 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) | 591 | struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space) |
615 | { | 592 | { |
616 | u32 domain; | 593 | u32 domain; |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 6f990da5d143..fff331b2d26c 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
@@ -52,6 +52,7 @@ | |||
52 | * @active_links: pointers to active links to node | 52 | * @active_links: pointers to active links to node |
53 | * @links: pointers to all links to node | 53 | * @links: pointers to all links to node |
54 | * @working_links: number of working links to node (both active and standby) | 54 | * @working_links: number of working links to node (both active and standby) |
55 | * @cleanup_required: non-zero if cleaning up after a prior loss of contact | ||
55 | * @link_cnt: number of links to node | 56 | * @link_cnt: number of links to node |
56 | * @permit_changeover: non-zero if node has redundant links to this system | 57 | * @permit_changeover: non-zero if node has redundant links to this system |
57 | * @routers: bitmap (used for multicluster communication) | 58 | * @routers: bitmap (used for multicluster communication) |
@@ -78,6 +79,7 @@ struct tipc_node { | |||
78 | struct link *links[MAX_BEARERS]; | 79 | struct link *links[MAX_BEARERS]; |
79 | int link_cnt; | 80 | int link_cnt; |
80 | int working_links; | 81 | int working_links; |
82 | int cleanup_required; | ||
81 | int permit_changeover; | 83 | int permit_changeover; |
82 | u32 routers[512/32]; | 84 | u32 routers[512/32]; |
83 | int last_router; | 85 | int last_router; |
@@ -94,7 +96,6 @@ struct tipc_node { | |||
94 | } bclink; | 96 | } bclink; |
95 | }; | 97 | }; |
96 | 98 | ||
97 | extern struct tipc_node *tipc_nodes; | ||
98 | extern u32 tipc_own_tag; | 99 | extern u32 tipc_own_tag; |
99 | 100 | ||
100 | struct tipc_node *tipc_node_create(u32 addr); | 101 | struct tipc_node *tipc_node_create(u32 addr); |
diff --git a/net/tipc/port.c b/net/tipc/port.c index 0737680e9266..82092eaa1536 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
@@ -293,34 +293,6 @@ int tipc_deleteport(u32 ref) | |||
293 | return 0; | 293 | return 0; |
294 | } | 294 | } |
295 | 295 | ||
296 | /** | ||
297 | * tipc_get_port() - return port associated with 'ref' | ||
298 | * | ||
299 | * Note: Port is not locked. | ||
300 | */ | ||
301 | |||
302 | struct tipc_port *tipc_get_port(const u32 ref) | ||
303 | { | ||
304 | return (struct tipc_port *)tipc_ref_deref(ref); | ||
305 | } | ||
306 | |||
307 | /** | ||
308 | * tipc_get_handle - return user handle associated to port 'ref' | ||
309 | */ | ||
310 | |||
311 | void *tipc_get_handle(const u32 ref) | ||
312 | { | ||
313 | struct port *p_ptr; | ||
314 | void * handle; | ||
315 | |||
316 | p_ptr = tipc_port_lock(ref); | ||
317 | if (!p_ptr) | ||
318 | return NULL; | ||
319 | handle = p_ptr->publ.usr_handle; | ||
320 | tipc_port_unlock(p_ptr); | ||
321 | return handle; | ||
322 | } | ||
323 | |||
324 | static int port_unreliable(struct port *p_ptr) | 296 | static int port_unreliable(struct port *p_ptr) |
325 | { | 297 | { |
326 | return msg_src_droppable(&p_ptr->publ.phdr); | 298 | return msg_src_droppable(&p_ptr->publ.phdr); |
@@ -392,7 +364,7 @@ static struct sk_buff *port_build_proto_msg(u32 destport, u32 destnode, | |||
392 | struct sk_buff *buf; | 364 | struct sk_buff *buf; |
393 | struct tipc_msg *msg; | 365 | struct tipc_msg *msg; |
394 | 366 | ||
395 | buf = buf_acquire(LONG_H_SIZE); | 367 | buf = tipc_buf_acquire(LONG_H_SIZE); |
396 | if (buf) { | 368 | if (buf) { |
397 | msg = buf_msg(buf); | 369 | msg = buf_msg(buf); |
398 | tipc_msg_init(msg, usr, type, LONG_H_SIZE, destnode); | 370 | tipc_msg_init(msg, usr, type, LONG_H_SIZE, destnode); |
@@ -433,7 +405,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err) | |||
433 | hdr_sz = MCAST_H_SIZE; | 405 | hdr_sz = MCAST_H_SIZE; |
434 | else | 406 | else |
435 | hdr_sz = LONG_H_SIZE; | 407 | hdr_sz = LONG_H_SIZE; |
436 | rbuf = buf_acquire(data_sz + hdr_sz); | 408 | rbuf = tipc_buf_acquire(data_sz + hdr_sz); |
437 | if (rbuf == NULL) { | 409 | if (rbuf == NULL) { |
438 | buf_discard(buf); | 410 | buf_discard(buf); |
439 | return data_sz; | 411 | return data_sz; |
@@ -588,19 +560,10 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf) | |||
588 | if (!p_ptr) { | 560 | if (!p_ptr) { |
589 | err = TIPC_ERR_NO_PORT; | 561 | err = TIPC_ERR_NO_PORT; |
590 | } else if (p_ptr->publ.connected) { | 562 | } else if (p_ptr->publ.connected) { |
591 | if (port_peernode(p_ptr) != msg_orignode(msg)) | 563 | if ((port_peernode(p_ptr) != msg_orignode(msg)) || |
564 | (port_peerport(p_ptr) != msg_origport(msg))) { | ||
592 | err = TIPC_ERR_NO_PORT; | 565 | err = TIPC_ERR_NO_PORT; |
593 | if (port_peerport(p_ptr) != msg_origport(msg)) | 566 | } else if (msg_type(msg) == CONN_ACK) { |
594 | err = TIPC_ERR_NO_PORT; | ||
595 | if (!err && msg_routed(msg)) { | ||
596 | u32 seqno = msg_transp_seqno(msg); | ||
597 | u32 myno = ++p_ptr->last_in_seqno; | ||
598 | if (seqno != myno) { | ||
599 | err = TIPC_ERR_NO_PORT; | ||
600 | abort_buf = port_build_self_abort_msg(p_ptr, err); | ||
601 | } | ||
602 | } | ||
603 | if (msg_type(msg) == CONN_ACK) { | ||
604 | int wakeup = tipc_port_congested(p_ptr) && | 567 | int wakeup = tipc_port_congested(p_ptr) && |
605 | p_ptr->publ.congested && | 568 | p_ptr->publ.congested && |
606 | p_ptr->wakeup; | 569 | p_ptr->wakeup; |
@@ -719,50 +682,6 @@ struct sk_buff *tipc_port_get_ports(void) | |||
719 | return buf; | 682 | return buf; |
720 | } | 683 | } |
721 | 684 | ||
722 | #if 0 | ||
723 | |||
724 | #define MAX_PORT_STATS 2000 | ||
725 | |||
726 | struct sk_buff *port_show_stats(const void *req_tlv_area, int req_tlv_space) | ||
727 | { | ||
728 | u32 ref; | ||
729 | struct port *p_ptr; | ||
730 | struct sk_buff *buf; | ||
731 | struct tlv_desc *rep_tlv; | ||
732 | struct print_buf pb; | ||
733 | int str_len; | ||
734 | |||
735 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_PORT_REF)) | ||
736 | return cfg_reply_error_string(TIPC_CFG_TLV_ERROR); | ||
737 | |||
738 | ref = *(u32 *)TLV_DATA(req_tlv_area); | ||
739 | ref = ntohl(ref); | ||
740 | |||
741 | p_ptr = tipc_port_lock(ref); | ||
742 | if (!p_ptr) | ||
743 | return cfg_reply_error_string("port not found"); | ||
744 | |||
745 | buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_PORT_STATS)); | ||
746 | if (!buf) { | ||
747 | tipc_port_unlock(p_ptr); | ||
748 | return NULL; | ||
749 | } | ||
750 | rep_tlv = (struct tlv_desc *)buf->data; | ||
751 | |||
752 | tipc_printbuf_init(&pb, TLV_DATA(rep_tlv), MAX_PORT_STATS); | ||
753 | port_print(p_ptr, &pb, 1); | ||
754 | /* NEED TO FILL IN ADDITIONAL PORT STATISTICS HERE */ | ||
755 | tipc_port_unlock(p_ptr); | ||
756 | str_len = tipc_printbuf_validate(&pb); | ||
757 | |||
758 | skb_put(buf, TLV_SPACE(str_len)); | ||
759 | TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); | ||
760 | |||
761 | return buf; | ||
762 | } | ||
763 | |||
764 | #endif | ||
765 | |||
766 | void tipc_port_reinit(void) | 685 | void tipc_port_reinit(void) |
767 | { | 686 | { |
768 | struct port *p_ptr; | 687 | struct port *p_ptr; |
@@ -1295,50 +1214,13 @@ int tipc_shutdown(u32 ref) | |||
1295 | return tipc_disconnect(ref); | 1214 | return tipc_disconnect(ref); |
1296 | } | 1215 | } |
1297 | 1216 | ||
1298 | int tipc_isconnected(u32 ref, int *isconnected) | ||
1299 | { | ||
1300 | struct port *p_ptr; | ||
1301 | |||
1302 | p_ptr = tipc_port_lock(ref); | ||
1303 | if (!p_ptr) | ||
1304 | return -EINVAL; | ||
1305 | *isconnected = p_ptr->publ.connected; | ||
1306 | tipc_port_unlock(p_ptr); | ||
1307 | return 0; | ||
1308 | } | ||
1309 | |||
1310 | int tipc_peer(u32 ref, struct tipc_portid *peer) | ||
1311 | { | ||
1312 | struct port *p_ptr; | ||
1313 | int res; | ||
1314 | |||
1315 | p_ptr = tipc_port_lock(ref); | ||
1316 | if (!p_ptr) | ||
1317 | return -EINVAL; | ||
1318 | if (p_ptr->publ.connected) { | ||
1319 | peer->ref = port_peerport(p_ptr); | ||
1320 | peer->node = port_peernode(p_ptr); | ||
1321 | res = 0; | ||
1322 | } else | ||
1323 | res = -ENOTCONN; | ||
1324 | tipc_port_unlock(p_ptr); | ||
1325 | return res; | ||
1326 | } | ||
1327 | |||
1328 | int tipc_ref_valid(u32 ref) | ||
1329 | { | ||
1330 | /* Works irrespective of type */ | ||
1331 | return !!tipc_ref_deref(ref); | ||
1332 | } | ||
1333 | |||
1334 | |||
1335 | /* | 1217 | /* |
1336 | * tipc_port_recv_sections(): Concatenate and deliver sectioned | 1218 | * tipc_port_recv_sections(): Concatenate and deliver sectioned |
1337 | * message for this node. | 1219 | * message for this node. |
1338 | */ | 1220 | */ |
1339 | 1221 | ||
1340 | int tipc_port_recv_sections(struct port *sender, unsigned int num_sect, | 1222 | static int tipc_port_recv_sections(struct port *sender, unsigned int num_sect, |
1341 | struct iovec const *msg_sect) | 1223 | struct iovec const *msg_sect) |
1342 | { | 1224 | { |
1343 | struct sk_buff *buf; | 1225 | struct sk_buff *buf; |
1344 | int res; | 1226 | int res; |
@@ -1389,65 +1271,16 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect) | |||
1389 | } | 1271 | } |
1390 | 1272 | ||
1391 | /** | 1273 | /** |
1392 | * tipc_send_buf - send message buffer on connection | ||
1393 | */ | ||
1394 | |||
1395 | int tipc_send_buf(u32 ref, struct sk_buff *buf, unsigned int dsz) | ||
1396 | { | ||
1397 | struct port *p_ptr; | ||
1398 | struct tipc_msg *msg; | ||
1399 | u32 destnode; | ||
1400 | u32 hsz; | ||
1401 | u32 sz; | ||
1402 | u32 res; | ||
1403 | |||
1404 | p_ptr = tipc_port_deref(ref); | ||
1405 | if (!p_ptr || !p_ptr->publ.connected) | ||
1406 | return -EINVAL; | ||
1407 | |||
1408 | msg = &p_ptr->publ.phdr; | ||
1409 | hsz = msg_hdr_sz(msg); | ||
1410 | sz = hsz + dsz; | ||
1411 | msg_set_size(msg, sz); | ||
1412 | if (skb_cow(buf, hsz)) | ||
1413 | return -ENOMEM; | ||
1414 | |||
1415 | skb_push(buf, hsz); | ||
1416 | skb_copy_to_linear_data(buf, msg, hsz); | ||
1417 | destnode = msg_destnode(msg); | ||
1418 | p_ptr->publ.congested = 1; | ||
1419 | if (!tipc_port_congested(p_ptr)) { | ||
1420 | if (likely(destnode != tipc_own_addr)) | ||
1421 | res = tipc_send_buf_fast(buf, destnode); | ||
1422 | else { | ||
1423 | tipc_port_recv_msg(buf); | ||
1424 | res = sz; | ||
1425 | } | ||
1426 | if (likely(res != -ELINKCONG)) { | ||
1427 | port_incr_out_seqno(p_ptr); | ||
1428 | p_ptr->sent++; | ||
1429 | p_ptr->publ.congested = 0; | ||
1430 | return res; | ||
1431 | } | ||
1432 | } | ||
1433 | if (port_unreliable(p_ptr)) { | ||
1434 | p_ptr->publ.congested = 0; | ||
1435 | return dsz; | ||
1436 | } | ||
1437 | return -ELINKCONG; | ||
1438 | } | ||
1439 | |||
1440 | /** | ||
1441 | * tipc_forward2name - forward message sections to port name | 1274 | * tipc_forward2name - forward message sections to port name |
1442 | */ | 1275 | */ |
1443 | 1276 | ||
1444 | int tipc_forward2name(u32 ref, | 1277 | static int tipc_forward2name(u32 ref, |
1445 | struct tipc_name const *name, | 1278 | struct tipc_name const *name, |
1446 | u32 domain, | 1279 | u32 domain, |
1447 | u32 num_sect, | 1280 | u32 num_sect, |
1448 | struct iovec const *msg_sect, | 1281 | struct iovec const *msg_sect, |
1449 | struct tipc_portid const *orig, | 1282 | struct tipc_portid const *orig, |
1450 | unsigned int importance) | 1283 | unsigned int importance) |
1451 | { | 1284 | { |
1452 | struct port *p_ptr; | 1285 | struct port *p_ptr; |
1453 | struct tipc_msg *msg; | 1286 | struct tipc_msg *msg; |
@@ -1473,7 +1306,7 @@ int tipc_forward2name(u32 ref, | |||
1473 | msg_set_destnode(msg, destnode); | 1306 | msg_set_destnode(msg, destnode); |
1474 | msg_set_destport(msg, destport); | 1307 | msg_set_destport(msg, destport); |
1475 | 1308 | ||
1476 | if (likely(destport || destnode)) { | 1309 | if (likely(destport)) { |
1477 | p_ptr->sent++; | 1310 | p_ptr->sent++; |
1478 | if (likely(destnode == tipc_own_addr)) | 1311 | if (likely(destnode == tipc_own_addr)) |
1479 | return tipc_port_recv_sections(p_ptr, num_sect, msg_sect); | 1312 | return tipc_port_recv_sections(p_ptr, num_sect, msg_sect); |
@@ -1510,89 +1343,15 @@ int tipc_send2name(u32 ref, | |||
1510 | } | 1343 | } |
1511 | 1344 | ||
1512 | /** | 1345 | /** |
1513 | * tipc_forward_buf2name - forward message buffer to port name | ||
1514 | */ | ||
1515 | |||
1516 | int tipc_forward_buf2name(u32 ref, | ||
1517 | struct tipc_name const *name, | ||
1518 | u32 domain, | ||
1519 | struct sk_buff *buf, | ||
1520 | unsigned int dsz, | ||
1521 | struct tipc_portid const *orig, | ||
1522 | unsigned int importance) | ||
1523 | { | ||
1524 | struct port *p_ptr; | ||
1525 | struct tipc_msg *msg; | ||
1526 | u32 destnode = domain; | ||
1527 | u32 destport; | ||
1528 | int res; | ||
1529 | |||
1530 | p_ptr = (struct port *)tipc_ref_deref(ref); | ||
1531 | if (!p_ptr || p_ptr->publ.connected) | ||
1532 | return -EINVAL; | ||
1533 | |||
1534 | msg = &p_ptr->publ.phdr; | ||
1535 | if (importance <= TIPC_CRITICAL_IMPORTANCE) | ||
1536 | msg_set_importance(msg, importance); | ||
1537 | msg_set_type(msg, TIPC_NAMED_MSG); | ||
1538 | msg_set_orignode(msg, orig->node); | ||
1539 | msg_set_origport(msg, orig->ref); | ||
1540 | msg_set_nametype(msg, name->type); | ||
1541 | msg_set_nameinst(msg, name->instance); | ||
1542 | msg_set_lookup_scope(msg, tipc_addr_scope(domain)); | ||
1543 | msg_set_hdr_sz(msg, LONG_H_SIZE); | ||
1544 | msg_set_size(msg, LONG_H_SIZE + dsz); | ||
1545 | destport = tipc_nametbl_translate(name->type, name->instance, &destnode); | ||
1546 | msg_set_destnode(msg, destnode); | ||
1547 | msg_set_destport(msg, destport); | ||
1548 | msg_dbg(msg, "forw2name ==> "); | ||
1549 | if (skb_cow(buf, LONG_H_SIZE)) | ||
1550 | return -ENOMEM; | ||
1551 | skb_push(buf, LONG_H_SIZE); | ||
1552 | skb_copy_to_linear_data(buf, msg, LONG_H_SIZE); | ||
1553 | msg_dbg(buf_msg(buf),"PREP:"); | ||
1554 | if (likely(destport || destnode)) { | ||
1555 | p_ptr->sent++; | ||
1556 | if (destnode == tipc_own_addr) | ||
1557 | return tipc_port_recv_msg(buf); | ||
1558 | res = tipc_send_buf_fast(buf, destnode); | ||
1559 | if (likely(res != -ELINKCONG)) | ||
1560 | return res; | ||
1561 | if (port_unreliable(p_ptr)) | ||
1562 | return dsz; | ||
1563 | return -ELINKCONG; | ||
1564 | } | ||
1565 | return tipc_reject_msg(buf, TIPC_ERR_NO_NAME); | ||
1566 | } | ||
1567 | |||
1568 | /** | ||
1569 | * tipc_send_buf2name - send message buffer to port name | ||
1570 | */ | ||
1571 | |||
1572 | int tipc_send_buf2name(u32 ref, | ||
1573 | struct tipc_name const *dest, | ||
1574 | u32 domain, | ||
1575 | struct sk_buff *buf, | ||
1576 | unsigned int dsz) | ||
1577 | { | ||
1578 | struct tipc_portid orig; | ||
1579 | |||
1580 | orig.ref = ref; | ||
1581 | orig.node = tipc_own_addr; | ||
1582 | return tipc_forward_buf2name(ref, dest, domain, buf, dsz, &orig, | ||
1583 | TIPC_PORT_IMPORTANCE); | ||
1584 | } | ||
1585 | |||
1586 | /** | ||
1587 | * tipc_forward2port - forward message sections to port identity | 1346 | * tipc_forward2port - forward message sections to port identity |
1588 | */ | 1347 | */ |
1589 | 1348 | ||
1590 | int tipc_forward2port(u32 ref, | 1349 | static int tipc_forward2port(u32 ref, |
1591 | struct tipc_portid const *dest, | 1350 | struct tipc_portid const *dest, |
1592 | unsigned int num_sect, | 1351 | unsigned int num_sect, |
1593 | struct iovec const *msg_sect, | 1352 | struct iovec const *msg_sect, |
1594 | struct tipc_portid const *orig, | 1353 | struct tipc_portid const *orig, |
1595 | unsigned int importance) | 1354 | unsigned int importance) |
1596 | { | 1355 | { |
1597 | struct port *p_ptr; | 1356 | struct port *p_ptr; |
1598 | struct tipc_msg *msg; | 1357 | struct tipc_msg *msg; |
@@ -1644,12 +1403,12 @@ int tipc_send2port(u32 ref, | |||
1644 | /** | 1403 | /** |
1645 | * tipc_forward_buf2port - forward message buffer to port identity | 1404 | * tipc_forward_buf2port - forward message buffer to port identity |
1646 | */ | 1405 | */ |
1647 | int tipc_forward_buf2port(u32 ref, | 1406 | static int tipc_forward_buf2port(u32 ref, |
1648 | struct tipc_portid const *dest, | 1407 | struct tipc_portid const *dest, |
1649 | struct sk_buff *buf, | 1408 | struct sk_buff *buf, |
1650 | unsigned int dsz, | 1409 | unsigned int dsz, |
1651 | struct tipc_portid const *orig, | 1410 | struct tipc_portid const *orig, |
1652 | unsigned int importance) | 1411 | unsigned int importance) |
1653 | { | 1412 | { |
1654 | struct port *p_ptr; | 1413 | struct port *p_ptr; |
1655 | struct tipc_msg *msg; | 1414 | struct tipc_msg *msg; |
diff --git a/net/tipc/port.h b/net/tipc/port.h index 8d1652aab298..73bbf442b346 100644 --- a/net/tipc/port.h +++ b/net/tipc/port.h | |||
@@ -109,8 +109,6 @@ struct port { | |||
109 | extern spinlock_t tipc_port_list_lock; | 109 | extern spinlock_t tipc_port_list_lock; |
110 | struct port_list; | 110 | struct port_list; |
111 | 111 | ||
112 | int tipc_port_recv_sections(struct port *p_ptr, u32 num_sect, | ||
113 | struct iovec const *msg_sect); | ||
114 | int tipc_port_reject_sections(struct port *p_ptr, struct tipc_msg *hdr, | 112 | int tipc_port_reject_sections(struct port *p_ptr, struct tipc_msg *hdr, |
115 | struct iovec const *msg_sect, u32 num_sect, | 113 | struct iovec const *msg_sect, u32 num_sect, |
116 | int err); | 114 | int err); |
@@ -157,7 +155,7 @@ static inline u32 tipc_peer_node(struct port *p_ptr) | |||
157 | 155 | ||
158 | static inline int tipc_port_congested(struct port *p_ptr) | 156 | static inline int tipc_port_congested(struct port *p_ptr) |
159 | { | 157 | { |
160 | return((p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2)); | 158 | return (p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2); |
161 | } | 159 | } |
162 | 160 | ||
163 | /** | 161 | /** |
diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 8dea66500cf5..ab8ad32d8c20 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c | |||
@@ -282,23 +282,6 @@ void *tipc_ref_lock(u32 ref) | |||
282 | return NULL; | 282 | return NULL; |
283 | } | 283 | } |
284 | 284 | ||
285 | /** | ||
286 | * tipc_ref_unlock - unlock referenced object | ||
287 | */ | ||
288 | |||
289 | void tipc_ref_unlock(u32 ref) | ||
290 | { | ||
291 | if (likely(tipc_ref_table.entries)) { | ||
292 | struct reference *entry; | ||
293 | |||
294 | entry = &tipc_ref_table.entries[ref & | ||
295 | tipc_ref_table.index_mask]; | ||
296 | if (likely((entry->ref == ref) && (entry->object))) | ||
297 | spin_unlock_bh(&entry->lock); | ||
298 | else | ||
299 | err("Attempt to unlock non-existent reference\n"); | ||
300 | } | ||
301 | } | ||
302 | 285 | ||
303 | /** | 286 | /** |
304 | * tipc_ref_deref - return pointer referenced object (without locking it) | 287 | * tipc_ref_deref - return pointer referenced object (without locking it) |
diff --git a/net/tipc/ref.h b/net/tipc/ref.h index 7e3798ea93b9..5bc8e7ab84de 100644 --- a/net/tipc/ref.h +++ b/net/tipc/ref.h | |||
@@ -44,7 +44,6 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock); | |||
44 | void tipc_ref_discard(u32 ref); | 44 | void tipc_ref_discard(u32 ref); |
45 | 45 | ||
46 | void *tipc_ref_lock(u32 ref); | 46 | void *tipc_ref_lock(u32 ref); |
47 | void tipc_ref_unlock(u32 ref); | ||
48 | void *tipc_ref_deref(u32 ref); | 47 | void *tipc_ref_deref(u32 ref); |
49 | 48 | ||
50 | #endif | 49 | #endif |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 66e889ba48fd..33217fc3d697 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -64,6 +64,7 @@ struct tipc_sock { | |||
64 | struct sock sk; | 64 | struct sock sk; |
65 | struct tipc_port *p; | 65 | struct tipc_port *p; |
66 | struct tipc_portid peer_name; | 66 | struct tipc_portid peer_name; |
67 | long conn_timeout; | ||
67 | }; | 68 | }; |
68 | 69 | ||
69 | #define tipc_sk(sk) ((struct tipc_sock *)(sk)) | 70 | #define tipc_sk(sk) ((struct tipc_sock *)(sk)) |
@@ -240,9 +241,9 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol, | |||
240 | sock->state = state; | 241 | sock->state = state; |
241 | 242 | ||
242 | sock_init_data(sock, sk); | 243 | sock_init_data(sock, sk); |
243 | sk->sk_rcvtimeo = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); | ||
244 | sk->sk_backlog_rcv = backlog_rcv; | 244 | sk->sk_backlog_rcv = backlog_rcv; |
245 | tipc_sk(sk)->p = tp_ptr; | 245 | tipc_sk(sk)->p = tp_ptr; |
246 | tipc_sk(sk)->conn_timeout = msecs_to_jiffies(CONN_TIMEOUT_DEFAULT); | ||
246 | 247 | ||
247 | spin_unlock_bh(tp_ptr->lock); | 248 | spin_unlock_bh(tp_ptr->lock); |
248 | 249 | ||
@@ -429,36 +430,55 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr, | |||
429 | * to handle any preventable race conditions, so TIPC will do the same ... | 430 | * to handle any preventable race conditions, so TIPC will do the same ... |
430 | * | 431 | * |
431 | * TIPC sets the returned events as follows: | 432 | * TIPC sets the returned events as follows: |
432 | * a) POLLRDNORM and POLLIN are set if the socket's receive queue is non-empty | 433 | * |
433 | * or if a connection-oriented socket is does not have an active connection | 434 | * socket state flags set |
434 | * (i.e. a read operation will not block). | 435 | * ------------ --------- |
435 | * b) POLLOUT is set except when a socket's connection has been terminated | 436 | * unconnected no read flags |
436 | * (i.e. a write operation will not block). | 437 | * no write flags |
437 | * c) POLLHUP is set when a socket's connection has been terminated. | 438 | * |
438 | * | 439 | * connecting POLLIN/POLLRDNORM if ACK/NACK in rx queue |
439 | * IMPORTANT: The fact that a read or write operation will not block does NOT | 440 | * no write flags |
440 | * imply that the operation will succeed! | 441 | * |
442 | * connected POLLIN/POLLRDNORM if data in rx queue | ||
443 | * POLLOUT if port is not congested | ||
444 | * | ||
445 | * disconnecting POLLIN/POLLRDNORM/POLLHUP | ||
446 | * no write flags | ||
447 | * | ||
448 | * listening POLLIN if SYN in rx queue | ||
449 | * no write flags | ||
450 | * | ||
451 | * ready POLLIN/POLLRDNORM if data in rx queue | ||
452 | * [connectionless] POLLOUT (since port cannot be congested) | ||
453 | * | ||
454 | * IMPORTANT: The fact that a read or write operation is indicated does NOT | ||
455 | * imply that the operation will succeed, merely that it should be performed | ||
456 | * and will not block. | ||
441 | */ | 457 | */ |
442 | 458 | ||
443 | static unsigned int poll(struct file *file, struct socket *sock, | 459 | static unsigned int poll(struct file *file, struct socket *sock, |
444 | poll_table *wait) | 460 | poll_table *wait) |
445 | { | 461 | { |
446 | struct sock *sk = sock->sk; | 462 | struct sock *sk = sock->sk; |
447 | u32 mask; | 463 | u32 mask = 0; |
448 | 464 | ||
449 | poll_wait(file, sk_sleep(sk), wait); | 465 | poll_wait(file, sk_sleep(sk), wait); |
450 | 466 | ||
451 | if (!skb_queue_empty(&sk->sk_receive_queue) || | 467 | switch ((int)sock->state) { |
452 | (sock->state == SS_UNCONNECTED) || | 468 | case SS_READY: |
453 | (sock->state == SS_DISCONNECTING)) | 469 | case SS_CONNECTED: |
454 | mask = (POLLRDNORM | POLLIN); | 470 | if (!tipc_sk_port(sk)->congested) |
455 | else | 471 | mask |= POLLOUT; |
456 | mask = 0; | 472 | /* fall thru' */ |
457 | 473 | case SS_CONNECTING: | |
458 | if (sock->state == SS_DISCONNECTING) | 474 | case SS_LISTENING: |
459 | mask |= POLLHUP; | 475 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
460 | else | 476 | mask |= (POLLIN | POLLRDNORM); |
461 | mask |= POLLOUT; | 477 | break; |
478 | case SS_DISCONNECTING: | ||
479 | mask = (POLLIN | POLLRDNORM | POLLHUP); | ||
480 | break; | ||
481 | } | ||
462 | 482 | ||
463 | return mask; | 483 | return mask; |
464 | } | 484 | } |
@@ -1026,9 +1046,8 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, | |||
1026 | struct sk_buff *buf; | 1046 | struct sk_buff *buf; |
1027 | struct tipc_msg *msg; | 1047 | struct tipc_msg *msg; |
1028 | unsigned int sz; | 1048 | unsigned int sz; |
1029 | int sz_to_copy; | 1049 | int sz_to_copy, target, needed; |
1030 | int sz_copied = 0; | 1050 | int sz_copied = 0; |
1031 | int needed; | ||
1032 | char __user *crs = m->msg_iov->iov_base; | 1051 | char __user *crs = m->msg_iov->iov_base; |
1033 | unsigned char *buf_crs; | 1052 | unsigned char *buf_crs; |
1034 | u32 err; | 1053 | u32 err; |
@@ -1050,6 +1069,8 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, | |||
1050 | goto exit; | 1069 | goto exit; |
1051 | } | 1070 | } |
1052 | 1071 | ||
1072 | target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); | ||
1073 | |||
1053 | restart: | 1074 | restart: |
1054 | 1075 | ||
1055 | /* Look for a message in receive queue; wait if necessary */ | 1076 | /* Look for a message in receive queue; wait if necessary */ |
@@ -1138,7 +1159,7 @@ restart: | |||
1138 | 1159 | ||
1139 | if ((sz_copied < buf_len) && /* didn't get all requested data */ | 1160 | if ((sz_copied < buf_len) && /* didn't get all requested data */ |
1140 | (!skb_queue_empty(&sk->sk_receive_queue) || | 1161 | (!skb_queue_empty(&sk->sk_receive_queue) || |
1141 | (flags & MSG_WAITALL)) && /* and more is ready or required */ | 1162 | (sz_copied < target)) && /* and more is ready or required */ |
1142 | (!(flags & MSG_PEEK)) && /* and aren't just peeking at data */ | 1163 | (!(flags & MSG_PEEK)) && /* and aren't just peeking at data */ |
1143 | (!err)) /* and haven't reached a FIN */ | 1164 | (!err)) /* and haven't reached a FIN */ |
1144 | goto restart; | 1165 | goto restart; |
@@ -1174,7 +1195,7 @@ static int rx_queue_full(struct tipc_msg *msg, u32 queue_size, u32 base) | |||
1174 | if (msg_connected(msg)) | 1195 | if (msg_connected(msg)) |
1175 | threshold *= 4; | 1196 | threshold *= 4; |
1176 | 1197 | ||
1177 | return (queue_size >= threshold); | 1198 | return queue_size >= threshold; |
1178 | } | 1199 | } |
1179 | 1200 | ||
1180 | /** | 1201 | /** |
@@ -1365,6 +1386,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, | |||
1365 | struct msghdr m = {NULL,}; | 1386 | struct msghdr m = {NULL,}; |
1366 | struct sk_buff *buf; | 1387 | struct sk_buff *buf; |
1367 | struct tipc_msg *msg; | 1388 | struct tipc_msg *msg; |
1389 | long timeout; | ||
1368 | int res; | 1390 | int res; |
1369 | 1391 | ||
1370 | lock_sock(sk); | 1392 | lock_sock(sk); |
@@ -1379,7 +1401,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, | |||
1379 | /* For now, TIPC does not support the non-blocking form of connect() */ | 1401 | /* For now, TIPC does not support the non-blocking form of connect() */ |
1380 | 1402 | ||
1381 | if (flags & O_NONBLOCK) { | 1403 | if (flags & O_NONBLOCK) { |
1382 | res = -EWOULDBLOCK; | 1404 | res = -EOPNOTSUPP; |
1383 | goto exit; | 1405 | goto exit; |
1384 | } | 1406 | } |
1385 | 1407 | ||
@@ -1425,11 +1447,12 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen, | |||
1425 | 1447 | ||
1426 | /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */ | 1448 | /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */ |
1427 | 1449 | ||
1450 | timeout = tipc_sk(sk)->conn_timeout; | ||
1428 | release_sock(sk); | 1451 | release_sock(sk); |
1429 | res = wait_event_interruptible_timeout(*sk_sleep(sk), | 1452 | res = wait_event_interruptible_timeout(*sk_sleep(sk), |
1430 | (!skb_queue_empty(&sk->sk_receive_queue) || | 1453 | (!skb_queue_empty(&sk->sk_receive_queue) || |
1431 | (sock->state != SS_CONNECTING)), | 1454 | (sock->state != SS_CONNECTING)), |
1432 | sk->sk_rcvtimeo); | 1455 | timeout ? timeout : MAX_SCHEDULE_TIMEOUT); |
1433 | lock_sock(sk); | 1456 | lock_sock(sk); |
1434 | 1457 | ||
1435 | if (res > 0) { | 1458 | if (res > 0) { |
@@ -1692,7 +1715,7 @@ static int setsockopt(struct socket *sock, | |||
1692 | res = tipc_set_portunreturnable(tport->ref, value); | 1715 | res = tipc_set_portunreturnable(tport->ref, value); |
1693 | break; | 1716 | break; |
1694 | case TIPC_CONN_TIMEOUT: | 1717 | case TIPC_CONN_TIMEOUT: |
1695 | sk->sk_rcvtimeo = msecs_to_jiffies(value); | 1718 | tipc_sk(sk)->conn_timeout = msecs_to_jiffies(value); |
1696 | /* no need to set "res", since already 0 at this point */ | 1719 | /* no need to set "res", since already 0 at this point */ |
1697 | break; | 1720 | break; |
1698 | default: | 1721 | default: |
@@ -1747,7 +1770,7 @@ static int getsockopt(struct socket *sock, | |||
1747 | res = tipc_portunreturnable(tport->ref, &value); | 1770 | res = tipc_portunreturnable(tport->ref, &value); |
1748 | break; | 1771 | break; |
1749 | case TIPC_CONN_TIMEOUT: | 1772 | case TIPC_CONN_TIMEOUT: |
1750 | value = jiffies_to_msecs(sk->sk_rcvtimeo); | 1773 | value = jiffies_to_msecs(tipc_sk(sk)->conn_timeout); |
1751 | /* no need to set "res", since already 0 at this point */ | 1774 | /* no need to set "res", since already 0 at this point */ |
1752 | break; | 1775 | break; |
1753 | case TIPC_NODE_RECVQ_DEPTH: | 1776 | case TIPC_NODE_RECVQ_DEPTH: |
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index ac91f0dfa144..33313961d010 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c | |||
@@ -606,12 +606,3 @@ void tipc_subscr_stop(void) | |||
606 | topsrv.user_ref = 0; | 606 | topsrv.user_ref = 0; |
607 | } | 607 | } |
608 | } | 608 | } |
609 | |||
610 | |||
611 | int tipc_ispublished(struct tipc_name const *name) | ||
612 | { | ||
613 | u32 domain = 0; | ||
614 | |||
615 | return(tipc_nametbl_translate(name->type, name->instance,&domain) != 0); | ||
616 | } | ||
617 | |||
diff --git a/net/tipc/zone.c b/net/tipc/zone.c index 2c01ba2d86bf..83f8b5e91fc8 100644 --- a/net/tipc/zone.c +++ b/net/tipc/zone.c | |||
@@ -160,14 +160,3 @@ u32 tipc_zone_select_router(struct _zone *z_ptr, u32 addr, u32 ref) | |||
160 | } | 160 | } |
161 | return 0; | 161 | return 0; |
162 | } | 162 | } |
163 | |||
164 | |||
165 | u32 tipc_zone_next_node(u32 addr) | ||
166 | { | ||
167 | struct cluster *c_ptr = tipc_cltr_find(addr); | ||
168 | |||
169 | if (c_ptr) | ||
170 | return tipc_cltr_next_node(c_ptr, addr); | ||
171 | return 0; | ||
172 | } | ||
173 | |||
diff --git a/net/tipc/zone.h b/net/tipc/zone.h index 7bdc3406ba9b..bd1c20ce9d06 100644 --- a/net/tipc/zone.h +++ b/net/tipc/zone.h | |||
@@ -61,7 +61,6 @@ void tipc_zone_send_external_routes(struct _zone *z_ptr, u32 dest); | |||
61 | struct _zone *tipc_zone_create(u32 addr); | 61 | struct _zone *tipc_zone_create(u32 addr); |
62 | void tipc_zone_delete(struct _zone *z_ptr); | 62 | void tipc_zone_delete(struct _zone *z_ptr); |
63 | void tipc_zone_attach_cluster(struct _zone *z_ptr, struct cluster *c_ptr); | 63 | void tipc_zone_attach_cluster(struct _zone *z_ptr, struct cluster *c_ptr); |
64 | u32 tipc_zone_next_node(u32 addr); | ||
65 | 64 | ||
66 | static inline struct _zone *tipc_zone_find(u32 addr) | 65 | static inline struct _zone *tipc_zone_find(u32 addr) |
67 | { | 66 | { |