2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A#ifndef _DHCP_SVC_PRIVATE_H
2N/A#define _DHCP_SVC_PRIVATE_H
2N/A
2N/A/*
2N/A * Contains SMI-private interfaces to DHCP data service. DO NOT SHIP!
2N/A */
2N/A
2N/A#ifdef __cplusplus
2N/Aextern "C" {
2N/A#endif
2N/A
2N/A#include <sys/types.h>
2N/A#include <stddef.h>
2N/A#include <dhcp_svc_confopt.h>
2N/A#include <dhcp_svc_public.h>
2N/A
2N/A#define DSVC_PRIVATE_VERSION 1 /* Version of private layer API */
2N/A#define DSVC_MODULE_DIR "/usr/lib/inet/dhcp/svc"
2N/A#define DSVC_PUBLIC_PREFIX "ds"
2N/A
2N/A/*
2N/A * Public (service provider) layer definitions at boundary with private layer.
2N/A */
2N/Atypedef int (*dsvc_splfuncp_t)();
2N/A
2N/Atypedef struct {
2N/A dsvc_splfuncp_t status;
2N/A dsvc_splfuncp_t version;
2N/A dsvc_splfuncp_t mklocation;
2N/A dsvc_splfuncp_t list_dt;
2N/A dsvc_splfuncp_t open_dt;
2N/A dsvc_splfuncp_t close_dt;
2N/A dsvc_splfuncp_t remove_dt;
2N/A dsvc_splfuncp_t lookup_dt;
2N/A dsvc_splfuncp_t add_dt;
2N/A dsvc_splfuncp_t modify_dt;
2N/A dsvc_splfuncp_t delete_dt;
2N/A dsvc_splfuncp_t list_dn;
2N/A dsvc_splfuncp_t open_dn;
2N/A dsvc_splfuncp_t close_dn;
2N/A dsvc_splfuncp_t remove_dn;
2N/A dsvc_splfuncp_t lookup_dn;
2N/A dsvc_splfuncp_t add_dn;
2N/A dsvc_splfuncp_t modify_dn;
2N/A dsvc_splfuncp_t delete_dn;
2N/A} dsvc_splapi_t;
2N/A
2N/A#define DSVC_NSPLFUNCS (sizeof (dsvc_splapi_t) / sizeof (dsvc_splfuncp_t))
2N/A#define DSVC_CUR_CONVER (-1) /* magic "get the current version" token */
2N/A
2N/Atypedef struct {
2N/A char *d_resource; /* datastore name; e.g. "SUNWfiles" */
2N/A char *d_location; /* location of datastore containers */
2N/A char *d_config; /* datastore-specific config data */
2N/A int d_conver; /* container version */
2N/A} dsvc_datastore_t;
2N/A
2N/A/*
2N/A * Container types.
2N/A */
2N/Atypedef enum {
2N/A DSVC_DHCPTAB,
2N/A DSVC_DHCPNETWORK
2N/A} dsvc_contype_t;
2N/A
2N/A/*
2N/A * Container ID: so far just the network and netmask for DSVC_DHCPNETWORK
2N/A * containers, but may include more information in the future.
2N/A */
2N/Atypedef struct {
2N/A struct in_addr c_net; /* network number */
2N/A struct in_addr c_mask; /* netmask */
2N/A} dsvc_conid_t;
2N/A
2N/Astruct dsvc_synch_ops; /* forward declaration */
2N/A
2N/A/*
2N/A * Per-handle synchronization information, used when modules require
2N/A * private-layer synchronization.
2N/A */
2N/Atypedef struct {
2N/A dsvc_datastore_t *s_datastore; /* datastore backpointer */
2N/A char s_loctoken[MAXPATHLEN];
2N/A char *s_conname; /* container name */
2N/A boolean_t s_nonblock; /* container opened NONBLOCK */
2N/A struct dsvc_synch_ops *s_ops; /* pointer to ops vector */
2N/A void *s_data; /* synch-layer private data */
2N/A} dsvc_synch_t;
2N/A
2N/A/*
2N/A * Synchronization operations; each synchronization strategy must implement
2N/A * these operations. Right now, we only have one synchronization strategy,
2N/A * but this may change someday.
2N/A */
2N/Atypedef struct dsvc_synch_ops {
2N/A int (*synch_init)(dsvc_synch_t *, unsigned int);
2N/A void (*synch_fini)(dsvc_synch_t *);
2N/A int (*synch_rdlock)(dsvc_synch_t *, void **);
2N/A int (*synch_wrlock)(dsvc_synch_t *, void **);
2N/A int (*synch_unlock)(dsvc_synch_t *, void *);
2N/A} dsvc_synch_ops_t;
2N/A
2N/A#define DSVC_SYNCH_INIT(sp, flags) ((sp)->s_ops->synch_init((sp), (flags)))
2N/A#define DSVC_SYNCH_FINI(sp) ((sp)->s_ops->synch_fini((sp)))
2N/A#define DSVC_SYNCH_RDLOCK(sp, cp) ((sp)->s_ops->synch_rdlock((sp), (cp)))
2N/A#define DSVC_SYNCH_WRLOCK(sp, cp) ((sp)->s_ops->synch_wrlock((sp), (cp)))
2N/A#define DSVC_SYNCH_UNLOCK(sp, c) ((sp)->s_ops->synch_unlock((sp), (c)))
2N/A
2N/A/*
2N/A * We divide the dsvc_synchtype_t up into two parts: a strategy part and a
2N/A * flags part. Right now, the only flag tells private layer to request
2N/A * cross-host synchronization. This is here instead of <dhcp_svc_public.h>
2N/A * since it's not a public interface and there's nowhere better to put it.
2N/A */
2N/A#define DSVC_SYNCH_FLAGMASK 0xffff0000
2N/A#define DSVC_SYNCH_STRATMASK 0x0000ffff
2N/A#define DSVC_SYNCH_CROSSHOST 0x00010000
2N/A
2N/A/*
2N/A * Private layer handle, one per open instance of a container.
2N/A * Allocated by open_dd(), destroyed by close_dd().
2N/A */
2N/Atypedef struct dsvc_handle {
2N/A dsvc_datastore_t d_desc; /* datastore descriptor */
2N/A void *d_instance; /* dlopen() instance */
2N/A dsvc_contype_t d_type; /* container type */
2N/A dsvc_conid_t d_conid; /* container id */
2N/A void *d_hand; /* public module handle */
2N/A dsvc_synch_t *d_synch; /* synchronization state */
2N/A dsvc_splapi_t d_api; /* service provider layer API */
2N/A} *dsvc_handle_t;
2N/A
2N/A/*
2N/A * Quick-n-dirty check for an invalid dsvc_handle_t.
2N/A */
2N/A#define DSVC_HANDLE_INVAL(h) ((h) == NULL || (h)->d_instance == NULL || \
2N/A (h)->d_hand == NULL)
2N/A
2N/Aextern int enumerate_dd(char ***, int *);
2N/Aextern int list_dd(dsvc_datastore_t *, dsvc_contype_t, char ***, uint_t *);
2N/Aextern int status_dd(dsvc_datastore_t *);
2N/Aextern int mklocation_dd(dsvc_datastore_t *);
2N/Aextern int add_dd_entry(dsvc_handle_t, void *);
2N/Aextern int modify_dd_entry(dsvc_handle_t, const void *, void *);
2N/Aextern int delete_dd_entry(dsvc_handle_t, void *);
2N/Aextern int close_dd(dsvc_handle_t *);
2N/Aextern int remove_dd(dsvc_datastore_t *, dsvc_contype_t, const char *);
2N/Aextern int open_dd(dsvc_handle_t *, dsvc_datastore_t *, dsvc_contype_t,
2N/A const char *, uint_t);
2N/Aextern int lookup_dd(dsvc_handle_t, boolean_t, uint_t, int, const void *,
2N/A void **, uint_t *);
2N/Aextern void free_dd(dsvc_handle_t, void *);
2N/Aextern void free_dd_list(dsvc_handle_t, void *);
2N/Aextern int confopt_to_datastore(dhcp_confopt_t *, dsvc_datastore_t *);
2N/Aextern int module_synchtype(dsvc_datastore_t *, dsvc_synchtype_t *);
2N/A
2N/A/*
2N/A * Under DEBUG, the DHCP_CONFOPT_ROOT environment variable can be set to
2N/A * the path of a directory for the DHCP server to use an alternate root
2N/A * for its configuration information and datastores.
2N/A */
2N/A#ifdef DEBUG
2N/A#define DHCP_CONFOPT_ROOT ((getenv("DHCP_CONFOPT_ROOT") != NULL) ? \
2N/A getenv("DHCP_CONFOPT_ROOT") : "")
2N/A#else
2N/A#define DHCP_CONFOPT_ROOT ""
2N/A#endif
2N/A
2N/A#ifdef __cplusplus
2N/A}
2N/A#endif
2N/A
2N/A#endif /* !_DHCP_SVC_PRIVATE_H */