xref: /titanic_53/usr/src/cmd/ldmad/ldma.h (revision 49bfb42b00abac0958a1308f4233e366fd083366)
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