linux/drivers/staging/lustre/lnet/lnet/lo.c
<<
>>
Prefs
   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 "../../include/linux/lnet/lib-lnet.h"
  37
  38static int
  39lolnd_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
  47static int
  48lolnd_recv(lnet_ni_t *ni, void *private, lnet_msg_t *lntmsg,
  49            int delayed, unsigned int niov,
  50            struct kvec *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
  87static int lolnd_instanced;
  88
  89static void
  90lolnd_shutdown(lnet_ni_t *ni)
  91{
  92        CDEBUG(D_NET, "shutdown\n");
  93        LASSERT(lolnd_instanced);
  94
  95        lolnd_instanced = 0;
  96}
  97
  98static int
  99lolnd_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
 108lnd_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        /* .lnd_accept     = */ NULL
 120};
 121