diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bcast.c | 161 | ||||
| -rw-r--r-- | net/tipc/bcast.h | 16 | ||||
| -rw-r--r-- | net/tipc/bearer.c | 190 | ||||
| -rw-r--r-- | net/tipc/bearer.h | 77 | ||||
| -rw-r--r-- | net/tipc/config.c | 13 | ||||
| -rw-r--r-- | net/tipc/core.c | 2 | ||||
| -rw-r--r-- | net/tipc/discover.c | 27 | ||||
| -rw-r--r-- | net/tipc/discover.h | 8 | ||||
| -rw-r--r-- | net/tipc/eth_media.c | 159 | ||||
| -rw-r--r-- | net/tipc/link.c | 346 | ||||
| -rw-r--r-- | net/tipc/link.h | 63 | ||||
| -rw-r--r-- | net/tipc/msg.c | 9 | ||||
| -rw-r--r-- | net/tipc/msg.h | 16 | ||||
| -rw-r--r-- | net/tipc/name_distr.c | 14 | ||||
| -rw-r--r-- | net/tipc/name_table.c | 15 | ||||
| -rw-r--r-- | net/tipc/name_table.h | 10 | ||||
| -rw-r--r-- | net/tipc/net.c | 7 | ||||
| -rw-r--r-- | net/tipc/node.c | 25 | ||||
| -rw-r--r-- | net/tipc/node.h | 12 | ||||
| -rw-r--r-- | net/tipc/port.c | 8 | ||||
| -rw-r--r-- | net/tipc/port.h | 4 | ||||
| -rw-r--r-- | net/tipc/ref.c | 3 | ||||
| -rw-r--r-- | net/tipc/socket.c | 3 | ||||
| -rw-r--r-- | net/tipc/subscr.c | 46 | ||||
| -rw-r--r-- | net/tipc/subscr.h | 10 |
25 files changed, 699 insertions, 545 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index 28908f54459e..8eb87b11d100 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #define BCLINK_WIN_DEFAULT 20 /* bcast link window size (default) */ | 46 | #define BCLINK_WIN_DEFAULT 20 /* bcast link window size (default) */ |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * struct bcbearer_pair - a pair of bearers used by broadcast link | 49 | * struct tipc_bcbearer_pair - a pair of bearers used by broadcast link |
| 50 | * @primary: pointer to primary bearer | 50 | * @primary: pointer to primary bearer |
| 51 | * @secondary: pointer to secondary bearer | 51 | * @secondary: pointer to secondary bearer |
| 52 | * | 52 | * |
| @@ -54,13 +54,13 @@ | |||
| 54 | * to be paired. | 54 | * to be paired. |
| 55 | */ | 55 | */ |
| 56 | 56 | ||
| 57 | struct bcbearer_pair { | 57 | struct tipc_bcbearer_pair { |
| 58 | struct tipc_bearer *primary; | 58 | struct tipc_bearer *primary; |
| 59 | struct tipc_bearer *secondary; | 59 | struct tipc_bearer *secondary; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | /** | 62 | /** |
| 63 | * struct bcbearer - bearer used by broadcast link | 63 | * struct tipc_bcbearer - bearer used by broadcast link |
| 64 | * @bearer: (non-standard) broadcast bearer structure | 64 | * @bearer: (non-standard) broadcast bearer structure |
| 65 | * @media: (non-standard) broadcast media structure | 65 | * @media: (non-standard) broadcast media structure |
| 66 | * @bpairs: array of bearer pairs | 66 | * @bpairs: array of bearer pairs |
| @@ -74,38 +74,40 @@ struct bcbearer_pair { | |||
| 74 | * prevented through use of the spinlock "bc_lock". | 74 | * prevented through use of the spinlock "bc_lock". |
| 75 | */ | 75 | */ |
| 76 | 76 | ||
| 77 | struct bcbearer { | 77 | struct tipc_bcbearer { |
| 78 | struct tipc_bearer bearer; | 78 | struct tipc_bearer bearer; |
| 79 | struct media media; | 79 | struct tipc_media media; |
| 80 | struct bcbearer_pair bpairs[MAX_BEARERS]; | 80 | struct tipc_bcbearer_pair bpairs[MAX_BEARERS]; |
| 81 | struct bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1]; | 81 | struct tipc_bcbearer_pair bpairs_temp[TIPC_MAX_LINK_PRI + 1]; |
| 82 | struct tipc_node_map remains; | 82 | struct tipc_node_map remains; |
| 83 | struct tipc_node_map remains_new; | 83 | struct tipc_node_map remains_new; |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | /** | 86 | /** |
| 87 | * struct bclink - link used for broadcast messages | 87 | * struct tipc_bclink - link used for broadcast messages |
| 88 | * @link: (non-standard) broadcast link structure | 88 | * @link: (non-standard) broadcast link structure |
| 89 | * @node: (non-standard) node structure representing b'cast link's peer node | 89 | * @node: (non-standard) node structure representing b'cast link's peer node |
| 90 | * @bcast_nodes: map of broadcast-capable nodes | ||
| 90 | * @retransmit_to: node that most recently requested a retransmit | 91 | * @retransmit_to: node that most recently requested a retransmit |
| 91 | * | 92 | * |
| 92 | * Handles sequence numbering, fragmentation, bundling, etc. | 93 | * Handles sequence numbering, fragmentation, bundling, etc. |
| 93 | */ | 94 | */ |
| 94 | 95 | ||
| 95 | struct bclink { | 96 | struct tipc_bclink { |
| 96 | struct link link; | 97 | struct tipc_link link; |
| 97 | struct tipc_node node; | 98 | struct tipc_node node; |
| 99 | struct tipc_node_map bcast_nodes; | ||
| 98 | struct tipc_node *retransmit_to; | 100 | struct tipc_node *retransmit_to; |
| 99 | }; | 101 | }; |
| 100 | 102 | ||
| 103 | static struct tipc_bcbearer bcast_bearer; | ||
| 104 | static struct tipc_bclink bcast_link; | ||
| 101 | 105 | ||
| 102 | static struct bcbearer *bcbearer; | 106 | static struct tipc_bcbearer *bcbearer = &bcast_bearer; |
| 103 | static struct bclink *bclink; | 107 | static struct tipc_bclink *bclink = &bcast_link; |
| 104 | static struct link *bcl; | 108 | static struct tipc_link *bcl = &bcast_link.link; |
| 105 | static DEFINE_SPINLOCK(bc_lock); | ||
| 106 | 109 | ||
| 107 | /* broadcast-capable node map */ | 110 | static DEFINE_SPINLOCK(bc_lock); |
| 108 | struct tipc_node_map tipc_bcast_nmap; | ||
| 109 | 111 | ||
| 110 | const char tipc_bclink_name[] = "broadcast-link"; | 112 | const char tipc_bclink_name[] = "broadcast-link"; |
| 111 | 113 | ||
| @@ -113,11 +115,6 @@ static void tipc_nmap_diff(struct tipc_node_map *nm_a, | |||
| 113 | struct tipc_node_map *nm_b, | 115 | struct tipc_node_map *nm_b, |
| 114 | struct tipc_node_map *nm_diff); | 116 | struct tipc_node_map *nm_diff); |
| 115 | 117 | ||
| 116 | static u32 buf_seqno(struct sk_buff *buf) | ||
| 117 | { | ||
| 118 | return msg_seqno(buf_msg(buf)); | ||
| 119 | } | ||
| 120 | |||
| 121 | static u32 bcbuf_acks(struct sk_buff *buf) | 118 | static u32 bcbuf_acks(struct sk_buff *buf) |
| 122 | { | 119 | { |
| 123 | return (u32)(unsigned long)TIPC_SKB_CB(buf)->handle; | 120 | return (u32)(unsigned long)TIPC_SKB_CB(buf)->handle; |
| @@ -133,6 +130,19 @@ static void bcbuf_decr_acks(struct sk_buff *buf) | |||
| 133 | bcbuf_set_acks(buf, bcbuf_acks(buf) - 1); | 130 | bcbuf_set_acks(buf, bcbuf_acks(buf) - 1); |
| 134 | } | 131 | } |
| 135 | 132 | ||
| 133 | void tipc_bclink_add_node(u32 addr) | ||
| 134 | { | ||
| 135 | spin_lock_bh(&bc_lock); | ||
| 136 | tipc_nmap_add(&bclink->bcast_nodes, addr); | ||
| 137 | spin_unlock_bh(&bc_lock); | ||
| 138 | } | ||
| 139 | |||
| 140 | void tipc_bclink_remove_node(u32 addr) | ||
| 141 | { | ||
| 142 | spin_lock_bh(&bc_lock); | ||
| 143 | tipc_nmap_remove(&bclink->bcast_nodes, addr); | ||
| 144 | spin_unlock_bh(&bc_lock); | ||
| 145 | } | ||
| 136 | 146 | ||
| 137 | static void bclink_set_last_sent(void) | 147 | static void bclink_set_last_sent(void) |
| 138 | { | 148 | { |
| @@ -222,14 +232,36 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) | |||
| 222 | struct sk_buff *next; | 232 | struct sk_buff *next; |
| 223 | unsigned int released = 0; | 233 | unsigned int released = 0; |
| 224 | 234 | ||
| 225 | if (less_eq(acked, n_ptr->bclink.acked)) | ||
| 226 | return; | ||
| 227 | |||
| 228 | spin_lock_bh(&bc_lock); | 235 | spin_lock_bh(&bc_lock); |
| 229 | 236 | ||
| 230 | /* Skip over packets that node has previously acknowledged */ | 237 | /* Bail out if tx queue is empty (no clean up is required) */ |
| 231 | |||
| 232 | crs = bcl->first_out; | 238 | crs = bcl->first_out; |
| 239 | if (!crs) | ||
| 240 | goto exit; | ||
| 241 | |||
| 242 | /* Determine which messages need to be acknowledged */ | ||
| 243 | if (acked == INVALID_LINK_SEQ) { | ||
| 244 | /* | ||
| 245 | * Contact with specified node has been lost, so need to | ||
| 246 | * acknowledge sent messages only (if other nodes still exist) | ||
| 247 | * or both sent and unsent messages (otherwise) | ||
| 248 | */ | ||
| 249 | if (bclink->bcast_nodes.count) | ||
| 250 | acked = bcl->fsm_msg_cnt; | ||
| 251 | else | ||
| 252 | acked = bcl->next_out_no; | ||
| 253 | } else { | ||
| 254 | /* | ||
| 255 | * Bail out if specified sequence number does not correspond | ||
| 256 | * to a message that has been sent and not yet acknowledged | ||
| 257 | */ | ||
| 258 | if (less(acked, buf_seqno(crs)) || | ||
| 259 | less(bcl->fsm_msg_cnt, acked) || | ||
| 260 | less_eq(acked, n_ptr->bclink.acked)) | ||
| 261 | goto exit; | ||
| 262 | } | ||
| 263 | |||
| 264 | /* Skip over packets that node has previously acknowledged */ | ||
| 233 | while (crs && less_eq(buf_seqno(crs), n_ptr->bclink.acked)) | 265 | while (crs && less_eq(buf_seqno(crs), n_ptr->bclink.acked)) |
| 234 | crs = crs->next; | 266 | crs = crs->next; |
| 235 | 267 | ||
| @@ -237,7 +269,15 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) | |||
| 237 | 269 | ||
| 238 | while (crs && less_eq(buf_seqno(crs), acked)) { | 270 | while (crs && less_eq(buf_seqno(crs), acked)) { |
| 239 | next = crs->next; | 271 | next = crs->next; |
| 240 | bcbuf_decr_acks(crs); | 272 | |
| 273 | if (crs != bcl->next_out) | ||
| 274 | bcbuf_decr_acks(crs); | ||
| 275 | else { | ||
| 276 | bcbuf_set_acks(crs, 0); | ||
| 277 | bcl->next_out = next; | ||
| 278 | bclink_set_last_sent(); | ||
| 279 | } | ||
| 280 | |||
| 241 | if (bcbuf_acks(crs) == 0) { | 281 | if (bcbuf_acks(crs) == 0) { |
| 242 | bcl->first_out = next; | 282 | bcl->first_out = next; |
| 243 | bcl->out_queue_size--; | 283 | bcl->out_queue_size--; |
| @@ -256,6 +296,7 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) | |||
| 256 | } | 296 | } |
| 257 | if (unlikely(released && !list_empty(&bcl->waiting_ports))) | 297 | if (unlikely(released && !list_empty(&bcl->waiting_ports))) |
| 258 | tipc_link_wakeup_ports(bcl, 0); | 298 | tipc_link_wakeup_ports(bcl, 0); |
| 299 | exit: | ||
| 259 | spin_unlock_bh(&bc_lock); | 300 | spin_unlock_bh(&bc_lock); |
| 260 | } | 301 | } |
| 261 | 302 | ||
| @@ -267,7 +308,7 @@ void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked) | |||
| 267 | 308 | ||
| 268 | static void bclink_send_ack(struct tipc_node *n_ptr) | 309 | static void bclink_send_ack(struct tipc_node *n_ptr) |
| 269 | { | 310 | { |
| 270 | struct link *l_ptr = n_ptr->active_links[n_ptr->addr & 1]; | 311 | struct tipc_link *l_ptr = n_ptr->active_links[n_ptr->addr & 1]; |
| 271 | 312 | ||
| 272 | if (l_ptr != NULL) | 313 | if (l_ptr != NULL) |
| 273 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); | 314 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); |
| @@ -402,13 +443,19 @@ int tipc_bclink_send_msg(struct sk_buff *buf) | |||
| 402 | 443 | ||
| 403 | spin_lock_bh(&bc_lock); | 444 | spin_lock_bh(&bc_lock); |
| 404 | 445 | ||
| 446 | if (!bclink->bcast_nodes.count) { | ||
| 447 | res = msg_data_sz(buf_msg(buf)); | ||
| 448 | buf_discard(buf); | ||
| 449 | goto exit; | ||
| 450 | } | ||
| 451 | |||
| 405 | res = tipc_link_send_buf(bcl, buf); | 452 | res = tipc_link_send_buf(bcl, buf); |
| 406 | if (likely(res > 0)) | 453 | if (likely(res >= 0)) { |
| 407 | bclink_set_last_sent(); | 454 | bclink_set_last_sent(); |
| 408 | 455 | bcl->stats.queue_sz_counts++; | |
| 409 | bcl->stats.queue_sz_counts++; | 456 | bcl->stats.accu_queue_sz += bcl->out_queue_size; |
| 410 | bcl->stats.accu_queue_sz += bcl->out_queue_size; | 457 | } |
| 411 | 458 | exit: | |
| 412 | spin_unlock_bh(&bc_lock); | 459 | spin_unlock_bh(&bc_lock); |
| 413 | return res; | 460 | return res; |
| 414 | } | 461 | } |
| @@ -572,13 +619,13 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
| 572 | if (likely(!msg_non_seq(buf_msg(buf)))) { | 619 | if (likely(!msg_non_seq(buf_msg(buf)))) { |
| 573 | struct tipc_msg *msg; | 620 | struct tipc_msg *msg; |
| 574 | 621 | ||
| 575 | bcbuf_set_acks(buf, tipc_bcast_nmap.count); | 622 | bcbuf_set_acks(buf, bclink->bcast_nodes.count); |
| 576 | msg = buf_msg(buf); | 623 | msg = buf_msg(buf); |
| 577 | msg_set_non_seq(msg, 1); | 624 | msg_set_non_seq(msg, 1); |
| 578 | msg_set_mc_netid(msg, tipc_net_id); | 625 | msg_set_mc_netid(msg, tipc_net_id); |
| 579 | bcl->stats.sent_info++; | 626 | bcl->stats.sent_info++; |
| 580 | 627 | ||
| 581 | if (WARN_ON(!tipc_bcast_nmap.count)) { | 628 | if (WARN_ON(!bclink->bcast_nodes.count)) { |
| 582 | dump_stack(); | 629 | dump_stack(); |
| 583 | return 0; | 630 | return 0; |
| 584 | } | 631 | } |
| @@ -586,7 +633,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
| 586 | 633 | ||
| 587 | /* Send buffer over bearers until all targets reached */ | 634 | /* Send buffer over bearers until all targets reached */ |
| 588 | 635 | ||
| 589 | bcbearer->remains = tipc_bcast_nmap; | 636 | bcbearer->remains = bclink->bcast_nodes; |
| 590 | 637 | ||
| 591 | for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { | 638 | for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) { |
| 592 | struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary; | 639 | struct tipc_bearer *p = bcbearer->bpairs[bp_index].primary; |
| @@ -630,8 +677,8 @@ static int tipc_bcbearer_send(struct sk_buff *buf, | |||
| 630 | 677 | ||
| 631 | void tipc_bcbearer_sort(void) | 678 | void tipc_bcbearer_sort(void) |
| 632 | { | 679 | { |
| 633 | struct bcbearer_pair *bp_temp = bcbearer->bpairs_temp; | 680 | struct tipc_bcbearer_pair *bp_temp = bcbearer->bpairs_temp; |
| 634 | struct bcbearer_pair *bp_curr; | 681 | struct tipc_bcbearer_pair *bp_curr; |
| 635 | int b_index; | 682 | int b_index; |
| 636 | int pri; | 683 | int pri; |
| 637 | 684 | ||
| @@ -752,25 +799,13 @@ int tipc_bclink_set_queue_limits(u32 limit) | |||
| 752 | return 0; | 799 | return 0; |
| 753 | } | 800 | } |
| 754 | 801 | ||
| 755 | int tipc_bclink_init(void) | 802 | void tipc_bclink_init(void) |
| 756 | { | 803 | { |
| 757 | bcbearer = kzalloc(sizeof(*bcbearer), GFP_ATOMIC); | ||
| 758 | bclink = kzalloc(sizeof(*bclink), GFP_ATOMIC); | ||
| 759 | if (!bcbearer || !bclink) { | ||
| 760 | warn("Broadcast link creation failed, no memory\n"); | ||
| 761 | kfree(bcbearer); | ||
| 762 | bcbearer = NULL; | ||
| 763 | kfree(bclink); | ||
| 764 | bclink = NULL; | ||
| 765 | return -ENOMEM; | ||
| 766 | } | ||
| 767 | |||
| 768 | INIT_LIST_HEAD(&bcbearer->bearer.cong_links); | 804 | INIT_LIST_HEAD(&bcbearer->bearer.cong_links); |
| 769 | bcbearer->bearer.media = &bcbearer->media; | 805 | bcbearer->bearer.media = &bcbearer->media; |
| 770 | bcbearer->media.send_msg = tipc_bcbearer_send; | 806 | bcbearer->media.send_msg = tipc_bcbearer_send; |
| 771 | sprintf(bcbearer->media.name, "tipc-broadcast"); | 807 | sprintf(bcbearer->media.name, "tipc-broadcast"); |
| 772 | 808 | ||
| 773 | bcl = &bclink->link; | ||
| 774 | INIT_LIST_HEAD(&bcl->waiting_ports); | 809 | INIT_LIST_HEAD(&bcl->waiting_ports); |
| 775 | bcl->next_out_no = 1; | 810 | bcl->next_out_no = 1; |
| 776 | spin_lock_init(&bclink->node.lock); | 811 | spin_lock_init(&bclink->node.lock); |
| @@ -780,22 +815,16 @@ int tipc_bclink_init(void) | |||
| 780 | bcl->b_ptr = &bcbearer->bearer; | 815 | bcl->b_ptr = &bcbearer->bearer; |
| 781 | bcl->state = WORKING_WORKING; | 816 | bcl->state = WORKING_WORKING; |
| 782 | strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); | 817 | strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); |
| 783 | |||
| 784 | return 0; | ||
| 785 | } | 818 | } |
| 786 | 819 | ||
| 787 | void tipc_bclink_stop(void) | 820 | void tipc_bclink_stop(void) |
| 788 | { | 821 | { |
| 789 | spin_lock_bh(&bc_lock); | 822 | spin_lock_bh(&bc_lock); |
| 790 | if (bcbearer) { | 823 | tipc_link_stop(bcl); |
| 791 | tipc_link_stop(bcl); | ||
| 792 | bcl = NULL; | ||
| 793 | kfree(bclink); | ||
| 794 | bclink = NULL; | ||
| 795 | kfree(bcbearer); | ||
| 796 | bcbearer = NULL; | ||
| 797 | } | ||
| 798 | spin_unlock_bh(&bc_lock); | 824 | spin_unlock_bh(&bc_lock); |
| 825 | |||
| 826 | memset(bclink, 0, sizeof(*bclink)); | ||
| 827 | memset(bcbearer, 0, sizeof(*bcbearer)); | ||
| 799 | } | 828 | } |
| 800 | 829 | ||
| 801 | 830 | ||
| @@ -864,9 +893,9 @@ static void tipc_nmap_diff(struct tipc_node_map *nm_a, | |||
| 864 | * tipc_port_list_add - add a port to a port list, ensuring no duplicates | 893 | * tipc_port_list_add - add a port to a port list, ensuring no duplicates |
| 865 | */ | 894 | */ |
| 866 | 895 | ||
| 867 | void tipc_port_list_add(struct port_list *pl_ptr, u32 port) | 896 | void tipc_port_list_add(struct tipc_port_list *pl_ptr, u32 port) |
| 868 | { | 897 | { |
| 869 | struct port_list *item = pl_ptr; | 898 | struct tipc_port_list *item = pl_ptr; |
| 870 | int i; | 899 | int i; |
| 871 | int item_sz = PLSIZE; | 900 | int item_sz = PLSIZE; |
| 872 | int cnt = pl_ptr->count; | 901 | int cnt = pl_ptr->count; |
| @@ -898,10 +927,10 @@ void tipc_port_list_add(struct port_list *pl_ptr, u32 port) | |||
| 898 | * | 927 | * |
| 899 | */ | 928 | */ |
| 900 | 929 | ||
| 901 | void tipc_port_list_free(struct port_list *pl_ptr) | 930 | void tipc_port_list_free(struct tipc_port_list *pl_ptr) |
| 902 | { | 931 | { |
| 903 | struct port_list *item; | 932 | struct tipc_port_list *item; |
| 904 | struct port_list *next; | 933 | struct tipc_port_list *next; |
| 905 | 934 | ||
| 906 | for (item = pl_ptr->next; item; item = next) { | 935 | for (item = pl_ptr->next; item; item = next) { |
| 907 | next = item->next; | 936 | next = item->next; |
diff --git a/net/tipc/bcast.h b/net/tipc/bcast.h index 06740da5ae61..b009666c60b0 100644 --- a/net/tipc/bcast.h +++ b/net/tipc/bcast.h | |||
| @@ -51,20 +51,18 @@ struct tipc_node_map { | |||
| 51 | u32 map[MAX_NODES / WSIZE]; | 51 | u32 map[MAX_NODES / WSIZE]; |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | extern struct tipc_node_map tipc_bcast_nmap; | ||
| 55 | |||
| 56 | #define PLSIZE 32 | 54 | #define PLSIZE 32 |
| 57 | 55 | ||
| 58 | /** | 56 | /** |
| 59 | * struct port_list - set of node local destination ports | 57 | * struct tipc_port_list - set of node local destination ports |
| 60 | * @count: # of ports in set (only valid for first entry in list) | 58 | * @count: # of ports in set (only valid for first entry in list) |
| 61 | * @next: pointer to next entry in list | 59 | * @next: pointer to next entry in list |
| 62 | * @ports: array of port references | 60 | * @ports: array of port references |
| 63 | */ | 61 | */ |
| 64 | 62 | ||
| 65 | struct port_list { | 63 | struct tipc_port_list { |
| 66 | int count; | 64 | int count; |
| 67 | struct port_list *next; | 65 | struct tipc_port_list *next; |
| 68 | u32 ports[PLSIZE]; | 66 | u32 ports[PLSIZE]; |
| 69 | }; | 67 | }; |
| 70 | 68 | ||
| @@ -85,11 +83,13 @@ static inline int tipc_nmap_equal(struct tipc_node_map *nm_a, struct tipc_node_m | |||
| 85 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); | 83 | return !memcmp(nm_a, nm_b, sizeof(*nm_a)); |
| 86 | } | 84 | } |
| 87 | 85 | ||
| 88 | void tipc_port_list_add(struct port_list *pl_ptr, u32 port); | 86 | void tipc_port_list_add(struct tipc_port_list *pl_ptr, u32 port); |
| 89 | void tipc_port_list_free(struct port_list *pl_ptr); | 87 | void tipc_port_list_free(struct tipc_port_list *pl_ptr); |
| 90 | 88 | ||
| 91 | int tipc_bclink_init(void); | 89 | void tipc_bclink_init(void); |
| 92 | void tipc_bclink_stop(void); | 90 | void tipc_bclink_stop(void); |
| 91 | void tipc_bclink_add_node(u32 addr); | ||
| 92 | void tipc_bclink_remove_node(u32 addr); | ||
| 93 | struct tipc_node *tipc_bclink_retransmit_to(void); | 93 | struct tipc_node *tipc_bclink_retransmit_to(void); |
| 94 | void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked); | 94 | void tipc_bclink_acknowledge(struct tipc_node *n_ptr, u32 acked); |
| 95 | int tipc_bclink_send_msg(struct sk_buff *buf); | 95 | int tipc_bclink_send_msg(struct sk_buff *buf); |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index e2202de3d93e..329fb659fae4 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | 41 | ||
| 42 | #define MAX_ADDR_STR 32 | 42 | #define MAX_ADDR_STR 32 |
| 43 | 43 | ||
| 44 | static struct media media_list[MAX_MEDIA]; | 44 | static struct tipc_media *media_list[MAX_MEDIA]; |
| 45 | static u32 media_count; | 45 | static u32 media_count; |
| 46 | 46 | ||
| 47 | struct tipc_bearer tipc_bearers[MAX_BEARERS]; | 47 | struct tipc_bearer tipc_bearers[MAX_BEARERS]; |
| @@ -65,17 +65,31 @@ static int media_name_valid(const char *name) | |||
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | /** | 67 | /** |
| 68 | * media_find - locates specified media object by name | 68 | * tipc_media_find - locates specified media object by name |
| 69 | */ | 69 | */ |
| 70 | 70 | ||
| 71 | static struct media *media_find(const char *name) | 71 | struct tipc_media *tipc_media_find(const char *name) |
| 72 | { | 72 | { |
| 73 | struct media *m_ptr; | ||
| 74 | u32 i; | 73 | u32 i; |
| 75 | 74 | ||
| 76 | for (i = 0, m_ptr = media_list; i < media_count; i++, m_ptr++) { | 75 | for (i = 0; i < media_count; i++) { |
| 77 | if (!strcmp(m_ptr->name, name)) | 76 | if (!strcmp(media_list[i]->name, name)) |
| 78 | return m_ptr; | 77 | return media_list[i]; |
| 78 | } | ||
| 79 | return NULL; | ||
| 80 | } | ||
| 81 | |||
| 82 | /** | ||
| 83 | * media_find_id - locates specified media object by type identifier | ||
| 84 | */ | ||
| 85 | |||
| 86 | static struct tipc_media *media_find_id(u8 type) | ||
| 87 | { | ||
| 88 | u32 i; | ||
| 89 | |||
| 90 | for (i = 0; i < media_count; i++) { | ||
| 91 | if (media_list[i]->type_id == type) | ||
| 92 | return media_list[i]; | ||
| 79 | } | 93 | } |
| 80 | return NULL; | 94 | return NULL; |
| 81 | } | 95 | } |
| @@ -86,87 +100,34 @@ static struct media *media_find(const char *name) | |||
| 86 | * Bearers for this media type must be activated separately at a later stage. | 100 | * Bearers for this media type must be activated separately at a later stage. |
| 87 | */ | 101 | */ |
| 88 | 102 | ||
| 89 | int tipc_register_media(u32 media_type, | 103 | int tipc_register_media(struct tipc_media *m_ptr) |
| 90 | char *name, | ||
| 91 | int (*enable)(struct tipc_bearer *), | ||
| 92 | void (*disable)(struct tipc_bearer *), | ||
| 93 | int (*send_msg)(struct sk_buff *, | ||
| 94 | struct tipc_bearer *, | ||
| 95 | struct tipc_media_addr *), | ||
| 96 | char *(*addr2str)(struct tipc_media_addr *a, | ||
| 97 | char *str_buf, int str_size), | ||
| 98 | struct tipc_media_addr *bcast_addr, | ||
| 99 | const u32 bearer_priority, | ||
| 100 | const u32 link_tolerance, /* [ms] */ | ||
| 101 | const u32 send_window_limit) | ||
| 102 | { | 104 | { |
| 103 | struct media *m_ptr; | ||
| 104 | u32 media_id; | ||
| 105 | u32 i; | ||
| 106 | int res = -EINVAL; | 105 | int res = -EINVAL; |
| 107 | 106 | ||
| 108 | write_lock_bh(&tipc_net_lock); | 107 | write_lock_bh(&tipc_net_lock); |
| 109 | 108 | ||
| 110 | if (tipc_mode != TIPC_NET_MODE) { | 109 | if (!media_name_valid(m_ptr->name)) |
| 111 | warn("Media <%s> rejected, not in networked mode yet\n", name); | ||
| 112 | goto exit; | 110 | goto exit; |
| 113 | } | 111 | if ((m_ptr->bcast_addr.media_id != m_ptr->type_id) || |
| 114 | if (!media_name_valid(name)) { | 112 | !m_ptr->bcast_addr.broadcast) |
| 115 | warn("Media <%s> rejected, illegal name\n", name); | ||
| 116 | goto exit; | 113 | goto exit; |
| 117 | } | 114 | if (m_ptr->priority > TIPC_MAX_LINK_PRI) |
| 118 | if (!bcast_addr) { | ||
| 119 | warn("Media <%s> rejected, no broadcast address\n", name); | ||
| 120 | goto exit; | 115 | goto exit; |
| 121 | } | 116 | if ((m_ptr->tolerance < TIPC_MIN_LINK_TOL) || |
| 122 | if ((bearer_priority < TIPC_MIN_LINK_PRI) || | 117 | (m_ptr->tolerance > TIPC_MAX_LINK_TOL)) |
| 123 | (bearer_priority > TIPC_MAX_LINK_PRI)) { | ||
| 124 | warn("Media <%s> rejected, illegal priority (%u)\n", name, | ||
| 125 | bearer_priority); | ||
| 126 | goto exit; | 118 | goto exit; |
| 127 | } | 119 | if (media_count >= MAX_MEDIA) |
| 128 | if ((link_tolerance < TIPC_MIN_LINK_TOL) || | ||
| 129 | (link_tolerance > TIPC_MAX_LINK_TOL)) { | ||
| 130 | warn("Media <%s> rejected, illegal tolerance (%u)\n", name, | ||
| 131 | link_tolerance); | ||
| 132 | goto exit; | 120 | goto exit; |
| 133 | } | 121 | if (tipc_media_find(m_ptr->name) || media_find_id(m_ptr->type_id)) |
| 134 | |||
| 135 | media_id = media_count++; | ||
| 136 | if (media_id >= MAX_MEDIA) { | ||
| 137 | warn("Media <%s> rejected, media limit reached (%u)\n", name, | ||
| 138 | MAX_MEDIA); | ||
| 139 | media_count--; | ||
| 140 | goto exit; | 122 | goto exit; |
| 141 | } | ||
| 142 | for (i = 0; i < media_id; i++) { | ||
| 143 | if (media_list[i].type_id == media_type) { | ||
| 144 | warn("Media <%s> rejected, duplicate type (%u)\n", name, | ||
| 145 | media_type); | ||
| 146 | media_count--; | ||
| 147 | goto exit; | ||
| 148 | } | ||
| 149 | if (!strcmp(name, media_list[i].name)) { | ||
| 150 | warn("Media <%s> rejected, duplicate name\n", name); | ||
| 151 | media_count--; | ||
| 152 | goto exit; | ||
| 153 | } | ||
| 154 | } | ||
| 155 | 123 | ||
| 156 | m_ptr = &media_list[media_id]; | 124 | media_list[media_count] = m_ptr; |
| 157 | m_ptr->type_id = media_type; | 125 | media_count++; |
| 158 | m_ptr->send_msg = send_msg; | ||
| 159 | m_ptr->enable_bearer = enable; | ||
| 160 | m_ptr->disable_bearer = disable; | ||
| 161 | m_ptr->addr2str = addr2str; | ||
| 162 | memcpy(&m_ptr->bcast_addr, bcast_addr, sizeof(*bcast_addr)); | ||
| 163 | strcpy(m_ptr->name, name); | ||
| 164 | m_ptr->priority = bearer_priority; | ||
| 165 | m_ptr->tolerance = link_tolerance; | ||
| 166 | m_ptr->window = send_window_limit; | ||
| 167 | res = 0; | 126 | res = 0; |
| 168 | exit: | 127 | exit: |
| 169 | write_unlock_bh(&tipc_net_lock); | 128 | write_unlock_bh(&tipc_net_lock); |
| 129 | if (res) | ||
| 130 | warn("Media <%s> registration error\n", m_ptr->name); | ||
| 170 | return res; | 131 | return res; |
| 171 | } | 132 | } |
| 172 | 133 | ||
| @@ -176,27 +137,19 @@ exit: | |||
| 176 | 137 | ||
| 177 | void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a) | 138 | void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a) |
| 178 | { | 139 | { |
| 179 | struct media *m_ptr; | 140 | char addr_str[MAX_ADDR_STR]; |
| 180 | u32 media_type; | 141 | struct tipc_media *m_ptr; |
| 181 | u32 i; | ||
| 182 | 142 | ||
| 183 | media_type = ntohl(a->type); | 143 | m_ptr = media_find_id(a->media_id); |
| 184 | for (i = 0, m_ptr = media_list; i < media_count; i++, m_ptr++) { | ||
| 185 | if (m_ptr->type_id == media_type) | ||
| 186 | break; | ||
| 187 | } | ||
| 188 | |||
| 189 | if ((i < media_count) && (m_ptr->addr2str != NULL)) { | ||
| 190 | char addr_str[MAX_ADDR_STR]; | ||
| 191 | 144 | ||
| 192 | tipc_printf(pb, "%s(%s)", m_ptr->name, | 145 | if (m_ptr && !m_ptr->addr2str(a, addr_str, sizeof(addr_str))) |
| 193 | m_ptr->addr2str(a, addr_str, sizeof(addr_str))); | 146 | tipc_printf(pb, "%s(%s)", m_ptr->name, addr_str); |
| 194 | } else { | 147 | else { |
| 195 | unchar *addr = (unchar *)&a->dev_addr; | 148 | u32 i; |
| 196 | 149 | ||
| 197 | tipc_printf(pb, "UNKNOWN(%u)", media_type); | 150 | tipc_printf(pb, "UNKNOWN(%u)", a->media_id); |
| 198 | for (i = 0; i < (sizeof(*a) - sizeof(a->type)); i++) | 151 | for (i = 0; i < sizeof(a->value); i++) |
| 199 | tipc_printf(pb, "-%02x", addr[i]); | 152 | tipc_printf(pb, "-%02x", a->value[i]); |
| 200 | } | 153 | } |
| 201 | } | 154 | } |
| 202 | 155 | ||
| @@ -207,7 +160,6 @@ void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a) | |||
| 207 | struct sk_buff *tipc_media_get_names(void) | 160 | struct sk_buff *tipc_media_get_names(void) |
| 208 | { | 161 | { |
| 209 | struct sk_buff *buf; | 162 | struct sk_buff *buf; |
| 210 | struct media *m_ptr; | ||
| 211 | int i; | 163 | int i; |
| 212 | 164 | ||
| 213 | buf = tipc_cfg_reply_alloc(MAX_MEDIA * TLV_SPACE(TIPC_MAX_MEDIA_NAME)); | 165 | buf = tipc_cfg_reply_alloc(MAX_MEDIA * TLV_SPACE(TIPC_MAX_MEDIA_NAME)); |
| @@ -215,9 +167,10 @@ struct sk_buff *tipc_media_get_names(void) | |||
| 215 | return NULL; | 167 | return NULL; |
| 216 | 168 | ||
| 217 | read_lock_bh(&tipc_net_lock); | 169 | read_lock_bh(&tipc_net_lock); |
| 218 | for (i = 0, m_ptr = media_list; i < media_count; i++, m_ptr++) { | 170 | for (i = 0; i < media_count; i++) { |
| 219 | tipc_cfg_append_tlv(buf, TIPC_TLV_MEDIA_NAME, m_ptr->name, | 171 | tipc_cfg_append_tlv(buf, TIPC_TLV_MEDIA_NAME, |
| 220 | strlen(m_ptr->name) + 1); | 172 | media_list[i]->name, |
| 173 | strlen(media_list[i]->name) + 1); | ||
| 221 | } | 174 | } |
| 222 | read_unlock_bh(&tipc_net_lock); | 175 | read_unlock_bh(&tipc_net_lock); |
| 223 | return buf; | 176 | return buf; |
| @@ -232,7 +185,7 @@ struct sk_buff *tipc_media_get_names(void) | |||
| 232 | */ | 185 | */ |
| 233 | 186 | ||
| 234 | static int bearer_name_validate(const char *name, | 187 | static int bearer_name_validate(const char *name, |
| 235 | struct bearer_name *name_parts) | 188 | struct tipc_bearer_names *name_parts) |
| 236 | { | 189 | { |
| 237 | char name_copy[TIPC_MAX_BEARER_NAME]; | 190 | char name_copy[TIPC_MAX_BEARER_NAME]; |
| 238 | char *media_name; | 191 | char *media_name; |
| @@ -276,10 +229,10 @@ static int bearer_name_validate(const char *name, | |||
| 276 | } | 229 | } |
| 277 | 230 | ||
| 278 | /** | 231 | /** |
| 279 | * bearer_find - locates bearer object with matching bearer name | 232 | * tipc_bearer_find - locates bearer object with matching bearer name |
| 280 | */ | 233 | */ |
| 281 | 234 | ||
| 282 | static struct tipc_bearer *bearer_find(const char *name) | 235 | struct tipc_bearer *tipc_bearer_find(const char *name) |
| 283 | { | 236 | { |
| 284 | struct tipc_bearer *b_ptr; | 237 | struct tipc_bearer *b_ptr; |
| 285 | u32 i; | 238 | u32 i; |
| @@ -318,7 +271,6 @@ struct tipc_bearer *tipc_bearer_find_interface(const char *if_name) | |||
| 318 | struct sk_buff *tipc_bearer_get_names(void) | 271 | struct sk_buff *tipc_bearer_get_names(void) |
| 319 | { | 272 | { |
| 320 | struct sk_buff *buf; | 273 | struct sk_buff *buf; |
| 321 | struct media *m_ptr; | ||
| 322 | struct tipc_bearer *b_ptr; | 274 | struct tipc_bearer *b_ptr; |
| 323 | int i, j; | 275 | int i, j; |
| 324 | 276 | ||
| @@ -327,10 +279,10 @@ struct sk_buff *tipc_bearer_get_names(void) | |||
| 327 | return NULL; | 279 | return NULL; |
| 328 | 280 | ||
| 329 | read_lock_bh(&tipc_net_lock); | 281 | read_lock_bh(&tipc_net_lock); |
| 330 | for (i = 0, m_ptr = media_list; i < media_count; i++, m_ptr++) { | 282 | for (i = 0; i < media_count; i++) { |
| 331 | for (j = 0; j < MAX_BEARERS; j++) { | 283 | for (j = 0; j < MAX_BEARERS; j++) { |
| 332 | b_ptr = &tipc_bearers[j]; | 284 | b_ptr = &tipc_bearers[j]; |
| 333 | if (b_ptr->active && (b_ptr->media == m_ptr)) { | 285 | if (b_ptr->active && (b_ptr->media == media_list[i])) { |
| 334 | tipc_cfg_append_tlv(buf, TIPC_TLV_BEARER_NAME, | 286 | tipc_cfg_append_tlv(buf, TIPC_TLV_BEARER_NAME, |
| 335 | b_ptr->name, | 287 | b_ptr->name, |
| 336 | strlen(b_ptr->name) + 1); | 288 | strlen(b_ptr->name) + 1); |
| @@ -366,7 +318,7 @@ void tipc_bearer_remove_dest(struct tipc_bearer *b_ptr, u32 dest) | |||
| 366 | static int bearer_push(struct tipc_bearer *b_ptr) | 318 | static int bearer_push(struct tipc_bearer *b_ptr) |
| 367 | { | 319 | { |
| 368 | u32 res = 0; | 320 | u32 res = 0; |
| 369 | struct link *ln, *tln; | 321 | struct tipc_link *ln, *tln; |
| 370 | 322 | ||
| 371 | if (b_ptr->blocked) | 323 | if (b_ptr->blocked) |
| 372 | return 0; | 324 | return 0; |
| @@ -412,7 +364,8 @@ void tipc_continue(struct tipc_bearer *b_ptr) | |||
| 412 | * bearer.lock is busy | 364 | * bearer.lock is busy |
| 413 | */ | 365 | */ |
| 414 | 366 | ||
| 415 | static void tipc_bearer_schedule_unlocked(struct tipc_bearer *b_ptr, struct link *l_ptr) | 367 | static void tipc_bearer_schedule_unlocked(struct tipc_bearer *b_ptr, |
| 368 | struct tipc_link *l_ptr) | ||
| 416 | { | 369 | { |
| 417 | list_move_tail(&l_ptr->link_list, &b_ptr->cong_links); | 370 | list_move_tail(&l_ptr->link_list, &b_ptr->cong_links); |
| 418 | } | 371 | } |
| @@ -425,7 +378,7 @@ static void tipc_bearer_schedule_unlocked(struct tipc_bearer *b_ptr, struct link | |||
| 425 | * bearer.lock is free | 378 | * bearer.lock is free |
| 426 | */ | 379 | */ |
| 427 | 380 | ||
| 428 | void tipc_bearer_schedule(struct tipc_bearer *b_ptr, struct link *l_ptr) | 381 | void tipc_bearer_schedule(struct tipc_bearer *b_ptr, struct tipc_link *l_ptr) |
| 429 | { | 382 | { |
| 430 | spin_lock_bh(&b_ptr->lock); | 383 | spin_lock_bh(&b_ptr->lock); |
| 431 | tipc_bearer_schedule_unlocked(b_ptr, l_ptr); | 384 | tipc_bearer_schedule_unlocked(b_ptr, l_ptr); |
| @@ -438,7 +391,8 @@ void tipc_bearer_schedule(struct tipc_bearer *b_ptr, struct link *l_ptr) | |||
| 438 | * and if there is, try to resolve it before returning. | 391 | * and if there is, try to resolve it before returning. |
| 439 | * 'tipc_net_lock' is read_locked when this function is called | 392 | * 'tipc_net_lock' is read_locked when this function is called |
| 440 | */ | 393 | */ |
| 441 | int tipc_bearer_resolve_congestion(struct tipc_bearer *b_ptr, struct link *l_ptr) | 394 | int tipc_bearer_resolve_congestion(struct tipc_bearer *b_ptr, |
| 395 | struct tipc_link *l_ptr) | ||
| 442 | { | 396 | { |
| 443 | int res = 1; | 397 | int res = 1; |
| 444 | 398 | ||
| @@ -457,7 +411,7 @@ int tipc_bearer_resolve_congestion(struct tipc_bearer *b_ptr, struct link *l_ptr | |||
| 457 | * tipc_bearer_congested - determines if bearer is currently congested | 411 | * tipc_bearer_congested - determines if bearer is currently congested |
| 458 | */ | 412 | */ |
| 459 | 413 | ||
| 460 | int tipc_bearer_congested(struct tipc_bearer *b_ptr, struct link *l_ptr) | 414 | int tipc_bearer_congested(struct tipc_bearer *b_ptr, struct tipc_link *l_ptr) |
| 461 | { | 415 | { |
| 462 | if (unlikely(b_ptr->blocked)) | 416 | if (unlikely(b_ptr->blocked)) |
| 463 | return 1; | 417 | return 1; |
| @@ -473,8 +427,8 @@ int tipc_bearer_congested(struct tipc_bearer *b_ptr, struct link *l_ptr) | |||
| 473 | int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) | 427 | int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) |
| 474 | { | 428 | { |
| 475 | struct tipc_bearer *b_ptr; | 429 | struct tipc_bearer *b_ptr; |
| 476 | struct media *m_ptr; | 430 | struct tipc_media *m_ptr; |
| 477 | struct bearer_name b_name; | 431 | struct tipc_bearer_names b_names; |
| 478 | char addr_string[16]; | 432 | char addr_string[16]; |
| 479 | u32 bearer_id; | 433 | u32 bearer_id; |
| 480 | u32 with_this_prio; | 434 | u32 with_this_prio; |
| @@ -486,7 +440,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) | |||
| 486 | name); | 440 | name); |
| 487 | return -ENOPROTOOPT; | 441 | return -ENOPROTOOPT; |
| 488 | } | 442 | } |
| 489 | if (!bearer_name_validate(name, &b_name)) { | 443 | if (!bearer_name_validate(name, &b_names)) { |
| 490 | warn("Bearer <%s> rejected, illegal name\n", name); | 444 | warn("Bearer <%s> rejected, illegal name\n", name); |
| 491 | return -EINVAL; | 445 | return -EINVAL; |
| 492 | } | 446 | } |
| @@ -511,10 +465,10 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, u32 priority) | |||
| 511 | 465 | ||
| 512 | write_lock_bh(&tipc_net_lock); | 466 | write_lock_bh(&tipc_net_lock); |
| 513 | 467 | ||
| 514 | m_ptr = media_find(b_name.media_name); | 468 | m_ptr = tipc_media_find(b_names.media_name); |
| 515 | if (!m_ptr) { | 469 | if (!m_ptr) { |
| 516 | warn("Bearer <%s> rejected, media <%s> not registered\n", name, | 470 | warn("Bearer <%s> rejected, media <%s> not registered\n", name, |
| 517 | b_name.media_name); | 471 | b_names.media_name); |
| 518 | goto exit; | 472 | goto exit; |
| 519 | } | 473 | } |
| 520 | 474 | ||
| @@ -561,6 +515,8 @@ restart: | |||
| 561 | 515 | ||
| 562 | b_ptr->identity = bearer_id; | 516 | b_ptr->identity = bearer_id; |
| 563 | b_ptr->media = m_ptr; | 517 | b_ptr->media = m_ptr; |
| 518 | b_ptr->tolerance = m_ptr->tolerance; | ||
| 519 | b_ptr->window = m_ptr->window; | ||
| 564 | b_ptr->net_plane = bearer_id + 'A'; | 520 | b_ptr->net_plane = bearer_id + 'A'; |
| 565 | b_ptr->active = 1; | 521 | b_ptr->active = 1; |
| 566 | b_ptr->priority = priority; | 522 | b_ptr->priority = priority; |
| @@ -590,11 +546,11 @@ exit: | |||
| 590 | int tipc_block_bearer(const char *name) | 546 | int tipc_block_bearer(const char *name) |
| 591 | { | 547 | { |
| 592 | struct tipc_bearer *b_ptr = NULL; | 548 | struct tipc_bearer *b_ptr = NULL; |
| 593 | struct link *l_ptr; | 549 | struct tipc_link *l_ptr; |
| 594 | struct link *temp_l_ptr; | 550 | struct tipc_link *temp_l_ptr; |
| 595 | 551 | ||
| 596 | read_lock_bh(&tipc_net_lock); | 552 | read_lock_bh(&tipc_net_lock); |
| 597 | b_ptr = bearer_find(name); | 553 | b_ptr = tipc_bearer_find(name); |
| 598 | if (!b_ptr) { | 554 | if (!b_ptr) { |
| 599 | warn("Attempt to block unknown bearer <%s>\n", name); | 555 | warn("Attempt to block unknown bearer <%s>\n", name); |
| 600 | read_unlock_bh(&tipc_net_lock); | 556 | read_unlock_bh(&tipc_net_lock); |
| @@ -625,8 +581,8 @@ int tipc_block_bearer(const char *name) | |||
| 625 | 581 | ||
| 626 | static void bearer_disable(struct tipc_bearer *b_ptr) | 582 | static void bearer_disable(struct tipc_bearer *b_ptr) |
| 627 | { | 583 | { |
| 628 | struct link *l_ptr; | 584 | struct tipc_link *l_ptr; |
| 629 | struct link *temp_l_ptr; | 585 | struct tipc_link *temp_l_ptr; |
| 630 | 586 | ||
| 631 | info("Disabling bearer <%s>\n", b_ptr->name); | 587 | info("Disabling bearer <%s>\n", b_ptr->name); |
| 632 | spin_lock_bh(&b_ptr->lock); | 588 | spin_lock_bh(&b_ptr->lock); |
| @@ -648,7 +604,7 @@ int tipc_disable_bearer(const char *name) | |||
| 648 | int res; | 604 | int res; |
| 649 | 605 | ||
| 650 | write_lock_bh(&tipc_net_lock); | 606 | write_lock_bh(&tipc_net_lock); |
| 651 | b_ptr = bearer_find(name); | 607 | b_ptr = tipc_bearer_find(name); |
| 652 | if (b_ptr == NULL) { | 608 | if (b_ptr == NULL) { |
| 653 | warn("Attempt to disable unknown bearer <%s>\n", name); | 609 | warn("Attempt to disable unknown bearer <%s>\n", name); |
| 654 | res = -EINVAL; | 610 | res = -EINVAL; |
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index d696f9e414e3..d3eac56b8c21 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
| @@ -43,32 +43,45 @@ | |||
| 43 | #define MAX_MEDIA 2 | 43 | #define MAX_MEDIA 2 |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * Identifiers associated with TIPC message header media address info | ||
| 47 | * | ||
| 48 | * - address info field is 20 bytes long | ||
| 49 | * - media type identifier located at offset 3 | ||
| 50 | * - remaining bytes vary according to media type | ||
| 51 | */ | ||
| 52 | |||
| 53 | #define TIPC_MEDIA_ADDR_SIZE 20 | ||
| 54 | #define TIPC_MEDIA_TYPE_OFFSET 3 | ||
| 55 | |||
| 56 | /* | ||
| 46 | * Identifiers of supported TIPC media types | 57 | * Identifiers of supported TIPC media types |
| 47 | */ | 58 | */ |
| 48 | #define TIPC_MEDIA_TYPE_ETH 1 | 59 | #define TIPC_MEDIA_TYPE_ETH 1 |
| 49 | 60 | ||
| 50 | /* | 61 | /* |
| 51 | * Destination address structure used by TIPC bearers when sending messages | 62 | * struct tipc_media_addr - destination address used by TIPC bearers |
| 52 | * | 63 | * @value: address info (format defined by media) |
| 53 | * IMPORTANT: The fields of this structure MUST be stored using the specified | 64 | * @media_id: TIPC media type identifier |
| 54 | * byte order indicated below, as the structure is exchanged between nodes | 65 | * @broadcast: non-zero if address is a broadcast address |
| 55 | * as part of a link setup process. | ||
| 56 | */ | 66 | */ |
| 67 | |||
| 57 | struct tipc_media_addr { | 68 | struct tipc_media_addr { |
| 58 | __be32 type; /* bearer type (network byte order) */ | 69 | u8 value[TIPC_MEDIA_ADDR_SIZE]; |
| 59 | union { | 70 | u8 media_id; |
| 60 | __u8 eth_addr[6]; /* 48 bit Ethernet addr (byte array) */ | 71 | u8 broadcast; |
| 61 | } dev_addr; | ||
| 62 | }; | 72 | }; |
| 63 | 73 | ||
| 64 | struct tipc_bearer; | 74 | struct tipc_bearer; |
| 65 | 75 | ||
| 66 | /** | 76 | /** |
| 67 | * struct media - TIPC media information available to internal users | 77 | * struct tipc_media - TIPC media information available to internal users |
| 68 | * @send_msg: routine which handles buffer transmission | 78 | * @send_msg: routine which handles buffer transmission |
| 69 | * @enable_bearer: routine which enables a bearer | 79 | * @enable_bearer: routine which enables a bearer |
| 70 | * @disable_bearer: routine which disables a bearer | 80 | * @disable_bearer: routine which disables a bearer |
| 71 | * @addr2str: routine which converts bearer's address to string form | 81 | * @addr2str: routine which converts media address to string |
| 82 | * @str2addr: routine which converts media address from string | ||
| 83 | * @addr2msg: routine which converts media address to protocol message area | ||
| 84 | * @msg2addr: routine which converts media address from protocol message area | ||
| 72 | * @bcast_addr: media address used in broadcasting | 85 | * @bcast_addr: media address used in broadcasting |
| 73 | * @priority: default link (and bearer) priority | 86 | * @priority: default link (and bearer) priority |
| 74 | * @tolerance: default time (in ms) before declaring link failure | 87 | * @tolerance: default time (in ms) before declaring link failure |
| @@ -77,14 +90,16 @@ struct tipc_bearer; | |||
| 77 | * @name: media name | 90 | * @name: media name |
| 78 | */ | 91 | */ |
| 79 | 92 | ||
| 80 | struct media { | 93 | struct tipc_media { |
| 81 | int (*send_msg)(struct sk_buff *buf, | 94 | int (*send_msg)(struct sk_buff *buf, |
| 82 | struct tipc_bearer *b_ptr, | 95 | struct tipc_bearer *b_ptr, |
| 83 | struct tipc_media_addr *dest); | 96 | struct tipc_media_addr *dest); |
| 84 | int (*enable_bearer)(struct tipc_bearer *b_ptr); | 97 | int (*enable_bearer)(struct tipc_bearer *b_ptr); |
| 85 | void (*disable_bearer)(struct tipc_bearer *b_ptr); | 98 | void (*disable_bearer)(struct tipc_bearer *b_ptr); |
| 86 | char *(*addr2str)(struct tipc_media_addr *a, | 99 | int (*addr2str)(struct tipc_media_addr *a, char *str_buf, int str_size); |
| 87 | char *str_buf, int str_size); | 100 | int (*str2addr)(struct tipc_media_addr *a, char *str_buf); |
| 101 | int (*addr2msg)(struct tipc_media_addr *a, char *msg_area); | ||
| 102 | int (*msg2addr)(struct tipc_media_addr *a, char *msg_area); | ||
| 88 | struct tipc_media_addr bcast_addr; | 103 | struct tipc_media_addr bcast_addr; |
| 89 | u32 priority; | 104 | u32 priority; |
| 90 | u32 tolerance; | 105 | u32 tolerance; |
| @@ -103,6 +118,8 @@ struct media { | |||
| 103 | * @name: bearer name (format = media:interface) | 118 | * @name: bearer name (format = media:interface) |
| 104 | * @media: ptr to media structure associated with bearer | 119 | * @media: ptr to media structure associated with bearer |
| 105 | * @priority: default link priority for bearer | 120 | * @priority: default link priority for bearer |
| 121 | * @window: default window size for bearer | ||
| 122 | * @tolerance: default link tolerance for bearer | ||
| 106 | * @identity: array index of this bearer within TIPC bearer array | 123 | * @identity: array index of this bearer within TIPC bearer array |
| 107 | * @link_req: ptr to (optional) structure making periodic link setup requests | 124 | * @link_req: ptr to (optional) structure making periodic link setup requests |
| 108 | * @links: list of non-congested links associated with bearer | 125 | * @links: list of non-congested links associated with bearer |
| @@ -122,10 +139,12 @@ struct tipc_bearer { | |||
| 122 | struct tipc_media_addr addr; /* initalized by media */ | 139 | struct tipc_media_addr addr; /* initalized by media */ |
| 123 | char name[TIPC_MAX_BEARER_NAME]; | 140 | char name[TIPC_MAX_BEARER_NAME]; |
| 124 | spinlock_t lock; | 141 | spinlock_t lock; |
| 125 | struct media *media; | 142 | struct tipc_media *media; |
| 126 | u32 priority; | 143 | u32 priority; |
| 144 | u32 window; | ||
| 145 | u32 tolerance; | ||
| 127 | u32 identity; | 146 | u32 identity; |
| 128 | struct link_req *link_req; | 147 | struct tipc_link_req *link_req; |
| 129 | struct list_head links; | 148 | struct list_head links; |
| 130 | struct list_head cong_links; | 149 | struct list_head cong_links; |
| 131 | int active; | 150 | int active; |
| @@ -133,28 +152,19 @@ struct tipc_bearer { | |||
| 133 | struct tipc_node_map nodes; | 152 | struct tipc_node_map nodes; |
| 134 | }; | 153 | }; |
| 135 | 154 | ||
| 136 | struct bearer_name { | 155 | struct tipc_bearer_names { |
| 137 | char media_name[TIPC_MAX_MEDIA_NAME]; | 156 | char media_name[TIPC_MAX_MEDIA_NAME]; |
| 138 | char if_name[TIPC_MAX_IF_NAME]; | 157 | char if_name[TIPC_MAX_IF_NAME]; |
| 139 | }; | 158 | }; |
| 140 | 159 | ||
| 141 | struct link; | 160 | struct tipc_link; |
| 142 | 161 | ||
| 143 | extern struct tipc_bearer tipc_bearers[]; | 162 | extern struct tipc_bearer tipc_bearers[]; |
| 144 | 163 | ||
| 145 | /* | 164 | /* |
| 146 | * TIPC routines available to supported media types | 165 | * TIPC routines available to supported media types |
| 147 | */ | 166 | */ |
| 148 | int tipc_register_media(u32 media_type, | 167 | int tipc_register_media(struct tipc_media *m_ptr); |
| 149 | char *media_name, int (*enable)(struct tipc_bearer *), | ||
| 150 | void (*disable)(struct tipc_bearer *), | ||
| 151 | int (*send_msg)(struct sk_buff *, | ||
| 152 | struct tipc_bearer *, struct tipc_media_addr *), | ||
| 153 | char *(*addr2str)(struct tipc_media_addr *a, | ||
| 154 | char *str_buf, int str_size), | ||
| 155 | struct tipc_media_addr *bcast_addr, const u32 bearer_priority, | ||
| 156 | const u32 link_tolerance, /* [ms] */ | ||
| 157 | const u32 send_window_limit); | ||
| 158 | 168 | ||
| 159 | void tipc_recv_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr); | 169 | void tipc_recv_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr); |
| 160 | 170 | ||
| @@ -170,16 +180,21 @@ int tipc_disable_bearer(const char *name); | |||
| 170 | int tipc_eth_media_start(void); | 180 | int tipc_eth_media_start(void); |
| 171 | void tipc_eth_media_stop(void); | 181 | void tipc_eth_media_stop(void); |
| 172 | 182 | ||
| 183 | int tipc_media_set_priority(const char *name, u32 new_value); | ||
| 184 | int tipc_media_set_window(const char *name, u32 new_value); | ||
| 173 | void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a); | 185 | void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a); |
| 174 | struct sk_buff *tipc_media_get_names(void); | 186 | struct sk_buff *tipc_media_get_names(void); |
| 175 | 187 | ||
| 176 | struct sk_buff *tipc_bearer_get_names(void); | 188 | struct sk_buff *tipc_bearer_get_names(void); |
| 177 | void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest); | 189 | void tipc_bearer_add_dest(struct tipc_bearer *b_ptr, u32 dest); |
| 178 | void tipc_bearer_remove_dest(struct tipc_bearer *b_ptr, u32 dest); | 190 | void tipc_bearer_remove_dest(struct tipc_bearer *b_ptr, u32 dest); |
| 179 | void tipc_bearer_schedule(struct tipc_bearer *b_ptr, struct link *l_ptr); | 191 | void tipc_bearer_schedule(struct tipc_bearer *b_ptr, struct tipc_link *l_ptr); |
| 192 | struct tipc_bearer *tipc_bearer_find(const char *name); | ||
| 180 | struct tipc_bearer *tipc_bearer_find_interface(const char *if_name); | 193 | struct tipc_bearer *tipc_bearer_find_interface(const char *if_name); |
| 181 | int tipc_bearer_resolve_congestion(struct tipc_bearer *b_ptr, struct link *l_ptr); | 194 | struct tipc_media *tipc_media_find(const char *name); |
| 182 | int tipc_bearer_congested(struct tipc_bearer *b_ptr, struct link *l_ptr); | 195 | int tipc_bearer_resolve_congestion(struct tipc_bearer *b_ptr, |
| 196 | struct tipc_link *l_ptr); | ||
| 197 | int tipc_bearer_congested(struct tipc_bearer *b_ptr, struct tipc_link *l_ptr); | ||
| 183 | void tipc_bearer_stop(void); | 198 | void tipc_bearer_stop(void); |
| 184 | void tipc_bearer_lock_push(struct tipc_bearer *b_ptr); | 199 | void tipc_bearer_lock_push(struct tipc_bearer *b_ptr); |
| 185 | 200 | ||
diff --git a/net/tipc/config.c b/net/tipc/config.c index b25a396b7e1e..4785bf26cdf4 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c | |||
| @@ -184,13 +184,12 @@ static struct sk_buff *cfg_set_own_addr(void) | |||
| 184 | " (cannot change node address once assigned)"); | 184 | " (cannot change node address once assigned)"); |
| 185 | 185 | ||
| 186 | /* | 186 | /* |
| 187 | * Must release all spinlocks before calling start_net() because | 187 | * Must temporarily release configuration spinlock while switching into |
| 188 | * Linux version of TIPC calls eth_media_start() which calls | 188 | * networking mode as it calls tipc_eth_media_start(), which may sleep. |
| 189 | * register_netdevice_notifier() which may block! | 189 | * Releasing the lock is harmless as other locally-issued configuration |
| 190 | * | 190 | * commands won't occur until this one completes, and remotely-issued |
| 191 | * Temporarily releasing the lock should be harmless for non-Linux TIPC, | 191 | * configuration commands can't be received until a local configuration |
| 192 | * but Linux version of eth_media_start() should really be reworked | 192 | * command to enable the first bearer is received and processed. |
| 193 | * so that it can be called with spinlocks held. | ||
| 194 | */ | 193 | */ |
| 195 | 194 | ||
| 196 | spin_unlock_bh(&config_lock); | 195 | spin_unlock_bh(&config_lock); |
diff --git a/net/tipc/core.c b/net/tipc/core.c index c21331d58fdb..2691cd57b8a8 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c | |||
| @@ -99,8 +99,8 @@ struct sk_buff *tipc_buf_acquire(u32 size) | |||
| 99 | 99 | ||
| 100 | static void tipc_core_stop_net(void) | 100 | static void tipc_core_stop_net(void) |
| 101 | { | 101 | { |
| 102 | tipc_eth_media_stop(); | ||
| 103 | tipc_net_stop(); | 102 | tipc_net_stop(); |
| 103 | tipc_eth_media_stop(); | ||
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | /** | 106 | /** |
diff --git a/net/tipc/discover.c b/net/tipc/discover.c index f2fb96e86ee8..a00e5f811569 100644 --- a/net/tipc/discover.c +++ b/net/tipc/discover.c | |||
| @@ -45,7 +45,7 @@ | |||
| 45 | 45 | ||
| 46 | 46 | ||
| 47 | /** | 47 | /** |
| 48 | * struct link_req - information about an ongoing link setup request | 48 | * struct tipc_link_req - information about an ongoing link setup request |
| 49 | * @bearer: bearer issuing requests | 49 | * @bearer: bearer issuing requests |
| 50 | * @dest: destination address for request messages | 50 | * @dest: destination address for request messages |
| 51 | * @domain: network domain to which links can be established | 51 | * @domain: network domain to which links can be established |
| @@ -54,7 +54,7 @@ | |||
| 54 | * @timer: timer governing period between requests | 54 | * @timer: timer governing period between requests |
| 55 | * @timer_intv: current interval between requests (in ms) | 55 | * @timer_intv: current interval between requests (in ms) |
| 56 | */ | 56 | */ |
| 57 | struct link_req { | 57 | struct tipc_link_req { |
| 58 | struct tipc_bearer *bearer; | 58 | struct tipc_bearer *bearer; |
| 59 | struct tipc_media_addr dest; | 59 | struct tipc_media_addr dest; |
| 60 | u32 domain; | 60 | u32 domain; |
| @@ -84,7 +84,7 @@ static struct sk_buff *tipc_disc_init_msg(u32 type, | |||
| 84 | msg_set_non_seq(msg, 1); | 84 | msg_set_non_seq(msg, 1); |
| 85 | msg_set_dest_domain(msg, dest_domain); | 85 | msg_set_dest_domain(msg, dest_domain); |
| 86 | msg_set_bc_netid(msg, tipc_net_id); | 86 | msg_set_bc_netid(msg, tipc_net_id); |
| 87 | msg_set_media_addr(msg, &b_ptr->addr); | 87 | b_ptr->media->addr2msg(&b_ptr->addr, msg_media_addr(msg)); |
| 88 | } | 88 | } |
| 89 | return buf; | 89 | return buf; |
| 90 | } | 90 | } |
| @@ -120,7 +120,7 @@ static void disc_dupl_alert(struct tipc_bearer *b_ptr, u32 node_addr, | |||
| 120 | void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr) | 120 | void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr) |
| 121 | { | 121 | { |
| 122 | struct tipc_node *n_ptr; | 122 | struct tipc_node *n_ptr; |
| 123 | struct link *link; | 123 | struct tipc_link *link; |
| 124 | struct tipc_media_addr media_addr, *addr; | 124 | struct tipc_media_addr media_addr, *addr; |
| 125 | struct sk_buff *rbuf; | 125 | struct sk_buff *rbuf; |
| 126 | struct tipc_msg *msg = buf_msg(buf); | 126 | struct tipc_msg *msg = buf_msg(buf); |
| @@ -130,12 +130,15 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr) | |||
| 130 | u32 type = msg_type(msg); | 130 | u32 type = msg_type(msg); |
| 131 | int link_fully_up; | 131 | int link_fully_up; |
| 132 | 132 | ||
| 133 | msg_get_media_addr(msg, &media_addr); | 133 | media_addr.broadcast = 1; |
| 134 | b_ptr->media->msg2addr(&media_addr, msg_media_addr(msg)); | ||
| 134 | buf_discard(buf); | 135 | buf_discard(buf); |
| 135 | 136 | ||
| 136 | /* Validate discovery message from requesting node */ | 137 | /* Validate discovery message from requesting node */ |
| 137 | if (net_id != tipc_net_id) | 138 | if (net_id != tipc_net_id) |
| 138 | return; | 139 | return; |
| 140 | if (media_addr.broadcast) | ||
| 141 | return; | ||
| 139 | if (!tipc_addr_domain_valid(dest)) | 142 | if (!tipc_addr_domain_valid(dest)) |
| 140 | return; | 143 | return; |
| 141 | if (!tipc_addr_node_valid(orig)) | 144 | if (!tipc_addr_node_valid(orig)) |
| @@ -215,7 +218,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr) | |||
| 215 | * and is either not currently searching or is searching at a slow rate | 218 | * and is either not currently searching or is searching at a slow rate |
| 216 | */ | 219 | */ |
| 217 | 220 | ||
| 218 | static void disc_update(struct link_req *req) | 221 | static void disc_update(struct tipc_link_req *req) |
| 219 | { | 222 | { |
| 220 | if (!req->num_nodes) { | 223 | if (!req->num_nodes) { |
| 221 | if ((req->timer_intv == TIPC_LINK_REQ_INACTIVE) || | 224 | if ((req->timer_intv == TIPC_LINK_REQ_INACTIVE) || |
| @@ -231,7 +234,7 @@ static void disc_update(struct link_req *req) | |||
| 231 | * @req: ptr to link request structure | 234 | * @req: ptr to link request structure |
| 232 | */ | 235 | */ |
| 233 | 236 | ||
| 234 | void tipc_disc_add_dest(struct link_req *req) | 237 | void tipc_disc_add_dest(struct tipc_link_req *req) |
| 235 | { | 238 | { |
| 236 | req->num_nodes++; | 239 | req->num_nodes++; |
| 237 | } | 240 | } |
| @@ -241,7 +244,7 @@ void tipc_disc_add_dest(struct link_req *req) | |||
| 241 | * @req: ptr to link request structure | 244 | * @req: ptr to link request structure |
| 242 | */ | 245 | */ |
| 243 | 246 | ||
| 244 | void tipc_disc_remove_dest(struct link_req *req) | 247 | void tipc_disc_remove_dest(struct tipc_link_req *req) |
| 245 | { | 248 | { |
| 246 | req->num_nodes--; | 249 | req->num_nodes--; |
| 247 | disc_update(req); | 250 | disc_update(req); |
| @@ -252,7 +255,7 @@ void tipc_disc_remove_dest(struct link_req *req) | |||
| 252 | * @req: ptr to link request structure | 255 | * @req: ptr to link request structure |
| 253 | */ | 256 | */ |
| 254 | 257 | ||
| 255 | static void disc_send_msg(struct link_req *req) | 258 | static void disc_send_msg(struct tipc_link_req *req) |
| 256 | { | 259 | { |
| 257 | if (!req->bearer->blocked) | 260 | if (!req->bearer->blocked) |
| 258 | tipc_bearer_send(req->bearer, req->buf, &req->dest); | 261 | tipc_bearer_send(req->bearer, req->buf, &req->dest); |
| @@ -265,7 +268,7 @@ static void disc_send_msg(struct link_req *req) | |||
| 265 | * Called whenever a link setup request timer associated with a bearer expires. | 268 | * Called whenever a link setup request timer associated with a bearer expires. |
| 266 | */ | 269 | */ |
| 267 | 270 | ||
| 268 | static void disc_timeout(struct link_req *req) | 271 | static void disc_timeout(struct tipc_link_req *req) |
| 269 | { | 272 | { |
| 270 | int max_delay; | 273 | int max_delay; |
| 271 | 274 | ||
| @@ -313,7 +316,7 @@ exit: | |||
| 313 | int tipc_disc_create(struct tipc_bearer *b_ptr, | 316 | int tipc_disc_create(struct tipc_bearer *b_ptr, |
| 314 | struct tipc_media_addr *dest, u32 dest_domain) | 317 | struct tipc_media_addr *dest, u32 dest_domain) |
| 315 | { | 318 | { |
| 316 | struct link_req *req; | 319 | struct tipc_link_req *req; |
| 317 | 320 | ||
| 318 | req = kmalloc(sizeof(*req), GFP_ATOMIC); | 321 | req = kmalloc(sizeof(*req), GFP_ATOMIC); |
| 319 | if (!req) | 322 | if (!req) |
| @@ -342,7 +345,7 @@ int tipc_disc_create(struct tipc_bearer *b_ptr, | |||
| 342 | * @req: ptr to link request structure | 345 | * @req: ptr to link request structure |
| 343 | */ | 346 | */ |
| 344 | 347 | ||
| 345 | void tipc_disc_delete(struct link_req *req) | 348 | void tipc_disc_delete(struct tipc_link_req *req) |
| 346 | { | 349 | { |
| 347 | k_cancel_timer(&req->timer); | 350 | k_cancel_timer(&req->timer); |
| 348 | k_term_timer(&req->timer); | 351 | k_term_timer(&req->timer); |
diff --git a/net/tipc/discover.h b/net/tipc/discover.h index a3af595b86cb..75b67c403aa3 100644 --- a/net/tipc/discover.h +++ b/net/tipc/discover.h | |||
| @@ -37,13 +37,13 @@ | |||
| 37 | #ifndef _TIPC_DISCOVER_H | 37 | #ifndef _TIPC_DISCOVER_H |
| 38 | #define _TIPC_DISCOVER_H | 38 | #define _TIPC_DISCOVER_H |
| 39 | 39 | ||
| 40 | struct link_req; | 40 | struct tipc_link_req; |
| 41 | 41 | ||
| 42 | int tipc_disc_create(struct tipc_bearer *b_ptr, struct tipc_media_addr *dest, | 42 | int tipc_disc_create(struct tipc_bearer *b_ptr, struct tipc_media_addr *dest, |
| 43 | u32 dest_domain); | 43 | u32 dest_domain); |
| 44 | void tipc_disc_delete(struct link_req *req); | 44 | void tipc_disc_delete(struct tipc_link_req *req); |
| 45 | void tipc_disc_add_dest(struct link_req *req); | 45 | void tipc_disc_add_dest(struct tipc_link_req *req); |
| 46 | void tipc_disc_remove_dest(struct link_req *req); | 46 | void tipc_disc_remove_dest(struct tipc_link_req *req); |
| 47 | void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr); | 47 | void tipc_disc_recv_msg(struct sk_buff *buf, struct tipc_bearer *b_ptr); |
| 48 | 48 | ||
| 49 | #endif | 49 | #endif |
diff --git a/net/tipc/eth_media.c b/net/tipc/eth_media.c index e728d4ce2a1b..527e3f0e165d 100644 --- a/net/tipc/eth_media.c +++ b/net/tipc/eth_media.c | |||
| @@ -38,28 +38,45 @@ | |||
| 38 | #include "bearer.h" | 38 | #include "bearer.h" |
| 39 | 39 | ||
| 40 | #define MAX_ETH_BEARERS MAX_BEARERS | 40 | #define MAX_ETH_BEARERS MAX_BEARERS |
| 41 | #define ETH_LINK_PRIORITY TIPC_DEF_LINK_PRI | 41 | |
| 42 | #define ETH_LINK_TOLERANCE TIPC_DEF_LINK_TOL | 42 | #define ETH_ADDR_OFFSET 4 /* message header offset of MAC address */ |
| 43 | #define ETH_LINK_WINDOW TIPC_DEF_LINK_WIN | ||
| 44 | 43 | ||
| 45 | /** | 44 | /** |
| 46 | * struct eth_bearer - Ethernet bearer data structure | 45 | * struct eth_bearer - Ethernet bearer data structure |
| 47 | * @bearer: ptr to associated "generic" bearer structure | 46 | * @bearer: ptr to associated "generic" bearer structure |
| 48 | * @dev: ptr to associated Ethernet network device | 47 | * @dev: ptr to associated Ethernet network device |
| 49 | * @tipc_packet_type: used in binding TIPC to Ethernet driver | 48 | * @tipc_packet_type: used in binding TIPC to Ethernet driver |
| 49 | * @cleanup: work item used when disabling bearer | ||
| 50 | */ | 50 | */ |
| 51 | 51 | ||
| 52 | struct eth_bearer { | 52 | struct eth_bearer { |
| 53 | struct tipc_bearer *bearer; | 53 | struct tipc_bearer *bearer; |
| 54 | struct net_device *dev; | 54 | struct net_device *dev; |
| 55 | struct packet_type tipc_packet_type; | 55 | struct packet_type tipc_packet_type; |
| 56 | struct work_struct cleanup; | ||
| 56 | }; | 57 | }; |
| 57 | 58 | ||
| 59 | static struct tipc_media eth_media_info; | ||
| 58 | static struct eth_bearer eth_bearers[MAX_ETH_BEARERS]; | 60 | static struct eth_bearer eth_bearers[MAX_ETH_BEARERS]; |
| 59 | static int eth_started; | 61 | static int eth_started; |
| 60 | static struct notifier_block notifier; | 62 | static struct notifier_block notifier; |
| 61 | 63 | ||
| 62 | /** | 64 | /** |
| 65 | * eth_media_addr_set - initialize Ethernet media address structure | ||
| 66 | * | ||
| 67 | * Media-dependent "value" field stores MAC address in first 6 bytes | ||
| 68 | * and zeroes out the remaining bytes. | ||
| 69 | */ | ||
| 70 | |||
| 71 | static void eth_media_addr_set(struct tipc_media_addr *a, char *mac) | ||
| 72 | { | ||
| 73 | memcpy(a->value, mac, ETH_ALEN); | ||
| 74 | memset(a->value + ETH_ALEN, 0, sizeof(a->value) - ETH_ALEN); | ||
| 75 | a->media_id = TIPC_MEDIA_TYPE_ETH; | ||
| 76 | a->broadcast = !memcmp(mac, eth_media_info.bcast_addr.value, ETH_ALEN); | ||
| 77 | } | ||
| 78 | |||
| 79 | /** | ||
| 63 | * send_msg - send a TIPC message out over an Ethernet interface | 80 | * send_msg - send a TIPC message out over an Ethernet interface |
| 64 | */ | 81 | */ |
| 65 | 82 | ||
| @@ -85,7 +102,7 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, | |||
| 85 | 102 | ||
| 86 | skb_reset_network_header(clone); | 103 | skb_reset_network_header(clone); |
| 87 | clone->dev = dev; | 104 | clone->dev = dev; |
| 88 | dev_hard_header(clone, dev, ETH_P_TIPC, &dest->dev_addr.eth_addr, | 105 | dev_hard_header(clone, dev, ETH_P_TIPC, dest->value, |
| 89 | dev->dev_addr, clone->len); | 106 | dev->dev_addr, clone->len); |
| 90 | dev_queue_xmit(clone); | 107 | dev_queue_xmit(clone); |
| 91 | return 0; | 108 | return 0; |
| @@ -172,22 +189,41 @@ static int enable_bearer(struct tipc_bearer *tb_ptr) | |||
| 172 | tb_ptr->usr_handle = (void *)eb_ptr; | 189 | tb_ptr->usr_handle = (void *)eb_ptr; |
| 173 | tb_ptr->mtu = dev->mtu; | 190 | tb_ptr->mtu = dev->mtu; |
| 174 | tb_ptr->blocked = 0; | 191 | tb_ptr->blocked = 0; |
| 175 | tb_ptr->addr.type = htonl(TIPC_MEDIA_TYPE_ETH); | 192 | eth_media_addr_set(&tb_ptr->addr, (char *)dev->dev_addr); |
| 176 | memcpy(&tb_ptr->addr.dev_addr, dev->dev_addr, ETH_ALEN); | ||
| 177 | return 0; | 193 | return 0; |
| 178 | } | 194 | } |
| 179 | 195 | ||
| 180 | /** | 196 | /** |
| 197 | * cleanup_bearer - break association between Ethernet bearer and interface | ||
| 198 | * | ||
| 199 | * This routine must be invoked from a work queue because it can sleep. | ||
| 200 | */ | ||
| 201 | |||
| 202 | static void cleanup_bearer(struct work_struct *work) | ||
| 203 | { | ||
| 204 | struct eth_bearer *eb_ptr = | ||
| 205 | container_of(work, struct eth_bearer, cleanup); | ||
| 206 | |||
| 207 | dev_remove_pack(&eb_ptr->tipc_packet_type); | ||
| 208 | dev_put(eb_ptr->dev); | ||
| 209 | eb_ptr->dev = NULL; | ||
| 210 | } | ||
| 211 | |||
| 212 | /** | ||
| 181 | * disable_bearer - detach TIPC bearer from an Ethernet interface | 213 | * disable_bearer - detach TIPC bearer from an Ethernet interface |
| 182 | * | 214 | * |
| 183 | * We really should do dev_remove_pack() here, but this function can not be | 215 | * Mark Ethernet bearer as inactive so that incoming buffers are thrown away, |
| 184 | * called at tasklet level. => Use eth_bearer->bearer as a flag to throw away | 216 | * then get worker thread to complete bearer cleanup. (Can't do cleanup |
| 185 | * incoming buffers, & postpone dev_remove_pack() to eth_media_stop() on exit. | 217 | * here because cleanup code needs to sleep and caller holds spinlocks.) |
| 186 | */ | 218 | */ |
| 187 | 219 | ||
| 188 | static void disable_bearer(struct tipc_bearer *tb_ptr) | 220 | static void disable_bearer(struct tipc_bearer *tb_ptr) |
| 189 | { | 221 | { |
| 190 | ((struct eth_bearer *)tb_ptr->usr_handle)->bearer = NULL; | 222 | struct eth_bearer *eb_ptr = (struct eth_bearer *)tb_ptr->usr_handle; |
| 223 | |||
| 224 | eb_ptr->bearer = NULL; | ||
| 225 | INIT_WORK(&eb_ptr->cleanup, cleanup_bearer); | ||
| 226 | schedule_work(&eb_ptr->cleanup); | ||
| 191 | } | 227 | } |
| 192 | 228 | ||
| 193 | /** | 229 | /** |
| @@ -246,17 +282,81 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt, | |||
| 246 | * eth_addr2str - convert Ethernet address to string | 282 | * eth_addr2str - convert Ethernet address to string |
| 247 | */ | 283 | */ |
| 248 | 284 | ||
| 249 | static char *eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) | 285 | static int eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size) |
| 286 | { | ||
| 287 | if (str_size < 18) /* 18 = strlen("aa:bb:cc:dd:ee:ff\0") */ | ||
| 288 | return 1; | ||
| 289 | |||
| 290 | sprintf(str_buf, "%pM", a->value); | ||
| 291 | return 0; | ||
| 292 | } | ||
| 293 | |||
| 294 | /** | ||
| 295 | * eth_str2addr - convert string to Ethernet address | ||
| 296 | */ | ||
| 297 | |||
| 298 | static int eth_str2addr(struct tipc_media_addr *a, char *str_buf) | ||
| 299 | { | ||
| 300 | char mac[ETH_ALEN]; | ||
| 301 | int r; | ||
| 302 | |||
| 303 | r = sscanf(str_buf, "%02x:%02x:%02x:%02x:%02x:%02x", | ||
| 304 | (u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], | ||
| 305 | (u32 *)&mac[3], (u32 *)&mac[4], (u32 *)&mac[5]); | ||
| 306 | |||
| 307 | if (r != ETH_ALEN) | ||
| 308 | return 1; | ||
| 309 | |||
| 310 | eth_media_addr_set(a, mac); | ||
| 311 | return 0; | ||
| 312 | } | ||
| 313 | |||
| 314 | /** | ||
| 315 | * eth_str2addr - convert Ethernet address format to message header format | ||
| 316 | */ | ||
| 317 | |||
| 318 | static int eth_addr2msg(struct tipc_media_addr *a, char *msg_area) | ||
| 250 | { | 319 | { |
| 251 | unchar *addr = (unchar *)&a->dev_addr; | 320 | memset(msg_area, 0, TIPC_MEDIA_ADDR_SIZE); |
| 321 | msg_area[TIPC_MEDIA_TYPE_OFFSET] = TIPC_MEDIA_TYPE_ETH; | ||
| 322 | memcpy(msg_area + ETH_ADDR_OFFSET, a->value, ETH_ALEN); | ||
| 323 | return 0; | ||
| 324 | } | ||
| 252 | 325 | ||
| 253 | if (str_size < 18) | 326 | /** |
| 254 | *str_buf = '\0'; | 327 | * eth_str2addr - convert message header address format to Ethernet format |
| 255 | else | 328 | */ |
| 256 | sprintf(str_buf, "%pM", addr); | 329 | |
| 257 | return str_buf; | 330 | static int eth_msg2addr(struct tipc_media_addr *a, char *msg_area) |
| 331 | { | ||
| 332 | if (msg_area[TIPC_MEDIA_TYPE_OFFSET] != TIPC_MEDIA_TYPE_ETH) | ||
| 333 | return 1; | ||
| 334 | |||
| 335 | eth_media_addr_set(a, msg_area + ETH_ADDR_OFFSET); | ||
| 336 | return 0; | ||
| 258 | } | 337 | } |
| 259 | 338 | ||
| 339 | /* | ||
| 340 | * Ethernet media registration info | ||
| 341 | */ | ||
| 342 | |||
| 343 | static struct tipc_media eth_media_info = { | ||
| 344 | .send_msg = send_msg, | ||
| 345 | .enable_bearer = enable_bearer, | ||
| 346 | .disable_bearer = disable_bearer, | ||
| 347 | .addr2str = eth_addr2str, | ||
| 348 | .str2addr = eth_str2addr, | ||
| 349 | .addr2msg = eth_addr2msg, | ||
| 350 | .msg2addr = eth_msg2addr, | ||
| 351 | .bcast_addr = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, | ||
| 352 | TIPC_MEDIA_TYPE_ETH, 1 }, | ||
| 353 | .priority = TIPC_DEF_LINK_PRI, | ||
| 354 | .tolerance = TIPC_DEF_LINK_TOL, | ||
| 355 | .window = TIPC_DEF_LINK_WIN, | ||
| 356 | .type_id = TIPC_MEDIA_TYPE_ETH, | ||
| 357 | .name = "eth" | ||
| 358 | }; | ||
| 359 | |||
| 260 | /** | 360 | /** |
| 261 | * tipc_eth_media_start - activate Ethernet bearer support | 361 | * tipc_eth_media_start - activate Ethernet bearer support |
| 262 | * | 362 | * |
| @@ -266,21 +366,12 @@ static char *eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size | |||
| 266 | 366 | ||
| 267 | int tipc_eth_media_start(void) | 367 | int tipc_eth_media_start(void) |
| 268 | { | 368 | { |
| 269 | struct tipc_media_addr bcast_addr; | ||
| 270 | int res; | 369 | int res; |
| 271 | 370 | ||
| 272 | if (eth_started) | 371 | if (eth_started) |
| 273 | return -EINVAL; | 372 | return -EINVAL; |
| 274 | 373 | ||
| 275 | bcast_addr.type = htonl(TIPC_MEDIA_TYPE_ETH); | 374 | res = tipc_register_media(ð_media_info); |
| 276 | memset(&bcast_addr.dev_addr, 0xff, ETH_ALEN); | ||
| 277 | |||
| 278 | memset(eth_bearers, 0, sizeof(eth_bearers)); | ||
| 279 | |||
| 280 | res = tipc_register_media(TIPC_MEDIA_TYPE_ETH, "eth", | ||
| 281 | enable_bearer, disable_bearer, send_msg, | ||
| 282 | eth_addr2str, &bcast_addr, ETH_LINK_PRIORITY, | ||
| 283 | ETH_LINK_TOLERANCE, ETH_LINK_WINDOW); | ||
| 284 | if (res) | 375 | if (res) |
| 285 | return res; | 376 | return res; |
| 286 | 377 | ||
| @@ -298,22 +389,10 @@ int tipc_eth_media_start(void) | |||
| 298 | 389 | ||
| 299 | void tipc_eth_media_stop(void) | 390 | void tipc_eth_media_stop(void) |
| 300 | { | 391 | { |
| 301 | int i; | ||
| 302 | |||
| 303 | if (!eth_started) | 392 | if (!eth_started) |
| 304 | return; | 393 | return; |
| 305 | 394 | ||
| 395 | flush_scheduled_work(); | ||
| 306 | unregister_netdevice_notifier(¬ifier); | 396 | unregister_netdevice_notifier(¬ifier); |
| 307 | for (i = 0; i < MAX_ETH_BEARERS ; i++) { | ||
| 308 | if (eth_bearers[i].bearer) { | ||
| 309 | eth_bearers[i].bearer->blocked = 1; | ||
| 310 | eth_bearers[i].bearer = NULL; | ||
| 311 | } | ||
| 312 | if (eth_bearers[i].dev) { | ||
| 313 | dev_remove_pack(ð_bearers[i].tipc_packet_type); | ||
| 314 | dev_put(eth_bearers[i].dev); | ||
| 315 | } | ||
| 316 | } | ||
| 317 | memset(ð_bearers, 0, sizeof(eth_bearers)); | ||
| 318 | eth_started = 0; | 397 | eth_started = 0; |
| 319 | } | 398 | } |
diff --git a/net/tipc/link.c b/net/tipc/link.c index ae98a72da11a..ac1832a66f8a 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
| @@ -71,35 +71,36 @@ | |||
| 71 | #define START_CHANGEOVER 100000u | 71 | #define START_CHANGEOVER 100000u |
| 72 | 72 | ||
| 73 | /** | 73 | /** |
| 74 | * struct link_name - deconstructed link name | 74 | * struct tipc_link_name - deconstructed link name |
| 75 | * @addr_local: network address of node at this end | 75 | * @addr_local: network address of node at this end |
| 76 | * @if_local: name of interface at this end | 76 | * @if_local: name of interface at this end |
| 77 | * @addr_peer: network address of node at far end | 77 | * @addr_peer: network address of node at far end |
| 78 | * @if_peer: name of interface at far end | 78 | * @if_peer: name of interface at far end |
| 79 | */ | 79 | */ |
| 80 | 80 | ||
| 81 | struct link_name { | 81 | struct tipc_link_name { |
| 82 | u32 addr_local; | 82 | u32 addr_local; |
| 83 | char if_local[TIPC_MAX_IF_NAME]; | 83 | char if_local[TIPC_MAX_IF_NAME]; |
| 84 | u32 addr_peer; | 84 | u32 addr_peer; |
| 85 | char if_peer[TIPC_MAX_IF_NAME]; | 85 | char if_peer[TIPC_MAX_IF_NAME]; |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| 88 | static void link_handle_out_of_seq_msg(struct link *l_ptr, | 88 | static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr, |
| 89 | struct sk_buff *buf); | 89 | struct sk_buff *buf); |
| 90 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); | 90 | static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf); |
| 91 | static int link_recv_changeover_msg(struct link **l_ptr, struct sk_buff **buf); | 91 | static int link_recv_changeover_msg(struct tipc_link **l_ptr, |
| 92 | static void link_set_supervision_props(struct link *l_ptr, u32 tolerance); | 92 | struct sk_buff **buf); |
| 93 | static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tolerance); | ||
| 93 | static int link_send_sections_long(struct tipc_port *sender, | 94 | static int link_send_sections_long(struct tipc_port *sender, |
| 94 | struct iovec const *msg_sect, | 95 | struct iovec const *msg_sect, |
| 95 | u32 num_sect, unsigned int total_len, | 96 | u32 num_sect, unsigned int total_len, |
| 96 | u32 destnode); | 97 | u32 destnode); |
| 97 | static void link_check_defragm_bufs(struct link *l_ptr); | 98 | static void link_check_defragm_bufs(struct tipc_link *l_ptr); |
| 98 | static void link_state_event(struct link *l_ptr, u32 event); | 99 | static void link_state_event(struct tipc_link *l_ptr, u32 event); |
| 99 | static void link_reset_statistics(struct link *l_ptr); | 100 | static void link_reset_statistics(struct tipc_link *l_ptr); |
| 100 | static void link_print(struct link *l_ptr, const char *str); | 101 | static void link_print(struct tipc_link *l_ptr, const char *str); |
| 101 | static void link_start(struct link *l_ptr); | 102 | static void link_start(struct tipc_link *l_ptr); |
| 102 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf); | 103 | static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf); |
| 103 | 104 | ||
| 104 | /* | 105 | /* |
| 105 | * Simple link routines | 106 | * Simple link routines |
| @@ -110,7 +111,7 @@ static unsigned int align(unsigned int i) | |||
| 110 | return (i + 3) & ~3u; | 111 | return (i + 3) & ~3u; |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | static void link_init_max_pkt(struct link *l_ptr) | 114 | static void link_init_max_pkt(struct tipc_link *l_ptr) |
| 114 | { | 115 | { |
| 115 | u32 max_pkt; | 116 | u32 max_pkt; |
| 116 | 117 | ||
| @@ -127,14 +128,14 @@ static void link_init_max_pkt(struct link *l_ptr) | |||
| 127 | l_ptr->max_pkt_probes = 0; | 128 | l_ptr->max_pkt_probes = 0; |
| 128 | } | 129 | } |
| 129 | 130 | ||
| 130 | static u32 link_next_sent(struct link *l_ptr) | 131 | static u32 link_next_sent(struct tipc_link *l_ptr) |
| 131 | { | 132 | { |
| 132 | if (l_ptr->next_out) | 133 | if (l_ptr->next_out) |
| 133 | return msg_seqno(buf_msg(l_ptr->next_out)); | 134 | return buf_seqno(l_ptr->next_out); |
| 134 | return mod(l_ptr->next_out_no); | 135 | return mod(l_ptr->next_out_no); |
| 135 | } | 136 | } |
| 136 | 137 | ||
| 137 | static u32 link_last_sent(struct link *l_ptr) | 138 | static u32 link_last_sent(struct tipc_link *l_ptr) |
| 138 | { | 139 | { |
| 139 | return mod(link_next_sent(l_ptr) - 1); | 140 | return mod(link_next_sent(l_ptr) - 1); |
| 140 | } | 141 | } |
| @@ -143,28 +144,29 @@ static u32 link_last_sent(struct link *l_ptr) | |||
| 143 | * Simple non-static link routines (i.e. referenced outside this file) | 144 | * Simple non-static link routines (i.e. referenced outside this file) |
| 144 | */ | 145 | */ |
| 145 | 146 | ||
| 146 | int tipc_link_is_up(struct link *l_ptr) | 147 | int tipc_link_is_up(struct tipc_link *l_ptr) |
| 147 | { | 148 | { |
| 148 | if (!l_ptr) | 149 | if (!l_ptr) |
| 149 | return 0; | 150 | return 0; |
| 150 | return link_working_working(l_ptr) || link_working_unknown(l_ptr); | 151 | return link_working_working(l_ptr) || link_working_unknown(l_ptr); |
| 151 | } | 152 | } |
| 152 | 153 | ||
| 153 | int tipc_link_is_active(struct link *l_ptr) | 154 | int tipc_link_is_active(struct tipc_link *l_ptr) |
| 154 | { | 155 | { |
| 155 | return (l_ptr->owner->active_links[0] == l_ptr) || | 156 | return (l_ptr->owner->active_links[0] == l_ptr) || |
| 156 | (l_ptr->owner->active_links[1] == l_ptr); | 157 | (l_ptr->owner->active_links[1] == l_ptr); |
| 157 | } | 158 | } |
| 158 | 159 | ||
| 159 | /** | 160 | /** |
| 160 | * link_name_validate - validate & (optionally) deconstruct link name | 161 | * link_name_validate - validate & (optionally) deconstruct tipc_link name |
| 161 | * @name - ptr to link name string | 162 | * @name - ptr to link name string |
| 162 | * @name_parts - ptr to area for link name components (or NULL if not needed) | 163 | * @name_parts - ptr to area for link name components (or NULL if not needed) |
| 163 | * | 164 | * |
| 164 | * Returns 1 if link name is valid, otherwise 0. | 165 | * Returns 1 if link name is valid, otherwise 0. |
| 165 | */ | 166 | */ |
| 166 | 167 | ||
| 167 | static int link_name_validate(const char *name, struct link_name *name_parts) | 168 | static int link_name_validate(const char *name, |
| 169 | struct tipc_link_name *name_parts) | ||
| 168 | { | 170 | { |
| 169 | char name_copy[TIPC_MAX_LINK_NAME]; | 171 | char name_copy[TIPC_MAX_LINK_NAME]; |
| 170 | char *addr_local; | 172 | char *addr_local; |
| @@ -238,7 +240,7 @@ static int link_name_validate(const char *name, struct link_name *name_parts) | |||
| 238 | * tipc_node_delete() is called.) | 240 | * tipc_node_delete() is called.) |
| 239 | */ | 241 | */ |
| 240 | 242 | ||
| 241 | static void link_timeout(struct link *l_ptr) | 243 | static void link_timeout(struct tipc_link *l_ptr) |
| 242 | { | 244 | { |
| 243 | tipc_node_lock(l_ptr->owner); | 245 | tipc_node_lock(l_ptr->owner); |
| 244 | 246 | ||
| @@ -287,7 +289,7 @@ static void link_timeout(struct link *l_ptr) | |||
| 287 | tipc_node_unlock(l_ptr->owner); | 289 | tipc_node_unlock(l_ptr->owner); |
| 288 | } | 290 | } |
| 289 | 291 | ||
| 290 | static void link_set_timer(struct link *l_ptr, u32 time) | 292 | static void link_set_timer(struct tipc_link *l_ptr, u32 time) |
| 291 | { | 293 | { |
| 292 | k_start_timer(&l_ptr->timer, time); | 294 | k_start_timer(&l_ptr->timer, time); |
| 293 | } | 295 | } |
| @@ -301,11 +303,11 @@ static void link_set_timer(struct link *l_ptr, u32 time) | |||
| 301 | * Returns pointer to link. | 303 | * Returns pointer to link. |
| 302 | */ | 304 | */ |
| 303 | 305 | ||
| 304 | struct link *tipc_link_create(struct tipc_node *n_ptr, | 306 | struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, |
| 305 | struct tipc_bearer *b_ptr, | 307 | struct tipc_bearer *b_ptr, |
| 306 | const struct tipc_media_addr *media_addr) | 308 | const struct tipc_media_addr *media_addr) |
| 307 | { | 309 | { |
| 308 | struct link *l_ptr; | 310 | struct tipc_link *l_ptr; |
| 309 | struct tipc_msg *msg; | 311 | struct tipc_msg *msg; |
| 310 | char *if_name; | 312 | char *if_name; |
| 311 | char addr_string[16]; | 313 | char addr_string[16]; |
| @@ -343,7 +345,7 @@ struct link *tipc_link_create(struct tipc_node *n_ptr, | |||
| 343 | l_ptr->checkpoint = 1; | 345 | l_ptr->checkpoint = 1; |
| 344 | l_ptr->peer_session = INVALID_SESSION; | 346 | l_ptr->peer_session = INVALID_SESSION; |
| 345 | l_ptr->b_ptr = b_ptr; | 347 | l_ptr->b_ptr = b_ptr; |
| 346 | link_set_supervision_props(l_ptr, b_ptr->media->tolerance); | 348 | link_set_supervision_props(l_ptr, b_ptr->tolerance); |
| 347 | l_ptr->state = RESET_UNKNOWN; | 349 | l_ptr->state = RESET_UNKNOWN; |
| 348 | 350 | ||
| 349 | l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg; | 351 | l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg; |
| @@ -355,7 +357,7 @@ struct link *tipc_link_create(struct tipc_node *n_ptr, | |||
| 355 | strcpy((char *)msg_data(msg), if_name); | 357 | strcpy((char *)msg_data(msg), if_name); |
| 356 | 358 | ||
| 357 | l_ptr->priority = b_ptr->priority; | 359 | l_ptr->priority = b_ptr->priority; |
| 358 | tipc_link_set_queue_limits(l_ptr, b_ptr->media->window); | 360 | tipc_link_set_queue_limits(l_ptr, b_ptr->window); |
| 359 | 361 | ||
| 360 | link_init_max_pkt(l_ptr); | 362 | link_init_max_pkt(l_ptr); |
| 361 | 363 | ||
| @@ -382,7 +384,7 @@ struct link *tipc_link_create(struct tipc_node *n_ptr, | |||
| 382 | * to avoid a potential deadlock situation. | 384 | * to avoid a potential deadlock situation. |
| 383 | */ | 385 | */ |
| 384 | 386 | ||
| 385 | void tipc_link_delete(struct link *l_ptr) | 387 | void tipc_link_delete(struct tipc_link *l_ptr) |
| 386 | { | 388 | { |
| 387 | if (!l_ptr) { | 389 | if (!l_ptr) { |
| 388 | err("Attempt to delete non-existent link\n"); | 390 | err("Attempt to delete non-existent link\n"); |
| @@ -401,7 +403,7 @@ void tipc_link_delete(struct link *l_ptr) | |||
| 401 | kfree(l_ptr); | 403 | kfree(l_ptr); |
| 402 | } | 404 | } |
| 403 | 405 | ||
| 404 | static void link_start(struct link *l_ptr) | 406 | static void link_start(struct tipc_link *l_ptr) |
| 405 | { | 407 | { |
| 406 | tipc_node_lock(l_ptr->owner); | 408 | tipc_node_lock(l_ptr->owner); |
| 407 | link_state_event(l_ptr, STARTING_EVT); | 409 | link_state_event(l_ptr, STARTING_EVT); |
| @@ -418,7 +420,7 @@ static void link_start(struct link *l_ptr) | |||
| 418 | * has abated. | 420 | * has abated. |
| 419 | */ | 421 | */ |
| 420 | 422 | ||
| 421 | static int link_schedule_port(struct link *l_ptr, u32 origport, u32 sz) | 423 | static int link_schedule_port(struct tipc_link *l_ptr, u32 origport, u32 sz) |
| 422 | { | 424 | { |
| 423 | struct tipc_port *p_ptr; | 425 | struct tipc_port *p_ptr; |
| 424 | 426 | ||
| @@ -440,7 +442,7 @@ exit: | |||
| 440 | return -ELINKCONG; | 442 | return -ELINKCONG; |
| 441 | } | 443 | } |
| 442 | 444 | ||
| 443 | void tipc_link_wakeup_ports(struct link *l_ptr, int all) | 445 | void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all) |
| 444 | { | 446 | { |
| 445 | struct tipc_port *p_ptr; | 447 | struct tipc_port *p_ptr; |
| 446 | struct tipc_port *temp_p_ptr; | 448 | struct tipc_port *temp_p_ptr; |
| @@ -475,7 +477,7 @@ exit: | |||
| 475 | * @l_ptr: pointer to link | 477 | * @l_ptr: pointer to link |
| 476 | */ | 478 | */ |
| 477 | 479 | ||
| 478 | static void link_release_outqueue(struct link *l_ptr) | 480 | static void link_release_outqueue(struct tipc_link *l_ptr) |
| 479 | { | 481 | { |
| 480 | struct sk_buff *buf = l_ptr->first_out; | 482 | struct sk_buff *buf = l_ptr->first_out; |
| 481 | struct sk_buff *next; | 483 | struct sk_buff *next; |
| @@ -494,7 +496,7 @@ static void link_release_outqueue(struct link *l_ptr) | |||
| 494 | * @l_ptr: pointer to link | 496 | * @l_ptr: pointer to link |
| 495 | */ | 497 | */ |
| 496 | 498 | ||
| 497 | void tipc_link_reset_fragments(struct link *l_ptr) | 499 | void tipc_link_reset_fragments(struct tipc_link *l_ptr) |
| 498 | { | 500 | { |
| 499 | struct sk_buff *buf = l_ptr->defragm_buf; | 501 | struct sk_buff *buf = l_ptr->defragm_buf; |
| 500 | struct sk_buff *next; | 502 | struct sk_buff *next; |
| @@ -512,7 +514,7 @@ void tipc_link_reset_fragments(struct link *l_ptr) | |||
| 512 | * @l_ptr: pointer to link | 514 | * @l_ptr: pointer to link |
| 513 | */ | 515 | */ |
| 514 | 516 | ||
| 515 | void tipc_link_stop(struct link *l_ptr) | 517 | void tipc_link_stop(struct tipc_link *l_ptr) |
| 516 | { | 518 | { |
| 517 | struct sk_buff *buf; | 519 | struct sk_buff *buf; |
| 518 | struct sk_buff *next; | 520 | struct sk_buff *next; |
| @@ -537,7 +539,7 @@ void tipc_link_stop(struct link *l_ptr) | |||
| 537 | l_ptr->proto_msg_queue = NULL; | 539 | l_ptr->proto_msg_queue = NULL; |
| 538 | } | 540 | } |
| 539 | 541 | ||
| 540 | void tipc_link_reset(struct link *l_ptr) | 542 | void tipc_link_reset(struct tipc_link *l_ptr) |
| 541 | { | 543 | { |
| 542 | struct sk_buff *buf; | 544 | struct sk_buff *buf; |
| 543 | u32 prev_state = l_ptr->state; | 545 | u32 prev_state = l_ptr->state; |
| @@ -597,7 +599,7 @@ void tipc_link_reset(struct link *l_ptr) | |||
| 597 | } | 599 | } |
| 598 | 600 | ||
| 599 | 601 | ||
| 600 | static void link_activate(struct link *l_ptr) | 602 | static void link_activate(struct tipc_link *l_ptr) |
| 601 | { | 603 | { |
| 602 | l_ptr->next_in_no = l_ptr->stats.recv_info = 1; | 604 | l_ptr->next_in_no = l_ptr->stats.recv_info = 1; |
| 603 | tipc_node_link_up(l_ptr->owner, l_ptr); | 605 | tipc_node_link_up(l_ptr->owner, l_ptr); |
| @@ -610,9 +612,9 @@ static void link_activate(struct link *l_ptr) | |||
| 610 | * @event: state machine event to process | 612 | * @event: state machine event to process |
| 611 | */ | 613 | */ |
| 612 | 614 | ||
| 613 | static void link_state_event(struct link *l_ptr, unsigned event) | 615 | static void link_state_event(struct tipc_link *l_ptr, unsigned event) |
| 614 | { | 616 | { |
| 615 | struct link *other; | 617 | struct tipc_link *other; |
| 616 | u32 cont_intv = l_ptr->continuity_interval; | 618 | u32 cont_intv = l_ptr->continuity_interval; |
| 617 | 619 | ||
| 618 | if (!l_ptr->started && (event != STARTING_EVT)) | 620 | if (!l_ptr->started && (event != STARTING_EVT)) |
| @@ -784,7 +786,7 @@ static void link_state_event(struct link *l_ptr, unsigned event) | |||
| 784 | * the tail of an existing one. | 786 | * the tail of an existing one. |
| 785 | */ | 787 | */ |
| 786 | 788 | ||
| 787 | static int link_bundle_buf(struct link *l_ptr, | 789 | static int link_bundle_buf(struct tipc_link *l_ptr, |
| 788 | struct sk_buff *bundler, | 790 | struct sk_buff *bundler, |
| 789 | struct sk_buff *buf) | 791 | struct sk_buff *buf) |
| 790 | { | 792 | { |
| @@ -813,7 +815,7 @@ static int link_bundle_buf(struct link *l_ptr, | |||
| 813 | return 1; | 815 | return 1; |
| 814 | } | 816 | } |
| 815 | 817 | ||
| 816 | static void link_add_to_outqueue(struct link *l_ptr, | 818 | static void link_add_to_outqueue(struct tipc_link *l_ptr, |
| 817 | struct sk_buff *buf, | 819 | struct sk_buff *buf, |
| 818 | struct tipc_msg *msg) | 820 | struct tipc_msg *msg) |
| 819 | { | 821 | { |
| @@ -834,7 +836,7 @@ static void link_add_to_outqueue(struct link *l_ptr, | |||
| 834 | l_ptr->stats.max_queue_sz = l_ptr->out_queue_size; | 836 | l_ptr->stats.max_queue_sz = l_ptr->out_queue_size; |
| 835 | } | 837 | } |
| 836 | 838 | ||
| 837 | static void link_add_chain_to_outqueue(struct link *l_ptr, | 839 | static void link_add_chain_to_outqueue(struct tipc_link *l_ptr, |
| 838 | struct sk_buff *buf_chain, | 840 | struct sk_buff *buf_chain, |
| 839 | u32 long_msgno) | 841 | u32 long_msgno) |
| 840 | { | 842 | { |
| @@ -859,7 +861,7 @@ static void link_add_chain_to_outqueue(struct link *l_ptr, | |||
| 859 | * has failed, and from link_send() | 861 | * has failed, and from link_send() |
| 860 | */ | 862 | */ |
| 861 | 863 | ||
| 862 | int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | 864 | int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf) |
| 863 | { | 865 | { |
| 864 | struct tipc_msg *msg = buf_msg(buf); | 866 | struct tipc_msg *msg = buf_msg(buf); |
| 865 | u32 size = msg_size(msg); | 867 | u32 size = msg_size(msg); |
| @@ -954,7 +956,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) | |||
| 954 | 956 | ||
| 955 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) | 957 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) |
| 956 | { | 958 | { |
| 957 | struct link *l_ptr; | 959 | struct tipc_link *l_ptr; |
| 958 | struct tipc_node *n_ptr; | 960 | struct tipc_node *n_ptr; |
| 959 | int res = -ELINKCONG; | 961 | int res = -ELINKCONG; |
| 960 | 962 | ||
| @@ -988,7 +990,7 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) | |||
| 988 | void tipc_link_send_names(struct list_head *message_list, u32 dest) | 990 | void tipc_link_send_names(struct list_head *message_list, u32 dest) |
| 989 | { | 991 | { |
| 990 | struct tipc_node *n_ptr; | 992 | struct tipc_node *n_ptr; |
| 991 | struct link *l_ptr; | 993 | struct tipc_link *l_ptr; |
| 992 | struct sk_buff *buf; | 994 | struct sk_buff *buf; |
| 993 | struct sk_buff *temp_buf; | 995 | struct sk_buff *temp_buf; |
| 994 | 996 | ||
| @@ -1027,7 +1029,7 @@ void tipc_link_send_names(struct list_head *message_list, u32 dest) | |||
| 1027 | * Link is locked. Returns user data length. | 1029 | * Link is locked. Returns user data length. |
| 1028 | */ | 1030 | */ |
| 1029 | 1031 | ||
| 1030 | static int link_send_buf_fast(struct link *l_ptr, struct sk_buff *buf, | 1032 | static int link_send_buf_fast(struct tipc_link *l_ptr, struct sk_buff *buf, |
| 1031 | u32 *used_max_pkt) | 1033 | u32 *used_max_pkt) |
| 1032 | { | 1034 | { |
| 1033 | struct tipc_msg *msg = buf_msg(buf); | 1035 | struct tipc_msg *msg = buf_msg(buf); |
| @@ -1061,7 +1063,7 @@ static int link_send_buf_fast(struct link *l_ptr, struct sk_buff *buf, | |||
| 1061 | */ | 1063 | */ |
| 1062 | int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) | 1064 | int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) |
| 1063 | { | 1065 | { |
| 1064 | struct link *l_ptr; | 1066 | struct tipc_link *l_ptr; |
| 1065 | struct tipc_node *n_ptr; | 1067 | struct tipc_node *n_ptr; |
| 1066 | int res; | 1068 | int res; |
| 1067 | u32 selector = msg_origport(buf_msg(buf)) & 1; | 1069 | u32 selector = msg_origport(buf_msg(buf)) & 1; |
| @@ -1100,7 +1102,7 @@ int tipc_link_send_sections_fast(struct tipc_port *sender, | |||
| 1100 | u32 destaddr) | 1102 | u32 destaddr) |
| 1101 | { | 1103 | { |
| 1102 | struct tipc_msg *hdr = &sender->phdr; | 1104 | struct tipc_msg *hdr = &sender->phdr; |
| 1103 | struct link *l_ptr; | 1105 | struct tipc_link *l_ptr; |
| 1104 | struct sk_buff *buf; | 1106 | struct sk_buff *buf; |
| 1105 | struct tipc_node *node; | 1107 | struct tipc_node *node; |
| 1106 | int res; | 1108 | int res; |
| @@ -1195,7 +1197,7 @@ static int link_send_sections_long(struct tipc_port *sender, | |||
| 1195 | unsigned int total_len, | 1197 | unsigned int total_len, |
| 1196 | u32 destaddr) | 1198 | u32 destaddr) |
| 1197 | { | 1199 | { |
| 1198 | struct link *l_ptr; | 1200 | struct tipc_link *l_ptr; |
| 1199 | struct tipc_node *node; | 1201 | struct tipc_node *node; |
| 1200 | struct tipc_msg *hdr = &sender->phdr; | 1202 | struct tipc_msg *hdr = &sender->phdr; |
| 1201 | u32 dsz = total_len; | 1203 | u32 dsz = total_len; |
| @@ -1342,7 +1344,7 @@ reject: | |||
| 1342 | /* | 1344 | /* |
| 1343 | * tipc_link_push_packet: Push one unsent packet to the media | 1345 | * tipc_link_push_packet: Push one unsent packet to the media |
| 1344 | */ | 1346 | */ |
| 1345 | u32 tipc_link_push_packet(struct link *l_ptr) | 1347 | u32 tipc_link_push_packet(struct tipc_link *l_ptr) |
| 1346 | { | 1348 | { |
| 1347 | struct sk_buff *buf = l_ptr->first_out; | 1349 | struct sk_buff *buf = l_ptr->first_out; |
| 1348 | u32 r_q_size = l_ptr->retransm_queue_size; | 1350 | u32 r_q_size = l_ptr->retransm_queue_size; |
| @@ -1354,7 +1356,7 @@ u32 tipc_link_push_packet(struct link *l_ptr) | |||
| 1354 | if (r_q_size && buf) { | 1356 | if (r_q_size && buf) { |
| 1355 | u32 last = lesser(mod(r_q_head + r_q_size), | 1357 | u32 last = lesser(mod(r_q_head + r_q_size), |
| 1356 | link_last_sent(l_ptr)); | 1358 | link_last_sent(l_ptr)); |
| 1357 | u32 first = msg_seqno(buf_msg(buf)); | 1359 | u32 first = buf_seqno(buf); |
| 1358 | 1360 | ||
| 1359 | while (buf && less(first, r_q_head)) { | 1361 | while (buf && less(first, r_q_head)) { |
| 1360 | first = mod(first + 1); | 1362 | first = mod(first + 1); |
| @@ -1403,7 +1405,7 @@ u32 tipc_link_push_packet(struct link *l_ptr) | |||
| 1403 | if (buf) { | 1405 | if (buf) { |
| 1404 | struct tipc_msg *msg = buf_msg(buf); | 1406 | struct tipc_msg *msg = buf_msg(buf); |
| 1405 | u32 next = msg_seqno(msg); | 1407 | u32 next = msg_seqno(msg); |
| 1406 | u32 first = msg_seqno(buf_msg(l_ptr->first_out)); | 1408 | u32 first = buf_seqno(l_ptr->first_out); |
| 1407 | 1409 | ||
| 1408 | if (mod(next - first) < l_ptr->queue_limit[0]) { | 1410 | if (mod(next - first) < l_ptr->queue_limit[0]) { |
| 1409 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); | 1411 | msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); |
| @@ -1426,7 +1428,7 @@ u32 tipc_link_push_packet(struct link *l_ptr) | |||
| 1426 | * push_queue(): push out the unsent messages of a link where | 1428 | * push_queue(): push out the unsent messages of a link where |
| 1427 | * congestion has abated. Node is locked | 1429 | * congestion has abated. Node is locked |
| 1428 | */ | 1430 | */ |
| 1429 | void tipc_link_push_queue(struct link *l_ptr) | 1431 | void tipc_link_push_queue(struct tipc_link *l_ptr) |
| 1430 | { | 1432 | { |
| 1431 | u32 res; | 1433 | u32 res; |
| 1432 | 1434 | ||
| @@ -1470,7 +1472,8 @@ static void link_reset_all(unsigned long addr) | |||
| 1470 | read_unlock_bh(&tipc_net_lock); | 1472 | read_unlock_bh(&tipc_net_lock); |
| 1471 | } | 1473 | } |
| 1472 | 1474 | ||
| 1473 | static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf) | 1475 | static void link_retransmit_failure(struct tipc_link *l_ptr, |
| 1476 | struct sk_buff *buf) | ||
| 1474 | { | 1477 | { |
| 1475 | struct tipc_msg *msg = buf_msg(buf); | 1478 | struct tipc_msg *msg = buf_msg(buf); |
| 1476 | 1479 | ||
| @@ -1514,7 +1517,7 @@ static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf) | |||
| 1514 | } | 1517 | } |
| 1515 | } | 1518 | } |
| 1516 | 1519 | ||
| 1517 | void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, | 1520 | void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *buf, |
| 1518 | u32 retransmits) | 1521 | u32 retransmits) |
| 1519 | { | 1522 | { |
| 1520 | struct tipc_msg *msg; | 1523 | struct tipc_msg *msg; |
| @@ -1558,7 +1561,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, | |||
| 1558 | } else { | 1561 | } else { |
| 1559 | tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); | 1562 | tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); |
| 1560 | l_ptr->stats.bearer_congs++; | 1563 | l_ptr->stats.bearer_congs++; |
| 1561 | l_ptr->retransm_queue_head = msg_seqno(buf_msg(buf)); | 1564 | l_ptr->retransm_queue_head = buf_seqno(buf); |
| 1562 | l_ptr->retransm_queue_size = retransmits; | 1565 | l_ptr->retransm_queue_size = retransmits; |
| 1563 | return; | 1566 | return; |
| 1564 | } | 1567 | } |
| @@ -1571,7 +1574,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, | |||
| 1571 | * link_insert_deferred_queue - insert deferred messages back into receive chain | 1574 | * link_insert_deferred_queue - insert deferred messages back into receive chain |
| 1572 | */ | 1575 | */ |
| 1573 | 1576 | ||
| 1574 | static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr, | 1577 | static struct sk_buff *link_insert_deferred_queue(struct tipc_link *l_ptr, |
| 1575 | struct sk_buff *buf) | 1578 | struct sk_buff *buf) |
| 1576 | { | 1579 | { |
| 1577 | u32 seq_no; | 1580 | u32 seq_no; |
| @@ -1579,7 +1582,7 @@ static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr, | |||
| 1579 | if (l_ptr->oldest_deferred_in == NULL) | 1582 | if (l_ptr->oldest_deferred_in == NULL) |
| 1580 | return buf; | 1583 | return buf; |
| 1581 | 1584 | ||
| 1582 | seq_no = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); | 1585 | seq_no = buf_seqno(l_ptr->oldest_deferred_in); |
| 1583 | if (seq_no == mod(l_ptr->next_in_no)) { | 1586 | if (seq_no == mod(l_ptr->next_in_no)) { |
| 1584 | l_ptr->newest_deferred_in->next = buf; | 1587 | l_ptr->newest_deferred_in->next = buf; |
| 1585 | buf = l_ptr->oldest_deferred_in; | 1588 | buf = l_ptr->oldest_deferred_in; |
| @@ -1653,7 +1656,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr) | |||
| 1653 | read_lock_bh(&tipc_net_lock); | 1656 | read_lock_bh(&tipc_net_lock); |
| 1654 | while (head) { | 1657 | while (head) { |
| 1655 | struct tipc_node *n_ptr; | 1658 | struct tipc_node *n_ptr; |
| 1656 | struct link *l_ptr; | 1659 | struct tipc_link *l_ptr; |
| 1657 | struct sk_buff *crs; | 1660 | struct sk_buff *crs; |
| 1658 | struct sk_buff *buf = head; | 1661 | struct sk_buff *buf = head; |
| 1659 | struct tipc_msg *msg; | 1662 | struct tipc_msg *msg; |
| @@ -1733,14 +1736,12 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *b_ptr) | |||
| 1733 | 1736 | ||
| 1734 | /* Release acked messages */ | 1737 | /* Release acked messages */ |
| 1735 | 1738 | ||
| 1736 | if (less(n_ptr->bclink.acked, msg_bcast_ack(msg))) { | 1739 | if (tipc_node_is_up(n_ptr) && n_ptr->bclink.supported) |
| 1737 | if (tipc_node_is_up(n_ptr) && n_ptr->bclink.supported) | 1740 | tipc_bclink_acknowledge(n_ptr, msg_bcast_ack(msg)); |
| 1738 | tipc_bclink_acknowledge(n_ptr, msg_bcast_ack(msg)); | ||
| 1739 | } | ||
| 1740 | 1741 | ||
| 1741 | crs = l_ptr->first_out; | 1742 | crs = l_ptr->first_out; |
| 1742 | while ((crs != l_ptr->next_out) && | 1743 | while ((crs != l_ptr->next_out) && |
| 1743 | less_eq(msg_seqno(buf_msg(crs)), ackd)) { | 1744 | less_eq(buf_seqno(crs), ackd)) { |
| 1744 | struct sk_buff *next = crs->next; | 1745 | struct sk_buff *next = crs->next; |
| 1745 | 1746 | ||
| 1746 | buf_discard(crs); | 1747 | buf_discard(crs); |
| @@ -1863,7 +1864,7 @@ u32 tipc_link_defer_pkt(struct sk_buff **head, | |||
| 1863 | { | 1864 | { |
| 1864 | struct sk_buff *prev = NULL; | 1865 | struct sk_buff *prev = NULL; |
| 1865 | struct sk_buff *crs = *head; | 1866 | struct sk_buff *crs = *head; |
| 1866 | u32 seq_no = msg_seqno(buf_msg(buf)); | 1867 | u32 seq_no = buf_seqno(buf); |
| 1867 | 1868 | ||
| 1868 | buf->next = NULL; | 1869 | buf->next = NULL; |
| 1869 | 1870 | ||
| @@ -1874,7 +1875,7 @@ u32 tipc_link_defer_pkt(struct sk_buff **head, | |||
| 1874 | } | 1875 | } |
| 1875 | 1876 | ||
| 1876 | /* Last ? */ | 1877 | /* Last ? */ |
| 1877 | if (less(msg_seqno(buf_msg(*tail)), seq_no)) { | 1878 | if (less(buf_seqno(*tail), seq_no)) { |
| 1878 | (*tail)->next = buf; | 1879 | (*tail)->next = buf; |
| 1879 | *tail = buf; | 1880 | *tail = buf; |
| 1880 | return 1; | 1881 | return 1; |
| @@ -1908,10 +1909,10 @@ u32 tipc_link_defer_pkt(struct sk_buff **head, | |||
| 1908 | * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet | 1909 | * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet |
| 1909 | */ | 1910 | */ |
| 1910 | 1911 | ||
| 1911 | static void link_handle_out_of_seq_msg(struct link *l_ptr, | 1912 | static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr, |
| 1912 | struct sk_buff *buf) | 1913 | struct sk_buff *buf) |
| 1913 | { | 1914 | { |
| 1914 | u32 seq_no = msg_seqno(buf_msg(buf)); | 1915 | u32 seq_no = buf_seqno(buf); |
| 1915 | 1916 | ||
| 1916 | if (likely(msg_user(buf_msg(buf)) == LINK_PROTOCOL)) { | 1917 | if (likely(msg_user(buf_msg(buf)) == LINK_PROTOCOL)) { |
| 1917 | link_recv_proto_msg(l_ptr, buf); | 1918 | link_recv_proto_msg(l_ptr, buf); |
| @@ -1946,8 +1947,9 @@ static void link_handle_out_of_seq_msg(struct link *l_ptr, | |||
| 1946 | /* | 1947 | /* |
| 1947 | * Send protocol message to the other endpoint. | 1948 | * Send protocol message to the other endpoint. |
| 1948 | */ | 1949 | */ |
| 1949 | void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | 1950 | void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ, |
| 1950 | u32 gap, u32 tolerance, u32 priority, u32 ack_mtu) | 1951 | int probe_msg, u32 gap, u32 tolerance, |
| 1952 | u32 priority, u32 ack_mtu) | ||
| 1951 | { | 1953 | { |
| 1952 | struct sk_buff *buf = NULL; | 1954 | struct sk_buff *buf = NULL; |
| 1953 | struct tipc_msg *msg = l_ptr->pmsg; | 1955 | struct tipc_msg *msg = l_ptr->pmsg; |
| @@ -1973,10 +1975,10 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
| 1973 | if (!tipc_link_is_up(l_ptr)) | 1975 | if (!tipc_link_is_up(l_ptr)) |
| 1974 | return; | 1976 | return; |
| 1975 | if (l_ptr->next_out) | 1977 | if (l_ptr->next_out) |
| 1976 | next_sent = msg_seqno(buf_msg(l_ptr->next_out)); | 1978 | next_sent = buf_seqno(l_ptr->next_out); |
| 1977 | msg_set_next_sent(msg, next_sent); | 1979 | msg_set_next_sent(msg, next_sent); |
| 1978 | if (l_ptr->oldest_deferred_in) { | 1980 | if (l_ptr->oldest_deferred_in) { |
| 1979 | u32 rec = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); | 1981 | u32 rec = buf_seqno(l_ptr->oldest_deferred_in); |
| 1980 | gap = mod(rec - mod(l_ptr->next_in_no)); | 1982 | gap = mod(rec - mod(l_ptr->next_in_no)); |
| 1981 | } | 1983 | } |
| 1982 | msg_set_seq_gap(msg, gap); | 1984 | msg_set_seq_gap(msg, gap); |
| @@ -2064,7 +2066,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, | |||
| 2064 | * change at any time. The node with lowest address rules | 2066 | * change at any time. The node with lowest address rules |
| 2065 | */ | 2067 | */ |
| 2066 | 2068 | ||
| 2067 | static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf) | 2069 | static void link_recv_proto_msg(struct tipc_link *l_ptr, struct sk_buff *buf) |
| 2068 | { | 2070 | { |
| 2069 | u32 rec_gap = 0; | 2071 | u32 rec_gap = 0; |
| 2070 | u32 max_pkt_info; | 2072 | u32 max_pkt_info; |
| @@ -2197,12 +2199,12 @@ exit: | |||
| 2197 | * tipc_link_tunnel(): Send one message via a link belonging to | 2199 | * tipc_link_tunnel(): Send one message via a link belonging to |
| 2198 | * another bearer. Owner node is locked. | 2200 | * another bearer. Owner node is locked. |
| 2199 | */ | 2201 | */ |
| 2200 | static void tipc_link_tunnel(struct link *l_ptr, | 2202 | static void tipc_link_tunnel(struct tipc_link *l_ptr, |
| 2201 | struct tipc_msg *tunnel_hdr, | 2203 | struct tipc_msg *tunnel_hdr, |
| 2202 | struct tipc_msg *msg, | 2204 | struct tipc_msg *msg, |
| 2203 | u32 selector) | 2205 | u32 selector) |
| 2204 | { | 2206 | { |
| 2205 | struct link *tunnel; | 2207 | struct tipc_link *tunnel; |
| 2206 | struct sk_buff *buf; | 2208 | struct sk_buff *buf; |
| 2207 | u32 length = msg_size(msg); | 2209 | u32 length = msg_size(msg); |
| 2208 | 2210 | ||
| @@ -2231,11 +2233,11 @@ static void tipc_link_tunnel(struct link *l_ptr, | |||
| 2231 | * Owner node is locked. | 2233 | * Owner node is locked. |
| 2232 | */ | 2234 | */ |
| 2233 | 2235 | ||
| 2234 | void tipc_link_changeover(struct link *l_ptr) | 2236 | void tipc_link_changeover(struct tipc_link *l_ptr) |
| 2235 | { | 2237 | { |
| 2236 | u32 msgcount = l_ptr->out_queue_size; | 2238 | u32 msgcount = l_ptr->out_queue_size; |
| 2237 | struct sk_buff *crs = l_ptr->first_out; | 2239 | struct sk_buff *crs = l_ptr->first_out; |
| 2238 | struct link *tunnel = l_ptr->owner->active_links[0]; | 2240 | struct tipc_link *tunnel = l_ptr->owner->active_links[0]; |
| 2239 | struct tipc_msg tunnel_hdr; | 2241 | struct tipc_msg tunnel_hdr; |
| 2240 | int split_bundles; | 2242 | int split_bundles; |
| 2241 | 2243 | ||
| @@ -2294,7 +2296,7 @@ void tipc_link_changeover(struct link *l_ptr) | |||
| 2294 | } | 2296 | } |
| 2295 | } | 2297 | } |
| 2296 | 2298 | ||
| 2297 | void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel) | 2299 | void tipc_link_send_duplicate(struct tipc_link *l_ptr, struct tipc_link *tunnel) |
| 2298 | { | 2300 | { |
| 2299 | struct sk_buff *iter; | 2301 | struct sk_buff *iter; |
| 2300 | struct tipc_msg tunnel_hdr; | 2302 | struct tipc_msg tunnel_hdr; |
| @@ -2358,11 +2360,11 @@ static struct sk_buff *buf_extract(struct sk_buff *skb, u32 from_pos) | |||
| 2358 | * via other link. Node is locked. Return extracted buffer. | 2360 | * via other link. Node is locked. Return extracted buffer. |
| 2359 | */ | 2361 | */ |
| 2360 | 2362 | ||
| 2361 | static int link_recv_changeover_msg(struct link **l_ptr, | 2363 | static int link_recv_changeover_msg(struct tipc_link **l_ptr, |
| 2362 | struct sk_buff **buf) | 2364 | struct sk_buff **buf) |
| 2363 | { | 2365 | { |
| 2364 | struct sk_buff *tunnel_buf = *buf; | 2366 | struct sk_buff *tunnel_buf = *buf; |
| 2365 | struct link *dest_link; | 2367 | struct tipc_link *dest_link; |
| 2366 | struct tipc_msg *msg; | 2368 | struct tipc_msg *msg; |
| 2367 | struct tipc_msg *tunnel_msg = buf_msg(tunnel_buf); | 2369 | struct tipc_msg *tunnel_msg = buf_msg(tunnel_buf); |
| 2368 | u32 msg_typ = msg_type(tunnel_msg); | 2370 | u32 msg_typ = msg_type(tunnel_msg); |
| @@ -2462,7 +2464,7 @@ void tipc_link_recv_bundle(struct sk_buff *buf) | |||
| 2462 | * The buffer is complete, inclusive total message length. | 2464 | * The buffer is complete, inclusive total message length. |
| 2463 | * Returns user data length. | 2465 | * Returns user data length. |
| 2464 | */ | 2466 | */ |
| 2465 | static int link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) | 2467 | static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf) |
| 2466 | { | 2468 | { |
| 2467 | struct sk_buff *buf_chain = NULL; | 2469 | struct sk_buff *buf_chain = NULL; |
| 2468 | struct sk_buff *buf_chain_tail = (struct sk_buff *)&buf_chain; | 2470 | struct sk_buff *buf_chain_tail = (struct sk_buff *)&buf_chain; |
| @@ -2591,7 +2593,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
| 2591 | 2593 | ||
| 2592 | /* Is there an incomplete message waiting for this fragment? */ | 2594 | /* Is there an incomplete message waiting for this fragment? */ |
| 2593 | 2595 | ||
| 2594 | while (pbuf && ((msg_seqno(buf_msg(pbuf)) != long_msg_seq_no) || | 2596 | while (pbuf && ((buf_seqno(pbuf) != long_msg_seq_no) || |
| 2595 | (msg_orignode(fragm) != msg_orignode(buf_msg(pbuf))))) { | 2597 | (msg_orignode(fragm) != msg_orignode(buf_msg(pbuf))))) { |
| 2596 | prev = pbuf; | 2598 | prev = pbuf; |
| 2597 | pbuf = pbuf->next; | 2599 | pbuf = pbuf->next; |
| @@ -2658,7 +2660,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, | |||
| 2658 | * @l_ptr: pointer to link | 2660 | * @l_ptr: pointer to link |
| 2659 | */ | 2661 | */ |
| 2660 | 2662 | ||
| 2661 | static void link_check_defragm_bufs(struct link *l_ptr) | 2663 | static void link_check_defragm_bufs(struct tipc_link *l_ptr) |
| 2662 | { | 2664 | { |
| 2663 | struct sk_buff *prev = NULL; | 2665 | struct sk_buff *prev = NULL; |
| 2664 | struct sk_buff *next = NULL; | 2666 | struct sk_buff *next = NULL; |
| @@ -2688,7 +2690,7 @@ static void link_check_defragm_bufs(struct link *l_ptr) | |||
| 2688 | 2690 | ||
| 2689 | 2691 | ||
| 2690 | 2692 | ||
| 2691 | static void link_set_supervision_props(struct link *l_ptr, u32 tolerance) | 2693 | static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tolerance) |
| 2692 | { | 2694 | { |
| 2693 | if ((tolerance < TIPC_MIN_LINK_TOL) || (tolerance > TIPC_MAX_LINK_TOL)) | 2695 | if ((tolerance < TIPC_MIN_LINK_TOL) || (tolerance > TIPC_MAX_LINK_TOL)) |
| 2694 | return; | 2696 | return; |
| @@ -2700,7 +2702,7 @@ static void link_set_supervision_props(struct link *l_ptr, u32 tolerance) | |||
| 2700 | } | 2702 | } |
| 2701 | 2703 | ||
| 2702 | 2704 | ||
| 2703 | void tipc_link_set_queue_limits(struct link *l_ptr, u32 window) | 2705 | void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window) |
| 2704 | { | 2706 | { |
| 2705 | /* Data messages from this node, inclusive FIRST_FRAGM */ | 2707 | /* Data messages from this node, inclusive FIRST_FRAGM */ |
| 2706 | l_ptr->queue_limit[TIPC_LOW_IMPORTANCE] = window; | 2708 | l_ptr->queue_limit[TIPC_LOW_IMPORTANCE] = window; |
| @@ -2730,11 +2732,12 @@ void tipc_link_set_queue_limits(struct link *l_ptr, u32 window) | |||
| 2730 | * Returns pointer to link (or 0 if invalid link name). | 2732 | * Returns pointer to link (or 0 if invalid link name). |
| 2731 | */ | 2733 | */ |
| 2732 | 2734 | ||
| 2733 | static struct link *link_find_link(const char *name, struct tipc_node **node) | 2735 | static struct tipc_link *link_find_link(const char *name, |
| 2736 | struct tipc_node **node) | ||
| 2734 | { | 2737 | { |
| 2735 | struct link_name link_name_parts; | 2738 | struct tipc_link_name link_name_parts; |
| 2736 | struct tipc_bearer *b_ptr; | 2739 | struct tipc_bearer *b_ptr; |
| 2737 | struct link *l_ptr; | 2740 | struct tipc_link *l_ptr; |
| 2738 | 2741 | ||
| 2739 | if (!link_name_validate(name, &link_name_parts)) | 2742 | if (!link_name_validate(name, &link_name_parts)) |
| 2740 | return NULL; | 2743 | return NULL; |
| @@ -2754,13 +2757,113 @@ static struct link *link_find_link(const char *name, struct tipc_node **node) | |||
| 2754 | return l_ptr; | 2757 | return l_ptr; |
| 2755 | } | 2758 | } |
| 2756 | 2759 | ||
| 2760 | /** | ||
| 2761 | * link_value_is_valid -- validate proposed link tolerance/priority/window | ||
| 2762 | * | ||
| 2763 | * @cmd - value type (TIPC_CMD_SET_LINK_*) | ||
| 2764 | * @new_value - the new value | ||
| 2765 | * | ||
| 2766 | * Returns 1 if value is within range, 0 if not. | ||
| 2767 | */ | ||
| 2768 | |||
| 2769 | static int link_value_is_valid(u16 cmd, u32 new_value) | ||
| 2770 | { | ||
| 2771 | switch (cmd) { | ||
| 2772 | case TIPC_CMD_SET_LINK_TOL: | ||
| 2773 | return (new_value >= TIPC_MIN_LINK_TOL) && | ||
| 2774 | (new_value <= TIPC_MAX_LINK_TOL); | ||
| 2775 | case TIPC_CMD_SET_LINK_PRI: | ||
| 2776 | return (new_value <= TIPC_MAX_LINK_PRI); | ||
| 2777 | case TIPC_CMD_SET_LINK_WINDOW: | ||
| 2778 | return (new_value >= TIPC_MIN_LINK_WIN) && | ||
| 2779 | (new_value <= TIPC_MAX_LINK_WIN); | ||
| 2780 | } | ||
| 2781 | return 0; | ||
| 2782 | } | ||
| 2783 | |||
| 2784 | |||
| 2785 | /** | ||
| 2786 | * link_cmd_set_value - change priority/tolerance/window for link/bearer/media | ||
| 2787 | * @name - ptr to link, bearer, or media name | ||
| 2788 | * @new_value - new value of link, bearer, or media setting | ||
| 2789 | * @cmd - which link, bearer, or media attribute to set (TIPC_CMD_SET_LINK_*) | ||
| 2790 | * | ||
| 2791 | * Caller must hold 'tipc_net_lock' to ensure link/bearer/media is not deleted. | ||
| 2792 | * | ||
| 2793 | * Returns 0 if value updated and negative value on error. | ||
| 2794 | */ | ||
| 2795 | |||
| 2796 | static int link_cmd_set_value(const char *name, u32 new_value, u16 cmd) | ||
| 2797 | { | ||
| 2798 | struct tipc_node *node; | ||
| 2799 | struct tipc_link *l_ptr; | ||
| 2800 | struct tipc_bearer *b_ptr; | ||
| 2801 | struct tipc_media *m_ptr; | ||
| 2802 | |||
| 2803 | l_ptr = link_find_link(name, &node); | ||
| 2804 | if (l_ptr) { | ||
| 2805 | /* | ||
| 2806 | * acquire node lock for tipc_link_send_proto_msg(). | ||
| 2807 | * see "TIPC locking policy" in net.c. | ||
| 2808 | */ | ||
| 2809 | tipc_node_lock(node); | ||
| 2810 | switch (cmd) { | ||
| 2811 | case TIPC_CMD_SET_LINK_TOL: | ||
| 2812 | link_set_supervision_props(l_ptr, new_value); | ||
| 2813 | tipc_link_send_proto_msg(l_ptr, | ||
| 2814 | STATE_MSG, 0, 0, new_value, 0, 0); | ||
| 2815 | break; | ||
| 2816 | case TIPC_CMD_SET_LINK_PRI: | ||
| 2817 | l_ptr->priority = new_value; | ||
| 2818 | tipc_link_send_proto_msg(l_ptr, | ||
| 2819 | STATE_MSG, 0, 0, 0, new_value, 0); | ||
| 2820 | break; | ||
| 2821 | case TIPC_CMD_SET_LINK_WINDOW: | ||
| 2822 | tipc_link_set_queue_limits(l_ptr, new_value); | ||
| 2823 | break; | ||
| 2824 | } | ||
| 2825 | tipc_node_unlock(node); | ||
| 2826 | return 0; | ||
| 2827 | } | ||
| 2828 | |||
| 2829 | b_ptr = tipc_bearer_find(name); | ||
| 2830 | if (b_ptr) { | ||
| 2831 | switch (cmd) { | ||
| 2832 | case TIPC_CMD_SET_LINK_TOL: | ||
| 2833 | b_ptr->tolerance = new_value; | ||
| 2834 | return 0; | ||
| 2835 | case TIPC_CMD_SET_LINK_PRI: | ||
| 2836 | b_ptr->priority = new_value; | ||
| 2837 | return 0; | ||
| 2838 | case TIPC_CMD_SET_LINK_WINDOW: | ||
| 2839 | b_ptr->window = new_value; | ||
| 2840 | return 0; | ||
| 2841 | } | ||
| 2842 | return -EINVAL; | ||
| 2843 | } | ||
| 2844 | |||
| 2845 | m_ptr = tipc_media_find(name); | ||
| 2846 | if (!m_ptr) | ||
| 2847 | return -ENODEV; | ||
| 2848 | switch (cmd) { | ||
| 2849 | case TIPC_CMD_SET_LINK_TOL: | ||
| 2850 | m_ptr->tolerance = new_value; | ||
| 2851 | return 0; | ||
| 2852 | case TIPC_CMD_SET_LINK_PRI: | ||
| 2853 | m_ptr->priority = new_value; | ||
| 2854 | return 0; | ||
| 2855 | case TIPC_CMD_SET_LINK_WINDOW: | ||
| 2856 | m_ptr->window = new_value; | ||
| 2857 | return 0; | ||
| 2858 | } | ||
| 2859 | return -EINVAL; | ||
| 2860 | } | ||
| 2861 | |||
| 2757 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, | 2862 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, |
| 2758 | u16 cmd) | 2863 | u16 cmd) |
| 2759 | { | 2864 | { |
| 2760 | struct tipc_link_config *args; | 2865 | struct tipc_link_config *args; |
| 2761 | u32 new_value; | 2866 | u32 new_value; |
| 2762 | struct link *l_ptr; | ||
| 2763 | struct tipc_node *node; | ||
| 2764 | int res; | 2867 | int res; |
| 2765 | 2868 | ||
| 2766 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG)) | 2869 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG)) |
| @@ -2769,6 +2872,10 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space | |||
| 2769 | args = (struct tipc_link_config *)TLV_DATA(req_tlv_area); | 2872 | args = (struct tipc_link_config *)TLV_DATA(req_tlv_area); |
| 2770 | new_value = ntohl(args->value); | 2873 | new_value = ntohl(args->value); |
| 2771 | 2874 | ||
| 2875 | if (!link_value_is_valid(cmd, new_value)) | ||
| 2876 | return tipc_cfg_reply_error_string( | ||
| 2877 | "cannot change, value invalid"); | ||
| 2878 | |||
| 2772 | if (!strcmp(args->name, tipc_bclink_name)) { | 2879 | if (!strcmp(args->name, tipc_bclink_name)) { |
| 2773 | if ((cmd == TIPC_CMD_SET_LINK_WINDOW) && | 2880 | if ((cmd == TIPC_CMD_SET_LINK_WINDOW) && |
| 2774 | (tipc_bclink_set_queue_limits(new_value) == 0)) | 2881 | (tipc_bclink_set_queue_limits(new_value) == 0)) |
| @@ -2778,43 +2885,7 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space | |||
| 2778 | } | 2885 | } |
| 2779 | 2886 | ||
| 2780 | read_lock_bh(&tipc_net_lock); | 2887 | read_lock_bh(&tipc_net_lock); |
| 2781 | l_ptr = link_find_link(args->name, &node); | 2888 | res = link_cmd_set_value(args->name, new_value, cmd); |
| 2782 | if (!l_ptr) { | ||
| 2783 | read_unlock_bh(&tipc_net_lock); | ||
| 2784 | return tipc_cfg_reply_error_string("link not found"); | ||
| 2785 | } | ||
| 2786 | |||
| 2787 | tipc_node_lock(node); | ||
| 2788 | res = -EINVAL; | ||
| 2789 | switch (cmd) { | ||
| 2790 | case TIPC_CMD_SET_LINK_TOL: | ||
| 2791 | if ((new_value >= TIPC_MIN_LINK_TOL) && | ||
| 2792 | (new_value <= TIPC_MAX_LINK_TOL)) { | ||
| 2793 | link_set_supervision_props(l_ptr, new_value); | ||
| 2794 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, | ||
| 2795 | 0, 0, new_value, 0, 0); | ||
| 2796 | res = 0; | ||
| 2797 | } | ||
| 2798 | break; | ||
| 2799 | case TIPC_CMD_SET_LINK_PRI: | ||
| 2800 | if ((new_value >= TIPC_MIN_LINK_PRI) && | ||
| 2801 | (new_value <= TIPC_MAX_LINK_PRI)) { | ||
| 2802 | l_ptr->priority = new_value; | ||
| 2803 | tipc_link_send_proto_msg(l_ptr, STATE_MSG, | ||
| 2804 | 0, 0, 0, new_value, 0); | ||
| 2805 | res = 0; | ||
| 2806 | } | ||
| 2807 | break; | ||
| 2808 | case TIPC_CMD_SET_LINK_WINDOW: | ||
| 2809 | if ((new_value >= TIPC_MIN_LINK_WIN) && | ||
| 2810 | (new_value <= TIPC_MAX_LINK_WIN)) { | ||
| 2811 | tipc_link_set_queue_limits(l_ptr, new_value); | ||
| 2812 | res = 0; | ||
| 2813 | } | ||
| 2814 | break; | ||
| 2815 | } | ||
| 2816 | tipc_node_unlock(node); | ||
| 2817 | |||
| 2818 | read_unlock_bh(&tipc_net_lock); | 2889 | read_unlock_bh(&tipc_net_lock); |
| 2819 | if (res) | 2890 | if (res) |
| 2820 | return tipc_cfg_reply_error_string("cannot change link setting"); | 2891 | return tipc_cfg_reply_error_string("cannot change link setting"); |
| @@ -2827,7 +2898,7 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space | |||
| 2827 | * @l_ptr: pointer to link | 2898 | * @l_ptr: pointer to link |
| 2828 | */ | 2899 | */ |
| 2829 | 2900 | ||
| 2830 | static void link_reset_statistics(struct link *l_ptr) | 2901 | static void link_reset_statistics(struct tipc_link *l_ptr) |
| 2831 | { | 2902 | { |
| 2832 | memset(&l_ptr->stats, 0, sizeof(l_ptr->stats)); | 2903 | memset(&l_ptr->stats, 0, sizeof(l_ptr->stats)); |
| 2833 | l_ptr->stats.sent_info = l_ptr->next_out_no; | 2904 | l_ptr->stats.sent_info = l_ptr->next_out_no; |
| @@ -2837,7 +2908,7 @@ static void link_reset_statistics(struct link *l_ptr) | |||
| 2837 | struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space) | 2908 | struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space) |
| 2838 | { | 2909 | { |
| 2839 | char *link_name; | 2910 | char *link_name; |
| 2840 | struct link *l_ptr; | 2911 | struct tipc_link *l_ptr; |
| 2841 | struct tipc_node *node; | 2912 | struct tipc_node *node; |
| 2842 | 2913 | ||
| 2843 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) | 2914 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) |
| @@ -2885,7 +2956,7 @@ static u32 percent(u32 count, u32 total) | |||
| 2885 | static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) | 2956 | static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) |
| 2886 | { | 2957 | { |
| 2887 | struct print_buf pb; | 2958 | struct print_buf pb; |
| 2888 | struct link *l_ptr; | 2959 | struct tipc_link *l_ptr; |
| 2889 | struct tipc_node *node; | 2960 | struct tipc_node *node; |
| 2890 | char *status; | 2961 | char *status; |
| 2891 | u32 profile_total = 0; | 2962 | u32 profile_total = 0; |
| @@ -3007,7 +3078,7 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s | |||
| 3007 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | 3078 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector) |
| 3008 | { | 3079 | { |
| 3009 | struct tipc_node *n_ptr; | 3080 | struct tipc_node *n_ptr; |
| 3010 | struct link *l_ptr; | 3081 | struct tipc_link *l_ptr; |
| 3011 | u32 res = MAX_PKT_DEFAULT; | 3082 | u32 res = MAX_PKT_DEFAULT; |
| 3012 | 3083 | ||
| 3013 | if (dest == tipc_own_addr) | 3084 | if (dest == tipc_own_addr) |
| @@ -3026,7 +3097,7 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector) | |||
| 3026 | return res; | 3097 | return res; |
| 3027 | } | 3098 | } |
| 3028 | 3099 | ||
| 3029 | static void link_print(struct link *l_ptr, const char *str) | 3100 | static void link_print(struct tipc_link *l_ptr, const char *str) |
| 3030 | { | 3101 | { |
| 3031 | char print_area[256]; | 3102 | char print_area[256]; |
| 3032 | struct print_buf pb; | 3103 | struct print_buf pb; |
| @@ -3046,13 +3117,12 @@ static void link_print(struct link *l_ptr, const char *str) | |||
| 3046 | tipc_printf(buf, "NXI(%u):", mod(l_ptr->next_in_no)); | 3117 | tipc_printf(buf, "NXI(%u):", mod(l_ptr->next_in_no)); |
| 3047 | tipc_printf(buf, "SQUE"); | 3118 | tipc_printf(buf, "SQUE"); |
| 3048 | if (l_ptr->first_out) { | 3119 | if (l_ptr->first_out) { |
| 3049 | tipc_printf(buf, "[%u..", msg_seqno(buf_msg(l_ptr->first_out))); | 3120 | tipc_printf(buf, "[%u..", buf_seqno(l_ptr->first_out)); |
| 3050 | if (l_ptr->next_out) | 3121 | if (l_ptr->next_out) |
| 3051 | tipc_printf(buf, "%u..", | 3122 | tipc_printf(buf, "%u..", buf_seqno(l_ptr->next_out)); |
| 3052 | msg_seqno(buf_msg(l_ptr->next_out))); | 3123 | tipc_printf(buf, "%u]", buf_seqno(l_ptr->last_out)); |
| 3053 | tipc_printf(buf, "%u]", msg_seqno(buf_msg(l_ptr->last_out))); | 3124 | if ((mod(buf_seqno(l_ptr->last_out) - |
| 3054 | if ((mod(msg_seqno(buf_msg(l_ptr->last_out)) - | 3125 | buf_seqno(l_ptr->first_out)) |
| 3055 | msg_seqno(buf_msg(l_ptr->first_out))) | ||
| 3056 | != (l_ptr->out_queue_size - 1)) || | 3126 | != (l_ptr->out_queue_size - 1)) || |
| 3057 | (l_ptr->last_out->next != NULL)) { | 3127 | (l_ptr->last_out->next != NULL)) { |
| 3058 | tipc_printf(buf, "\nSend queue inconsistency\n"); | 3128 | tipc_printf(buf, "\nSend queue inconsistency\n"); |
| @@ -3064,8 +3134,8 @@ static void link_print(struct link *l_ptr, const char *str) | |||
| 3064 | tipc_printf(buf, "[]"); | 3134 | tipc_printf(buf, "[]"); |
| 3065 | tipc_printf(buf, "SQSIZ(%u)", l_ptr->out_queue_size); | 3135 | tipc_printf(buf, "SQSIZ(%u)", l_ptr->out_queue_size); |
| 3066 | if (l_ptr->oldest_deferred_in) { | 3136 | if (l_ptr->oldest_deferred_in) { |
| 3067 | u32 o = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); | 3137 | u32 o = buf_seqno(l_ptr->oldest_deferred_in); |
| 3068 | u32 n = msg_seqno(buf_msg(l_ptr->newest_deferred_in)); | 3138 | u32 n = buf_seqno(l_ptr->newest_deferred_in); |
| 3069 | tipc_printf(buf, ":RQUE[%u..%u]", o, n); | 3139 | tipc_printf(buf, ":RQUE[%u..%u]", o, n); |
| 3070 | if (l_ptr->deferred_inqueue_sz != mod((n + 1) - o)) { | 3140 | if (l_ptr->deferred_inqueue_sz != mod((n + 1) - o)) { |
| 3071 | tipc_printf(buf, ":RQSIZ(%u)", | 3141 | tipc_printf(buf, ":RQSIZ(%u)", |
diff --git a/net/tipc/link.h b/net/tipc/link.h index e56cb532913e..73c18c140e1d 100644 --- a/net/tipc/link.h +++ b/net/tipc/link.h | |||
| @@ -45,6 +45,12 @@ | |||
| 45 | #define PUSH_FINISHED 2 | 45 | #define PUSH_FINISHED 2 |
| 46 | 46 | ||
| 47 | /* | 47 | /* |
| 48 | * Out-of-range value for link sequence numbers | ||
| 49 | */ | ||
| 50 | |||
| 51 | #define INVALID_LINK_SEQ 0x10000 | ||
| 52 | |||
| 53 | /* | ||
| 48 | * Link states | 54 | * Link states |
| 49 | */ | 55 | */ |
| 50 | 56 | ||
| @@ -61,7 +67,7 @@ | |||
| 61 | #define MAX_PKT_DEFAULT 1500 | 67 | #define MAX_PKT_DEFAULT 1500 |
| 62 | 68 | ||
| 63 | /** | 69 | /** |
| 64 | * struct link - TIPC link data structure | 70 | * struct tipc_link - TIPC link data structure |
| 65 | * @addr: network address of link's peer node | 71 | * @addr: network address of link's peer node |
| 66 | * @name: link name character string | 72 | * @name: link name character string |
| 67 | * @media_addr: media address to use when sending messages over link | 73 | * @media_addr: media address to use when sending messages over link |
| @@ -109,7 +115,7 @@ | |||
| 109 | * @stats: collects statistics regarding link activity | 115 | * @stats: collects statistics regarding link activity |
| 110 | */ | 116 | */ |
| 111 | 117 | ||
| 112 | struct link { | 118 | struct tipc_link { |
| 113 | u32 addr; | 119 | u32 addr; |
| 114 | char name[TIPC_MAX_LINK_NAME]; | 120 | char name[TIPC_MAX_LINK_NAME]; |
| 115 | struct tipc_media_addr media_addr; | 121 | struct tipc_media_addr media_addr; |
| @@ -207,24 +213,24 @@ struct link { | |||
| 207 | 213 | ||
| 208 | struct tipc_port; | 214 | struct tipc_port; |
| 209 | 215 | ||
| 210 | struct link *tipc_link_create(struct tipc_node *n_ptr, | 216 | struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, |
| 211 | struct tipc_bearer *b_ptr, | 217 | struct tipc_bearer *b_ptr, |
| 212 | const struct tipc_media_addr *media_addr); | 218 | const struct tipc_media_addr *media_addr); |
| 213 | void tipc_link_delete(struct link *l_ptr); | 219 | void tipc_link_delete(struct tipc_link *l_ptr); |
| 214 | void tipc_link_changeover(struct link *l_ptr); | 220 | void tipc_link_changeover(struct tipc_link *l_ptr); |
| 215 | void tipc_link_send_duplicate(struct link *l_ptr, struct link *dest); | 221 | void tipc_link_send_duplicate(struct tipc_link *l_ptr, struct tipc_link *dest); |
| 216 | void tipc_link_reset_fragments(struct link *l_ptr); | 222 | void tipc_link_reset_fragments(struct tipc_link *l_ptr); |
| 217 | int tipc_link_is_up(struct link *l_ptr); | 223 | int tipc_link_is_up(struct tipc_link *l_ptr); |
| 218 | int tipc_link_is_active(struct link *l_ptr); | 224 | int tipc_link_is_active(struct tipc_link *l_ptr); |
| 219 | u32 tipc_link_push_packet(struct link *l_ptr); | 225 | u32 tipc_link_push_packet(struct tipc_link *l_ptr); |
| 220 | void tipc_link_stop(struct link *l_ptr); | 226 | void tipc_link_stop(struct tipc_link *l_ptr); |
| 221 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd); | 227 | struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, u16 cmd); |
| 222 | struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space); | 228 | struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space); |
| 223 | struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space); | 229 | struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space); |
| 224 | void tipc_link_reset(struct link *l_ptr); | 230 | void tipc_link_reset(struct tipc_link *l_ptr); |
| 225 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector); | 231 | int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector); |
| 226 | void tipc_link_send_names(struct list_head *message_list, u32 dest); | 232 | void tipc_link_send_names(struct list_head *message_list, u32 dest); |
| 227 | int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf); | 233 | int tipc_link_send_buf(struct tipc_link *l_ptr, struct sk_buff *buf); |
| 228 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector); | 234 | u32 tipc_link_get_max_pkt(u32 dest, u32 selector); |
| 229 | int tipc_link_send_sections_fast(struct tipc_port *sender, | 235 | int tipc_link_send_sections_fast(struct tipc_port *sender, |
| 230 | struct iovec const *msg_sect, | 236 | struct iovec const *msg_sect, |
| @@ -235,19 +241,26 @@ void tipc_link_recv_bundle(struct sk_buff *buf); | |||
| 235 | int tipc_link_recv_fragment(struct sk_buff **pending, | 241 | int tipc_link_recv_fragment(struct sk_buff **pending, |
| 236 | struct sk_buff **fb, | 242 | struct sk_buff **fb, |
| 237 | struct tipc_msg **msg); | 243 | struct tipc_msg **msg); |
| 238 | void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int prob, u32 gap, | 244 | void tipc_link_send_proto_msg(struct tipc_link *l_ptr, u32 msg_typ, int prob, |
| 239 | u32 tolerance, u32 priority, u32 acked_mtu); | 245 | u32 gap, u32 tolerance, u32 priority, |
| 240 | void tipc_link_push_queue(struct link *l_ptr); | 246 | u32 acked_mtu); |
| 247 | void tipc_link_push_queue(struct tipc_link *l_ptr); | ||
| 241 | u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail, | 248 | u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail, |
| 242 | struct sk_buff *buf); | 249 | struct sk_buff *buf); |
| 243 | void tipc_link_wakeup_ports(struct link *l_ptr, int all); | 250 | void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all); |
| 244 | void tipc_link_set_queue_limits(struct link *l_ptr, u32 window); | 251 | void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window); |
| 245 | void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *start, u32 retransmits); | 252 | void tipc_link_retransmit(struct tipc_link *l_ptr, |
| 253 | struct sk_buff *start, u32 retransmits); | ||
| 246 | 254 | ||
| 247 | /* | 255 | /* |
| 248 | * Link sequence number manipulation routines (uses modulo 2**16 arithmetic) | 256 | * Link sequence number manipulation routines (uses modulo 2**16 arithmetic) |
| 249 | */ | 257 | */ |
| 250 | 258 | ||
| 259 | static inline u32 buf_seqno(struct sk_buff *buf) | ||
| 260 | { | ||
| 261 | return msg_seqno(buf_msg(buf)); | ||
| 262 | } | ||
| 263 | |||
| 251 | static inline u32 mod(u32 x) | 264 | static inline u32 mod(u32 x) |
| 252 | { | 265 | { |
| 253 | return x & 0xffffu; | 266 | return x & 0xffffu; |
| @@ -282,32 +295,32 @@ static inline u32 lesser(u32 left, u32 right) | |||
| 282 | * Link status checking routines | 295 | * Link status checking routines |
| 283 | */ | 296 | */ |
| 284 | 297 | ||
| 285 | static inline int link_working_working(struct link *l_ptr) | 298 | static inline int link_working_working(struct tipc_link *l_ptr) |
| 286 | { | 299 | { |
| 287 | return l_ptr->state == WORKING_WORKING; | 300 | return l_ptr->state == WORKING_WORKING; |
| 288 | } | 301 | } |
| 289 | 302 | ||
| 290 | static inline int link_working_unknown(struct link *l_ptr) | 303 | static inline int link_working_unknown(struct tipc_link *l_ptr) |
| 291 | { | 304 | { |
| 292 | return l_ptr->state == WORKING_UNKNOWN; | 305 | return l_ptr->state == WORKING_UNKNOWN; |
| 293 | } | 306 | } |
| 294 | 307 | ||
| 295 | static inline int link_reset_unknown(struct link *l_ptr) | 308 | static inline int link_reset_unknown(struct tipc_link *l_ptr) |
| 296 | { | 309 | { |
| 297 | return l_ptr->state == RESET_UNKNOWN; | 310 | return l_ptr->state == RESET_UNKNOWN; |
| 298 | } | 311 | } |
| 299 | 312 | ||
| 300 | static inline int link_reset_reset(struct link *l_ptr) | 313 | static inline int link_reset_reset(struct tipc_link *l_ptr) |
| 301 | { | 314 | { |
| 302 | return l_ptr->state == RESET_RESET; | 315 | return l_ptr->state == RESET_RESET; |
| 303 | } | 316 | } |
| 304 | 317 | ||
| 305 | static inline int link_blocked(struct link *l_ptr) | 318 | static inline int link_blocked(struct tipc_link *l_ptr) |
| 306 | { | 319 | { |
| 307 | return l_ptr->exp_msg_count || l_ptr->blocked; | 320 | return l_ptr->exp_msg_count || l_ptr->blocked; |
| 308 | } | 321 | } |
| 309 | 322 | ||
| 310 | static inline int link_congested(struct link *l_ptr) | 323 | static inline int link_congested(struct tipc_link *l_ptr) |
| 311 | { | 324 | { |
| 312 | return l_ptr->out_queue_size >= l_ptr->queue_limit[0]; | 325 | return l_ptr->out_queue_size >= l_ptr->queue_limit[0]; |
| 313 | } | 326 | } |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 83d50967910c..3e4d3e29be61 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
| @@ -333,11 +333,14 @@ void tipc_msg_dbg(struct print_buf *buf, struct tipc_msg *msg, const char *str) | |||
| 333 | } | 333 | } |
| 334 | 334 | ||
| 335 | if (msg_user(msg) == LINK_CONFIG) { | 335 | if (msg_user(msg) == LINK_CONFIG) { |
| 336 | u32 *raw = (u32 *)msg; | 336 | struct tipc_media_addr orig; |
| 337 | struct tipc_media_addr *orig = (struct tipc_media_addr *)&raw[5]; | 337 | |
| 338 | tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg)); | 338 | tipc_printf(buf, ":DDOM(%x):", msg_dest_domain(msg)); |
| 339 | tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg)); | 339 | tipc_printf(buf, ":NETID(%u):", msg_bc_netid(msg)); |
| 340 | tipc_media_addr_printf(buf, orig); | 340 | memcpy(orig.value, msg_media_addr(msg), sizeof(orig.value)); |
| 341 | orig.media_id = 0; | ||
| 342 | orig.broadcast = 0; | ||
| 343 | tipc_media_addr_printf(buf, &orig); | ||
| 341 | } | 344 | } |
| 342 | if (msg_user(msg) == BCAST_PROTOCOL) { | 345 | if (msg_user(msg) == BCAST_PROTOCOL) { |
| 343 | tipc_printf(buf, "BCNACK:AFTER(%u):", msg_bcgap_after(msg)); | 346 | tipc_printf(buf, "BCNACK:AFTER(%u):", msg_bcgap_after(msg)); |
diff --git a/net/tipc/msg.h b/net/tipc/msg.h index d93178f2e852..7b0cda167107 100644 --- a/net/tipc/msg.h +++ b/net/tipc/msg.h | |||
| @@ -78,6 +78,8 @@ | |||
| 78 | 78 | ||
| 79 | #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) | 79 | #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) |
| 80 | 80 | ||
| 81 | #define TIPC_MEDIA_ADDR_OFFSET 5 | ||
| 82 | |||
| 81 | 83 | ||
| 82 | struct tipc_msg { | 84 | struct tipc_msg { |
| 83 | __be32 hdr[15]; | 85 | __be32 hdr[15]; |
| @@ -682,6 +684,10 @@ static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r) | |||
| 682 | msg_set_bits(m, 5, 12, 0x1, r); | 684 | msg_set_bits(m, 5, 12, 0x1, r); |
| 683 | } | 685 | } |
| 684 | 686 | ||
| 687 | static inline char *msg_media_addr(struct tipc_msg *m) | ||
| 688 | { | ||
| 689 | return (char *)&m->hdr[TIPC_MEDIA_ADDR_OFFSET]; | ||
| 690 | } | ||
| 685 | 691 | ||
| 686 | /* | 692 | /* |
| 687 | * Word 9 | 693 | * Word 9 |
| @@ -734,14 +740,4 @@ int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect, | |||
| 734 | u32 num_sect, unsigned int total_len, | 740 | u32 num_sect, unsigned int total_len, |
| 735 | int max_size, int usrmem, struct sk_buff **buf); | 741 | int max_size, int usrmem, struct sk_buff **buf); |
| 736 | 742 | ||
| 737 | static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) | ||
| 738 | { | ||
| 739 | memcpy(&((int *)m)[5], a, sizeof(*a)); | ||
| 740 | } | ||
| 741 | |||
| 742 | static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) | ||
| 743 | { | ||
| 744 | memcpy(a, &((int *)m)[5], sizeof(*a)); | ||
| 745 | } | ||
| 746 | |||
| 747 | #endif | 743 | #endif |
diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index b7ca1bd7b151..98ebb37f1808 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c | |||
| @@ -176,7 +176,7 @@ void tipc_named_withdraw(struct publication *publ) | |||
| 176 | void tipc_named_node_up(unsigned long nodearg) | 176 | void tipc_named_node_up(unsigned long nodearg) |
| 177 | { | 177 | { |
| 178 | struct tipc_node *n_ptr; | 178 | struct tipc_node *n_ptr; |
| 179 | struct link *l_ptr; | 179 | struct tipc_link *l_ptr; |
| 180 | struct publication *publ; | 180 | struct publication *publ; |
| 181 | struct distr_item *item = NULL; | 181 | struct distr_item *item = NULL; |
| 182 | struct sk_buff *buf = NULL; | 182 | struct sk_buff *buf = NULL; |
| @@ -322,10 +322,9 @@ void tipc_named_recv(struct sk_buff *buf) | |||
| 322 | /** | 322 | /** |
| 323 | * tipc_named_reinit - re-initialize local publication list | 323 | * tipc_named_reinit - re-initialize local publication list |
| 324 | * | 324 | * |
| 325 | * This routine is called whenever TIPC networking is (re)enabled. | 325 | * This routine is called whenever TIPC networking is enabled. |
| 326 | * All existing publications by this node that have "cluster" or "zone" scope | 326 | * All existing publications by this node that have "cluster" or "zone" scope |
| 327 | * are updated to reflect the node's current network address. | 327 | * are updated to reflect the node's new network address. |
| 328 | * (If the node's address is unchanged, the update loop terminates immediately.) | ||
| 329 | */ | 328 | */ |
| 330 | 329 | ||
| 331 | void tipc_named_reinit(void) | 330 | void tipc_named_reinit(void) |
| @@ -333,10 +332,9 @@ void tipc_named_reinit(void) | |||
| 333 | struct publication *publ; | 332 | struct publication *publ; |
| 334 | 333 | ||
| 335 | write_lock_bh(&tipc_nametbl_lock); | 334 | write_lock_bh(&tipc_nametbl_lock); |
| 336 | list_for_each_entry(publ, &publ_root, local_list) { | 335 | |
| 337 | if (publ->node == tipc_own_addr) | 336 | list_for_each_entry(publ, &publ_root, local_list) |
| 338 | break; | ||
| 339 | publ->node = tipc_own_addr; | 337 | publ->node = tipc_own_addr; |
| 340 | } | 338 | |
| 341 | write_unlock_bh(&tipc_nametbl_lock); | 339 | write_unlock_bh(&tipc_nametbl_lock); |
| 342 | } | 340 | } |
diff --git a/net/tipc/name_table.c b/net/tipc/name_table.c index 46e6b6c2ecc9..89eb5621ebba 100644 --- a/net/tipc/name_table.c +++ b/net/tipc/name_table.c | |||
| @@ -251,8 +251,8 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq, | |||
| 251 | u32 type, u32 lower, u32 upper, | 251 | u32 type, u32 lower, u32 upper, |
| 252 | u32 scope, u32 node, u32 port, u32 key) | 252 | u32 scope, u32 node, u32 port, u32 key) |
| 253 | { | 253 | { |
| 254 | struct subscription *s; | 254 | struct tipc_subscription *s; |
| 255 | struct subscription *st; | 255 | struct tipc_subscription *st; |
| 256 | struct publication *publ; | 256 | struct publication *publ; |
| 257 | struct sub_seq *sseq; | 257 | struct sub_seq *sseq; |
| 258 | struct name_info *info; | 258 | struct name_info *info; |
| @@ -381,7 +381,7 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i | |||
| 381 | struct sub_seq *sseq = nameseq_find_subseq(nseq, inst); | 381 | struct sub_seq *sseq = nameseq_find_subseq(nseq, inst); |
| 382 | struct name_info *info; | 382 | struct name_info *info; |
| 383 | struct sub_seq *free; | 383 | struct sub_seq *free; |
| 384 | struct subscription *s, *st; | 384 | struct tipc_subscription *s, *st; |
| 385 | int removed_subseq = 0; | 385 | int removed_subseq = 0; |
| 386 | 386 | ||
| 387 | if (!sseq) | 387 | if (!sseq) |
| @@ -448,7 +448,8 @@ found: | |||
| 448 | * sequence overlapping with the requested sequence | 448 | * sequence overlapping with the requested sequence |
| 449 | */ | 449 | */ |
| 450 | 450 | ||
| 451 | static void tipc_nameseq_subscribe(struct name_seq *nseq, struct subscription *s) | 451 | static void tipc_nameseq_subscribe(struct name_seq *nseq, |
| 452 | struct tipc_subscription *s) | ||
| 452 | { | 453 | { |
| 453 | struct sub_seq *sseq = nseq->sseqs; | 454 | struct sub_seq *sseq = nseq->sseqs; |
| 454 | 455 | ||
| @@ -625,7 +626,7 @@ not_found: | |||
| 625 | */ | 626 | */ |
| 626 | 627 | ||
| 627 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, | 628 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, |
| 628 | struct port_list *dports) | 629 | struct tipc_port_list *dports) |
| 629 | { | 630 | { |
| 630 | struct name_seq *seq; | 631 | struct name_seq *seq; |
| 631 | struct sub_seq *sseq; | 632 | struct sub_seq *sseq; |
| @@ -739,7 +740,7 @@ int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key) | |||
| 739 | * tipc_nametbl_subscribe - add a subscription object to the name table | 740 | * tipc_nametbl_subscribe - add a subscription object to the name table |
| 740 | */ | 741 | */ |
| 741 | 742 | ||
| 742 | void tipc_nametbl_subscribe(struct subscription *s) | 743 | void tipc_nametbl_subscribe(struct tipc_subscription *s) |
| 743 | { | 744 | { |
| 744 | u32 type = s->seq.type; | 745 | u32 type = s->seq.type; |
| 745 | struct name_seq *seq; | 746 | struct name_seq *seq; |
| @@ -763,7 +764,7 @@ void tipc_nametbl_subscribe(struct subscription *s) | |||
| 763 | * tipc_nametbl_unsubscribe - remove a subscription object from name table | 764 | * tipc_nametbl_unsubscribe - remove a subscription object from name table |
| 764 | */ | 765 | */ |
| 765 | 766 | ||
| 766 | void tipc_nametbl_unsubscribe(struct subscription *s) | 767 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s) |
| 767 | { | 768 | { |
| 768 | struct name_seq *seq; | 769 | struct name_seq *seq; |
| 769 | 770 | ||
diff --git a/net/tipc/name_table.h b/net/tipc/name_table.h index 62d77e5e902e..8086b42f92ad 100644 --- a/net/tipc/name_table.h +++ b/net/tipc/name_table.h | |||
| @@ -39,8 +39,8 @@ | |||
| 39 | 39 | ||
| 40 | #include "node_subscr.h" | 40 | #include "node_subscr.h" |
| 41 | 41 | ||
| 42 | struct subscription; | 42 | struct tipc_subscription; |
| 43 | struct port_list; | 43 | struct tipc_port_list; |
| 44 | 44 | ||
| 45 | /* | 45 | /* |
| 46 | * TIPC name types reserved for internal TIPC use (both current and planned) | 46 | * TIPC name types reserved for internal TIPC use (both current and planned) |
| @@ -90,7 +90,7 @@ extern rwlock_t tipc_nametbl_lock; | |||
| 90 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space); | 90 | struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space); |
| 91 | u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node); | 91 | u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node); |
| 92 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, | 92 | int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, |
| 93 | struct port_list *dports); | 93 | struct tipc_port_list *dports); |
| 94 | int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope, | 94 | int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope, |
| 95 | struct tipc_name_seq const *seq); | 95 | struct tipc_name_seq const *seq); |
| 96 | struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper, | 96 | struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper, |
| @@ -100,8 +100,8 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper, | |||
| 100 | u32 scope, u32 node, u32 ref, u32 key); | 100 | u32 scope, u32 node, u32 ref, u32 key); |
| 101 | struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, | 101 | struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, |
| 102 | u32 node, u32 ref, u32 key); | 102 | u32 node, u32 ref, u32 key); |
| 103 | void tipc_nametbl_subscribe(struct subscription *s); | 103 | void tipc_nametbl_subscribe(struct tipc_subscription *s); |
| 104 | void tipc_nametbl_unsubscribe(struct subscription *s); | 104 | void tipc_nametbl_unsubscribe(struct tipc_subscription *s); |
| 105 | int tipc_nametbl_init(void); | 105 | int tipc_nametbl_init(void); |
| 106 | void tipc_nametbl_stop(void); | 106 | void tipc_nametbl_stop(void); |
| 107 | 107 | ||
diff --git a/net/tipc/net.c b/net/tipc/net.c index fafef6c3c0f6..61afee7e8291 100644 --- a/net/tipc/net.c +++ b/net/tipc/net.c | |||
| @@ -174,7 +174,6 @@ void tipc_net_route_msg(struct sk_buff *buf) | |||
| 174 | int tipc_net_start(u32 addr) | 174 | int tipc_net_start(u32 addr) |
| 175 | { | 175 | { |
| 176 | char addr_string[16]; | 176 | char addr_string[16]; |
| 177 | int res; | ||
| 178 | 177 | ||
| 179 | if (tipc_mode != TIPC_NODE_MODE) | 178 | if (tipc_mode != TIPC_NODE_MODE) |
| 180 | return -ENOPROTOOPT; | 179 | return -ENOPROTOOPT; |
| @@ -187,9 +186,7 @@ int tipc_net_start(u32 addr) | |||
| 187 | tipc_named_reinit(); | 186 | tipc_named_reinit(); |
| 188 | tipc_port_reinit(); | 187 | tipc_port_reinit(); |
| 189 | 188 | ||
| 190 | res = tipc_bclink_init(); | 189 | tipc_bclink_init(); |
| 191 | if (res) | ||
| 192 | return res; | ||
| 193 | 190 | ||
| 194 | tipc_k_signal((Handler)tipc_subscr_start, 0); | 191 | tipc_k_signal((Handler)tipc_subscr_start, 0); |
| 195 | tipc_k_signal((Handler)tipc_cfg_init, 0); | 192 | tipc_k_signal((Handler)tipc_cfg_init, 0); |
| @@ -207,8 +204,8 @@ void tipc_net_stop(void) | |||
| 207 | if (tipc_mode != TIPC_NET_MODE) | 204 | if (tipc_mode != TIPC_NET_MODE) |
| 208 | return; | 205 | return; |
| 209 | write_lock_bh(&tipc_net_lock); | 206 | write_lock_bh(&tipc_net_lock); |
| 210 | tipc_bearer_stop(); | ||
| 211 | tipc_mode = TIPC_NODE_MODE; | 207 | tipc_mode = TIPC_NODE_MODE; |
| 208 | tipc_bearer_stop(); | ||
| 212 | tipc_bclink_stop(); | 209 | tipc_bclink_stop(); |
| 213 | list_for_each_entry_safe(node, t_node, &tipc_node_list, list) | 210 | list_for_each_entry_safe(node, t_node, &tipc_node_list, list) |
| 214 | tipc_node_delete(node); | 211 | tipc_node_delete(node); |
diff --git a/net/tipc/node.c b/net/tipc/node.c index 27b4bb0cca6c..6b226faad89f 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -136,9 +136,9 @@ void tipc_node_delete(struct tipc_node *n_ptr) | |||
| 136 | * Link becomes active (alone or shared) or standby, depending on its priority. | 136 | * Link becomes active (alone or shared) or standby, depending on its priority. |
| 137 | */ | 137 | */ |
| 138 | 138 | ||
| 139 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr) | 139 | void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr) |
| 140 | { | 140 | { |
| 141 | struct link **active = &n_ptr->active_links[0]; | 141 | struct tipc_link **active = &n_ptr->active_links[0]; |
| 142 | 142 | ||
| 143 | n_ptr->working_links++; | 143 | n_ptr->working_links++; |
| 144 | 144 | ||
| @@ -171,14 +171,14 @@ void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr) | |||
| 171 | 171 | ||
| 172 | static void node_select_active_links(struct tipc_node *n_ptr) | 172 | static void node_select_active_links(struct tipc_node *n_ptr) |
| 173 | { | 173 | { |
| 174 | struct link **active = &n_ptr->active_links[0]; | 174 | struct tipc_link **active = &n_ptr->active_links[0]; |
| 175 | u32 i; | 175 | u32 i; |
| 176 | u32 highest_prio = 0; | 176 | u32 highest_prio = 0; |
| 177 | 177 | ||
| 178 | active[0] = active[1] = NULL; | 178 | active[0] = active[1] = NULL; |
| 179 | 179 | ||
| 180 | for (i = 0; i < MAX_BEARERS; i++) { | 180 | for (i = 0; i < MAX_BEARERS; i++) { |
| 181 | struct link *l_ptr = n_ptr->links[i]; | 181 | struct tipc_link *l_ptr = n_ptr->links[i]; |
| 182 | 182 | ||
| 183 | if (!l_ptr || !tipc_link_is_up(l_ptr) || | 183 | if (!l_ptr || !tipc_link_is_up(l_ptr) || |
| 184 | (l_ptr->priority < highest_prio)) | 184 | (l_ptr->priority < highest_prio)) |
| @@ -197,9 +197,9 @@ static void node_select_active_links(struct tipc_node *n_ptr) | |||
| 197 | * tipc_node_link_down - handle loss of link | 197 | * tipc_node_link_down - handle loss of link |
| 198 | */ | 198 | */ |
| 199 | 199 | ||
| 200 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr) | 200 | void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr) |
| 201 | { | 201 | { |
| 202 | struct link **active; | 202 | struct tipc_link **active; |
| 203 | 203 | ||
| 204 | n_ptr->working_links--; | 204 | n_ptr->working_links--; |
| 205 | 205 | ||
| @@ -239,14 +239,14 @@ int tipc_node_is_up(struct tipc_node *n_ptr) | |||
| 239 | return tipc_node_active_links(n_ptr); | 239 | return tipc_node_active_links(n_ptr); |
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct link *l_ptr) | 242 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) |
| 243 | { | 243 | { |
| 244 | n_ptr->links[l_ptr->b_ptr->identity] = l_ptr; | 244 | n_ptr->links[l_ptr->b_ptr->identity] = l_ptr; |
| 245 | atomic_inc(&tipc_num_links); | 245 | atomic_inc(&tipc_num_links); |
| 246 | n_ptr->link_cnt++; | 246 | n_ptr->link_cnt++; |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr) | 249 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) |
| 250 | { | 250 | { |
| 251 | n_ptr->links[l_ptr->b_ptr->identity] = NULL; | 251 | n_ptr->links[l_ptr->b_ptr->identity] = NULL; |
| 252 | atomic_dec(&tipc_num_links); | 252 | atomic_dec(&tipc_num_links); |
| @@ -307,7 +307,7 @@ static void node_established_contact(struct tipc_node *n_ptr) | |||
| 307 | n_ptr->bclink.acked = tipc_bclink_get_last_sent(); | 307 | n_ptr->bclink.acked = tipc_bclink_get_last_sent(); |
| 308 | 308 | ||
| 309 | if (n_ptr->bclink.supported) { | 309 | if (n_ptr->bclink.supported) { |
| 310 | tipc_nmap_add(&tipc_bcast_nmap, n_ptr->addr); | 310 | tipc_bclink_add_node(n_ptr->addr); |
| 311 | if (n_ptr->addr < tipc_own_addr) | 311 | if (n_ptr->addr < tipc_own_addr) |
| 312 | tipc_own_tag++; | 312 | tipc_own_tag++; |
| 313 | } | 313 | } |
| @@ -350,9 +350,8 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
| 350 | n_ptr->bclink.defragm = NULL; | 350 | n_ptr->bclink.defragm = NULL; |
| 351 | } | 351 | } |
| 352 | 352 | ||
| 353 | tipc_nmap_remove(&tipc_bcast_nmap, n_ptr->addr); | 353 | tipc_bclink_remove_node(n_ptr->addr); |
| 354 | tipc_bclink_acknowledge(n_ptr, | 354 | tipc_bclink_acknowledge(n_ptr, INVALID_LINK_SEQ); |
| 355 | mod(n_ptr->bclink.acked + 10000)); | ||
| 356 | if (n_ptr->addr < tipc_own_addr) | 355 | if (n_ptr->addr < tipc_own_addr) |
| 357 | tipc_own_tag--; | 356 | tipc_own_tag--; |
| 358 | 357 | ||
| @@ -361,7 +360,7 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
| 361 | 360 | ||
| 362 | /* Abort link changeover */ | 361 | /* Abort link changeover */ |
| 363 | for (i = 0; i < MAX_BEARERS; i++) { | 362 | for (i = 0; i < MAX_BEARERS; i++) { |
| 364 | struct link *l_ptr = n_ptr->links[i]; | 363 | struct tipc_link *l_ptr = n_ptr->links[i]; |
| 365 | if (!l_ptr) | 364 | if (!l_ptr) |
| 366 | continue; | 365 | continue; |
| 367 | l_ptr->reset_checkpoint = l_ptr->next_in_no; | 366 | l_ptr->reset_checkpoint = l_ptr->next_in_no; |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 4f15cb40aaa4..0b1c5f8b6996 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
| @@ -79,8 +79,8 @@ struct tipc_node { | |||
| 79 | struct hlist_node hash; | 79 | struct hlist_node hash; |
| 80 | struct list_head list; | 80 | struct list_head list; |
| 81 | struct list_head nsub; | 81 | struct list_head nsub; |
| 82 | struct link *active_links[2]; | 82 | struct tipc_link *active_links[2]; |
| 83 | struct link *links[MAX_BEARERS]; | 83 | struct tipc_link *links[MAX_BEARERS]; |
| 84 | int link_cnt; | 84 | int link_cnt; |
| 85 | int working_links; | 85 | int working_links; |
| 86 | int block_setup; | 86 | int block_setup; |
| @@ -117,10 +117,10 @@ extern u32 tipc_own_tag; | |||
| 117 | struct tipc_node *tipc_node_find(u32 addr); | 117 | struct tipc_node *tipc_node_find(u32 addr); |
| 118 | struct tipc_node *tipc_node_create(u32 addr); | 118 | struct tipc_node *tipc_node_create(u32 addr); |
| 119 | void tipc_node_delete(struct tipc_node *n_ptr); | 119 | void tipc_node_delete(struct tipc_node *n_ptr); |
| 120 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct link *l_ptr); | 120 | void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
| 121 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr); | 121 | void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
| 122 | void tipc_node_link_down(struct tipc_node *n_ptr, struct link *l_ptr); | 122 | void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
| 123 | void tipc_node_link_up(struct tipc_node *n_ptr, struct link *l_ptr); | 123 | void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
| 124 | int tipc_node_active_links(struct tipc_node *n_ptr); | 124 | int tipc_node_active_links(struct tipc_node *n_ptr); |
| 125 | int tipc_node_redundant_links(struct tipc_node *n_ptr); | 125 | int tipc_node_redundant_links(struct tipc_node *n_ptr); |
| 126 | int tipc_node_is_up(struct tipc_node *n_ptr); | 126 | int tipc_node_is_up(struct tipc_node *n_ptr); |
diff --git a/net/tipc/port.c b/net/tipc/port.c index 54d812a5a4d9..d91efc69e6f9 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
| @@ -80,7 +80,7 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, | |||
| 80 | struct tipc_msg *hdr; | 80 | struct tipc_msg *hdr; |
| 81 | struct sk_buff *buf; | 81 | struct sk_buff *buf; |
| 82 | struct sk_buff *ibuf = NULL; | 82 | struct sk_buff *ibuf = NULL; |
| 83 | struct port_list dports = {0, NULL, }; | 83 | struct tipc_port_list dports = {0, NULL, }; |
| 84 | struct tipc_port *oport = tipc_port_deref(ref); | 84 | struct tipc_port *oport = tipc_port_deref(ref); |
| 85 | int ext_targets; | 85 | int ext_targets; |
| 86 | int res; | 86 | int res; |
| @@ -142,11 +142,11 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, | |||
| 142 | * If there is no port list, perform a lookup to create one | 142 | * If there is no port list, perform a lookup to create one |
| 143 | */ | 143 | */ |
| 144 | 144 | ||
| 145 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) | 145 | void tipc_port_recv_mcast(struct sk_buff *buf, struct tipc_port_list *dp) |
| 146 | { | 146 | { |
| 147 | struct tipc_msg *msg; | 147 | struct tipc_msg *msg; |
| 148 | struct port_list dports = {0, NULL, }; | 148 | struct tipc_port_list dports = {0, NULL, }; |
| 149 | struct port_list *item = dp; | 149 | struct tipc_port_list *item = dp; |
| 150 | int cnt = 0; | 150 | int cnt = 0; |
| 151 | 151 | ||
| 152 | msg = buf_msg(buf); | 152 | msg = buf_msg(buf); |
diff --git a/net/tipc/port.h b/net/tipc/port.h index b9aa34195aec..f751807e2a91 100644 --- a/net/tipc/port.h +++ b/net/tipc/port.h | |||
| @@ -151,7 +151,7 @@ struct tipc_port { | |||
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | extern spinlock_t tipc_port_list_lock; | 153 | extern spinlock_t tipc_port_list_lock; |
| 154 | struct port_list; | 154 | struct tipc_port_list; |
| 155 | 155 | ||
| 156 | /* | 156 | /* |
| 157 | * TIPC port manipulation routines | 157 | * TIPC port manipulation routines |
| @@ -228,7 +228,7 @@ int tipc_port_reject_sections(struct tipc_port *p_ptr, struct tipc_msg *hdr, | |||
| 228 | unsigned int total_len, int err); | 228 | unsigned int total_len, int err); |
| 229 | struct sk_buff *tipc_port_get_ports(void); | 229 | struct sk_buff *tipc_port_get_ports(void); |
| 230 | void tipc_port_recv_proto_msg(struct sk_buff *buf); | 230 | void tipc_port_recv_proto_msg(struct sk_buff *buf); |
| 231 | void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp); | 231 | void tipc_port_recv_mcast(struct sk_buff *buf, struct tipc_port_list *dp); |
| 232 | void tipc_port_reinit(void); | 232 | void tipc_port_reinit(void); |
| 233 | 233 | ||
| 234 | /** | 234 | /** |
diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 83116892528b..9e37b7812c3c 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c | |||
| @@ -110,8 +110,7 @@ int tipc_ref_table_init(u32 requested_size, u32 start) | |||
| 110 | 110 | ||
| 111 | /* allocate table & mark all entries as uninitialized */ | 111 | /* allocate table & mark all entries as uninitialized */ |
| 112 | 112 | ||
| 113 | table = __vmalloc(actual_size * sizeof(struct reference), | 113 | table = vzalloc(actual_size * sizeof(struct reference)); |
| 114 | GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); | ||
| 115 | if (table == NULL) | 114 | if (table == NULL) |
| 116 | return -ENOMEM; | 115 | return -ENOMEM; |
| 117 | 116 | ||
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 42b8324ff2ee..e2f7c5d370ba 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -185,9 +185,6 @@ static int tipc_create(struct net *net, struct socket *sock, int protocol, | |||
| 185 | 185 | ||
| 186 | /* Validate arguments */ | 186 | /* Validate arguments */ |
| 187 | 187 | ||
| 188 | if (!net_eq(net, &init_net)) | ||
| 189 | return -EAFNOSUPPORT; | ||
| 190 | |||
| 191 | if (unlikely(protocol != 0)) | 188 | if (unlikely(protocol != 0)) |
| 192 | return -EPROTONOSUPPORT; | 189 | return -EPROTONOSUPPORT; |
| 193 | 190 | ||
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c index 198371723b41..8c49566da8f3 100644 --- a/net/tipc/subscr.c +++ b/net/tipc/subscr.c | |||
| @@ -40,14 +40,14 @@ | |||
| 40 | #include "subscr.h" | 40 | #include "subscr.h" |
| 41 | 41 | ||
| 42 | /** | 42 | /** |
| 43 | * struct subscriber - TIPC network topology subscriber | 43 | * struct tipc_subscriber - TIPC network topology subscriber |
| 44 | * @port_ref: object reference to server port connecting to subscriber | 44 | * @port_ref: object reference to server port connecting to subscriber |
| 45 | * @lock: pointer to spinlock controlling access to subscriber's server port | 45 | * @lock: pointer to spinlock controlling access to subscriber's server port |
| 46 | * @subscriber_list: adjacent subscribers in top. server's list of subscribers | 46 | * @subscriber_list: adjacent subscribers in top. server's list of subscribers |
| 47 | * @subscription_list: list of subscription objects for this subscriber | 47 | * @subscription_list: list of subscription objects for this subscriber |
| 48 | */ | 48 | */ |
| 49 | 49 | ||
| 50 | struct subscriber { | 50 | struct tipc_subscriber { |
| 51 | u32 port_ref; | 51 | u32 port_ref; |
| 52 | spinlock_t *lock; | 52 | spinlock_t *lock; |
| 53 | struct list_head subscriber_list; | 53 | struct list_head subscriber_list; |
| @@ -92,7 +92,7 @@ static u32 htohl(u32 in, int swap) | |||
| 92 | * try to take the lock if the message is rejected and returned! | 92 | * try to take the lock if the message is rejected and returned! |
| 93 | */ | 93 | */ |
| 94 | 94 | ||
| 95 | static void subscr_send_event(struct subscription *sub, | 95 | static void subscr_send_event(struct tipc_subscription *sub, |
| 96 | u32 found_lower, | 96 | u32 found_lower, |
| 97 | u32 found_upper, | 97 | u32 found_upper, |
| 98 | u32 event, | 98 | u32 event, |
| @@ -118,7 +118,7 @@ static void subscr_send_event(struct subscription *sub, | |||
| 118 | * Returns 1 if there is overlap, otherwise 0. | 118 | * Returns 1 if there is overlap, otherwise 0. |
| 119 | */ | 119 | */ |
| 120 | 120 | ||
| 121 | int tipc_subscr_overlap(struct subscription *sub, | 121 | int tipc_subscr_overlap(struct tipc_subscription *sub, |
| 122 | u32 found_lower, | 122 | u32 found_lower, |
| 123 | u32 found_upper) | 123 | u32 found_upper) |
| 124 | 124 | ||
| @@ -138,7 +138,7 @@ int tipc_subscr_overlap(struct subscription *sub, | |||
| 138 | * Protected by nameseq.lock in name_table.c | 138 | * Protected by nameseq.lock in name_table.c |
| 139 | */ | 139 | */ |
| 140 | 140 | ||
| 141 | void tipc_subscr_report_overlap(struct subscription *sub, | 141 | void tipc_subscr_report_overlap(struct tipc_subscription *sub, |
| 142 | u32 found_lower, | 142 | u32 found_lower, |
| 143 | u32 found_upper, | 143 | u32 found_upper, |
| 144 | u32 event, | 144 | u32 event, |
| @@ -158,7 +158,7 @@ void tipc_subscr_report_overlap(struct subscription *sub, | |||
| 158 | * subscr_timeout - subscription timeout has occurred | 158 | * subscr_timeout - subscription timeout has occurred |
| 159 | */ | 159 | */ |
| 160 | 160 | ||
| 161 | static void subscr_timeout(struct subscription *sub) | 161 | static void subscr_timeout(struct tipc_subscription *sub) |
| 162 | { | 162 | { |
| 163 | struct tipc_port *server_port; | 163 | struct tipc_port *server_port; |
| 164 | 164 | ||
| @@ -205,7 +205,7 @@ static void subscr_timeout(struct subscription *sub) | |||
| 205 | * Called with subscriber port locked. | 205 | * Called with subscriber port locked. |
| 206 | */ | 206 | */ |
| 207 | 207 | ||
| 208 | static void subscr_del(struct subscription *sub) | 208 | static void subscr_del(struct tipc_subscription *sub) |
| 209 | { | 209 | { |
| 210 | tipc_nametbl_unsubscribe(sub); | 210 | tipc_nametbl_unsubscribe(sub); |
| 211 | list_del(&sub->subscription_list); | 211 | list_del(&sub->subscription_list); |
| @@ -224,11 +224,11 @@ static void subscr_del(struct subscription *sub) | |||
| 224 | * simply wait for it to be released, then claim it.) | 224 | * simply wait for it to be released, then claim it.) |
| 225 | */ | 225 | */ |
| 226 | 226 | ||
| 227 | static void subscr_terminate(struct subscriber *subscriber) | 227 | static void subscr_terminate(struct tipc_subscriber *subscriber) |
| 228 | { | 228 | { |
| 229 | u32 port_ref; | 229 | u32 port_ref; |
| 230 | struct subscription *sub; | 230 | struct tipc_subscription *sub; |
| 231 | struct subscription *sub_temp; | 231 | struct tipc_subscription *sub_temp; |
| 232 | 232 | ||
| 233 | /* Invalidate subscriber reference */ | 233 | /* Invalidate subscriber reference */ |
| 234 | 234 | ||
| @@ -278,10 +278,10 @@ static void subscr_terminate(struct subscriber *subscriber) | |||
| 278 | */ | 278 | */ |
| 279 | 279 | ||
| 280 | static void subscr_cancel(struct tipc_subscr *s, | 280 | static void subscr_cancel(struct tipc_subscr *s, |
| 281 | struct subscriber *subscriber) | 281 | struct tipc_subscriber *subscriber) |
| 282 | { | 282 | { |
| 283 | struct subscription *sub; | 283 | struct tipc_subscription *sub; |
| 284 | struct subscription *sub_temp; | 284 | struct tipc_subscription *sub_temp; |
| 285 | int found = 0; | 285 | int found = 0; |
| 286 | 286 | ||
| 287 | /* Find first matching subscription, exit if not found */ | 287 | /* Find first matching subscription, exit if not found */ |
| @@ -314,10 +314,10 @@ static void subscr_cancel(struct tipc_subscr *s, | |||
| 314 | * Called with subscriber port locked. | 314 | * Called with subscriber port locked. |
| 315 | */ | 315 | */ |
| 316 | 316 | ||
| 317 | static struct subscription *subscr_subscribe(struct tipc_subscr *s, | 317 | static struct tipc_subscription *subscr_subscribe(struct tipc_subscr *s, |
| 318 | struct subscriber *subscriber) | 318 | struct tipc_subscriber *subscriber) |
| 319 | { | 319 | { |
| 320 | struct subscription *sub; | 320 | struct tipc_subscription *sub; |
| 321 | int swap; | 321 | int swap; |
| 322 | 322 | ||
| 323 | /* Determine subscriber's endianness */ | 323 | /* Determine subscriber's endianness */ |
| @@ -393,7 +393,7 @@ static void subscr_conn_shutdown_event(void *usr_handle, | |||
| 393 | unsigned int size, | 393 | unsigned int size, |
| 394 | int reason) | 394 | int reason) |
| 395 | { | 395 | { |
| 396 | struct subscriber *subscriber = usr_handle; | 396 | struct tipc_subscriber *subscriber = usr_handle; |
| 397 | spinlock_t *subscriber_lock; | 397 | spinlock_t *subscriber_lock; |
| 398 | 398 | ||
| 399 | if (tipc_port_lock(port_ref) == NULL) | 399 | if (tipc_port_lock(port_ref) == NULL) |
| @@ -416,9 +416,9 @@ static void subscr_conn_msg_event(void *usr_handle, | |||
| 416 | const unchar *data, | 416 | const unchar *data, |
| 417 | u32 size) | 417 | u32 size) |
| 418 | { | 418 | { |
| 419 | struct subscriber *subscriber = usr_handle; | 419 | struct tipc_subscriber *subscriber = usr_handle; |
| 420 | spinlock_t *subscriber_lock; | 420 | spinlock_t *subscriber_lock; |
| 421 | struct subscription *sub; | 421 | struct tipc_subscription *sub; |
| 422 | 422 | ||
| 423 | /* | 423 | /* |
| 424 | * Lock subscriber's server port (& make a local copy of lock pointer, | 424 | * Lock subscriber's server port (& make a local copy of lock pointer, |
| @@ -471,12 +471,12 @@ static void subscr_named_msg_event(void *usr_handle, | |||
| 471 | struct tipc_portid const *orig, | 471 | struct tipc_portid const *orig, |
| 472 | struct tipc_name_seq const *dest) | 472 | struct tipc_name_seq const *dest) |
| 473 | { | 473 | { |
| 474 | struct subscriber *subscriber; | 474 | struct tipc_subscriber *subscriber; |
| 475 | u32 server_port_ref; | 475 | u32 server_port_ref; |
| 476 | 476 | ||
| 477 | /* Create subscriber object */ | 477 | /* Create subscriber object */ |
| 478 | 478 | ||
| 479 | subscriber = kzalloc(sizeof(struct subscriber), GFP_ATOMIC); | 479 | subscriber = kzalloc(sizeof(struct tipc_subscriber), GFP_ATOMIC); |
| 480 | if (subscriber == NULL) { | 480 | if (subscriber == NULL) { |
| 481 | warn("Subscriber rejected, no memory\n"); | 481 | warn("Subscriber rejected, no memory\n"); |
| 482 | return; | 482 | return; |
| @@ -568,8 +568,8 @@ failed: | |||
| 568 | 568 | ||
| 569 | void tipc_subscr_stop(void) | 569 | void tipc_subscr_stop(void) |
| 570 | { | 570 | { |
| 571 | struct subscriber *subscriber; | 571 | struct tipc_subscriber *subscriber; |
| 572 | struct subscriber *subscriber_temp; | 572 | struct tipc_subscriber *subscriber_temp; |
| 573 | spinlock_t *subscriber_lock; | 573 | spinlock_t *subscriber_lock; |
| 574 | 574 | ||
| 575 | if (topsrv.setup_port) { | 575 | if (topsrv.setup_port) { |
diff --git a/net/tipc/subscr.h b/net/tipc/subscr.h index 4b06ef6f8401..ef6529c8456f 100644 --- a/net/tipc/subscr.h +++ b/net/tipc/subscr.h | |||
| @@ -37,10 +37,10 @@ | |||
| 37 | #ifndef _TIPC_SUBSCR_H | 37 | #ifndef _TIPC_SUBSCR_H |
| 38 | #define _TIPC_SUBSCR_H | 38 | #define _TIPC_SUBSCR_H |
| 39 | 39 | ||
| 40 | struct subscription; | 40 | struct tipc_subscription; |
| 41 | 41 | ||
| 42 | /** | 42 | /** |
| 43 | * struct subscription - TIPC network topology subscription object | 43 | * struct tipc_subscription - TIPC network topology subscription object |
| 44 | * @seq: name sequence associated with subscription | 44 | * @seq: name sequence associated with subscription |
| 45 | * @timeout: duration of subscription (in ms) | 45 | * @timeout: duration of subscription (in ms) |
| 46 | * @filter: event filtering to be done for subscription | 46 | * @filter: event filtering to be done for subscription |
| @@ -52,7 +52,7 @@ struct subscription; | |||
| 52 | * @evt: template for events generated by subscription | 52 | * @evt: template for events generated by subscription |
| 53 | */ | 53 | */ |
| 54 | 54 | ||
| 55 | struct subscription { | 55 | struct tipc_subscription { |
| 56 | struct tipc_name_seq seq; | 56 | struct tipc_name_seq seq; |
| 57 | u32 timeout; | 57 | u32 timeout; |
| 58 | u32 filter; | 58 | u32 filter; |
| @@ -64,11 +64,11 @@ struct subscription { | |||
| 64 | struct tipc_event evt; | 64 | struct tipc_event evt; |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | int tipc_subscr_overlap(struct subscription *sub, | 67 | int tipc_subscr_overlap(struct tipc_subscription *sub, |
| 68 | u32 found_lower, | 68 | u32 found_lower, |
| 69 | u32 found_upper); | 69 | u32 found_upper); |
| 70 | 70 | ||
| 71 | void tipc_subscr_report_overlap(struct subscription *sub, | 71 | void tipc_subscr_report_overlap(struct tipc_subscription *sub, |
| 72 | u32 found_lower, | 72 | u32 found_lower, |
| 73 | u32 found_upper, | 73 | u32 found_upper, |
| 74 | u32 event, | 74 | u32 event, |
