@@ -147,87 +147,71 @@ int tipc_link_is_active(struct tipc_link *l)
147
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
156
* tipc_link_create - create a new link
152
- * @n_ptr: pointer to associated node
153
- * @b_ptr: pointer to associated bearer
154
- * @media_addr: media address to use when sending messages over link
157
+ * @n: pointer to associated node
158
+ * @b: pointer to associated bearer
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 ,
159
- struct tipc_bearer * b_ptr ,
160
- const struct tipc_media_addr * media_addr ,
161
- struct sk_buff_head * inputq ,
162
- struct sk_buff_head * namedq )
168
+ bool tipc_link_create (struct tipc_node * n , struct tipc_bearer * b , u32 session ,
169
+ u32 ownnode , u32 peer , struct tipc_media_addr * maddr ,
170
+ struct sk_buff_head * inputq , struct sk_buff_head * namedq ,
171
+ struct tipc_link * * link )
163
172
{
164
- struct tipc_net * tn = net_generic (n_ptr -> net , tipc_net_id );
165
- struct tipc_link * l_ptr ;
166
- struct tipc_msg * msg ;
173
+ struct tipc_link * l ;
174
+ struct tipc_msg * hdr ;
167
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 ) {
172
- tipc_addr_string_fill (addr_string , n_ptr -> addr );
173
- pr_err ("Cannot establish %uth link to %s. Max %u allowed.\n" ,
174
- n_ptr -> link_cnt , addr_string , MAX_BEARERS );
175
- return NULL ;
176
- }
177
+ l = kzalloc (sizeof (* l ), GFP_ATOMIC );
178
+ if (!l )
179
+ return false;
180
+ * link = l ;
177
181
178
- if (n_ptr -> links [b_ptr -> identity ].link ) {
179
- tipc_addr_string_fill (addr_string , n_ptr -> addr );
180
- pr_err ("Attempt to establish second link on <%s> to %s\n" ,
181
- b_ptr -> name , addr_string );
182
- return NULL ;
183
- }
182
+ /* Note: peer i/f name is completed by reset/activate message */
183
+ if_name = strchr (b -> name , ':' ) + 1 ;
184
+ sprintf (l -> name , "%u.%u.%u:%s-%u.%u.%u:unknown" ,
185
+ tipc_zone (ownnode ), tipc_cluster (ownnode ), tipc_node (ownnode ),
186
+ if_name , tipc_zone (peer ), tipc_cluster (peer ), tipc_node (peer ));
184
187
185
- l_ptr = kzalloc (sizeof (* l_ptr ), GFP_ATOMIC );
186
- if (!l_ptr ) {
187
- pr_warn ("Link creation failed, no memory\n" );
188
- return NULL ;
189
- }
190
- l_ptr -> addr = peer ;
191
- if_name = strchr (b_ptr -> name , ':' ) + 1 ;
192
- sprintf (l_ptr -> name , "%u.%u.%u:%s-%u.%u.%u:unknown" ,
193
- tipc_zone (tn -> own_addr ), tipc_cluster (tn -> own_addr ),
194
- tipc_node (tn -> own_addr ),
195
- if_name ,
196
- tipc_zone (peer ), tipc_cluster (peer ), tipc_node (peer ));
197
- /* note: peer i/f name is updated by reset/activate message */
198
- memcpy (& l_ptr -> media_addr , media_addr , sizeof (* media_addr ));
199
- l_ptr -> owner = n_ptr ;
200
- l_ptr -> peer_session = WILDCARD_SESSION ;
201
- l_ptr -> bearer_id = b_ptr -> identity ;
202
- l_ptr -> tolerance = b_ptr -> tolerance ;
203
- l_ptr -> snd_nxt = 1 ;
204
- l_ptr -> rcv_nxt = 1 ;
205
- l_ptr -> state = LINK_RESET ;
206
-
207
- l_ptr -> pmsg = (struct tipc_msg * )& l_ptr -> proto_msg ;
208
- msg = l_ptr -> pmsg ;
209
- tipc_msg_init (tn -> own_addr , msg , LINK_PROTOCOL , RESET_MSG , INT_H_SIZE ,
210
- l_ptr -> addr );
211
- msg_set_size (msg , sizeof (l_ptr -> proto_msg ));
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 ;
188
+ l -> addr = peer ;
189
+ l -> media_addr = maddr ;
190
+ l -> owner = n ;
191
+ l -> peer_session = WILDCARD_SESSION ;
192
+ l -> bearer_id = b -> identity ;
193
+ l -> tolerance = b -> tolerance ;
194
+ l -> net_plane = b -> net_plane ;
195
+ l -> advertised_mtu = b -> mtu ;
196
+ l -> mtu = b -> mtu ;
197
+ l -> priority = b -> priority ;
198
+ tipc_link_set_queue_limits (l , b -> window );
199
+ l -> inputq = inputq ;
200
+ l -> namedq = namedq ;
201
+ l -> state = LINK_RESETTING ;
202
+ l -> pmsg = (struct tipc_msg * )& l -> proto_msg ;
203
+ hdr = l -> pmsg ;
204
+ tipc_msg_init (ownnode , hdr , LINK_PROTOCOL , RESET_MSG , INT_H_SIZE , peer );
205
+ msg_set_size (hdr , sizeof (l -> proto_msg ));
206
+ msg_set_session (hdr , session );
207
+ msg_set_bearer_id (hdr , l -> bearer_id );
208
+ strcpy ((char * )msg_data (hdr ), if_name );
209
+ __skb_queue_head_init (& l -> transmq );
210
+ __skb_queue_head_init (& l -> backlogq );
211
+ __skb_queue_head_init (& l -> deferdq );
212
+ skb_queue_head_init (& l -> wakeupq );
213
+ skb_queue_head_init (l -> inputq );
214
+ return true;
231
215
}
232
216
233
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
627
u16 ack = mod (link -> rcv_nxt - 1 );
644
628
u16 seqno = link -> snd_nxt ;
645
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
631
struct sk_buff_head * transmq = & link -> transmq ;
648
632
struct sk_buff_head * backlogq = & link -> backlogq ;
649
633
struct sk_buff * skb , * bskb ;
@@ -809,7 +793,7 @@ void tipc_link_push_packets(struct tipc_link *link)
809
793
link -> rcv_unacked = 0 ;
810
794
__skb_queue_tail (& link -> transmq , skb );
811
795
tipc_bearer_send (link -> owner -> net , link -> bearer_id ,
812
- skb , & link -> media_addr );
796
+ skb , link -> media_addr );
813
797
}
814
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
896
msg_set_ack (msg , mod (l_ptr -> rcv_nxt - 1 ));
913
897
msg_set_bcast_ack (msg , l_ptr -> owner -> bclink .last_in );
914
898
tipc_bearer_send (l_ptr -> owner -> net , l_ptr -> bearer_id , skb ,
915
- & l_ptr -> media_addr );
899
+ l_ptr -> media_addr );
916
900
retransmits -- ;
917
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
1184
skb = __skb_dequeue (& xmitq );
1201
1185
if (!skb )
1202
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
1188
l -> rcv_unacked = 0 ;
1205
1189
kfree_skb (skb );
1206
1190
}
0 commit comments