1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  *
21  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
22  * Use is subject to license terms.
23  *
24  * Copyright 2021 Tintri by DDN, Inc. All rights reserved.
25  */
26 
27 #ifndef	_IPMP_MPATHD_H
28 #define	_IPMP_MPATHD_H
29 
30 /*
31  * Definitions for the messaging protocol between in.mpathd and libipmp.
32  * This interface is project-private to the IPMP subsystem.
33  */
34 
35 #include <sys/types.h>
36 #include <sys/socket.h>		/* needed for <net/if.h> */
37 #include <net/if.h>		/* needed for LIFNAMSIZ */
38 
39 #ifdef	__cplusplus
40 extern "C" {
41 #endif
42 
43 #define	MPATHD_PORT	5999
44 #define	MPATHD_PATH	"/lib/inet/in.mpathd"
45 
46 /*
47  * Supported commands.
48  */
49 enum {
50 	MI_PING		= 0,	/* ping in.mpathd */
51 	MI_OFFLINE	= 1,	/* offline the interface */
52 	MI_UNDO_OFFLINE	= 2,	/* undo the offline */
53 	MI_QUERY	= 3,	/* query ipmp-related information */
54 	MI_NCMD			/* total number of commands */
55 };
56 
57 /*
58  * Types of information which can be requested and received (except for
59  * IPMP_IFLIST and IPMP_ADDRLIST, which can only be received).
60  */
61 typedef enum {
62 	IPMP_GROUPLIST	= 1,
63 	IPMP_GROUPINFO	= 2,
64 	IPMP_GROUPCNT	= 3,
65 	IPMP_IFINFO	= 4,
66 	IPMP_IFLIST	= 5,
67 	IPMP_IFCNT	= 6,
68 	IPMP_ADDRLIST	= 7,
69 	IPMP_ADDRINFO	= 8,
70 	IPMP_ADDRCNT	= 9,
71 	IPMP_SNAP	= 10
72 } ipmp_infotype_t;
73 
74 /*
75  * Daemon ping request.
76  */
77 typedef struct mi_ping {
78 	uint32_t	mip_command;
79 } mi_ping_t;
80 
81 /*
82  * Interface offline request; `mio_ifname' is the interface to offline;
83  * `mio_min_redundancy' is the minimum amount of usable interfaces after
84  * offline that must exist for the operation to succeed.
85  */
86 typedef struct mi_offline {
87 	uint32_t	mio_command;
88 	char		mio_ifname[LIFNAMSIZ];
89 	uint32_t	mio_min_redundancy;
90 } mi_offline_t;
91 
92 /*
93  * Interface undo-offline request; `miu_uname' is the interface to
94  * undo-offline.
95  */
96 typedef struct mi_undo_offline {
97 	uint32_t	miu_command;
98 	char		miu_ifname[LIFNAMSIZ];
99 } mi_undo_offline_t;
100 
101 /*
102  * Retrieve IPMP-related information: `miq_inforeq' is the type of information
103  * being request (see above for the list of types).  If the request type is
104  * IPMP_GROUPINFO, then `miq_grname' indicates the group.  If the request type
105  * is IPMP_IFINFO, then `miq_ifname' indicates the interface.  If the request
106  * type is IPMP_ADDRINFO then `miq_grname' indicates the group and `miq_addr'
107  * indicates the address.
108  */
109 typedef struct mi_query {
110 	uint32_t	miq_command;
111 	ipmp_infotype_t	miq_inforeq;
112 	union {
113 		char	miqu_ifname[LIFNAMSIZ];
114 		char	miqu_grname[LIFGRNAMSIZ];
115 	} miq_infodata;
116 	struct sockaddr_storage	miq_addr;
117 } mi_query_t;
118 #define	miq_ifname	miq_infodata.miqu_ifname
119 #define	miq_grname	miq_infodata.miqu_grname
120 
121 /*
122  * Union of all commands. Can be used to estimate the maximum buffer size
123  * requirement for receiving any command.
124  */
125 union mi_commands {
126 	uint32_t		mi_command;
127 	mi_ping_t		mi_pcmd;
128 	mi_offline_t		mi_ocmd;
129 	mi_undo_offline_t	mi_ucmd;
130 	mi_query_t		mi_qcmd;
131 };
132 
133 /*
134  * Result structure returned by in.mpathd.
135  */
136 typedef struct mi_result {
137 	uint32_t me_sys_error;			/* System error (errno.h) */
138 	uint32_t me_mpathd_error;		/* Mpathd error */
139 } mi_result_t;
140 
141 #define	IPMP_REQTIMEOUT	5			/* seconds */
142 
143 extern int ipmp_connect(int *);
144 extern int ipmp_read(int, void *, size_t, const struct timeval *);
145 extern int ipmp_write(int, const void *, size_t);
146 extern int ipmp_writetlv(int, ipmp_infotype_t, size_t, void *);
147 extern int ipmp_readtlv(int, ipmp_infotype_t *, size_t *, void **,
148     const struct timeval *);
149 
150 #ifdef	__cplusplus
151 }
152 #endif
153 
154 #endif	/* _IPMP_MPATHD_H */
155