Current File : //usr/include/libdlib.h
/*
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _LIBDLIB_H
#define	_LIBDLIB_H

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/types.h>
#include <sys/ib/ib_types.h>

/*
 * Interfaces for IPoIB partition object management.
 */
#define	MAXPKEYSTRSZ	968
#define	MAXPKEYLEN 6
#define	IBGUIDSTRLEN 16
#define	IBPORTSTRLEN 5

#define	DLADM_PART_FORCE_CREATE 0x1

typedef struct dladm_ib_attr_s {
	datalink_id_t	dia_physlinkid;	/* IB Phys link datalink ID */
	datalink_id_t	dia_partlinkid;	/* IB Partition datalink ID */
	ib_pkey_t	dia_pkey;	/* IB partitions P_Key */
	uint32_t	dia_flags;
	uint_t		dia_portnum;	/* IB Phys link's HCA port number */
	int		dia_instance;	/* IP over IB driver instance number */
	ib_guid_t	dia_hca_guid;	/* IB HCA GUID */
	ib_guid_t	dia_port_guid;	/* IB HCA Port GUID */
	uint_t		dia_port_pkey_tbl_sz;
	ib_pkey_t	*dia_port_pkeys;	/* Ptr to the P_Key table */
	boolean_t	dia_anet;	/* zonecfg anet datalink */
	zoneid_t	dia_target_zoneid; /* set only for anet datalinks */
} dladm_ib_attr_t;

typedef struct dladm_ib_attr_s dladm_part_attr_t;

typedef enum {
	DLADM_PART_UD_MODE = 0,
	DLADM_PART_CM_MODE
} dladm_part_linkmode_t;

extern dladm_status_t dladm_part_create(dladm_handle_t, datalink_id_t,
    ib_pkey_t, uint32_t, char *, datalink_id_t *, dladm_arg_list_t *);
extern dladm_status_t dladm_part_create_zone(dladm_handle_t, zoneid_t,
    datalink_id_t, ib_pkey_t, uint32_t, char *,
    datalink_id_t *, dladm_arg_list_t *, boolean_t);
extern dladm_status_t dladm_part_delete(dladm_handle_t, datalink_id_t, int);
extern dladm_status_t dladm_part_up(dladm_handle_t, datalink_id_t, uint32_t);
extern dladm_status_t dladm_part_down(dladm_handle_t, datalink_id_t, uint32_t);
extern dladm_status_t dladm_part_info(dladm_handle_t, datalink_id_t,
    dladm_part_attr_t *, uint32_t);
extern dladm_status_t dladm_ib_info(dladm_handle_t, datalink_id_t,
    dladm_ib_attr_t *, uint32_t);
extern void dladm_free_ib_info(dladm_ib_attr_t *);

/*
 * Interfaces for EoIB datalink management.
 */

#define	EIB_RESERVED_GWPORT		"reserved"

/*
 * Lengths of objects defined in EoIB FIP as well the values used by the
 * EoIB ioctls for storing that information (the latter always slightly
 * larger than the former)
 */
#define	EIB_FIP_GW_SYSNAME_LEN		32
#define	EIB_GW_SYSNAME_LEN		40
#define	EIB_FIP_GW_PORTNAME_LEN		8
#define	EIB_GW_PORTNAME_LEN		16

/*
 * Gateway availability indicators returned by the ioctls
 */
#define	EIB_AVL_GW_AVAILABLE		((uint32_t)1 << 16)
#define	EIB_AVL_HOST_ADM_OK		((uint32_t)1 << 17)
#define	EIB_AVL_GW_DEAD			((uint32_t)1 << 31)
#define	EIB_AVL_NET_VNICS_MASK		(0xffff)

typedef struct dladm_eoib_gw_attr_s {
	datalink_id_t		ga_ib_physlinkid;
	uint32_t		ga_gw_portid;
	uint32_t		ga_gw_availability;
	char			ga_gw_name[EIB_GW_SYSNAME_LEN];
	char			ga_gw_port[EIB_GW_PORTNAME_LEN];
} dladm_eoib_gw_attr_t;

typedef struct dladm_eoib_gw_info_s {
	uint32_t		gi_num_entries;
	dladm_eoib_gw_attr_t	*gi_list;
} dladm_eoib_gw_info_t;

typedef struct dladm_eoib_attr_s {
	ib_guid_t		ea_port_guid;
	datalink_id_t		ea_linkid;
	datalink_id_t		ea_ib_physlinkid;
	uint32_t		ea_gw_portid;
	uint32_t		ea_gw_availability;
	char			ea_gw_name[EIB_GW_SYSNAME_LEN];
	char			ea_gw_port[EIB_GW_PORTNAME_LEN];
} dladm_eoib_attr_t;

typedef struct dladm_eoib_info_s {
	uint32_t		ei_num_entries;
	dladm_eoib_attr_t	*ei_list;
} dladm_eoib_info_t;

typedef struct dladm_eoib_create_s {
	ib_guid_t		ec_hca_guid;
	ib_guid_t		ec_port_guid;
	uint32_t		ec_hca_num;
	uint32_t		ec_port_num;
	uint32_t		ec_flags;
	datalink_id_t		ec_ib_physlinkid;
	char			ec_linkname[MAXLINKNAMELEN];
	char			ec_gw_name[EIB_GW_SYSNAME_LEN];
	char			ec_gw_port[EIB_GW_PORTNAME_LEN];
} dladm_eoib_create_t;


extern dladm_status_t dladm_eoib_create(dladm_handle_t, dladm_eoib_create_t *,
    datalink_id_t *);
extern dladm_status_t dladm_eoib_delete(dladm_handle_t, datalink_id_t,
    uint32_t);
extern dladm_status_t dladm_eoib_up(dladm_handle_t, datalink_id_t);
extern dladm_status_t dladm_eoib_down(dladm_handle_t, datalink_id_t);
extern dladm_status_t dladm_eoib_info(dladm_handle_t, datalink_id_t,
    dladm_eoib_info_t **, uint32_t);
extern void dladm_eoib_free_info(dladm_eoib_info_t *);
extern dladm_status_t dladm_eoib_gwinfo(dladm_handle_t,
    dladm_eoib_gw_info_t **);
extern void dladm_eoib_free_gwinfo(dladm_eoib_gw_info_t *);


#ifdef	__cplusplus
}
#endif

#endif /* _LIBDLIB_H */