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