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 5*e11c3f44Smeem * Common Development and Distribution License (the "License"). 6*e11c3f44Smeem * 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 20*e11c3f44Smeem * 21*e11c3f44Smeem * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 227c478bd9Sstevel@tonic-gate * Use is subject to license terms. 237c478bd9Sstevel@tonic-gate */ 247c478bd9Sstevel@tonic-gate 257c478bd9Sstevel@tonic-gate #ifndef _IPMP_QUERY_H 267c478bd9Sstevel@tonic-gate #define _IPMP_QUERY_H 277c478bd9Sstevel@tonic-gate 287c478bd9Sstevel@tonic-gate #include <sys/types.h> 297c478bd9Sstevel@tonic-gate #include <sys/socket.h> /* needed by <net/if.h> */ 307c478bd9Sstevel@tonic-gate #include <net/if.h> /* for LIF*NAMSIZ */ 317c478bd9Sstevel@tonic-gate #include <ipmp.h> 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate /* 347c478bd9Sstevel@tonic-gate * IPMP query interfaces. 357c478bd9Sstevel@tonic-gate * 367c478bd9Sstevel@tonic-gate * These interfaces may only be used within ON or after signing a contract 37*e11c3f44Smeem * with ON. For documentation, refer to PSARC/2002/615 and PSARC/2007/272. 387c478bd9Sstevel@tonic-gate */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #ifdef __cplusplus 417c478bd9Sstevel@tonic-gate extern "C" { 427c478bd9Sstevel@tonic-gate #endif 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate /* 45*e11c3f44Smeem * Assorted enumerations used in the data types described below. 46*e11c3f44Smeem */ 47*e11c3f44Smeem typedef enum ipmp_if_probestate { 48*e11c3f44Smeem IPMP_PROBE_OK, /* probes detect no problems */ 49*e11c3f44Smeem IPMP_PROBE_FAILED, /* probes detect failure */ 50*e11c3f44Smeem IPMP_PROBE_UNKNOWN, /* probe detection unavailable */ 51*e11c3f44Smeem IPMP_PROBE_DISABLED /* probe detection disabled */ 52*e11c3f44Smeem } ipmp_if_probestate_t; 53*e11c3f44Smeem 54*e11c3f44Smeem typedef enum ipmp_if_linkstate { 55*e11c3f44Smeem IPMP_LINK_UP, /* link detects up */ 56*e11c3f44Smeem IPMP_LINK_DOWN, /* link detects down */ 57*e11c3f44Smeem IPMP_LINK_UNKNOWN /* link detection unavailable */ 58*e11c3f44Smeem } ipmp_if_linkstate_t; 59*e11c3f44Smeem 60*e11c3f44Smeem typedef enum ipmp_if_flags { 61*e11c3f44Smeem IPMP_IFFLAG_INACTIVE = 0x1, 62*e11c3f44Smeem IPMP_IFFLAG_HWADDRDUP = 0x2, 63*e11c3f44Smeem IPMP_IFFLAG_ACTIVE = 0x4, 64*e11c3f44Smeem IPMP_IFFLAG_DOWN = 0x8 65*e11c3f44Smeem } ipmp_if_flags_t; 66*e11c3f44Smeem 67*e11c3f44Smeem typedef enum ipmp_addr_state { 68*e11c3f44Smeem IPMP_ADDR_UP, /* address is up */ 69*e11c3f44Smeem IPMP_ADDR_DOWN /* address is down */ 70*e11c3f44Smeem } ipmp_addr_state_t; 71*e11c3f44Smeem 72*e11c3f44Smeem typedef enum ipmp_if_targmode { 73*e11c3f44Smeem IPMP_TARG_DISABLED, /* use of targets is disabled */ 74*e11c3f44Smeem IPMP_TARG_ROUTES, /* route-learned targets */ 75*e11c3f44Smeem IPMP_TARG_MULTICAST /* multicast-learned targets */ 76*e11c3f44Smeem } ipmp_if_targmode_t; 77*e11c3f44Smeem 78*e11c3f44Smeem #define IPMP_LIST_SIZE(listtype, elsize, nel) \ 79*e11c3f44Smeem ((sizeof (ipmp_ ## listtype ## _t) - (elsize)) + ((nel) * (elsize))) 80*e11c3f44Smeem 81*e11c3f44Smeem /* 827c478bd9Sstevel@tonic-gate * Data type describing a list of IPMP groups. 837c478bd9Sstevel@tonic-gate */ 847c478bd9Sstevel@tonic-gate typedef struct ipmp_grouplist { 857c478bd9Sstevel@tonic-gate uint64_t gl_sig; 867c478bd9Sstevel@tonic-gate unsigned int gl_ngroup; 877c478bd9Sstevel@tonic-gate char gl_groups[1][LIFGRNAMSIZ]; 887c478bd9Sstevel@tonic-gate } ipmp_grouplist_t; 897c478bd9Sstevel@tonic-gate 90*e11c3f44Smeem #define IPMP_GROUPLIST_SIZE(ngr) \ 91*e11c3f44Smeem IPMP_LIST_SIZE(grouplist, LIFGRNAMSIZ, ngr) 927c478bd9Sstevel@tonic-gate 937c478bd9Sstevel@tonic-gate /* 947c478bd9Sstevel@tonic-gate * Data type describing a list of interfaces. 957c478bd9Sstevel@tonic-gate */ 967c478bd9Sstevel@tonic-gate typedef struct ipmp_iflist { 977c478bd9Sstevel@tonic-gate unsigned int il_nif; 987c478bd9Sstevel@tonic-gate char il_ifs[1][LIFNAMSIZ]; 997c478bd9Sstevel@tonic-gate } ipmp_iflist_t; 1007c478bd9Sstevel@tonic-gate 101*e11c3f44Smeem #define IPMP_IFLIST_SIZE(nif) \ 102*e11c3f44Smeem IPMP_LIST_SIZE(iflist, LIFNAMSIZ, nif) 103*e11c3f44Smeem 104*e11c3f44Smeem /* 105*e11c3f44Smeem * Data type describing a list of addresses. 106*e11c3f44Smeem */ 107*e11c3f44Smeem typedef struct ipmp_addrlist { 108*e11c3f44Smeem unsigned int al_naddr; 109*e11c3f44Smeem struct sockaddr_storage al_addrs[1]; 110*e11c3f44Smeem } ipmp_addrlist_t; 111*e11c3f44Smeem 112*e11c3f44Smeem #define IPMP_ADDRLIST_SIZE(naddr) \ 113*e11c3f44Smeem IPMP_LIST_SIZE(addrlist, sizeof (struct sockaddr_storage), naddr) 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate /* 1167c478bd9Sstevel@tonic-gate * Data type describing the state of an IPMP group. 1177c478bd9Sstevel@tonic-gate */ 1187c478bd9Sstevel@tonic-gate typedef struct ipmp_groupinfo { 1197c478bd9Sstevel@tonic-gate char gr_name[LIFGRNAMSIZ]; 1207c478bd9Sstevel@tonic-gate uint64_t gr_sig; 1217c478bd9Sstevel@tonic-gate ipmp_group_state_t gr_state; 1227c478bd9Sstevel@tonic-gate ipmp_iflist_t *gr_iflistp; 123*e11c3f44Smeem ipmp_addrlist_t *gr_adlistp; 124*e11c3f44Smeem char gr_ifname[LIFNAMSIZ]; 125*e11c3f44Smeem char gr_m4ifname[LIFNAMSIZ]; 126*e11c3f44Smeem char gr_m6ifname[LIFNAMSIZ]; 127*e11c3f44Smeem char gr_bcifname[LIFNAMSIZ]; 128*e11c3f44Smeem unsigned int gr_fdt; 1297c478bd9Sstevel@tonic-gate } ipmp_groupinfo_t; 1307c478bd9Sstevel@tonic-gate 1317c478bd9Sstevel@tonic-gate /* 132*e11c3f44Smeem * Data type describing IPMP target information for a particular interface. 133*e11c3f44Smeem */ 134*e11c3f44Smeem typedef struct ipmp_targinfo { 135*e11c3f44Smeem char it_name[LIFNAMSIZ]; 136*e11c3f44Smeem struct sockaddr_storage it_testaddr; 137*e11c3f44Smeem ipmp_if_targmode_t it_targmode; 138*e11c3f44Smeem ipmp_addrlist_t *it_targlistp; 139*e11c3f44Smeem } ipmp_targinfo_t; 140*e11c3f44Smeem 141*e11c3f44Smeem /* 1427c478bd9Sstevel@tonic-gate * Data type describing the IPMP-related state of an interface. 1437c478bd9Sstevel@tonic-gate */ 1447c478bd9Sstevel@tonic-gate typedef struct ipmp_ifinfo { 1457c478bd9Sstevel@tonic-gate char if_name[LIFNAMSIZ]; 1467c478bd9Sstevel@tonic-gate char if_group[LIFGRNAMSIZ]; 1477c478bd9Sstevel@tonic-gate ipmp_if_state_t if_state; 1487c478bd9Sstevel@tonic-gate ipmp_if_type_t if_type; 149*e11c3f44Smeem ipmp_if_linkstate_t if_linkstate; 150*e11c3f44Smeem ipmp_if_probestate_t if_probestate; 151*e11c3f44Smeem ipmp_if_flags_t if_flags; 152*e11c3f44Smeem ipmp_targinfo_t if_targinfo4; 153*e11c3f44Smeem ipmp_targinfo_t if_targinfo6; 1547c478bd9Sstevel@tonic-gate } ipmp_ifinfo_t; 1557c478bd9Sstevel@tonic-gate 156*e11c3f44Smeem /* 157*e11c3f44Smeem * Data type describing an IPMP data address. 158*e11c3f44Smeem */ 159*e11c3f44Smeem typedef struct ipmp_addrinfo { 160*e11c3f44Smeem struct sockaddr_storage ad_addr; 161*e11c3f44Smeem ipmp_addr_state_t ad_state; 162*e11c3f44Smeem char ad_group[LIFGRNAMSIZ]; 163*e11c3f44Smeem char ad_binding[LIFNAMSIZ]; 164*e11c3f44Smeem } ipmp_addrinfo_t; 165*e11c3f44Smeem 1667c478bd9Sstevel@tonic-gate typedef enum { 1677c478bd9Sstevel@tonic-gate IPMP_QCONTEXT_LIVE, 1687c478bd9Sstevel@tonic-gate IPMP_QCONTEXT_SNAP 1697c478bd9Sstevel@tonic-gate } ipmp_qcontext_t; 1707c478bd9Sstevel@tonic-gate 1717c478bd9Sstevel@tonic-gate extern int ipmp_setqcontext(ipmp_handle_t, ipmp_qcontext_t); 1727c478bd9Sstevel@tonic-gate extern int ipmp_getgrouplist(ipmp_handle_t, ipmp_grouplist_t **); 1737c478bd9Sstevel@tonic-gate extern void ipmp_freegrouplist(ipmp_grouplist_t *); 1747c478bd9Sstevel@tonic-gate extern int ipmp_getgroupinfo(ipmp_handle_t, const char *, ipmp_groupinfo_t **); 1757c478bd9Sstevel@tonic-gate extern void ipmp_freegroupinfo(ipmp_groupinfo_t *); 1767c478bd9Sstevel@tonic-gate extern int ipmp_getifinfo(ipmp_handle_t, const char *, ipmp_ifinfo_t **); 1777c478bd9Sstevel@tonic-gate extern void ipmp_freeifinfo(ipmp_ifinfo_t *); 178*e11c3f44Smeem extern int ipmp_getaddrinfo(ipmp_handle_t, const char *, 179*e11c3f44Smeem struct sockaddr_storage *, ipmp_addrinfo_t **); 180*e11c3f44Smeem extern void ipmp_freeaddrinfo(ipmp_addrinfo_t *); 1817c478bd9Sstevel@tonic-gate 1827c478bd9Sstevel@tonic-gate #ifdef __cplusplus 1837c478bd9Sstevel@tonic-gate } 1847c478bd9Sstevel@tonic-gate #endif 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate #endif /* _IPMP_QUERY_H */ 187