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
25#ifndef	_IPMP_MPATHD_H
26#define	_IPMP_MPATHD_H
27
28/*
29 * Definitions for the messaging protocol between in.mpathd and libipmp.
30 * This interface is project-private to the IPMP subsystem.
31 */
32
33#include <sys/types.h>
34#include <sys/socket.h>		/* needed for <net/if.h> */
35#include <net/if.h>		/* needed for LIFNAMSIZ */
36
37#ifdef	__cplusplus
38extern "C" {
39#endif
40
41#define	MPATHD_PORT	5999
42#define	MPATHD_PATH	"/lib/inet/in.mpathd"
43
44/*
45 * Supported commands.
46 */
47enum {
48	MI_PING		= 0,	/* ping in.mpathd */
49	MI_OFFLINE	= 1,	/* offline the interface */
50	MI_UNDO_OFFLINE	= 2,	/* undo the offline */
51	MI_QUERY	= 3,	/* query ipmp-related information */
52	MI_NCMD			/* total number of commands */
53};
54
55/*
56 * Types of information which can be requested and received (except for
57 * IPMP_IFLIST and IPMP_ADDRLIST, which can only be received).
58 */
59typedef enum {
60	IPMP_GROUPLIST	= 1,
61	IPMP_GROUPINFO	= 2,
62	IPMP_IFINFO	= 3,
63	IPMP_IFLIST	= 4,
64	IPMP_SNAP	= 5,
65	IPMP_ADDRLIST	= 6,
66	IPMP_ADDRINFO	= 7
67} ipmp_infotype_t;
68
69/*
70 * Daemon ping request.
71 */
72typedef struct mi_ping {
73	uint32_t	mip_command;
74} mi_ping_t;
75
76/*
77 * Interface offline request; `mio_ifname' is the interface to offline;
78 * `mio_min_redundancy' is the minimum amount of usable interfaces after
79 * offline that must exist for the operation to succeed.
80 */
81typedef struct mi_offline {
82	uint32_t 	mio_command;
83	char		mio_ifname[LIFNAMSIZ];
84	uint32_t	mio_min_redundancy;
85} mi_offline_t;
86
87/*
88 * Interface undo-offline request; `miu_uname' is the interface to
89 * undo-offline.
90 */
91typedef struct mi_undo_offline {
92	uint32_t	miu_command;
93	char		miu_ifname[LIFNAMSIZ];
94} mi_undo_offline_t;
95
96/*
97 * Retrieve IPMP-related information: `miq_inforeq' is the type of information
98 * being request (see above for the list of types).  If the request type is
99 * IPMP_GROUPINFO, then `miq_grname' indicates the group.  If the request type
100 * is IPMP_IFINFO, then `miq_ifname' indicates the interface.  If the request
101 * type is IPMP_ADDRINFO then `miq_grname' indicates the group and `miq_addr'
102 * indicates the address.
103 */
104typedef struct mi_query {
105	uint32_t	miq_command;
106	ipmp_infotype_t	miq_inforeq;
107	union {
108		char	miqu_ifname[LIFNAMSIZ];
109		char	miqu_grname[LIFGRNAMSIZ];
110	} miq_infodata;
111	struct sockaddr_storage	miq_addr;
112} mi_query_t;
113#define	miq_ifname	miq_infodata.miqu_ifname
114#define	miq_grname	miq_infodata.miqu_grname
115
116/*
117 * Union of all commands. Can be used to estimate the maximum buffer size
118 * requirement for receiving any command.
119 */
120union mi_commands {
121	uint32_t		mi_command;
122	mi_ping_t		mi_pcmd;
123	mi_offline_t		mi_ocmd;
124	mi_undo_offline_t	mi_ucmd;
125	mi_query_t		mi_qcmd;
126};
127
128/*
129 * Result structure returned by in.mpathd.
130 */
131typedef struct mi_result {
132	uint32_t me_sys_error;			/* System error (errno.h) */
133	uint32_t me_mpathd_error;		/* Mpathd error */
134} mi_result_t;
135
136#define	IPMP_REQTIMEOUT	5			/* seconds */
137
138extern int ipmp_connect(int *);
139extern int ipmp_read(int, void *, size_t, const struct timeval *);
140extern int ipmp_write(int, const void *, size_t);
141extern int ipmp_writetlv(int, ipmp_infotype_t, size_t, void *);
142extern int ipmp_readtlv(int, ipmp_infotype_t *, size_t *, void **,
143    const struct timeval *);
144
145#ifdef	__cplusplus
146}
147#endif
148
149#endif	/* _IPMP_MPATHD_H */
150