@@ -147,87 +147,71 @@ int tipc_link_is_active(struct tipc_link *l)
147147 return (node_active_link (n , 0 ) == l ) || (node_active_link (n , 1 ) == l );
148148}
149149
150+ static u32 link_own_addr (struct tipc_link * l )
151+ {
152+ return msg_prevnode (l -> pmsg );
153+ }
154+
150155/**
151156 * 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
155165 *
156- * Returns pointer to link.
166+ * Returns true if link was created, otherwise false
157167 */
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 )
163172{
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 ;
167175 char * if_name ;
168- char addr_string [16 ];
169- u32 peer = n_ptr -> addr ;
170176
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 ;
177181
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 ));
184187
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;
231215}
232216
233217/* 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,
643627 u16 ack = mod (link -> rcv_nxt - 1 );
644628 u16 seqno = link -> snd_nxt ;
645629 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 ;
647631 struct sk_buff_head * transmq = & link -> transmq ;
648632 struct sk_buff_head * backlogq = & link -> backlogq ;
649633 struct sk_buff * skb , * bskb ;
@@ -809,7 +793,7 @@ void tipc_link_push_packets(struct tipc_link *link)
809793 link -> rcv_unacked = 0 ;
810794 __skb_queue_tail (& link -> transmq , skb );
811795 tipc_bearer_send (link -> owner -> net , link -> bearer_id ,
812- skb , & link -> media_addr );
796+ skb , link -> media_addr );
813797 }
814798 link -> snd_nxt = seqno ;
815799}
@@ -912,7 +896,7 @@ void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *skb,
912896 msg_set_ack (msg , mod (l_ptr -> rcv_nxt - 1 ));
913897 msg_set_bcast_ack (msg , l_ptr -> owner -> bclink .last_in );
914898 tipc_bearer_send (l_ptr -> owner -> net , l_ptr -> bearer_id , skb ,
915- & l_ptr -> media_addr );
899+ l_ptr -> media_addr );
916900 retransmits -- ;
917901 l_ptr -> stats .retransmitted ++ ;
918902 }
@@ -1200,7 +1184,7 @@ void tipc_link_proto_xmit(struct tipc_link *l, u32 msg_typ, int probe_msg,
12001184 skb = __skb_dequeue (& xmitq );
12011185 if (!skb )
12021186 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 );
12041188 l -> rcv_unacked = 0 ;
12051189 kfree_skb (skb );
12061190}
0 commit comments