1*49bfb42bSAlexandre Chartre /* 2*49bfb42bSAlexandre Chartre * CDDL HEADER START 3*49bfb42bSAlexandre Chartre * 4*49bfb42bSAlexandre Chartre * The contents of this file are subject to the terms of the 5*49bfb42bSAlexandre Chartre * Common Development and Distribution License (the "License"). 6*49bfb42bSAlexandre Chartre * You may not use this file except in compliance with the License. 7*49bfb42bSAlexandre Chartre * 8*49bfb42bSAlexandre Chartre * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*49bfb42bSAlexandre Chartre * or http://www.opensolaris.org/os/licensing. 10*49bfb42bSAlexandre Chartre * See the License for the specific language governing permissions 11*49bfb42bSAlexandre Chartre * and limitations under the License. 12*49bfb42bSAlexandre Chartre * 13*49bfb42bSAlexandre Chartre * When distributing Covered Code, include this CDDL HEADER in each 14*49bfb42bSAlexandre Chartre * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*49bfb42bSAlexandre Chartre * If applicable, add the following below this CDDL HEADER, with the 16*49bfb42bSAlexandre Chartre * fields enclosed by brackets "[]" replaced with your own identifying 17*49bfb42bSAlexandre Chartre * information: Portions Copyright [yyyy] [name of copyright owner] 18*49bfb42bSAlexandre Chartre * 19*49bfb42bSAlexandre Chartre * CDDL HEADER END 20*49bfb42bSAlexandre Chartre */ 21*49bfb42bSAlexandre Chartre 22*49bfb42bSAlexandre Chartre /* 23*49bfb42bSAlexandre Chartre * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*49bfb42bSAlexandre Chartre * Use is subject to license terms. 25*49bfb42bSAlexandre Chartre */ 26*49bfb42bSAlexandre Chartre 27*49bfb42bSAlexandre Chartre #ifndef _LDMA_H 28*49bfb42bSAlexandre Chartre #define _LDMA_H 29*49bfb42bSAlexandre Chartre 30*49bfb42bSAlexandre Chartre #ifdef __cplusplus 31*49bfb42bSAlexandre Chartre extern "C" { 32*49bfb42bSAlexandre Chartre #endif 33*49bfb42bSAlexandre Chartre 34*49bfb42bSAlexandre Chartre #include <libds.h> 35*49bfb42bSAlexandre Chartre #include <sys/sysmacros.h> 36*49bfb42bSAlexandre Chartre #include <sys/types.h> 37*49bfb42bSAlexandre Chartre 38*49bfb42bSAlexandre Chartre /* 39*49bfb42bSAlexandre Chartre * The following definitions are part of the LDoms Agent specification. 40*49bfb42bSAlexandre Chartre */ 41*49bfb42bSAlexandre Chartre 42*49bfb42bSAlexandre Chartre /* reply message types */ 43*49bfb42bSAlexandre Chartre #define LDMA_MSG_RESULT 0x8000 /* result message */ 44*49bfb42bSAlexandre Chartre #define LDMA_MSG_ERROR 0x8001 /* error message */ 45*49bfb42bSAlexandre Chartre 46*49bfb42bSAlexandre Chartre /* error codes for error messages */ 47*49bfb42bSAlexandre Chartre #define LDMA_MSGERR_FAIL 0x0000 /* request has failed */ 48*49bfb42bSAlexandre Chartre #define LDMA_MSGERR_INVALID 0x8001 /* request is invalid */ 49*49bfb42bSAlexandre Chartre #define LDMA_MSGERR_NOTSUP 0x8002 /* request is not supported */ 50*49bfb42bSAlexandre Chartre #define LDMA_MSGERR_DENY 0x8003 /* request is denied */ 51*49bfb42bSAlexandre Chartre 52*49bfb42bSAlexandre Chartre /* 53*49bfb42bSAlexandre Chartre * LDoms Device Agent 54*49bfb42bSAlexandre Chartre */ 55*49bfb42bSAlexandre Chartre #define LDMA_NAME_DEVICE "agent-device" 56*49bfb42bSAlexandre Chartre 57*49bfb42bSAlexandre Chartre #define LDMA_MSGDEV_VALIDATE_PATH 0x01 /* validate path */ 58*49bfb42bSAlexandre Chartre #define LDMA_MSGDEV_VALIDATE_NIC 0x02 /* validate network interface */ 59*49bfb42bSAlexandre Chartre 60*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_EXIST 0x01 /* path is accessible */ 61*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_OPENRW 0x02 /* path can be opened rw */ 62*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_OPENRO 0x04 /* path can be opened ro */ 63*49bfb42bSAlexandre Chartre 64*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_UNKNOWN 0x00 /* path points to unknown */ 65*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_FILE 0x01 /* path points to a file */ 66*49bfb42bSAlexandre Chartre #define LDMA_DEVPATH_TYPE_DEVICE 0x02 /* path points to a device */ 67*49bfb42bSAlexandre Chartre 68*49bfb42bSAlexandre Chartre #define LDMA_DEVNIC_EXIST 0x01 /* nic is accessible */ 69*49bfb42bSAlexandre Chartre 70*49bfb42bSAlexandre Chartre /* 71*49bfb42bSAlexandre Chartre * LDoms System Agent 72*49bfb42bSAlexandre Chartre */ 73*49bfb42bSAlexandre Chartre #define LDMA_NAME_SYSTEM "agent-system" 74*49bfb42bSAlexandre Chartre 75*49bfb42bSAlexandre Chartre #define LDMA_MSGSYS_GET_SYSINFO 0x01 /* get system info request */ 76*49bfb42bSAlexandre Chartre 77*49bfb42bSAlexandre Chartre /* 78*49bfb42bSAlexandre Chartre * Size of the header of an agent message. This is the minimal size that 79*49bfb42bSAlexandre Chartre * a message can have. 80*49bfb42bSAlexandre Chartre */ 81*49bfb42bSAlexandre Chartre #define LDMA_MESSAGE_HEADER_SIZE (sizeof (ldma_message_header_t)) 82*49bfb42bSAlexandre Chartre 83*49bfb42bSAlexandre Chartre /* 84*49bfb42bSAlexandre Chartre * Macro to compute the size of a message with a msg_data of size dlen. 85*49bfb42bSAlexandre Chartre * The size of the msg_data field must be a multiple of 8-bytes so dlen 86*49bfb42bSAlexandre Chartre * is roundup to an 8-bytes multiple. 87*49bfb42bSAlexandre Chartre */ 88*49bfb42bSAlexandre Chartre #define LDMA_MESSAGE_SIZE(dlen) (LDMA_MESSAGE_HEADER_SIZE + P2ROUNDUP(dlen, 8)) 89*49bfb42bSAlexandre Chartre 90*49bfb42bSAlexandre Chartre /* 91*49bfb42bSAlexandre Chartre * Macro to compute the size of the msg_data field from the size of the message. 92*49bfb42bSAlexandre Chartre */ 93*49bfb42bSAlexandre Chartre #define LDMA_MESSAGE_DLEN(msgsize) ((msgsize) - LDMA_MESSAGE_HEADER_SIZE) 94*49bfb42bSAlexandre Chartre 95*49bfb42bSAlexandre Chartre /* 96*49bfb42bSAlexandre Chartre * Handy macros for using the message and header structures. 97*49bfb42bSAlexandre Chartre */ 98*49bfb42bSAlexandre Chartre #define LDMA_HDR2MSG(hdr) ((ldma_message_t *)(hdr)) 99*49bfb42bSAlexandre Chartre #define LDMA_HDR2DATA(hdr) (LDMA_HDR2MSG(hdr)->msg_data) 100*49bfb42bSAlexandre Chartre #define LDMA_MSG2HDR(msg) ((ldma_message_header_t *)(msg)) 101*49bfb42bSAlexandre Chartre 102*49bfb42bSAlexandre Chartre /* agent message header structure */ 103*49bfb42bSAlexandre Chartre typedef struct ldma_message_header { 104*49bfb42bSAlexandre Chartre uint64_t msg_num; /* message number */ 105*49bfb42bSAlexandre Chartre uint32_t msg_type; /* message type */ 106*49bfb42bSAlexandre Chartre uint32_t msg_info; /* message info */ 107*49bfb42bSAlexandre Chartre } ldma_message_header_t; 108*49bfb42bSAlexandre Chartre 109*49bfb42bSAlexandre Chartre /* agent message structure */ 110*49bfb42bSAlexandre Chartre typedef struct ldma_message { 111*49bfb42bSAlexandre Chartre ldma_message_header_t msg_hdr; /* message header */ 112*49bfb42bSAlexandre Chartre char msg_data[1]; /* message data */ 113*49bfb42bSAlexandre Chartre } ldma_message_t; 114*49bfb42bSAlexandre Chartre 115*49bfb42bSAlexandre Chartre /* 116*49bfb42bSAlexandre Chartre * Additional structures and definition for the implementation. 117*49bfb42bSAlexandre Chartre */ 118*49bfb42bSAlexandre Chartre typedef enum ldma_request_status_t { 119*49bfb42bSAlexandre Chartre LDMA_REQ_COMPLETED, /* request was completed */ 120*49bfb42bSAlexandre Chartre LDMA_REQ_FAILED, /* request has failed */ 121*49bfb42bSAlexandre Chartre LDMA_REQ_INVALID, /* request is invalid */ 122*49bfb42bSAlexandre Chartre LDMA_REQ_NOTSUP, /* request is not supported */ 123*49bfb42bSAlexandre Chartre LDMA_REQ_DENIED /* request was denied */ 124*49bfb42bSAlexandre Chartre } ldma_request_status_t; 125*49bfb42bSAlexandre Chartre 126*49bfb42bSAlexandre Chartre typedef ldma_request_status_t (ldm_msg_func_t)(ds_ver_t *, 127*49bfb42bSAlexandre Chartre ldma_message_header_t *, size_t, ldma_message_header_t **, size_t *); 128*49bfb42bSAlexandre Chartre 129*49bfb42bSAlexandre Chartre typedef struct ldma_msg_handler { 130*49bfb42bSAlexandre Chartre uint32_t msg_type; /* message type */ 131*49bfb42bSAlexandre Chartre ldm_msg_func_t *msg_handler; /* message handler */ 132*49bfb42bSAlexandre Chartre } ldma_msg_handler_t; 133*49bfb42bSAlexandre Chartre 134*49bfb42bSAlexandre Chartre typedef struct ldma_agent_info { 135*49bfb42bSAlexandre Chartre char *name; /* agent name */ 136*49bfb42bSAlexandre Chartre ds_ver_t *vers; /* supported versions */ 137*49bfb42bSAlexandre Chartre int nvers; /* number of versions */ 138*49bfb42bSAlexandre Chartre ldma_msg_handler_t *handlers; /* message handlers */ 139*49bfb42bSAlexandre Chartre int nhandlers; /* number of handlers */ 140*49bfb42bSAlexandre Chartre } ldma_agent_info_t; 141*49bfb42bSAlexandre Chartre 142*49bfb42bSAlexandre Chartre /* 143*49bfb42bSAlexandre Chartre * Helper functions for the daemon and agents. 144*49bfb42bSAlexandre Chartre */ 145*49bfb42bSAlexandre Chartre 146*49bfb42bSAlexandre Chartre /* function to allocate a result message */ 147*49bfb42bSAlexandre Chartre ldma_message_header_t *ldma_alloc_result_msg(ldma_message_header_t *, size_t); 148*49bfb42bSAlexandre Chartre 149*49bfb42bSAlexandre Chartre /* functions to log messages */ 150*49bfb42bSAlexandre Chartre void ldma_err(char *module, char *fmt, ...); 151*49bfb42bSAlexandre Chartre void ldma_info(char *module, char *fmt, ...); 152*49bfb42bSAlexandre Chartre void ldma_dbg(char *module, char *fmt, ...); 153*49bfb42bSAlexandre Chartre 154*49bfb42bSAlexandre Chartre /* 155*49bfb42bSAlexandre Chartre * Macros to log messages. Each module/file using these macros should define 156*49bfb42bSAlexandre Chartre * LDMA_MODULE as the name under which messages are logged. For a given agent, 157*49bfb42bSAlexandre Chartre * LDMA_MODULE should be set to the name of the agent. 158*49bfb42bSAlexandre Chartre */ 159*49bfb42bSAlexandre Chartre #define LDMA_ERR(...) ldma_err(LDMA_MODULE, __VA_ARGS__) 160*49bfb42bSAlexandre Chartre #define LDMA_INFO(...) ldma_info(LDMA_MODULE, __VA_ARGS__) 161*49bfb42bSAlexandre Chartre #define LDMA_DBG(...) ldma_dbg(LDMA_MODULE, __VA_ARGS__) 162*49bfb42bSAlexandre Chartre 163*49bfb42bSAlexandre Chartre #ifdef __cplusplus 164*49bfb42bSAlexandre Chartre } 165*49bfb42bSAlexandre Chartre #endif 166*49bfb42bSAlexandre Chartre 167*49bfb42bSAlexandre Chartre #endif /* _LDMA_H */ 168