rdc_subr.c revision 3270659f55e0928d6edec3d26217cc29398a8149
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * CDDL HEADER START
6a67d144095c31bbafed93cec1619590157335eajvergara *
6a67d144095c31bbafed93cec1619590157335eajvergara * The contents of this file are subject to the terms of the
6a67d144095c31bbafed93cec1619590157335eajvergara * Common Development and Distribution License (the "License").
6a67d144095c31bbafed93cec1619590157335eajvergara * You may not use this file except in compliance with the License.
6a67d144095c31bbafed93cec1619590157335eajvergara *
6a67d144095c31bbafed93cec1619590157335eajvergara * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * or http://www.opensolaris.org/os/licensing.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * See the License for the specific language governing permissions
6a67d144095c31bbafed93cec1619590157335eajvergara * and limitations under the License.
6a67d144095c31bbafed93cec1619590157335eajvergara *
6a67d144095c31bbafed93cec1619590157335eajvergara * When distributing Covered Code, include this CDDL HEADER in each
6a67d144095c31bbafed93cec1619590157335eajvergara * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * If applicable, add the following below this CDDL HEADER, with the
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * fields enclosed by brackets "[]" replaced with your own identifying
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * information: Portions Copyright [yyyy] [name of copyright owner]
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac *
6a67d144095c31bbafed93cec1619590157335eajvergara * CDDL HEADER END
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
6a67d144095c31bbafed93cec1619590157335eajvergara * Use is subject to license terms.
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara */
a5b9f8fb834b1b2208e59a2fa76714bd91a5f147violette
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/types.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/ksynch.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/errno.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/debug.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/cmn_err.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/kmem.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/errno.h>
2401d3c2af505789c7c3b860a43e973f27731243jvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara#ifdef _SunOS_2_6
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara/*
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara * on 2.6 both dki_lock.h and rpc/types.h define bool_t so we
6a67d144095c31bbafed93cec1619590157335eajvergara * define enum_t here as it is all we need from rpc/types.h
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter * anyway and make it look like we included it. Yuck.
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara#define _RPC_TYPES_H
6a67d144095c31bbafed93cec1619590157335eajvergaratypedef int enum_t;
2401d3c2af505789c7c3b860a43e973f27731243jvergara#else
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter#ifndef DS_DDICT
2401d3c2af505789c7c3b860a43e973f27731243jvergara#include <rpc/types.h>
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter#endif
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter#endif /* _SunOS_2_6 */
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/nsc_thread.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <sys/nsctl/nsctl.h>
4c5f6e1826364b5d627620cbc906da0d48ec5348jvergara#include "rdc_io.h"
6a67d144095c31bbafed93cec1619590157335eajvergara#include "rdc_ioctl.h"
6a67d144095c31bbafed93cec1619590157335eajvergara#include "rdc_prot.h"
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * Initialize a netbuf suitable for
6a67d144095c31bbafed93cec1619590157335eajvergara * describing an address
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergaravoid
6a67d144095c31bbafed93cec1619590157335eajvergarainit_rdc_netbuf(struct netbuf *nbuf)
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter{
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter nbuf->buf = kmem_zalloc(RDC_MAXADDR, KM_SLEEP);
6a67d144095c31bbafed93cec1619590157335eajvergara nbuf->maxlen = RDC_MAXADDR;
6a67d144095c31bbafed93cec1619590157335eajvergara nbuf->len = 0;
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter}
6a67d144095c31bbafed93cec1619590157335eajvergara
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara/*
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara * Free a netbuf
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_sutervoid
6a67d144095c31bbafed93cec1619590157335eajvergarafree_rdc_netbuf(struct netbuf *nbuf)
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter{
6a67d144095c31bbafed93cec1619590157335eajvergara if (!(nbuf) || !(nbuf->buf)) {
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter#ifdef DEBUG
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_PANIC, "Null netbuf in free_rdc_netbuf");
6a67d144095c31bbafed93cec1619590157335eajvergara#endif
6a67d144095c31bbafed93cec1619590157335eajvergara return;
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara kmem_free(nbuf->buf, nbuf->maxlen);
6a67d144095c31bbafed93cec1619590157335eajvergara nbuf->buf = NULL;
6a67d144095c31bbafed93cec1619590157335eajvergara nbuf->maxlen = 0;
6a67d144095c31bbafed93cec1619590157335eajvergara nbuf->len = 0;
6a67d144095c31bbafed93cec1619590157335eajvergara}
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * Duplicate a netbuf, must be followed by a free_rdc_netbuf().
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergaravoid
6a67d144095c31bbafed93cec1619590157335eajvergaradup_rdc_netbuf(const struct netbuf *from, struct netbuf *to)
6a67d144095c31bbafed93cec1619590157335eajvergara{
6a67d144095c31bbafed93cec1619590157335eajvergara init_rdc_netbuf(to);
2401d3c2af505789c7c3b860a43e973f27731243jvergara to->len = from->len;
25fb00be6524f81f54ea62a417882b362111d7dbjvergara
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter if (from->len > to->maxlen) {
2401d3c2af505789c7c3b860a43e973f27731243jvergara cmn_err(CE_WARN, "!dup_rdc_netbuf: from->len %d, to->maxlen %d",
2401d3c2af505789c7c3b860a43e973f27731243jvergara from->len, to->maxlen);
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara }
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara bcopy(from->buf, to->buf, (size_t)from->len);
2401d3c2af505789c7c3b860a43e973f27731243jvergara}
2401d3c2af505789c7c3b860a43e973f27731243jvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara#ifdef DEBUG
2401d3c2af505789c7c3b860a43e973f27731243jvergaravoid
2401d3c2af505789c7c3b860a43e973f27731243jvergarardc_print_svinfo(rdc_srv_t *svp, char *str)
2401d3c2af505789c7c3b860a43e973f27731243jvergara{
2401d3c2af505789c7c3b860a43e973f27731243jvergara int i;
2401d3c2af505789c7c3b860a43e973f27731243jvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara if (svp == NULL)
2401d3c2af505789c7c3b860a43e973f27731243jvergara return;
25fb00be6524f81f54ea62a417882b362111d7dbjvergara
25fb00be6524f81f54ea62a417882b362111d7dbjvergara cmn_err(CE_NOTE, "!rdc %s servinfo: %p\n", str, (void *) svp);
25fb00be6524f81f54ea62a417882b362111d7dbjvergara
25fb00be6524f81f54ea62a417882b362111d7dbjvergara if (svp->ri_knconf != NULL) {
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "!knconf: semantics %d",
6a67d144095c31bbafed93cec1619590157335eajvergara svp->ri_knconf->knc_semantics);
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "! protofmly %s",
6a67d144095c31bbafed93cec1619590157335eajvergara svp->ri_knconf->knc_protofmly);
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "! proto %s",
6a67d144095c31bbafed93cec1619590157335eajvergara svp->ri_knconf->knc_proto);
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter cmn_err(CE_NOTE, "! rdev %lx",
6a67d144095c31bbafed93cec1619590157335eajvergara svp->ri_knconf->knc_rdev);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter for (i = 0; i < svp->ri_addr.len; i++)
6a67d144095c31bbafed93cec1619590157335eajvergara printf("%u ", svp->ri_addr.buf[i]);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "!\naddr: len %d buf %p\n",
6a67d144095c31bbafed93cec1619590157335eajvergara svp->ri_addr.len, (void *) svp->ri_addr.buf);
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "!host: %s\n", svp->ri_hostname);
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter}
6a67d144095c31bbafed93cec1619590157335eajvergara#endif /* DEBUG */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * Initialize an rdc servinfo
6a67d144095c31bbafed93cec1619590157335eajvergara * Contains all the protocol we need to do a client rpc
6a67d144095c31bbafed93cec1619590157335eajvergara * A chain of rdc_srv_t indicates a one to many
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergarardc_srv_t *
6a67d144095c31bbafed93cec1619590157335eajvergarardc_create_svinfo(char *host, struct netbuf *svaddr, struct knetconfig *conf)
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter{
ffa279622cea61d6eec13e3df386bd3015388388jvergara rdc_srv_t *nvp;
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter int hlen = strlen(host) + 1;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (conf == NULL) {
6a67d144095c31bbafed93cec1619590157335eajvergara return (NULL);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (host == NULL) {
6a67d144095c31bbafed93cec1619590157335eajvergara return (NULL);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara nvp = kmem_zalloc(sizeof (*nvp), KM_SLEEP);
6a67d144095c31bbafed93cec1619590157335eajvergara nvp->ri_knconf = kmem_alloc(sizeof (*nvp->ri_knconf), KM_SLEEP);
6a67d144095c31bbafed93cec1619590157335eajvergara nvp->ri_hostname = kmem_zalloc(hlen, KM_SLEEP);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (nvp == NULL || nvp->ri_hostname == NULL || nvp->ri_knconf == NULL) {
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara rdc_destroy_svinfo(nvp);
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara return (NULL);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara nvp->ri_hostnamelen = hlen;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara bcopy((void *)conf, (void *)nvp->ri_knconf, sizeof (*nvp->ri_knconf));
6a67d144095c31bbafed93cec1619590157335eajvergara nvp->ri_knconf->knc_protofmly = kmem_zalloc(KNC_STRSIZE + 1, KM_SLEEP);
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter nvp->ri_knconf->knc_proto = kmem_zalloc(KNC_STRSIZE + 1, KM_SLEEP);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (nvp->ri_knconf->knc_protofmly == NULL ||
6a67d144095c31bbafed93cec1619590157335eajvergara nvp->ri_knconf->knc_proto == NULL) {
6a67d144095c31bbafed93cec1619590157335eajvergara rdc_destroy_svinfo(nvp);
6a67d144095c31bbafed93cec1619590157335eajvergara return (NULL);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara }
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter
6a67d144095c31bbafed93cec1619590157335eajvergara (void) strncpy(nvp->ri_knconf->knc_protofmly, conf->knc_protofmly,
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter KNC_STRSIZE);
6a67d144095c31bbafed93cec1619590157335eajvergara (void) strncpy(nvp->ri_knconf->knc_proto, conf->knc_proto, KNC_STRSIZE);
6a67d144095c31bbafed93cec1619590157335eajvergara
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara dup_rdc_netbuf(svaddr, &nvp->ri_addr);
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara nvp->ri_secdata = NULL; /* For now */
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara (void) strncpy(nvp->ri_hostname, host, hlen);
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara#ifdef DEBUG_IP
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara rdc_print_svinfo(nvp, "!create");
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara#endif
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara return (nvp);
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara}
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergaravoid
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergarardc_destroy_svinfo(rdc_srv_t *svp)
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara{
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara if (svp == NULL)
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara return;
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara if (svp->ri_addr.buf && svp->ri_addr.maxlen)
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara free_rdc_netbuf(&(svp->ri_addr));
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (svp->ri_knconf->knc_protofmly)
6a67d144095c31bbafed93cec1619590157335eajvergara kmem_free(svp->ri_knconf->knc_protofmly, KNC_STRSIZE + 1);
6a67d144095c31bbafed93cec1619590157335eajvergara
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter if (svp->ri_knconf->knc_proto)
6a67d144095c31bbafed93cec1619590157335eajvergara kmem_free(svp->ri_knconf->knc_proto, KNC_STRSIZE + 1);
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter if (svp->ri_knconf)
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter kmem_free(svp->ri_knconf, sizeof (*svp->ri_knconf));
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter
2401d3c2af505789c7c3b860a43e973f27731243jvergara kmem_free(svp, sizeof (*svp));
252ea19a057499e16910a99b951793bdd6d468f7kenneth_suter}
6a67d144095c31bbafed93cec1619590157335eajvergara
48013e6d1c0677bd7649309e6b0b611b6c364c77jvergara/*
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter * rdc_netbuf_toint
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter * Returns oldsytle ipv4 RDC ver 3 addresses for RPC protocol from netbuf
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter * Note: This would never be called in the case of IPv6 and a program
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter * mismatch ie ver 3 to ver 4
2401d3c2af505789c7c3b860a43e973f27731243jvergara */
25fb00be6524f81f54ea62a417882b362111d7dbjvergaraint
2401d3c2af505789c7c3b860a43e973f27731243jvergarardc_netbuf_toint(struct netbuf *nb)
2401d3c2af505789c7c3b860a43e973f27731243jvergara{
76d78217d6ca09688d73efe4da48c76e6abc1f23kenneth_suter int ret;
76d78217d6ca09688d73efe4da48c76e6abc1f23kenneth_suter if (nb->len > RDC_MAXADDR)
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara cmn_err(CE_NOTE, "!rdc_netbuf_toint: bad size %d", nb->len);
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara switch (nb->len) {
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara case 4:
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara bcopy(nb->buf, (char *)&ret, sizeof (int));
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter return (ret);
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara case 8:
6a67d144095c31bbafed93cec1619590157335eajvergara case 16:
6a67d144095c31bbafed93cec1619590157335eajvergara case 32:
6a67d144095c31bbafed93cec1619590157335eajvergara bcopy(&nb->buf[4], (char *)&ret, sizeof (int));
6a67d144095c31bbafed93cec1619590157335eajvergara return (ret);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara default:
6a67d144095c31bbafed93cec1619590157335eajvergara cmn_err(CE_NOTE, "!rdc_netbuf_toint: size %d", nb->len);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara return (0);
6a67d144095c31bbafed93cec1619590157335eajvergara}
6a67d144095c31bbafed93cec1619590157335eajvergara