diff options
author | Jon Paul Maloy <jon.maloy@ericsson.com> | 2015-07-30 18:24:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-07-30 20:25:15 -0400 |
commit | 440d8963cd590ec9387d76a36e60c02da9ed944d (patch) | |
tree | 7d1135b020321fd3bd06f9bd6dbc1837380858f8 /net/tipc/link.c | |
parent | 9073fb8be3ee6f89492b8ea8f6d3902913a9fc91 (diff) |
tipc: clean up link creation
We simplify the link creation function tipc_link_create() and the way
the link struct it is connected to the node struct. In particular, we
remove the duplicate initialization of some fields which are anyway set
in tipc_link_reset().
Tested-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r-- | net/tipc/link.c | 136 |
1 files changed, 60 insertions, 76 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c index d683fe9f68c8..f067e5425560 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c | |||
@@ -147,87 +147,71 @@ int tipc_link_is_active(struct tipc_link *l) | |||
147 | return (node_active_link(n, 0) == l) || (node_active_link(n, 1) == l); | 147 | return (node_active_link(n, 0) == l) || (node_active_link(n, 1) == l); |
148 | } | 148 | } |
149 | 149 | ||
150 | static u32 link_own_addr(struct tipc_link *l) | ||
151 | { | ||
152 | return msg_prevnode(l->pmsg); | ||
153 | } | ||
154 | |||
150 | /** | 155 | /** |
151 | * tipc_link_create - create a new link | 156 | * tipc_link_create - create a new link |
152 | * @n_ptr: pointer to associated node | 157 | * @n: pointer to associated node |
153 | * @b_ptr: pointer to associated bearer | 158 | * @b: pointer to associated bearer |
154 | * @media_addr: media address to use when sending messages over link | 159 | * @ownnode: identity of own node |
160 | * @peer: identity of peer node | ||
161 | * @maddr: media address to be used | ||
162 | * @inputq: queue to put messages ready for delivery | ||
163 | * @namedq: queue to put binding table update messages ready for delivery | ||
164 | * @link: return value, pointer to put the created link | ||
155 | * | 165 | * |
156 | * Returns pointer to link. | 166 | * Returns true if link was created, otherwise false |
157 | */ | 167 | */ |
158 | struct tipc_link *tipc_link_create(struct tipc_node *n_ptr, | 168 | bool tipc_link_create(struct tipc_node *n, struct tipc_bearer *b, u32 session, |
159 | struct tipc_bearer *b_ptr, | 169 | u32 ownnode, u32 peer, struct tipc_media_addr *maddr, |
160 | const struct tipc_media_addr *media_addr, | 170 | struct sk_buff_head *inputq, struct sk_buff_head *namedq, |
161 | struct sk_buff_head *inputq, | 171 | struct tipc_link **link) |
162 | struct sk_buff_head *namedq) | ||
163 | { | 172 | { |
164 | struct tipc_net *tn = net_generic(n_ptr->net, tipc_net_id); | 173 | struct tipc_link *l; |
165 | struct tipc_link *l_ptr; | 174 | struct tipc_msg *hdr; |
166 | struct tipc_msg *msg; | ||
167 | char *if_name; | 175 | char *if_name; |
168 | char addr_string[16]; | ||
169 | u32 peer = n_ptr->addr; | ||
170 | 176 | ||
171 | if (n_ptr->link_cnt >= MAX_BEARERS) { | 177 | l = kzalloc(sizeof(*l), GFP_ATOMIC); |
172 | tipc_addr_string_fill(addr_string, n_ptr->addr); | 178 | if (!l) |
173 | pr_err("Cannot establish %uth link to %s. Max %u allowed.\n", | 179 | return false; |
174 | n_ptr->link_cnt, addr_string, MAX_BEARERS); | 180 | *link = l; |
175 | return NULL; | ||
176 | } | ||
177 | 181 | ||
178 | if (n_ptr->links[b_ptr->identity].link) { | 182 | /* Note: peer i/f name is completed by reset/activate message */ |
179 | tipc_addr_string_fill(addr_string, n_ptr->addr); | 183 | if_name = strchr(b->name, ':') + 1; |
180 | pr_err("Attempt to establish second link on <%s> to %s\n", | 184 | sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", |
181 | b_ptr->name, addr_string); | 185 | tipc_zone(ownnode), tipc_cluster(ownnode), tipc_node(ownnode), |
182 | return NULL; | 186 | if_name, tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); |
183 | } | ||
184 | 187 | ||
185 | l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); | 188 | l->addr = peer; |
186 | if (!l_ptr) { | 189 | l->media_addr = maddr; |
187 | pr_warn("Link creation failed, no memory\n"); | 190 | l->owner = n; |
188 | return NULL; | 191 | l->peer_session = WILDCARD_SESSION; |
189 | } | 192 | l->bearer_id = b->identity; |
190 | l_ptr->addr = peer; | 193 | l->tolerance = b->tolerance; |
191 | if_name = strchr(b_ptr->name, ':') + 1; | 194 | l->net_plane = b->net_plane; |
192 | sprintf(l_ptr->name, "%u.%u.%u:%s-%u.%u.%u:unknown", | 195 | l->advertised_mtu = b->mtu; |
193 | tipc_zone(tn->own_addr), tipc_cluster(tn->own_addr), | 196 | l->mtu = b->mtu; |
194 | tipc_node(tn->own_addr), | 197 | l->priority = b->priority; |
195 | if_name, | 198 | tipc_link_set_queue_limits(l, b->window); |
196 | tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); | 199 | l->inputq = inputq; |
197 | /* note: peer i/f name is updated by reset/activate message */ | 200 | l->namedq = namedq; |
198 | memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr)); | 201 | l->state = LINK_RESETTING; |
199 | l_ptr->owner = n_ptr; | 202 | l->pmsg = (struct tipc_msg *)&l->proto_msg; |
200 | l_ptr->peer_session = WILDCARD_SESSION; | 203 | hdr = l->pmsg; |
201 | l_ptr->bearer_id = b_ptr->identity; | 204 | tipc_msg_init(ownnode, hdr, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, peer); |
202 | l_ptr->tolerance = b_ptr->tolerance; | 205 | msg_set_size(hdr, sizeof(l->proto_msg)); |
203 | l_ptr->snd_nxt = 1; | 206 | msg_set_session(hdr, session); |
204 | l_ptr->rcv_nxt = 1; | 207 | msg_set_bearer_id(hdr, l->bearer_id); |
205 | l_ptr->state = LINK_RESET; | 208 | strcpy((char *)msg_data(hdr), if_name); |
206 | 209 | __skb_queue_head_init(&l->transmq); | |
207 | l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg; | 210 | __skb_queue_head_init(&l->backlogq); |
208 | msg = l_ptr->pmsg; | 211 | __skb_queue_head_init(&l->deferdq); |
209 | tipc_msg_init(tn->own_addr, msg, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, | 212 | skb_queue_head_init(&l->wakeupq); |
210 | l_ptr->addr); | 213 | skb_queue_head_init(l->inputq); |
211 | msg_set_size(msg, sizeof(l_ptr->proto_msg)); | 214 | return true; |
212 | msg_set_session(msg, (tn->random & 0xffff)); | ||
213 | msg_set_bearer_id(msg, b_ptr->identity); | ||
214 | strcpy((char *)msg_data(msg), if_name); | ||
215 | l_ptr->net_plane = b_ptr->net_plane; | ||
216 | l_ptr->advertised_mtu = b_ptr->mtu; | ||
217 | l_ptr->mtu = l_ptr->advertised_mtu; | ||
218 | l_ptr->priority = b_ptr->priority; | ||
219 | tipc_link_set_queue_limits(l_ptr, b_ptr->window); | ||
220 | l_ptr->snd_nxt = 1; | ||
221 | __skb_queue_head_init(&l_ptr->transmq); | ||
222 | __skb_queue_head_init(&l_ptr->backlogq); | ||
223 | __skb_queue_head_init(&l_ptr->deferdq); | ||
224 | skb_queue_head_init(&l_ptr->wakeupq); | ||
225 | l_ptr->inputq = inputq; | ||
226 | l_ptr->namedq = namedq; | ||
227 | skb_queue_head_init(l_ptr->inputq); | ||
228 | link_reset_statistics(l_ptr); | ||
229 | tipc_node_attach_link(n_ptr, l_ptr); | ||
230 | return l_ptr; | ||
231 | } | 215 | } |
232 | 216 | ||
233 | /* tipc_link_build_bcast_sync_msg() - synchronize broadcast link endpoints. | 217 | /* tipc_link_build_bcast_sync_msg() - synchronize broadcast link endpoints. |
@@ -643,7 +627,7 @@ int __tipc_link_xmit(struct net *net, struct tipc_link *link, | |||
643 | u16 ack = mod(link->rcv_nxt - 1); | 627 | u16 ack = mod(link->rcv_nxt - 1); |
644 | u16 seqno = link->snd_nxt; | 628 | u16 seqno = link->snd_nxt; |
645 | u16 bc_last_in = link->owner->bclink.last_in; | 629 | u16 bc_last_in = link->owner->bclink.last_in; |
646 | struct tipc_media_addr *addr = &link->media_addr; | 630 | struct tipc_media_addr *addr = link->media_addr; |
647 | struct sk_buff_head *transmq = &link->transmq; | 631 | struct sk_buff_head *transmq = &link->transmq; |
648 | struct sk_buff_head *backlogq = &link->backlogq; | 632 | struct sk_buff_head *backlogq = &link->backlogq; |
649 | struct sk_buff *skb, *bskb; | 633 | struct sk_buff *skb, *bskb; |
@@ -809,7 +793,7 @@ void tipc_link_push_packets(struct tipc_link *link) | |||
809 | link->rcv_unacked = 0; | 793 | link->rcv_unacked = 0; |
810 | __skb_queue_tail(&link->transmq, skb); | 794 | __skb_queue_tail(&link->transmq, skb); |
811 | tipc_bearer_send(link->owner->net, link->bearer_id, | 795 | tipc_bearer_send(link->owner->net, link->bearer_id, |
812 | skb, &link->media_addr); | 796 | skb, link->media_addr); |
813 | } | 797 | } |
814 | link->snd_nxt = seqno; | 798 | link->snd_nxt = seqno; |
815 | } | 799 | } |
@@ -912,7 +896,7 @@ void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *skb, | |||
912 | msg_set_ack(msg, mod(l_ptr->rcv_nxt - 1)); | 896 | msg_set_ack(msg, mod(l_ptr->rcv_nxt - 1)); |
913 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); | 897 | msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); |
914 | tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, skb, | 898 | tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, skb, |
915 | &l_ptr->media_addr); | 899 | l_ptr->media_addr); |
916 | retransmits--; | 900 | retransmits--; |
917 | l_ptr->stats.retransmitted++; | 901 | l_ptr->stats.retransmitted++; |
918 | } | 902 | } |
@@ -1200,7 +1184,7 @@ void tipc_link_proto_xmit(struct tipc_link *l, u32 msg_typ, int probe_msg, | |||
1200 | skb = __skb_dequeue(&xmitq); | 1184 | skb = __skb_dequeue(&xmitq); |
1201 | if (!skb) | 1185 | if (!skb) |
1202 | return; | 1186 | return; |
1203 | tipc_bearer_send(l->owner->net, l->bearer_id, skb, &l->media_addr); | 1187 | tipc_bearer_send(l->owner->net, l->bearer_id, skb, l->media_addr); |
1204 | l->rcv_unacked = 0; | 1188 | l->rcv_unacked = 0; |
1205 | kfree_skb(skb); | 1189 | kfree_skb(skb); |
1206 | } | 1190 | } |