Whamcloud - gitweb
LU-2456 lnet: Dynamic LNet Configuration (DLC) dynamic routing
[fs/lustre-release.git] / lnet / lnet / lo.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19  *
20  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21  * CA 95054 USA or visit www.sun.com if you need additional information or
22  * have any questions.
23  *
24  * GPL HEADER END
25  */
26 /*
27  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28  * Use is subject to license terms.
29  */
30 /*
31  * This file is part of Lustre, http://www.lustre.org/
32  * Lustre is a trademark of Sun Microsystems, Inc.
33  */
34
35 #define DEBUG_SUBSYSTEM S_LNET
36 #include <lnet/lib-lnet.h>
37
38 int
39 lolnd_send (lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg)
40 {
41         LASSERT (!lntmsg->msg_routing);
42         LASSERT (!lntmsg->msg_target_is_router);
43         
44         return lnet_parse(ni, &lntmsg->msg_hdr, ni->ni_nid, lntmsg, 0);
45 }
46
47 int
48 lolnd_recv (lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg,
49             int delayed, unsigned int niov, 
50             struct iovec *iov, lnet_kiov_t *kiov,
51             unsigned int offset, unsigned int mlen, unsigned int rlen)
52 {
53         lnet_msg_t *sendmsg = private;
54
55         if (lntmsg != NULL) {                   /* not discarding */
56                 if (sendmsg->msg_iov != NULL) {
57                         if (iov != NULL)
58                                 lnet_copy_iov2iov(niov, iov, offset,
59                                                   sendmsg->msg_niov,
60                                                   sendmsg->msg_iov,
61                                                   sendmsg->msg_offset, mlen);
62                         else
63                                 lnet_copy_iov2kiov(niov, kiov, offset,
64                                                    sendmsg->msg_niov,
65                                                    sendmsg->msg_iov,
66                                                    sendmsg->msg_offset, mlen);
67                 } else {
68                         if (iov != NULL)
69                                 lnet_copy_kiov2iov(niov, iov, offset,
70                                                    sendmsg->msg_niov,
71                                                    sendmsg->msg_kiov,
72                                                    sendmsg->msg_offset, mlen);
73                         else
74                                 lnet_copy_kiov2kiov(niov, kiov, offset,
75                                                     sendmsg->msg_niov,
76                                                     sendmsg->msg_kiov,
77                                                     sendmsg->msg_offset, mlen);
78                 }
79
80                 lnet_finalize(ni, lntmsg, 0);
81         }
82         
83         lnet_finalize(ni, sendmsg, 0);
84         return 0;
85 }
86
87 static int lolnd_instanced;
88
89 void
90 lolnd_shutdown(lnet_ni_t *ni)
91 {
92         CDEBUG (D_NET, "shutdown\n");
93         LASSERT (lolnd_instanced);
94         
95         lolnd_instanced = 0;
96 }
97
98 int
99 lolnd_startup (lnet_ni_t *ni)
100 {
101         LASSERT (ni->ni_lnd == &the_lolnd);
102         LASSERT (!lolnd_instanced);
103         lolnd_instanced = 1;
104
105         return (0);
106 }
107
108 lnd_t the_lolnd = {
109         /* .lnd_list       = */ {&the_lolnd.lnd_list, &the_lolnd.lnd_list},
110         /* .lnd_refcount   = */ 0,
111         /* .lnd_type       = */ LOLND,
112         /* .lnd_startup    = */ lolnd_startup,
113         /* .lnd_shutdown   = */ lolnd_shutdown,
114         /* .lnt_ctl        = */ NULL, 
115         /* .lnd_send       = */ lolnd_send,
116         /* .lnd_recv       = */ lolnd_recv,
117         /* .lnd_eager_recv = */ NULL,
118         /* .lnd_notify     = */ NULL,
119 #ifdef __KERNEL__
120         /* .lnd_accept     = */ NULL
121 #else
122         /* .lnd_wait       = */ NULL
123 #endif
124 };