17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5e11c3f44Smeem * Common Development and Distribution License (the "License"). 6e11c3f44Smeem * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 20e11c3f44Smeem * 21e11c3f44Smeem * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 227c478bd9Sstevel@tonic-gate * Use is subject to license terms. 23*80d556f9SHans Rosenfeld * 24*80d556f9SHans Rosenfeld * Copyright 2021 Tintri by DDN, Inc. All rights reserved. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #ifndef _IPMP_QUERY_H 287c478bd9Sstevel@tonic-gate #define _IPMP_QUERY_H 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate #include <sys/types.h> 317c478bd9Sstevel@tonic-gate #include <sys/socket.h> /* needed by <net/if.h> */ 327c478bd9Sstevel@tonic-gate #include <net/if.h> /* for LIF*NAMSIZ */ 337c478bd9Sstevel@tonic-gate #include <ipmp.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate /* 367c478bd9Sstevel@tonic-gate * IPMP query interfaces. 377c478bd9Sstevel@tonic-gate * 387c478bd9Sstevel@tonic-gate * These interfaces may only be used within ON or after signing a contract 39e11c3f44Smeem * with ON. For documentation, refer to PSARC/2002/615 and PSARC/2007/272. 407c478bd9Sstevel@tonic-gate */ 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate #ifdef __cplusplus 437c478bd9Sstevel@tonic-gate extern "C" { 447c478bd9Sstevel@tonic-gate #endif 457c478bd9Sstevel@tonic-gate 467c478bd9Sstevel@tonic-gate /* 47e11c3f44Smeem * Assorted enumerations used in the data types described below. 48e11c3f44Smeem */ 49e11c3f44Smeem typedef enum ipmp_if_probestate { 50e11c3f44Smeem IPMP_PROBE_OK, /* probes detect no problems */ 51e11c3f44Smeem IPMP_PROBE_FAILED, /* probes detect failure */ 52e11c3f44Smeem IPMP_PROBE_UNKNOWN, /* probe detection unavailable */ 53e11c3f44Smeem IPMP_PROBE_DISABLED /* probe detection disabled */ 54e11c3f44Smeem } ipmp_if_probestate_t; 55e11c3f44Smeem 56e11c3f44Smeem typedef enum ipmp_if_linkstate { 57e11c3f44Smeem IPMP_LINK_UP, /* link detects up */ 58e11c3f44Smeem IPMP_LINK_DOWN, /* link detects down */ 59e11c3f44Smeem IPMP_LINK_UNKNOWN /* link detection unavailable */ 60e11c3f44Smeem } ipmp_if_linkstate_t; 61e11c3f44Smeem 62e11c3f44Smeem typedef enum ipmp_if_flags { 63e11c3f44Smeem IPMP_IFFLAG_INACTIVE = 0x1, 64e11c3f44Smeem IPMP_IFFLAG_HWADDRDUP = 0x2, 65e11c3f44Smeem IPMP_IFFLAG_ACTIVE = 0x4, 66e11c3f44Smeem IPMP_IFFLAG_DOWN = 0x8 67e11c3f44Smeem } ipmp_if_flags_t; 68e11c3f44Smeem 69e11c3f44Smeem typedef enum ipmp_addr_state { 70e11c3f44Smeem IPMP_ADDR_UP, /* address is up */ 71e11c3f44Smeem IPMP_ADDR_DOWN /* address is down */ 72e11c3f44Smeem } ipmp_addr_state_t; 73e11c3f44Smeem 74e11c3f44Smeem typedef enum ipmp_if_targmode { 75e11c3f44Smeem IPMP_TARG_DISABLED, /* use of targets is disabled */ 76e11c3f44Smeem IPMP_TARG_ROUTES, /* route-learned targets */ 77e11c3f44Smeem IPMP_TARG_MULTICAST /* multicast-learned targets */ 78e11c3f44Smeem } ipmp_if_targmode_t; 79e11c3f44Smeem 80e11c3f44Smeem #define IPMP_LIST_SIZE(listtype, elsize, nel) \ 81e11c3f44Smeem ((sizeof (ipmp_ ## listtype ## _t) - (elsize)) + ((nel) * (elsize))) 82e11c3f44Smeem 83e11c3f44Smeem /* 847c478bd9Sstevel@tonic-gate * Data type describing a list of IPMP groups. 857c478bd9Sstevel@tonic-gate */ 867c478bd9Sstevel@tonic-gate typedef struct ipmp_grouplist { 877c478bd9Sstevel@tonic-gate uint64_t gl_sig; 887c478bd9Sstevel@tonic-gate unsigned int gl_ngroup; 89*80d556f9SHans Rosenfeld uint32_t gl_pad; 907c478bd9Sstevel@tonic-gate char gl_groups[1][LIFGRNAMSIZ]; 917c478bd9Sstevel@tonic-gate } ipmp_grouplist_t; 927c478bd9Sstevel@tonic-gate 93e11c3f44Smeem #define IPMP_GROUPLIST_SIZE(ngr) \ 94e11c3f44Smeem IPMP_LIST_SIZE(grouplist, LIFGRNAMSIZ, ngr) 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate /* 977c478bd9Sstevel@tonic-gate * Data type describing a list of interfaces. 987c478bd9Sstevel@tonic-gate */ 997c478bd9Sstevel@tonic-gate typedef struct ipmp_iflist { 1007c478bd9Sstevel@tonic-gate unsigned int il_nif; 1017c478bd9Sstevel@tonic-gate char il_ifs[1][LIFNAMSIZ]; 1027c478bd9Sstevel@tonic-gate } ipmp_iflist_t; 1037c478bd9Sstevel@tonic-gate 104e11c3f44Smeem #define IPMP_IFLIST_SIZE(nif) \ 105e11c3f44Smeem IPMP_LIST_SIZE(iflist, LIFNAMSIZ, nif) 106e11c3f44Smeem 107e11c3f44Smeem /* 108e11c3f44Smeem * Data type describing a list of addresses. 109e11c3f44Smeem */ 110e11c3f44Smeem typedef struct ipmp_addrlist { 111e11c3f44Smeem unsigned int al_naddr; 112*80d556f9SHans Rosenfeld uint32_t al_pad; 113e11c3f44Smeem struct sockaddr_storage al_addrs[1]; 114e11c3f44Smeem } ipmp_addrlist_t; 115e11c3f44Smeem 116e11c3f44Smeem #define IPMP_ADDRLIST_SIZE(naddr) \ 117e11c3f44Smeem IPMP_LIST_SIZE(addrlist, sizeof (struct sockaddr_storage), naddr) 1187c478bd9Sstevel@tonic-gate 1197c478bd9Sstevel@tonic-gate /* 120*80d556f9SHans Rosenfeld * Data type describing the state of an IPMP group, and a subset data type 121*80d556f9SHans Rosenfeld * used for communication between libipmp and in.mpathd. 1227c478bd9Sstevel@tonic-gate */ 1237c478bd9Sstevel@tonic-gate typedef struct ipmp_groupinfo { 1247c478bd9Sstevel@tonic-gate char gr_name[LIFGRNAMSIZ]; 1257c478bd9Sstevel@tonic-gate uint64_t gr_sig; 1267c478bd9Sstevel@tonic-gate ipmp_group_state_t gr_state; 1277c478bd9Sstevel@tonic-gate ipmp_iflist_t *gr_iflistp; 128e11c3f44Smeem ipmp_addrlist_t *gr_adlistp; 129e11c3f44Smeem char gr_ifname[LIFNAMSIZ]; 130e11c3f44Smeem char gr_m4ifname[LIFNAMSIZ]; 131e11c3f44Smeem char gr_m6ifname[LIFNAMSIZ]; 132e11c3f44Smeem char gr_bcifname[LIFNAMSIZ]; 133e11c3f44Smeem unsigned int gr_fdt; 1347c478bd9Sstevel@tonic-gate } ipmp_groupinfo_t; 1357c478bd9Sstevel@tonic-gate 136*80d556f9SHans Rosenfeld typedef struct ipmp_groupinfo_xfer { 137*80d556f9SHans Rosenfeld char grx_name[LIFGRNAMSIZ]; 138*80d556f9SHans Rosenfeld uint64_t grx_sig; 139*80d556f9SHans Rosenfeld ipmp_group_state_t grx_state; 140*80d556f9SHans Rosenfeld char grx_ifname[LIFNAMSIZ]; 141*80d556f9SHans Rosenfeld char grx_m4ifname[LIFNAMSIZ]; 142*80d556f9SHans Rosenfeld char grx_m6ifname[LIFNAMSIZ]; 143*80d556f9SHans Rosenfeld char grx_bcifname[LIFNAMSIZ]; 144*80d556f9SHans Rosenfeld unsigned int grx_fdt; 145*80d556f9SHans Rosenfeld } ipmp_groupinfo_xfer_t; 146*80d556f9SHans Rosenfeld 1477c478bd9Sstevel@tonic-gate /* 148*80d556f9SHans Rosenfeld * Data type describing IPMP target information for a particular interface, 149*80d556f9SHans Rosenfeld * and a subset data type used for communication between libipmp and in.mpathd. 150e11c3f44Smeem */ 151e11c3f44Smeem typedef struct ipmp_targinfo { 152e11c3f44Smeem char it_name[LIFNAMSIZ]; 153e11c3f44Smeem struct sockaddr_storage it_testaddr; 154e11c3f44Smeem ipmp_if_targmode_t it_targmode; 155e11c3f44Smeem ipmp_addrlist_t *it_targlistp; 156e11c3f44Smeem } ipmp_targinfo_t; 157e11c3f44Smeem 158*80d556f9SHans Rosenfeld typedef struct ipmp_targinfo_xfer { 159*80d556f9SHans Rosenfeld char itx_name[LIFNAMSIZ]; 160*80d556f9SHans Rosenfeld struct sockaddr_storage itx_testaddr; 161*80d556f9SHans Rosenfeld ipmp_if_targmode_t itx_targmode; 162*80d556f9SHans Rosenfeld uint32_t itx_pad; 163*80d556f9SHans Rosenfeld } ipmp_targinfo_xfer_t; 164*80d556f9SHans Rosenfeld 165*80d556f9SHans Rosenfeld 166e11c3f44Smeem /* 167*80d556f9SHans Rosenfeld * Data type describing the IPMP-related state of an interface, and a subset 168*80d556f9SHans Rosenfeld * data type used for communication between libipmp and in.mpathd. 1697c478bd9Sstevel@tonic-gate */ 1707c478bd9Sstevel@tonic-gate typedef struct ipmp_ifinfo { 1717c478bd9Sstevel@tonic-gate char if_name[LIFNAMSIZ]; 1727c478bd9Sstevel@tonic-gate char if_group[LIFGRNAMSIZ]; 1737c478bd9Sstevel@tonic-gate ipmp_if_state_t if_state; 1747c478bd9Sstevel@tonic-gate ipmp_if_type_t if_type; 175e11c3f44Smeem ipmp_if_linkstate_t if_linkstate; 176e11c3f44Smeem ipmp_if_probestate_t if_probestate; 177e11c3f44Smeem ipmp_if_flags_t if_flags; 178e11c3f44Smeem ipmp_targinfo_t if_targinfo4; 179e11c3f44Smeem ipmp_targinfo_t if_targinfo6; 1807c478bd9Sstevel@tonic-gate } ipmp_ifinfo_t; 1817c478bd9Sstevel@tonic-gate 182*80d556f9SHans Rosenfeld typedef struct ipmp_ifinfo_xfer { 183*80d556f9SHans Rosenfeld char ifx_name[LIFNAMSIZ]; 184*80d556f9SHans Rosenfeld char ifx_group[LIFGRNAMSIZ]; 185*80d556f9SHans Rosenfeld ipmp_if_state_t ifx_state; 186*80d556f9SHans Rosenfeld ipmp_if_type_t ifx_type; 187*80d556f9SHans Rosenfeld ipmp_if_linkstate_t ifx_linkstate; 188*80d556f9SHans Rosenfeld ipmp_if_probestate_t ifx_probestate; 189*80d556f9SHans Rosenfeld ipmp_if_flags_t ifx_flags; 190*80d556f9SHans Rosenfeld uint32_t ifx_pad; 191*80d556f9SHans Rosenfeld ipmp_targinfo_xfer_t ifx_targinfo4; 192*80d556f9SHans Rosenfeld ipmp_targinfo_xfer_t ifx_targinfo6; 193*80d556f9SHans Rosenfeld } ipmp_ifinfo_xfer_t; 194*80d556f9SHans Rosenfeld 195*80d556f9SHans Rosenfeld 196e11c3f44Smeem /* 197e11c3f44Smeem * Data type describing an IPMP data address. 198e11c3f44Smeem */ 199e11c3f44Smeem typedef struct ipmp_addrinfo { 200e11c3f44Smeem struct sockaddr_storage ad_addr; 201e11c3f44Smeem ipmp_addr_state_t ad_state; 202e11c3f44Smeem char ad_group[LIFGRNAMSIZ]; 203e11c3f44Smeem char ad_binding[LIFNAMSIZ]; 204*80d556f9SHans Rosenfeld uint32_t ad_pad; 205e11c3f44Smeem } ipmp_addrinfo_t; 206e11c3f44Smeem 2077c478bd9Sstevel@tonic-gate typedef enum { 2087c478bd9Sstevel@tonic-gate IPMP_QCONTEXT_LIVE, 2097c478bd9Sstevel@tonic-gate IPMP_QCONTEXT_SNAP 2107c478bd9Sstevel@tonic-gate } ipmp_qcontext_t; 2117c478bd9Sstevel@tonic-gate 2127c478bd9Sstevel@tonic-gate extern int ipmp_setqcontext(ipmp_handle_t, ipmp_qcontext_t); 2137c478bd9Sstevel@tonic-gate extern int ipmp_getgrouplist(ipmp_handle_t, ipmp_grouplist_t **); 2147c478bd9Sstevel@tonic-gate extern void ipmp_freegrouplist(ipmp_grouplist_t *); 2157c478bd9Sstevel@tonic-gate extern int ipmp_getgroupinfo(ipmp_handle_t, const char *, ipmp_groupinfo_t **); 2167c478bd9Sstevel@tonic-gate extern void ipmp_freegroupinfo(ipmp_groupinfo_t *); 2177c478bd9Sstevel@tonic-gate extern int ipmp_getifinfo(ipmp_handle_t, const char *, ipmp_ifinfo_t **); 2187c478bd9Sstevel@tonic-gate extern void ipmp_freeifinfo(ipmp_ifinfo_t *); 219e11c3f44Smeem extern int ipmp_getaddrinfo(ipmp_handle_t, const char *, 220e11c3f44Smeem struct sockaddr_storage *, ipmp_addrinfo_t **); 221e11c3f44Smeem extern void ipmp_freeaddrinfo(ipmp_addrinfo_t *); 2227c478bd9Sstevel@tonic-gate 2237c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2247c478bd9Sstevel@tonic-gate } 2257c478bd9Sstevel@tonic-gate #endif 2267c478bd9Sstevel@tonic-gate 2277c478bd9Sstevel@tonic-gate #endif /* _IPMP_QUERY_H */ 228