1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
5 * Author: Zach Brown <zab@zabbo.net>
6 * Author: Peter J. Braam <braam@clusterfs.com>
7 * Author: Phil Schwan <phil@clusterfs.com>
8 * Author: Eric Barton <eric@bartonsoftware.com>
10 * This file is part of Portals, http://www.sf.net/projects/sandiaportals/
12 * Portals is free software; you can redistribute it and/or
13 * modify it under the terms of version 2 of the GNU General Public
14 * License as published by the Free Software Foundation.
16 * Portals is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with Portals; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 lnd_t the_ksocklnd = {
30 .lnd_startup = ksocknal_startup,
31 .lnd_shutdown = ksocknal_shutdown,
32 .lnd_ctl = ksocknal_ctl,
33 .lnd_send = ksocknal_send,
34 .lnd_recv = ksocknal_recv,
35 .lnd_notify = ksocknal_notify,
36 .lnd_accept = ksocknal_accept,
39 ksock_nal_data_t ksocknal_data;
42 ksocknal_ip2iface(lnet_ni_t *ni, __u32 ip)
44 ksock_net_t *net = ni->ni_data;
46 ksock_interface_t *iface;
48 for (i = 0; i < net->ksnn_ninterfaces; i++) {
49 LASSERT(i < LNET_MAX_INTERFACES);
50 iface = &net->ksnn_interfaces[i];
52 if (iface->ksni_ipaddr == ip)
60 ksocknal_create_route (__u32 ipaddr, int port)
64 LIBCFS_ALLOC (route, sizeof (*route));
68 atomic_set (&route->ksnr_refcount, 1);
69 route->ksnr_peer = NULL;
70 route->ksnr_retry_interval = 0; /* OK to connect at any time */
71 route->ksnr_ipaddr = ipaddr;
72 route->ksnr_port = port;
73 route->ksnr_scheduled = 0;
74 route->ksnr_connecting = 0;
75 route->ksnr_connected = 0;
76 route->ksnr_deleted = 0;
77 route->ksnr_conn_count = 0;
78 route->ksnr_share_count = 0;
84 ksocknal_destroy_route (ksock_route_t *route)
86 LASSERT (atomic_read(&route->ksnr_refcount) == 0);
88 if (route->ksnr_peer != NULL)
89 ksocknal_peer_decref(route->ksnr_peer);
91 LIBCFS_FREE (route, sizeof (*route));
95 ksocknal_create_peer (ksock_peer_t **peerp, lnet_ni_t *ni, lnet_process_id_t id)
97 ksock_net_t *net = ni->ni_data;
100 LASSERT (id.nid != LNET_NID_ANY);
101 LASSERT (id.pid != LNET_PID_ANY);
102 LASSERT (!in_interrupt());
104 LIBCFS_ALLOC (peer, sizeof (*peer));
108 memset (peer, 0, sizeof (*peer)); /* NULL pointers/clear flags etc */
112 atomic_set (&peer->ksnp_refcount, 1); /* 1 ref for caller */
113 peer->ksnp_closing = 0;
114 peer->ksnp_accepting = 0;
115 peer->ksnp_zc_next_cookie = 1;
116 peer->ksnp_proto = NULL;
117 CFS_INIT_LIST_HEAD (&peer->ksnp_conns);
118 CFS_INIT_LIST_HEAD (&peer->ksnp_routes);
119 CFS_INIT_LIST_HEAD (&peer->ksnp_tx_queue);
120 CFS_INIT_LIST_HEAD (&peer->ksnp_zc_req_list);
121 spin_lock_init(&peer->ksnp_lock);
123 spin_lock_bh (&net->ksnn_lock);
125 if (net->ksnn_shutdown) {
126 spin_unlock_bh (&net->ksnn_lock);
128 LIBCFS_FREE(peer, sizeof(*peer));
129 CERROR("Can't create peer: network shutdown\n");
135 spin_unlock_bh (&net->ksnn_lock);
142 ksocknal_destroy_peer (ksock_peer_t *peer)
144 ksock_net_t *net = peer->ksnp_ni->ni_data;
146 CDEBUG (D_NET, "peer %s %p deleted\n",
147 libcfs_id2str(peer->ksnp_id), peer);
149 LASSERT (atomic_read (&peer->ksnp_refcount) == 0);
150 LASSERT (peer->ksnp_accepting == 0);
151 LASSERT (list_empty (&peer->ksnp_conns));
152 LASSERT (list_empty (&peer->ksnp_routes));
153 LASSERT (list_empty (&peer->ksnp_tx_queue));
154 LASSERT (list_empty (&peer->ksnp_zc_req_list));
156 LIBCFS_FREE (peer, sizeof (*peer));
158 /* NB a peer's connections and routes keep a reference on their peer
159 * until they are destroyed, so we can be assured that _all_ state to
160 * do with this peer has been cleaned up when its refcount drops to
162 spin_lock_bh (&net->ksnn_lock);
164 spin_unlock_bh (&net->ksnn_lock);
168 ksocknal_find_peer_locked (lnet_ni_t *ni, lnet_process_id_t id)
170 struct list_head *peer_list = ksocknal_nid2peerlist(id.nid);
171 struct list_head *tmp;
174 list_for_each (tmp, peer_list) {
176 peer = list_entry (tmp, ksock_peer_t, ksnp_list);
178 LASSERT (!peer->ksnp_closing);
180 if (peer->ksnp_ni != ni)
183 if (peer->ksnp_id.nid != id.nid ||
184 peer->ksnp_id.pid != id.pid)
187 CDEBUG(D_NET, "got peer [%p] -> %s (%d)\n",
188 peer, libcfs_id2str(id),
189 atomic_read(&peer->ksnp_refcount));
196 ksocknal_find_peer (lnet_ni_t *ni, lnet_process_id_t id)
200 read_lock (&ksocknal_data.ksnd_global_lock);
201 peer = ksocknal_find_peer_locked (ni, id);
202 if (peer != NULL) /* +1 ref for caller? */
203 ksocknal_peer_addref(peer);
204 read_unlock (&ksocknal_data.ksnd_global_lock);
210 ksocknal_unlink_peer_locked (ksock_peer_t *peer)
214 ksock_interface_t *iface;
216 for (i = 0; i < peer->ksnp_n_passive_ips; i++) {
217 LASSERT (i < LNET_MAX_INTERFACES);
218 ip = peer->ksnp_passive_ips[i];
220 iface = ksocknal_ip2iface(peer->ksnp_ni, ip);
221 /* All IPs in peer->ksnp_passive_ips[] come from the
222 * interface list, therefore the call must succeed. */
223 LASSERT (iface != NULL);
225 CDEBUG(D_NET, "peer=%p iface=%p ksni_nroutes=%d\n",
226 peer, iface, iface->ksni_nroutes);
227 iface->ksni_npeers--;
230 LASSERT (list_empty(&peer->ksnp_conns));
231 LASSERT (list_empty(&peer->ksnp_routes));
232 LASSERT (!peer->ksnp_closing);
233 peer->ksnp_closing = 1;
234 list_del (&peer->ksnp_list);
235 /* lose peerlist's ref */
236 ksocknal_peer_decref(peer);
240 ksocknal_get_peer_info (lnet_ni_t *ni, int index,
241 lnet_process_id_t *id, __u32 *myip, __u32 *peer_ip, int *port,
242 int *conn_count, int *share_count)
245 struct list_head *ptmp;
246 ksock_route_t *route;
247 struct list_head *rtmp;
252 read_lock (&ksocknal_data.ksnd_global_lock);
254 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
256 list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) {
257 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
259 if (peer->ksnp_ni != ni)
262 if (peer->ksnp_n_passive_ips == 0 &&
263 list_empty(&peer->ksnp_routes)) {
277 for (j = 0; j < peer->ksnp_n_passive_ips; j++) {
282 *myip = peer->ksnp_passive_ips[j];
291 list_for_each (rtmp, &peer->ksnp_routes) {
295 route = list_entry(rtmp, ksock_route_t,
299 *myip = route->ksnr_myipaddr;
300 *peer_ip = route->ksnr_ipaddr;
301 *port = route->ksnr_port;
302 *conn_count = route->ksnr_conn_count;
303 *share_count = route->ksnr_share_count;
310 read_unlock (&ksocknal_data.ksnd_global_lock);
315 ksocknal_associate_route_conn_locked(ksock_route_t *route, ksock_conn_t *conn)
317 ksock_peer_t *peer = route->ksnr_peer;
318 int type = conn->ksnc_type;
319 ksock_interface_t *iface;
321 conn->ksnc_route = route;
322 ksocknal_route_addref(route);
324 if (route->ksnr_myipaddr != conn->ksnc_myipaddr) {
325 if (route->ksnr_myipaddr == 0) {
326 /* route wasn't bound locally yet (the initial route) */
327 CDEBUG(D_NET, "Binding %s %u.%u.%u.%u to %u.%u.%u.%u\n",
328 libcfs_id2str(peer->ksnp_id),
329 HIPQUAD(route->ksnr_ipaddr),
330 HIPQUAD(conn->ksnc_myipaddr));
332 CDEBUG(D_NET, "Rebinding %s %u.%u.%u.%u from "
333 "%u.%u.%u.%u to %u.%u.%u.%u\n",
334 libcfs_id2str(peer->ksnp_id),
335 HIPQUAD(route->ksnr_ipaddr),
336 HIPQUAD(route->ksnr_myipaddr),
337 HIPQUAD(conn->ksnc_myipaddr));
339 iface = ksocknal_ip2iface(route->ksnr_peer->ksnp_ni,
340 route->ksnr_myipaddr);
342 iface->ksni_nroutes--;
344 route->ksnr_myipaddr = conn->ksnc_myipaddr;
345 iface = ksocknal_ip2iface(route->ksnr_peer->ksnp_ni,
346 route->ksnr_myipaddr);
348 iface->ksni_nroutes++;
351 route->ksnr_connected |= (1<<type);
352 route->ksnr_conn_count++;
354 /* Successful connection => further attempts can
355 * proceed immediately */
356 route->ksnr_retry_interval = 0;
360 ksocknal_add_route_locked (ksock_peer_t *peer, ksock_route_t *route)
362 struct list_head *tmp;
364 ksock_route_t *route2;
366 LASSERT (!peer->ksnp_closing);
367 LASSERT (route->ksnr_peer == NULL);
368 LASSERT (!route->ksnr_scheduled);
369 LASSERT (!route->ksnr_connecting);
370 LASSERT (route->ksnr_connected == 0);
372 /* LASSERT(unique) */
373 list_for_each(tmp, &peer->ksnp_routes) {
374 route2 = list_entry(tmp, ksock_route_t, ksnr_list);
376 if (route2->ksnr_ipaddr == route->ksnr_ipaddr) {
377 CERROR ("Duplicate route %s %u.%u.%u.%u\n",
378 libcfs_id2str(peer->ksnp_id),
379 HIPQUAD(route->ksnr_ipaddr));
384 route->ksnr_peer = peer;
385 ksocknal_peer_addref(peer);
386 /* peer's routelist takes over my ref on 'route' */
387 list_add_tail(&route->ksnr_list, &peer->ksnp_routes);
389 list_for_each(tmp, &peer->ksnp_conns) {
390 conn = list_entry(tmp, ksock_conn_t, ksnc_list);
392 if (conn->ksnc_ipaddr != route->ksnr_ipaddr)
395 ksocknal_associate_route_conn_locked(route, conn);
396 /* keep going (typed routes) */
401 ksocknal_del_route_locked (ksock_route_t *route)
403 ksock_peer_t *peer = route->ksnr_peer;
404 ksock_interface_t *iface;
406 struct list_head *ctmp;
407 struct list_head *cnxt;
409 LASSERT (!route->ksnr_deleted);
411 /* Close associated conns */
412 list_for_each_safe (ctmp, cnxt, &peer->ksnp_conns) {
413 conn = list_entry(ctmp, ksock_conn_t, ksnc_list);
415 if (conn->ksnc_route != route)
418 ksocknal_close_conn_locked (conn, 0);
421 if (route->ksnr_myipaddr != 0) {
422 iface = ksocknal_ip2iface(route->ksnr_peer->ksnp_ni,
423 route->ksnr_myipaddr);
425 iface->ksni_nroutes--;
428 route->ksnr_deleted = 1;
429 list_del (&route->ksnr_list);
430 ksocknal_route_decref(route); /* drop peer's ref */
432 if (list_empty (&peer->ksnp_routes) &&
433 list_empty (&peer->ksnp_conns)) {
434 /* I've just removed the last route to a peer with no active
436 ksocknal_unlink_peer_locked (peer);
441 ksocknal_add_peer (lnet_ni_t *ni, lnet_process_id_t id, __u32 ipaddr, int port)
443 struct list_head *tmp;
446 ksock_route_t *route;
447 ksock_route_t *route2;
450 if (id.nid == LNET_NID_ANY ||
451 id.pid == LNET_PID_ANY)
454 /* Have a brand new peer ready... */
455 rc = ksocknal_create_peer(&peer, ni, id);
459 route = ksocknal_create_route (ipaddr, port);
461 ksocknal_peer_decref(peer);
465 write_lock_bh (&ksocknal_data.ksnd_global_lock);
467 /* always called with a ref on ni, so shutdown can't have started */
468 LASSERT (((ksock_net_t *) ni->ni_data)->ksnn_shutdown == 0);
470 peer2 = ksocknal_find_peer_locked (ni, id);
472 ksocknal_peer_decref(peer);
475 /* peer table takes my ref on peer */
476 list_add_tail (&peer->ksnp_list,
477 ksocknal_nid2peerlist (id.nid));
481 list_for_each (tmp, &peer->ksnp_routes) {
482 route2 = list_entry(tmp, ksock_route_t, ksnr_list);
484 if (route2->ksnr_ipaddr == ipaddr)
489 if (route2 == NULL) {
490 ksocknal_add_route_locked(peer, route);
491 route->ksnr_share_count++;
493 ksocknal_route_decref(route);
494 route2->ksnr_share_count++;
497 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
503 ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip)
506 ksock_route_t *route;
507 struct list_head *tmp;
508 struct list_head *nxt;
511 LASSERT (!peer->ksnp_closing);
513 /* Extra ref prevents peer disappearing until I'm done with it */
514 ksocknal_peer_addref(peer);
516 list_for_each_safe (tmp, nxt, &peer->ksnp_routes) {
517 route = list_entry(tmp, ksock_route_t, ksnr_list);
520 if (!(ip == 0 || route->ksnr_ipaddr == ip))
523 route->ksnr_share_count = 0;
524 /* This deletes associated conns too */
525 ksocknal_del_route_locked (route);
529 list_for_each_safe (tmp, nxt, &peer->ksnp_routes) {
530 route = list_entry(tmp, ksock_route_t, ksnr_list);
531 nshared += route->ksnr_share_count;
535 /* remove everything else if there are no explicit entries
538 list_for_each_safe (tmp, nxt, &peer->ksnp_routes) {
539 route = list_entry(tmp, ksock_route_t, ksnr_list);
541 /* we should only be removing auto-entries */
542 LASSERT(route->ksnr_share_count == 0);
543 ksocknal_del_route_locked (route);
546 list_for_each_safe (tmp, nxt, &peer->ksnp_conns) {
547 conn = list_entry(tmp, ksock_conn_t, ksnc_list);
549 ksocknal_close_conn_locked(conn, 0);
553 ksocknal_peer_decref(peer);
554 /* NB peer unlinks itself when last conn/route is removed */
558 ksocknal_del_peer (lnet_ni_t *ni, lnet_process_id_t id, __u32 ip)
560 CFS_LIST_HEAD (zombies);
561 struct list_head *ptmp;
562 struct list_head *pnxt;
569 write_lock_bh (&ksocknal_data.ksnd_global_lock);
571 if (id.nid != LNET_NID_ANY)
572 lo = hi = ksocknal_nid2peerlist(id.nid) - ksocknal_data.ksnd_peers;
575 hi = ksocknal_data.ksnd_peer_hash_size - 1;
578 for (i = lo; i <= hi; i++) {
579 list_for_each_safe (ptmp, pnxt, &ksocknal_data.ksnd_peers[i]) {
580 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
582 if (peer->ksnp_ni != ni)
585 if (!((id.nid == LNET_NID_ANY || peer->ksnp_id.nid == id.nid) &&
586 (id.pid == LNET_PID_ANY || peer->ksnp_id.pid == id.pid)))
589 ksocknal_peer_addref(peer); /* a ref for me... */
591 ksocknal_del_peer_locked (peer, ip);
593 if (peer->ksnp_closing && !list_empty(&peer->ksnp_tx_queue)) {
594 LASSERT (list_empty(&peer->ksnp_conns));
595 LASSERT (list_empty(&peer->ksnp_routes));
597 list_splice_init(&peer->ksnp_tx_queue, &zombies);
600 ksocknal_peer_decref(peer); /* ...till here */
602 rc = 0; /* matched! */
606 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
608 ksocknal_txlist_done(ni, &zombies, 1);
614 ksocknal_get_conn_by_idx (lnet_ni_t *ni, int index)
617 struct list_head *ptmp;
619 struct list_head *ctmp;
622 read_lock (&ksocknal_data.ksnd_global_lock);
624 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
625 list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) {
626 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
628 LASSERT (!peer->ksnp_closing);
630 if (peer->ksnp_ni != ni)
633 list_for_each (ctmp, &peer->ksnp_conns) {
637 conn = list_entry (ctmp, ksock_conn_t, ksnc_list);
638 ksocknal_conn_addref(conn);
639 read_unlock (&ksocknal_data.ksnd_global_lock);
645 read_unlock (&ksocknal_data.ksnd_global_lock);
650 ksocknal_choose_scheduler_locked (unsigned int irq)
652 ksock_sched_t *sched;
653 ksock_irqinfo_t *info;
656 LASSERT (irq < NR_IRQS);
657 info = &ksocknal_data.ksnd_irqinfo[irq];
659 if (irq != 0 && /* hardware NIC */
660 info->ksni_valid) { /* already set up */
661 return (&ksocknal_data.ksnd_schedulers[info->ksni_sched]);
664 /* software NIC (irq == 0) || not associated with a scheduler yet.
665 * Choose the CPU with the fewest connections... */
666 sched = &ksocknal_data.ksnd_schedulers[0];
667 for (i = 1; i < ksocknal_data.ksnd_nschedulers; i++)
668 if (sched->kss_nconns >
669 ksocknal_data.ksnd_schedulers[i].kss_nconns)
670 sched = &ksocknal_data.ksnd_schedulers[i];
672 if (irq != 0) { /* Hardware NIC */
673 info->ksni_valid = 1;
674 info->ksni_sched = sched - ksocknal_data.ksnd_schedulers;
677 LASSERT (info->ksni_sched == sched - ksocknal_data.ksnd_schedulers);
684 ksocknal_local_ipvec (lnet_ni_t *ni, __u32 *ipaddrs)
686 ksock_net_t *net = ni->ni_data;
690 read_lock (&ksocknal_data.ksnd_global_lock);
692 nip = net->ksnn_ninterfaces;
693 LASSERT (nip <= LNET_MAX_INTERFACES);
695 /* Only offer interfaces for additional connections if I have
698 read_unlock (&ksocknal_data.ksnd_global_lock);
702 for (i = 0; i < nip; i++) {
703 ipaddrs[i] = net->ksnn_interfaces[i].ksni_ipaddr;
704 LASSERT (ipaddrs[i] != 0);
707 read_unlock (&ksocknal_data.ksnd_global_lock);
712 ksocknal_match_peerip (ksock_interface_t *iface, __u32 *ips, int nips)
714 int best_netmatch = 0;
721 for (i = 0; i < nips; i++) {
725 this_xor = (ips[i] ^ iface->ksni_ipaddr);
726 this_netmatch = ((this_xor & iface->ksni_netmask) == 0) ? 1 : 0;
729 best_netmatch < this_netmatch ||
730 (best_netmatch == this_netmatch &&
731 best_xor > this_xor)))
735 best_netmatch = this_netmatch;
744 ksocknal_select_ips(ksock_peer_t *peer, __u32 *peerips, int n_peerips)
746 rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock;
747 ksock_net_t *net = peer->ksnp_ni->ni_data;
748 ksock_interface_t *iface;
749 ksock_interface_t *best_iface;
760 /* CAVEAT EMPTOR: We do all our interface matching with an
761 * exclusive hold of global lock at IRQ priority. We're only
762 * expecting to be dealing with small numbers of interfaces, so the
763 * O(n**3)-ness shouldn't matter */
765 /* Also note that I'm not going to return more than n_peerips
766 * interfaces, even if I have more myself */
768 write_lock_bh (global_lock);
770 LASSERT (n_peerips <= LNET_MAX_INTERFACES);
771 LASSERT (net->ksnn_ninterfaces <= LNET_MAX_INTERFACES);
773 /* Only match interfaces for additional connections
774 * if I have > 1 interface */
775 n_ips = (net->ksnn_ninterfaces < 2) ? 0 :
776 MIN(n_peerips, net->ksnn_ninterfaces);
778 for (i = 0; peer->ksnp_n_passive_ips < n_ips; i++) {
779 /* ^ yes really... */
781 /* If we have any new interfaces, first tick off all the
782 * peer IPs that match old interfaces, then choose new
783 * interfaces to match the remaining peer IPS.
784 * We don't forget interfaces we've stopped using; we might
785 * start using them again... */
787 if (i < peer->ksnp_n_passive_ips) {
789 ip = peer->ksnp_passive_ips[i];
790 best_iface = ksocknal_ip2iface(peer->ksnp_ni, ip);
792 /* peer passive ips are kept up to date */
793 LASSERT(best_iface != NULL);
795 /* choose a new interface */
796 LASSERT (i == peer->ksnp_n_passive_ips);
802 for (j = 0; j < net->ksnn_ninterfaces; j++) {
803 iface = &net->ksnn_interfaces[j];
804 ip = iface->ksni_ipaddr;
806 for (k = 0; k < peer->ksnp_n_passive_ips; k++)
807 if (peer->ksnp_passive_ips[k] == ip)
810 if (k < peer->ksnp_n_passive_ips) /* using it already */
813 k = ksocknal_match_peerip(iface, peerips, n_peerips);
814 xor = (ip ^ peerips[k]);
815 this_netmatch = ((xor & iface->ksni_netmask) == 0) ? 1 : 0;
817 if (!(best_iface == NULL ||
818 best_netmatch < this_netmatch ||
819 (best_netmatch == this_netmatch &&
820 best_npeers > iface->ksni_npeers)))
824 best_netmatch = this_netmatch;
825 best_npeers = iface->ksni_npeers;
828 best_iface->ksni_npeers++;
829 ip = best_iface->ksni_ipaddr;
830 peer->ksnp_passive_ips[i] = ip;
831 peer->ksnp_n_passive_ips = i+1;
834 LASSERT (best_iface != NULL);
836 /* mark the best matching peer IP used */
837 j = ksocknal_match_peerip(best_iface, peerips, n_peerips);
841 /* Overwrite input peer IP addresses */
842 memcpy(peerips, peer->ksnp_passive_ips, n_ips * sizeof(*peerips));
844 write_unlock_bh (global_lock);
850 ksocknal_create_routes(ksock_peer_t *peer, int port,
851 __u32 *peer_ipaddrs, int npeer_ipaddrs)
853 ksock_route_t *newroute = NULL;
854 rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock;
855 lnet_ni_t *ni = peer->ksnp_ni;
856 ksock_net_t *net = ni->ni_data;
857 struct list_head *rtmp;
858 ksock_route_t *route;
859 ksock_interface_t *iface;
860 ksock_interface_t *best_iface;
867 /* CAVEAT EMPTOR: We do all our interface matching with an
868 * exclusive hold of global lock at IRQ priority. We're only
869 * expecting to be dealing with small numbers of interfaces, so the
870 * O(n**3)-ness here shouldn't matter */
872 write_lock_bh (global_lock);
874 if (net->ksnn_ninterfaces < 2) {
875 /* Only create additional connections
876 * if I have > 1 interface */
877 write_unlock_bh (global_lock);
881 LASSERT (npeer_ipaddrs <= LNET_MAX_INTERFACES);
883 for (i = 0; i < npeer_ipaddrs; i++) {
884 if (newroute != NULL) {
885 newroute->ksnr_ipaddr = peer_ipaddrs[i];
887 write_unlock_bh (global_lock);
889 newroute = ksocknal_create_route(peer_ipaddrs[i], port);
890 if (newroute == NULL)
893 write_lock_bh (global_lock);
896 if (peer->ksnp_closing) {
897 /* peer got closed under me */
901 /* Already got a route? */
903 list_for_each(rtmp, &peer->ksnp_routes) {
904 route = list_entry(rtmp, ksock_route_t, ksnr_list);
906 if (route->ksnr_ipaddr == newroute->ksnr_ipaddr)
918 LASSERT (net->ksnn_ninterfaces <= LNET_MAX_INTERFACES);
920 /* Select interface to connect from */
921 for (j = 0; j < net->ksnn_ninterfaces; j++) {
922 iface = &net->ksnn_interfaces[j];
924 /* Using this interface already? */
925 list_for_each(rtmp, &peer->ksnp_routes) {
926 route = list_entry(rtmp, ksock_route_t, ksnr_list);
928 if (route->ksnr_myipaddr == iface->ksni_ipaddr)
936 this_netmatch = (((iface->ksni_ipaddr ^
937 newroute->ksnr_ipaddr) &
938 iface->ksni_netmask) == 0) ? 1 : 0;
940 if (!(best_iface == NULL ||
941 best_netmatch < this_netmatch ||
942 (best_netmatch == this_netmatch &&
943 best_nroutes > iface->ksni_nroutes)))
947 best_netmatch = this_netmatch;
948 best_nroutes = iface->ksni_nroutes;
951 if (best_iface == NULL)
954 newroute->ksnr_myipaddr = best_iface->ksni_ipaddr;
955 best_iface->ksni_nroutes++;
957 ksocknal_add_route_locked(peer, newroute);
961 write_unlock_bh (global_lock);
962 if (newroute != NULL)
963 ksocknal_route_decref(newroute);
967 ksocknal_accept (lnet_ni_t *ni, cfs_socket_t *sock)
974 rc = libcfs_sock_getaddr(sock, 1, &peer_ip, &peer_port);
975 LASSERT (rc == 0); /* we succeeded before */
977 LIBCFS_ALLOC(cr, sizeof(*cr));
979 LCONSOLE_ERROR_MSG(0x12f, "Dropping connection request from "
980 "%u.%u.%u.%u: memory exhausted\n",
987 cr->ksncr_sock = sock;
989 spin_lock_bh (&ksocknal_data.ksnd_connd_lock);
991 list_add_tail(&cr->ksncr_list, &ksocknal_data.ksnd_connd_connreqs);
992 cfs_waitq_signal(&ksocknal_data.ksnd_connd_waitq);
994 spin_unlock_bh (&ksocknal_data.ksnd_connd_lock);
999 ksocknal_connecting (ksock_peer_t *peer, __u32 ipaddr)
1001 ksock_route_t *route;
1003 list_for_each_entry (route, &peer->ksnp_routes, ksnr_list) {
1005 if (route->ksnr_ipaddr == ipaddr)
1006 return route->ksnr_connecting;
1012 ksocknal_create_conn (lnet_ni_t *ni, ksock_route_t *route,
1013 cfs_socket_t *sock, int type)
1015 rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock;
1016 CFS_LIST_HEAD (zombies);
1017 lnet_process_id_t peerid;
1018 struct list_head *tmp;
1021 ksock_conn_t *conn2;
1022 ksock_peer_t *peer = NULL;
1023 ksock_peer_t *peer2;
1024 ksock_sched_t *sched;
1025 ksock_hello_msg_t *hello;
1032 active = (route != NULL);
1034 LASSERT (active == (type != SOCKLND_CONN_NONE));
1036 irq = ksocknal_lib_sock_irq (sock);
1038 LIBCFS_ALLOC(conn, sizeof(*conn));
1044 memset (conn, 0, sizeof (*conn));
1045 conn->ksnc_peer = NULL;
1046 conn->ksnc_route = NULL;
1047 conn->ksnc_sock = sock;
1048 /* 2 ref, 1 for conn, another extra ref prevents socket
1049 * being closed before establishment of connection */
1050 atomic_set (&conn->ksnc_sock_refcount, 2);
1051 conn->ksnc_type = type;
1052 ksocknal_lib_save_callback(sock, conn);
1053 atomic_set (&conn->ksnc_conn_refcount, 1); /* 1 ref for me */
1055 conn->ksnc_zc_capable = ksocknal_lib_zc_capable(sock);
1056 conn->ksnc_rx_ready = 0;
1057 conn->ksnc_rx_scheduled = 0;
1059 CFS_INIT_LIST_HEAD (&conn->ksnc_tx_queue);
1060 conn->ksnc_tx_ready = 0;
1061 conn->ksnc_tx_scheduled = 0;
1062 conn->ksnc_tx_mono = NULL;
1063 atomic_set (&conn->ksnc_tx_nob, 0);
1065 LIBCFS_ALLOC(hello, offsetof(ksock_hello_msg_t,
1066 kshm_ips[LNET_MAX_INTERFACES]));
1067 if (hello == NULL) {
1072 /* stash conn's local and remote addrs */
1073 rc = ksocknal_lib_get_conn_addrs (conn);
1077 /* Find out/confirm peer's NID and connection type and get the
1078 * vector of interfaces she's willing to let me connect to.
1079 * Passive connections use the listener timeout since the peer sends
1083 peer = route->ksnr_peer;
1084 LASSERT(ni == peer->ksnp_ni);
1086 /* Active connection sends HELLO eagerly */
1087 hello->kshm_nips = ksocknal_local_ipvec(ni, hello->kshm_ips);
1088 peerid = peer->ksnp_id;
1090 write_lock_bh(global_lock);
1091 conn->ksnc_proto = peer->ksnp_proto;
1092 write_unlock_bh(global_lock);
1094 if (conn->ksnc_proto == NULL) {
1095 conn->ksnc_proto = &ksocknal_protocol_v2x;
1096 #if SOCKNAL_VERSION_DEBUG
1097 if (*ksocknal_tunables.ksnd_protocol != 2)
1098 conn->ksnc_proto = &ksocknal_protocol_v1x;
1102 rc = ksocknal_send_hello (ni, conn, peerid.nid, hello);
1106 peerid.nid = LNET_NID_ANY;
1107 peerid.pid = LNET_PID_ANY;
1109 /* Passive, get protocol from peer */
1110 conn->ksnc_proto = NULL;
1113 rc = ksocknal_recv_hello (ni, conn, hello, &peerid, &incarnation);
1117 LASSERT (rc == 0 || active);
1118 LASSERT (conn->ksnc_proto != NULL);
1119 LASSERT (peerid.nid != LNET_NID_ANY);
1122 ksocknal_peer_addref(peer);
1123 write_lock_bh (global_lock);
1125 rc = ksocknal_create_peer(&peer, ni, peerid);
1129 write_lock_bh (global_lock);
1131 /* called with a ref on ni, so shutdown can't have started */
1132 LASSERT (((ksock_net_t *) ni->ni_data)->ksnn_shutdown == 0);
1134 peer2 = ksocknal_find_peer_locked(ni, peerid);
1135 if (peer2 == NULL) {
1136 /* NB this puts an "empty" peer in the peer
1137 * table (which takes my ref) */
1138 list_add_tail(&peer->ksnp_list,
1139 ksocknal_nid2peerlist(peerid.nid));
1141 ksocknal_peer_decref(peer);
1146 ksocknal_peer_addref(peer);
1147 peer->ksnp_accepting++;
1149 /* Am I already connecting to this guy? Resolve in
1150 * favour of higher NID... */
1151 if (peerid.nid < ni->ni_nid &&
1152 ksocknal_connecting(peer, conn->ksnc_ipaddr)) {
1154 warn = "connection race resolution";
1159 if (peer->ksnp_closing ||
1160 (active && route->ksnr_deleted)) {
1161 /* peer/route got closed under me */
1163 warn = "peer/route removed";
1167 if (peer->ksnp_proto == NULL) {
1168 /* Never connected before.
1169 * NB recv_hello may have returned EPROTO to signal my peer
1170 * wants a different protocol than the one I asked for.
1172 LASSERT (list_empty(&peer->ksnp_conns));
1174 peer->ksnp_proto = conn->ksnc_proto;
1175 peer->ksnp_incarnation = incarnation;
1178 if (peer->ksnp_proto != conn->ksnc_proto ||
1179 peer->ksnp_incarnation != incarnation) {
1180 /* Peer rebooted or I've got the wrong protocol version */
1181 ksocknal_close_peer_conns_locked(peer, 0, 0);
1183 peer->ksnp_proto = NULL;
1185 warn = peer->ksnp_incarnation != incarnation ?
1187 "wrong proto version";
1197 warn = "lost conn race";
1200 warn = "retry with different protocol version";
1204 /* Refuse to duplicate an existing connection, unless this is a
1205 * loopback connection */
1206 if (conn->ksnc_ipaddr != conn->ksnc_myipaddr) {
1207 list_for_each(tmp, &peer->ksnp_conns) {
1208 conn2 = list_entry(tmp, ksock_conn_t, ksnc_list);
1210 if (conn2->ksnc_ipaddr != conn->ksnc_ipaddr ||
1211 conn2->ksnc_myipaddr != conn->ksnc_myipaddr ||
1212 conn2->ksnc_type != conn->ksnc_type)
1215 /* Reply on a passive connection attempt so the peer
1216 * realises we're connected. */
1226 /* If the connection created by this route didn't bind to the IP
1227 * address the route connected to, the connection/route matching
1228 * code below probably isn't going to work. */
1230 route->ksnr_ipaddr != conn->ksnc_ipaddr) {
1231 CERROR("Route %s %u.%u.%u.%u connected to %u.%u.%u.%u\n",
1232 libcfs_id2str(peer->ksnp_id),
1233 HIPQUAD(route->ksnr_ipaddr),
1234 HIPQUAD(conn->ksnc_ipaddr));
1237 /* Search for a route corresponding to the new connection and
1238 * create an association. This allows incoming connections created
1239 * by routes in my peer to match my own route entries so I don't
1240 * continually create duplicate routes. */
1241 list_for_each (tmp, &peer->ksnp_routes) {
1242 route = list_entry(tmp, ksock_route_t, ksnr_list);
1244 if (route->ksnr_ipaddr != conn->ksnc_ipaddr)
1247 ksocknal_associate_route_conn_locked(route, conn);
1251 conn->ksnc_peer = peer; /* conn takes my ref on peer */
1252 peer->ksnp_last_alive = cfs_time_current();
1253 peer->ksnp_error = 0;
1255 sched = ksocknal_choose_scheduler_locked (irq);
1256 sched->kss_nconns++;
1257 conn->ksnc_scheduler = sched;
1259 /* Set the deadline for the outgoing HELLO to drain */
1260 conn->ksnc_tx_bufnob = SOCK_WMEM_QUEUED(sock);
1261 conn->ksnc_tx_deadline = cfs_time_shift(*ksocknal_tunables.ksnd_timeout);
1262 mb(); /* order with adding to peer's conn list */
1264 list_add (&conn->ksnc_list, &peer->ksnp_conns);
1265 ksocknal_conn_addref(conn);
1267 ksocknal_new_packet(conn, 0);
1269 /* Take all the packets blocking for a connection.
1270 * NB, it might be nicer to share these blocked packets among any
1271 * other connections that are becoming established. */
1272 while (!list_empty (&peer->ksnp_tx_queue)) {
1273 tx = list_entry (peer->ksnp_tx_queue.next,
1274 ksock_tx_t, tx_list);
1276 list_del (&tx->tx_list);
1277 ksocknal_queue_tx_locked (tx, conn);
1280 write_unlock_bh (global_lock);
1282 /* We've now got a new connection. Any errors from here on are just
1283 * like "normal" comms errors and we close the connection normally.
1284 * NB (a) we still have to send the reply HELLO for passive
1286 * (b) normal I/O on the conn is blocked until I setup and call the
1290 ksocknal_lib_bind_irq (irq);
1292 CDEBUG(D_NET, "New conn %s p %d.x %u.%u.%u.%u -> %u.%u.%u.%u/%d"
1293 " incarnation:"LPD64" sched[%d]/%d\n",
1294 libcfs_id2str(peerid), conn->ksnc_proto->pro_version,
1295 HIPQUAD(conn->ksnc_myipaddr), HIPQUAD(conn->ksnc_ipaddr),
1296 conn->ksnc_port, incarnation,
1297 (int)(conn->ksnc_scheduler - ksocknal_data.ksnd_schedulers), irq);
1300 /* additional routes after interface exchange? */
1301 ksocknal_create_routes(peer, conn->ksnc_port,
1302 hello->kshm_ips, hello->kshm_nips);
1304 hello->kshm_nips = ksocknal_select_ips(peer, hello->kshm_ips,
1306 rc = ksocknal_send_hello(ni, conn, peerid.nid, hello);
1309 LIBCFS_FREE(hello, offsetof(ksock_hello_msg_t,
1310 kshm_ips[LNET_MAX_INTERFACES]));
1312 /* setup the socket AFTER I've received hello (it disables
1313 * SO_LINGER). I might call back to the acceptor who may want
1314 * to send a protocol version response and then close the
1315 * socket; this ensures the socket only tears down after the
1316 * response has been sent. */
1318 rc = ksocknal_lib_setup_sock(sock);
1320 write_lock_bh(global_lock);
1322 /* NB my callbacks block while I hold ksnd_global_lock */
1323 ksocknal_lib_set_callback(sock, conn);
1326 peer->ksnp_accepting--;
1328 write_unlock_bh(global_lock);
1331 write_lock_bh(global_lock);
1332 ksocknal_close_conn_locked(conn, rc);
1333 write_unlock_bh(global_lock);
1334 } else if (ksocknal_connsock_addref(conn) == 0) {
1335 /* Allow I/O to proceed. */
1336 ksocknal_read_callback(conn);
1337 ksocknal_write_callback(conn);
1338 ksocknal_connsock_decref(conn);
1341 ksocknal_connsock_decref(conn);
1342 ksocknal_conn_decref(conn);
1346 if (!peer->ksnp_closing &&
1347 list_empty (&peer->ksnp_conns) &&
1348 list_empty (&peer->ksnp_routes)) {
1349 list_add(&zombies, &peer->ksnp_tx_queue);
1350 list_del_init(&peer->ksnp_tx_queue);
1351 ksocknal_unlink_peer_locked(peer);
1354 write_unlock_bh (global_lock);
1358 CERROR("Not creating conn %s type %d: %s\n",
1359 libcfs_id2str(peerid), conn->ksnc_type, warn);
1361 CDEBUG(D_NET, "Not creating conn %s type %d: %s\n",
1362 libcfs_id2str(peerid), conn->ksnc_type, warn);
1367 /* Request retry by replying with CONN_NONE
1368 * ksnc_proto has been set already */
1369 conn->ksnc_type = SOCKLND_CONN_NONE;
1370 hello->kshm_nips = 0;
1371 ksocknal_send_hello(ni, conn, peerid.nid, hello);
1374 write_lock_bh(global_lock);
1375 peer->ksnp_accepting--;
1376 write_unlock_bh(global_lock);
1379 ksocknal_txlist_done(ni, &zombies, 1);
1380 ksocknal_peer_decref(peer);
1384 LIBCFS_FREE(hello, offsetof(ksock_hello_msg_t,
1385 kshm_ips[LNET_MAX_INTERFACES]));
1387 LIBCFS_FREE (conn, sizeof(*conn));
1390 libcfs_sock_release(sock);
1395 ksocknal_close_conn_locked (ksock_conn_t *conn, int error)
1397 /* This just does the immmediate housekeeping, and queues the
1398 * connection for the reaper to terminate.
1399 * Caller holds ksnd_global_lock exclusively in irq context */
1400 ksock_peer_t *peer = conn->ksnc_peer;
1401 ksock_route_t *route;
1402 ksock_conn_t *conn2;
1403 struct list_head *tmp;
1405 LASSERT (peer->ksnp_error == 0);
1406 LASSERT (!conn->ksnc_closing);
1407 conn->ksnc_closing = 1;
1409 /* ksnd_deathrow_conns takes over peer's ref */
1410 list_del (&conn->ksnc_list);
1412 route = conn->ksnc_route;
1413 if (route != NULL) {
1414 /* dissociate conn from route... */
1415 LASSERT (!route->ksnr_deleted);
1416 LASSERT ((route->ksnr_connected & (1 << conn->ksnc_type)) != 0);
1419 list_for_each(tmp, &peer->ksnp_conns) {
1420 conn2 = list_entry(tmp, ksock_conn_t, ksnc_list);
1422 if (conn2->ksnc_route == route &&
1423 conn2->ksnc_type == conn->ksnc_type)
1429 route->ksnr_connected &= ~(1 << conn->ksnc_type);
1431 conn->ksnc_route = NULL;
1433 #if 0 /* irrelevent with only eager routes */
1434 list_del (&route->ksnr_list); /* make route least favourite */
1435 list_add_tail (&route->ksnr_list, &peer->ksnp_routes);
1437 ksocknal_route_decref(route); /* drop conn's ref on route */
1440 if (list_empty (&peer->ksnp_conns)) {
1441 /* No more connections to this peer */
1443 peer->ksnp_proto = NULL; /* renegotiate protocol version */
1444 peer->ksnp_error = error; /* stash last conn close reason */
1446 if (list_empty (&peer->ksnp_routes)) {
1447 /* I've just closed last conn belonging to a
1448 * peer with no routes to it */
1449 ksocknal_unlink_peer_locked (peer);
1453 spin_lock_bh (&ksocknal_data.ksnd_reaper_lock);
1455 list_add_tail (&conn->ksnc_list, &ksocknal_data.ksnd_deathrow_conns);
1456 cfs_waitq_signal (&ksocknal_data.ksnd_reaper_waitq);
1458 spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
1462 ksocknal_peer_failed (ksock_peer_t *peer)
1464 time_t last_alive = 0;
1467 /* There has been a connection failure or comms error; but I'll only
1468 * tell LNET I think the peer is dead if it's to another kernel and
1469 * there are no connections or connection attempts in existance. */
1471 read_lock (&ksocknal_data.ksnd_global_lock);
1473 if ((peer->ksnp_id.pid & LNET_PID_USERFLAG) == 0 &&
1474 list_empty(&peer->ksnp_conns) &&
1475 peer->ksnp_accepting == 0 &&
1476 ksocknal_find_connecting_route_locked(peer) == NULL) {
1478 last_alive = cfs_time_current_sec() -
1479 cfs_duration_sec(cfs_time_current() -
1480 peer->ksnp_last_alive);
1483 read_unlock (&ksocknal_data.ksnd_global_lock);
1486 lnet_notify (peer->ksnp_ni, peer->ksnp_id.nid, 0,
1491 ksocknal_terminate_conn (ksock_conn_t *conn)
1493 /* This gets called by the reaper (guaranteed thread context) to
1494 * disengage the socket from its callbacks and close it.
1495 * ksnc_refcount will eventually hit zero, and then the reaper will
1497 ksock_peer_t *peer = conn->ksnc_peer;
1498 ksock_sched_t *sched = conn->ksnc_scheduler;
1500 struct list_head *tmp;
1501 struct list_head *nxt;
1505 LASSERT(conn->ksnc_closing);
1507 /* wake up the scheduler to "send" all remaining packets to /dev/null */
1508 spin_lock_bh (&sched->kss_lock);
1510 /* a closing conn is always ready to tx */
1511 conn->ksnc_tx_ready = 1;
1513 if (!conn->ksnc_tx_scheduled &&
1514 !list_empty(&conn->ksnc_tx_queue)){
1515 list_add_tail (&conn->ksnc_tx_list,
1516 &sched->kss_tx_conns);
1517 conn->ksnc_tx_scheduled = 1;
1518 /* extra ref for scheduler */
1519 ksocknal_conn_addref(conn);
1521 cfs_waitq_signal (&sched->kss_waitq);
1524 spin_unlock_bh (&sched->kss_lock);
1526 spin_lock(&peer->ksnp_lock);
1528 list_for_each_safe(tmp, nxt, &peer->ksnp_zc_req_list) {
1529 tx = list_entry(tmp, ksock_tx_t, tx_zc_list);
1531 if (tx->tx_conn != conn)
1534 LASSERT (tx->tx_msg.ksm_zc_req_cookie != 0);
1536 tx->tx_msg.ksm_zc_req_cookie = 0;
1537 list_del(&tx->tx_zc_list);
1538 list_add(&tx->tx_zc_list, &zlist);
1541 spin_unlock(&peer->ksnp_lock);
1543 list_for_each_safe(tmp, nxt, &zlist) {
1544 tx = list_entry(tmp, ksock_tx_t, tx_zc_list);
1546 list_del(&tx->tx_zc_list);
1547 ksocknal_tx_decref(tx);
1550 /* serialise with callbacks */
1551 write_lock_bh (&ksocknal_data.ksnd_global_lock);
1553 ksocknal_lib_reset_callback(conn->ksnc_sock, conn);
1555 /* OK, so this conn may not be completely disengaged from its
1556 * scheduler yet, but it _has_ committed to terminate... */
1557 conn->ksnc_scheduler->kss_nconns--;
1559 if (peer->ksnp_error != 0) {
1560 /* peer's last conn closed in error */
1561 LASSERT (list_empty (&peer->ksnp_conns));
1563 peer->ksnp_error = 0; /* avoid multiple notifications */
1566 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
1569 ksocknal_peer_failed(peer);
1571 /* The socket is closed on the final put; either here, or in
1572 * ksocknal_{send,recv}msg(). Since we set up the linger2 option
1573 * when the connection was established, this will close the socket
1574 * immediately, aborting anything buffered in it. Any hung
1575 * zero-copy transmits will therefore complete in finite time. */
1576 ksocknal_connsock_decref(conn);
1580 ksocknal_queue_zombie_conn (ksock_conn_t *conn)
1582 /* Queue the conn for the reaper to destroy */
1584 LASSERT (atomic_read(&conn->ksnc_conn_refcount) == 0);
1585 spin_lock_bh (&ksocknal_data.ksnd_reaper_lock);
1587 list_add_tail(&conn->ksnc_list, &ksocknal_data.ksnd_zombie_conns);
1588 cfs_waitq_signal(&ksocknal_data.ksnd_reaper_waitq);
1590 spin_unlock_bh (&ksocknal_data.ksnd_reaper_lock);
1594 ksocknal_destroy_conn (ksock_conn_t *conn)
1596 /* Final coup-de-grace of the reaper */
1597 CDEBUG (D_NET, "connection %p\n", conn);
1599 LASSERT (atomic_read (&conn->ksnc_conn_refcount) == 0);
1600 LASSERT (atomic_read (&conn->ksnc_sock_refcount) == 0);
1601 LASSERT (conn->ksnc_sock == NULL);
1602 LASSERT (conn->ksnc_route == NULL);
1603 LASSERT (!conn->ksnc_tx_scheduled);
1604 LASSERT (!conn->ksnc_rx_scheduled);
1605 LASSERT (list_empty(&conn->ksnc_tx_queue));
1607 /* complete current receive if any */
1608 switch (conn->ksnc_rx_state) {
1609 case SOCKNAL_RX_LNET_PAYLOAD:
1610 CERROR("Completing partial receive from %s"
1611 ", ip %d.%d.%d.%d:%d, with error\n",
1612 libcfs_id2str(conn->ksnc_peer->ksnp_id),
1613 HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port);
1614 lnet_finalize (conn->ksnc_peer->ksnp_ni,
1615 conn->ksnc_cookie, -EIO);
1617 case SOCKNAL_RX_LNET_HEADER:
1618 if (conn->ksnc_rx_started)
1619 CERROR("Incomplete receive of lnet header from %s"
1620 ", ip %d.%d.%d.%d:%d, with error, protocol: %d.x.\n",
1621 libcfs_id2str(conn->ksnc_peer->ksnp_id),
1622 HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port,
1623 conn->ksnc_proto->pro_version);
1625 case SOCKNAL_RX_KSM_HEADER:
1626 if (conn->ksnc_rx_started)
1627 CERROR("Incomplete receive of ksock message from %s"
1628 ", ip %d.%d.%d.%d:%d, with error, protocol: %d.x.\n",
1629 libcfs_id2str(conn->ksnc_peer->ksnp_id),
1630 HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port,
1631 conn->ksnc_proto->pro_version);
1633 case SOCKNAL_RX_SLOP:
1634 if (conn->ksnc_rx_started)
1635 CERROR("Incomplete receive of slops from %s"
1636 ", ip %d.%d.%d.%d:%d, with error\n",
1637 libcfs_id2str(conn->ksnc_peer->ksnp_id),
1638 HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port);
1645 ksocknal_peer_decref(conn->ksnc_peer);
1647 LIBCFS_FREE (conn, sizeof (*conn));
1651 ksocknal_close_peer_conns_locked (ksock_peer_t *peer, __u32 ipaddr, int why)
1654 struct list_head *ctmp;
1655 struct list_head *cnxt;
1658 list_for_each_safe (ctmp, cnxt, &peer->ksnp_conns) {
1659 conn = list_entry (ctmp, ksock_conn_t, ksnc_list);
1662 conn->ksnc_ipaddr == ipaddr) {
1664 ksocknal_close_conn_locked (conn, why);
1672 ksocknal_close_conn_and_siblings (ksock_conn_t *conn, int why)
1674 ksock_peer_t *peer = conn->ksnc_peer;
1675 __u32 ipaddr = conn->ksnc_ipaddr;
1678 write_lock_bh (&ksocknal_data.ksnd_global_lock);
1680 count = ksocknal_close_peer_conns_locked (peer, ipaddr, why);
1682 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
1688 ksocknal_close_matching_conns (lnet_process_id_t id, __u32 ipaddr)
1691 struct list_head *ptmp;
1692 struct list_head *pnxt;
1698 write_lock_bh (&ksocknal_data.ksnd_global_lock);
1700 if (id.nid != LNET_NID_ANY)
1701 lo = hi = ksocknal_nid2peerlist(id.nid) - ksocknal_data.ksnd_peers;
1704 hi = ksocknal_data.ksnd_peer_hash_size - 1;
1707 for (i = lo; i <= hi; i++) {
1708 list_for_each_safe (ptmp, pnxt, &ksocknal_data.ksnd_peers[i]) {
1710 peer = list_entry (ptmp, ksock_peer_t, ksnp_list);
1712 if (!((id.nid == LNET_NID_ANY || id.nid == peer->ksnp_id.nid) &&
1713 (id.pid == LNET_PID_ANY || id.pid == peer->ksnp_id.pid)))
1716 count += ksocknal_close_peer_conns_locked (peer, ipaddr, 0);
1720 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
1722 /* wildcards always succeed */
1723 if (id.nid == LNET_NID_ANY || id.pid == LNET_PID_ANY || ipaddr == 0)
1726 return (count == 0 ? -ENOENT : 0);
1730 ksocknal_notify (lnet_ni_t *ni, lnet_nid_t gw_nid, int alive)
1732 /* The router is telling me she's been notified of a change in
1733 * gateway state.... */
1734 lnet_process_id_t id = {.nid = gw_nid, .pid = LNET_PID_ANY};
1736 CDEBUG (D_NET, "gw %s %s\n", libcfs_nid2str(gw_nid),
1737 alive ? "up" : "down");
1740 /* If the gateway crashed, close all open connections... */
1741 ksocknal_close_matching_conns (id, 0);
1745 /* ...otherwise do nothing. We can only establish new connections
1746 * if we have autroutes, and these connect on demand. */
1750 ksocknal_push_peer (ksock_peer_t *peer)
1754 struct list_head *tmp;
1757 for (index = 0; ; index++) {
1758 read_lock (&ksocknal_data.ksnd_global_lock);
1763 list_for_each (tmp, &peer->ksnp_conns) {
1765 conn = list_entry (tmp, ksock_conn_t, ksnc_list);
1766 ksocknal_conn_addref(conn);
1771 read_unlock (&ksocknal_data.ksnd_global_lock);
1776 ksocknal_lib_push_conn (conn);
1777 ksocknal_conn_decref(conn);
1782 ksocknal_push (lnet_ni_t *ni, lnet_process_id_t id)
1785 struct list_head *tmp;
1791 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
1792 for (j = 0; ; j++) {
1793 read_lock (&ksocknal_data.ksnd_global_lock);
1798 list_for_each (tmp, &ksocknal_data.ksnd_peers[i]) {
1799 peer = list_entry(tmp, ksock_peer_t,
1802 if (!((id.nid == LNET_NID_ANY ||
1803 id.nid == peer->ksnp_id.nid) &&
1804 (id.pid == LNET_PID_ANY ||
1805 id.pid == peer->ksnp_id.pid))) {
1811 ksocknal_peer_addref(peer);
1816 read_unlock (&ksocknal_data.ksnd_global_lock);
1820 ksocknal_push_peer (peer);
1821 ksocknal_peer_decref(peer);
1831 ksocknal_add_interface(lnet_ni_t *ni, __u32 ipaddress, __u32 netmask)
1833 ksock_net_t *net = ni->ni_data;
1834 ksock_interface_t *iface;
1838 struct list_head *ptmp;
1840 struct list_head *rtmp;
1841 ksock_route_t *route;
1843 if (ipaddress == 0 ||
1847 write_lock_bh (&ksocknal_data.ksnd_global_lock);
1849 iface = ksocknal_ip2iface(ni, ipaddress);
1850 if (iface != NULL) {
1851 /* silently ignore dups */
1853 } else if (net->ksnn_ninterfaces == LNET_MAX_INTERFACES) {
1856 iface = &net->ksnn_interfaces[net->ksnn_ninterfaces++];
1858 iface->ksni_ipaddr = ipaddress;
1859 iface->ksni_netmask = netmask;
1860 iface->ksni_nroutes = 0;
1861 iface->ksni_npeers = 0;
1863 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
1864 list_for_each(ptmp, &ksocknal_data.ksnd_peers[i]) {
1865 peer = list_entry(ptmp, ksock_peer_t, ksnp_list);
1867 for (j = 0; j < peer->ksnp_n_passive_ips; j++)
1868 if (peer->ksnp_passive_ips[j] == ipaddress)
1869 iface->ksni_npeers++;
1871 list_for_each(rtmp, &peer->ksnp_routes) {
1872 route = list_entry(rtmp, ksock_route_t, ksnr_list);
1874 if (route->ksnr_myipaddr == ipaddress)
1875 iface->ksni_nroutes++;
1881 /* NB only new connections will pay attention to the new interface! */
1884 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
1890 ksocknal_peer_del_interface_locked(ksock_peer_t *peer, __u32 ipaddr)
1892 struct list_head *tmp;
1893 struct list_head *nxt;
1894 ksock_route_t *route;
1899 for (i = 0; i < peer->ksnp_n_passive_ips; i++)
1900 if (peer->ksnp_passive_ips[i] == ipaddr) {
1901 for (j = i+1; j < peer->ksnp_n_passive_ips; j++)
1902 peer->ksnp_passive_ips[j-1] =
1903 peer->ksnp_passive_ips[j];
1904 peer->ksnp_n_passive_ips--;
1908 list_for_each_safe(tmp, nxt, &peer->ksnp_routes) {
1909 route = list_entry (tmp, ksock_route_t, ksnr_list);
1911 if (route->ksnr_myipaddr != ipaddr)
1914 if (route->ksnr_share_count != 0) {
1915 /* Manually created; keep, but unbind */
1916 route->ksnr_myipaddr = 0;
1918 ksocknal_del_route_locked(route);
1922 list_for_each_safe(tmp, nxt, &peer->ksnp_conns) {
1923 conn = list_entry(tmp, ksock_conn_t, ksnc_list);
1925 if (conn->ksnc_myipaddr == ipaddr)
1926 ksocknal_close_conn_locked (conn, 0);
1931 ksocknal_del_interface(lnet_ni_t *ni, __u32 ipaddress)
1933 ksock_net_t *net = ni->ni_data;
1935 struct list_head *tmp;
1936 struct list_head *nxt;
1942 write_lock_bh (&ksocknal_data.ksnd_global_lock);
1944 for (i = 0; i < net->ksnn_ninterfaces; i++) {
1945 this_ip = net->ksnn_interfaces[i].ksni_ipaddr;
1947 if (!(ipaddress == 0 ||
1948 ipaddress == this_ip))
1953 for (j = i+1; j < net->ksnn_ninterfaces; j++)
1954 net->ksnn_interfaces[j-1] =
1955 net->ksnn_interfaces[j];
1957 net->ksnn_ninterfaces--;
1959 for (j = 0; j < ksocknal_data.ksnd_peer_hash_size; j++) {
1960 list_for_each_safe(tmp, nxt, &ksocknal_data.ksnd_peers[j]) {
1961 peer = list_entry(tmp, ksock_peer_t, ksnp_list);
1963 if (peer->ksnp_ni != ni)
1966 ksocknal_peer_del_interface_locked(peer, this_ip);
1971 write_unlock_bh (&ksocknal_data.ksnd_global_lock);
1977 ksocknal_ctl(lnet_ni_t *ni, unsigned int cmd, void *arg)
1979 struct libcfs_ioctl_data *data = arg;
1983 case IOC_LIBCFS_GET_INTERFACE: {
1984 ksock_net_t *net = ni->ni_data;
1985 ksock_interface_t *iface;
1987 read_lock (&ksocknal_data.ksnd_global_lock);
1989 if (data->ioc_count < 0 ||
1990 data->ioc_count >= net->ksnn_ninterfaces) {
1994 iface = &net->ksnn_interfaces[data->ioc_count];
1996 data->ioc_u32[0] = iface->ksni_ipaddr;
1997 data->ioc_u32[1] = iface->ksni_netmask;
1998 data->ioc_u32[2] = iface->ksni_npeers;
1999 data->ioc_u32[3] = iface->ksni_nroutes;
2002 read_unlock (&ksocknal_data.ksnd_global_lock);
2006 case IOC_LIBCFS_ADD_INTERFACE:
2007 return ksocknal_add_interface(ni,
2008 data->ioc_u32[0], /* IP address */
2009 data->ioc_u32[1]); /* net mask */
2011 case IOC_LIBCFS_DEL_INTERFACE:
2012 return ksocknal_del_interface(ni,
2013 data->ioc_u32[0]); /* IP address */
2015 case IOC_LIBCFS_GET_PEER: {
2016 lnet_process_id_t id = {0,};
2021 int share_count = 0;
2023 rc = ksocknal_get_peer_info(ni, data->ioc_count,
2024 &id, &myip, &ip, &port,
2025 &conn_count, &share_count);
2029 data->ioc_nid = id.nid;
2030 data->ioc_count = share_count;
2031 data->ioc_u32[0] = ip;
2032 data->ioc_u32[1] = port;
2033 data->ioc_u32[2] = myip;
2034 data->ioc_u32[3] = conn_count;
2035 data->ioc_u32[4] = id.pid;
2039 case IOC_LIBCFS_ADD_PEER: {
2040 lnet_process_id_t id = {.nid = data->ioc_nid,
2041 .pid = LUSTRE_SRV_LNET_PID};
2042 return ksocknal_add_peer (ni, id,
2043 data->ioc_u32[0], /* IP */
2044 data->ioc_u32[1]); /* port */
2046 case IOC_LIBCFS_DEL_PEER: {
2047 lnet_process_id_t id = {.nid = data->ioc_nid,
2048 .pid = LNET_PID_ANY};
2049 return ksocknal_del_peer (ni, id,
2050 data->ioc_u32[0]); /* IP */
2052 case IOC_LIBCFS_GET_CONN: {
2056 ksock_conn_t *conn = ksocknal_get_conn_by_idx (ni, data->ioc_count);
2061 ksocknal_lib_get_conn_tunables(conn, &txmem, &rxmem, &nagle);
2063 data->ioc_count = txmem;
2064 data->ioc_nid = conn->ksnc_peer->ksnp_id.nid;
2065 data->ioc_flags = nagle;
2066 data->ioc_u32[0] = conn->ksnc_ipaddr;
2067 data->ioc_u32[1] = conn->ksnc_port;
2068 data->ioc_u32[2] = conn->ksnc_myipaddr;
2069 data->ioc_u32[3] = conn->ksnc_type;
2070 data->ioc_u32[4] = conn->ksnc_scheduler -
2071 ksocknal_data.ksnd_schedulers;
2072 data->ioc_u32[5] = rxmem;
2073 data->ioc_u32[6] = conn->ksnc_peer->ksnp_id.pid;
2074 ksocknal_conn_decref(conn);
2078 case IOC_LIBCFS_CLOSE_CONNECTION: {
2079 lnet_process_id_t id = {.nid = data->ioc_nid,
2080 .pid = LNET_PID_ANY};
2082 return ksocknal_close_matching_conns (id,
2085 case IOC_LIBCFS_REGISTER_MYNID:
2086 /* Ignore if this is a noop */
2087 if (data->ioc_nid == ni->ni_nid)
2090 CERROR("obsolete IOC_LIBCFS_REGISTER_MYNID: %s(%s)\n",
2091 libcfs_nid2str(data->ioc_nid),
2092 libcfs_nid2str(ni->ni_nid));
2095 case IOC_LIBCFS_PUSH_CONNECTION: {
2096 lnet_process_id_t id = {.nid = data->ioc_nid,
2097 .pid = LNET_PID_ANY};
2099 return ksocknal_push(ni, id);
2108 ksocknal_free_buffers (void)
2110 LASSERT (atomic_read(&ksocknal_data.ksnd_nactive_txs) == 0);
2112 if (ksocknal_data.ksnd_schedulers != NULL)
2113 LIBCFS_FREE (ksocknal_data.ksnd_schedulers,
2114 sizeof (ksock_sched_t) * ksocknal_data.ksnd_nschedulers);
2116 LIBCFS_FREE (ksocknal_data.ksnd_peers,
2117 sizeof (struct list_head) *
2118 ksocknal_data.ksnd_peer_hash_size);
2120 spin_lock(&ksocknal_data.ksnd_tx_lock);
2122 if (!list_empty(&ksocknal_data.ksnd_idle_noop_txs)) {
2123 struct list_head zlist;
2126 list_add(&zlist, &ksocknal_data.ksnd_idle_noop_txs);
2127 list_del_init(&ksocknal_data.ksnd_idle_noop_txs);
2128 spin_unlock(&ksocknal_data.ksnd_tx_lock);
2130 while(!list_empty(&zlist)) {
2131 tx = list_entry(zlist.next, ksock_tx_t, tx_list);
2132 list_del(&tx->tx_list);
2133 LIBCFS_FREE(tx, tx->tx_desc_size);
2136 spin_unlock(&ksocknal_data.ksnd_tx_lock);
2141 ksocknal_base_shutdown (void)
2143 ksock_sched_t *sched;
2146 CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n",
2147 atomic_read (&libcfs_kmemory));
2148 LASSERT (ksocknal_data.ksnd_nnets == 0);
2150 switch (ksocknal_data.ksnd_init) {
2154 case SOCKNAL_INIT_ALL:
2155 case SOCKNAL_INIT_DATA:
2156 LASSERT (ksocknal_data.ksnd_peers != NULL);
2157 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
2158 LASSERT (list_empty (&ksocknal_data.ksnd_peers[i]));
2160 LASSERT (list_empty (&ksocknal_data.ksnd_enomem_conns));
2161 LASSERT (list_empty (&ksocknal_data.ksnd_zombie_conns));
2162 LASSERT (list_empty (&ksocknal_data.ksnd_connd_connreqs));
2163 LASSERT (list_empty (&ksocknal_data.ksnd_connd_routes));
2165 if (ksocknal_data.ksnd_schedulers != NULL)
2166 for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) {
2167 ksock_sched_t *kss =
2168 &ksocknal_data.ksnd_schedulers[i];
2170 LASSERT (list_empty (&kss->kss_tx_conns));
2171 LASSERT (list_empty (&kss->kss_rx_conns));
2172 LASSERT (list_empty (&kss->kss_zombie_noop_txs));
2173 LASSERT (kss->kss_nconns == 0);
2176 /* flag threads to terminate; wake and wait for them to die */
2177 ksocknal_data.ksnd_shuttingdown = 1;
2178 cfs_waitq_broadcast (&ksocknal_data.ksnd_connd_waitq);
2179 cfs_waitq_broadcast (&ksocknal_data.ksnd_reaper_waitq);
2181 if (ksocknal_data.ksnd_schedulers != NULL)
2182 for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) {
2183 sched = &ksocknal_data.ksnd_schedulers[i];
2184 cfs_waitq_broadcast(&sched->kss_waitq);
2188 read_lock (&ksocknal_data.ksnd_global_lock);
2189 while (ksocknal_data.ksnd_nthreads != 0) {
2191 CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */
2192 "waiting for %d threads to terminate\n",
2193 ksocknal_data.ksnd_nthreads);
2194 read_unlock (&ksocknal_data.ksnd_global_lock);
2195 cfs_pause(cfs_time_seconds(1));
2196 read_lock (&ksocknal_data.ksnd_global_lock);
2198 read_unlock (&ksocknal_data.ksnd_global_lock);
2200 ksocknal_free_buffers();
2202 ksocknal_data.ksnd_init = SOCKNAL_INIT_NOTHING;
2206 CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n",
2207 atomic_read (&libcfs_kmemory));
2209 PORTAL_MODULE_UNUSE;
2214 ksocknal_new_incarnation (void)
2218 /* The incarnation number is the time this module loaded and it
2219 * identifies this particular instance of the socknal. Hopefully
2220 * we won't be able to reboot more frequently than 1MHz for the
2221 * forseeable future :) */
2223 do_gettimeofday(&tv);
2225 return (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec;
2229 ksocknal_base_startup (void)
2234 LASSERT (ksocknal_data.ksnd_init == SOCKNAL_INIT_NOTHING);
2235 LASSERT (ksocknal_data.ksnd_nnets == 0);
2237 memset (&ksocknal_data, 0, sizeof (ksocknal_data)); /* zero pointers */
2239 ksocknal_data.ksnd_peer_hash_size = SOCKNAL_PEER_HASH_SIZE;
2240 LIBCFS_ALLOC (ksocknal_data.ksnd_peers,
2241 sizeof (struct list_head) * ksocknal_data.ksnd_peer_hash_size);
2242 if (ksocknal_data.ksnd_peers == NULL)
2245 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++)
2246 CFS_INIT_LIST_HEAD(&ksocknal_data.ksnd_peers[i]);
2248 rwlock_init(&ksocknal_data.ksnd_global_lock);
2250 spin_lock_init (&ksocknal_data.ksnd_reaper_lock);
2251 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_enomem_conns);
2252 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_zombie_conns);
2253 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_deathrow_conns);
2254 cfs_waitq_init(&ksocknal_data.ksnd_reaper_waitq);
2256 spin_lock_init (&ksocknal_data.ksnd_connd_lock);
2257 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_connd_connreqs);
2258 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_connd_routes);
2259 cfs_waitq_init(&ksocknal_data.ksnd_connd_waitq);
2261 spin_lock_init (&ksocknal_data.ksnd_tx_lock);
2262 CFS_INIT_LIST_HEAD (&ksocknal_data.ksnd_idle_noop_txs);
2264 /* NB memset above zeros whole of ksocknal_data, including
2265 * ksocknal_data.ksnd_irqinfo[all].ksni_valid */
2267 /* flag lists/ptrs/locks initialised */
2268 ksocknal_data.ksnd_init = SOCKNAL_INIT_DATA;
2271 ksocknal_data.ksnd_nschedulers = ksocknal_nsched();
2272 LIBCFS_ALLOC(ksocknal_data.ksnd_schedulers,
2273 sizeof(ksock_sched_t) * ksocknal_data.ksnd_nschedulers);
2274 if (ksocknal_data.ksnd_schedulers == NULL)
2277 for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) {
2278 ksock_sched_t *kss = &ksocknal_data.ksnd_schedulers[i];
2280 spin_lock_init (&kss->kss_lock);
2281 CFS_INIT_LIST_HEAD (&kss->kss_rx_conns);
2282 CFS_INIT_LIST_HEAD (&kss->kss_tx_conns);
2283 CFS_INIT_LIST_HEAD (&kss->kss_zombie_noop_txs);
2284 cfs_waitq_init (&kss->kss_waitq);
2287 for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) {
2288 rc = ksocknal_thread_start (ksocknal_scheduler,
2289 &ksocknal_data.ksnd_schedulers[i]);
2291 CERROR("Can't spawn socknal scheduler[%d]: %d\n",
2297 /* must have at least 2 connds to remain responsive to accepts while
2299 if (*ksocknal_tunables.ksnd_nconnds < 2)
2300 *ksocknal_tunables.ksnd_nconnds = 2;
2302 for (i = 0; i < *ksocknal_tunables.ksnd_nconnds; i++) {
2303 rc = ksocknal_thread_start (ksocknal_connd, (void *)((long)i));
2305 CERROR("Can't spawn socknal connd: %d\n", rc);
2310 rc = ksocknal_thread_start (ksocknal_reaper, NULL);
2312 CERROR ("Can't spawn socknal reaper: %d\n", rc);
2316 /* flag everything initialised */
2317 ksocknal_data.ksnd_init = SOCKNAL_INIT_ALL;
2322 ksocknal_base_shutdown();
2327 ksocknal_debug_peerhash (lnet_ni_t *ni)
2329 ksock_peer_t *peer = NULL;
2330 struct list_head *tmp;
2333 read_lock (&ksocknal_data.ksnd_global_lock);
2335 for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) {
2336 list_for_each (tmp, &ksocknal_data.ksnd_peers[i]) {
2337 peer = list_entry (tmp, ksock_peer_t, ksnp_list);
2339 if (peer->ksnp_ni == ni) break;
2346 ksock_route_t *route;
2349 CWARN ("Active peer on shutdown: %s, ref %d, scnt %d, "
2350 "closing %d, accepting %d, err %d, zcookie "LPU64", "
2351 "txq %d, zc_req %d\n", libcfs_id2str(peer->ksnp_id),
2352 atomic_read(&peer->ksnp_refcount),
2353 peer->ksnp_sharecount, peer->ksnp_closing,
2354 peer->ksnp_accepting, peer->ksnp_error,
2355 peer->ksnp_zc_next_cookie,
2356 !list_empty(&peer->ksnp_tx_queue),
2357 !list_empty(&peer->ksnp_zc_req_list));
2359 list_for_each (tmp, &peer->ksnp_routes) {
2360 route = list_entry(tmp, ksock_route_t, ksnr_list);
2361 CWARN ("Route: ref %d, schd %d, conn %d, cnted %d, "
2362 "del %d\n", atomic_read(&route->ksnr_refcount),
2363 route->ksnr_scheduled, route->ksnr_connecting,
2364 route->ksnr_connected, route->ksnr_deleted);
2367 list_for_each (tmp, &peer->ksnp_conns) {
2368 conn = list_entry(tmp, ksock_conn_t, ksnc_list);
2369 CWARN ("Conn: ref %d, sref %d, t %d, c %d\n",
2370 atomic_read(&conn->ksnc_conn_refcount),
2371 atomic_read(&conn->ksnc_sock_refcount),
2372 conn->ksnc_type, conn->ksnc_closing);
2376 read_unlock (&ksocknal_data.ksnd_global_lock);
2381 ksocknal_shutdown (lnet_ni_t *ni)
2383 ksock_net_t *net = ni->ni_data;
2385 lnet_process_id_t anyid = {.nid = LNET_NID_ANY,
2386 .pid = LNET_PID_ANY};
2388 LASSERT(ksocknal_data.ksnd_init == SOCKNAL_INIT_ALL);
2389 LASSERT(ksocknal_data.ksnd_nnets > 0);
2391 spin_lock_bh (&net->ksnn_lock);
2392 net->ksnn_shutdown = 1; /* prevent new peers */
2393 spin_unlock_bh (&net->ksnn_lock);
2395 /* Delete all peers */
2396 ksocknal_del_peer(ni, anyid, 0);
2398 /* Wait for all peer state to clean up */
2400 spin_lock_bh (&net->ksnn_lock);
2401 while (net->ksnn_npeers != 0) {
2402 spin_unlock_bh (&net->ksnn_lock);
2405 CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */
2406 "waiting for %d peers to disconnect\n",
2408 cfs_pause(cfs_time_seconds(1));
2410 ksocknal_debug_peerhash(ni);
2412 spin_lock_bh (&net->ksnn_lock);
2414 spin_unlock_bh (&net->ksnn_lock);
2416 for (i = 0; i < net->ksnn_ninterfaces; i++) {
2417 LASSERT (net->ksnn_interfaces[i].ksni_npeers == 0);
2418 LASSERT (net->ksnn_interfaces[i].ksni_nroutes == 0);
2421 LIBCFS_FREE(net, sizeof(*net));
2423 ksocknal_data.ksnd_nnets--;
2424 if (ksocknal_data.ksnd_nnets == 0)
2425 ksocknal_base_shutdown();
2429 ksocknal_enumerate_interfaces(ksock_net_t *net)
2437 n = libcfs_ipif_enumerate(&names);
2439 CERROR("Can't enumerate interfaces: %d\n", n);
2443 for (i = j = 0; i < n; i++) {
2448 if (!strcmp(names[i], "lo")) /* skip the loopback IF */
2451 rc = libcfs_ipif_query(names[i], &up, &ip, &mask);
2453 CWARN("Can't get interface %s info: %d\n",
2459 CWARN("Ignoring interface %s (down)\n",
2464 if (j == LNET_MAX_INTERFACES) {
2465 CWARN("Ignoring interface %s (too many interfaces)\n",
2470 net->ksnn_interfaces[j].ksni_ipaddr = ip;
2471 net->ksnn_interfaces[j].ksni_netmask = mask;
2475 libcfs_ipif_free_enumeration(names, n);
2478 CERROR("Can't find any usable interfaces\n");
2484 ksocknal_startup (lnet_ni_t *ni)
2490 LASSERT (ni->ni_lnd == &the_ksocklnd);
2492 if (ksocknal_data.ksnd_init == SOCKNAL_INIT_NOTHING) {
2493 rc = ksocknal_base_startup();
2498 LIBCFS_ALLOC(net, sizeof(*net));
2502 memset(net, 0, sizeof(*net));
2503 spin_lock_init(&net->ksnn_lock);
2504 net->ksnn_incarnation = ksocknal_new_incarnation();
2506 ni->ni_maxtxcredits = *ksocknal_tunables.ksnd_credits;
2507 ni->ni_peertxcredits = *ksocknal_tunables.ksnd_peercredits;
2509 if (ni->ni_interfaces[0] == NULL) {
2510 rc = ksocknal_enumerate_interfaces(net);
2514 net->ksnn_ninterfaces = 1;
2516 for (i = 0; i < LNET_MAX_INTERFACES; i++) {
2519 if (ni->ni_interfaces[i] == NULL)
2522 rc = libcfs_ipif_query(
2523 ni->ni_interfaces[i], &up,
2524 &net->ksnn_interfaces[i].ksni_ipaddr,
2525 &net->ksnn_interfaces[i].ksni_netmask);
2528 CERROR("Can't get interface %s info: %d\n",
2529 ni->ni_interfaces[i], rc);
2534 CERROR("Interface %s is down\n",
2535 ni->ni_interfaces[i]);
2539 net->ksnn_ninterfaces = i;
2542 ni->ni_nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid),
2543 net->ksnn_interfaces[0].ksni_ipaddr);
2545 ksocknal_data.ksnd_nnets++;
2550 LIBCFS_FREE(net, sizeof(*net));
2552 if (ksocknal_data.ksnd_nnets == 0)
2553 ksocknal_base_shutdown();
2560 ksocknal_module_fini (void)
2562 lnet_unregister_lnd(&the_ksocklnd);
2563 ksocknal_lib_tunables_fini();
2567 ksocknal_module_init (void)
2571 /* check ksnr_connected/connecting field large enough */
2572 CLASSERT(SOCKLND_CONN_NTYPES <= 4);
2574 rc = ksocknal_lib_tunables_init();
2578 lnet_register_lnd(&the_ksocklnd);
2583 MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
2584 MODULE_DESCRIPTION("Kernel TCP Socket LND v2.0.0");
2585 MODULE_LICENSE("GPL");
2587 cfs_module(ksocknal, "2.0.0", ksocknal_module_init, ksocknal_module_fini);