1*d6b92ffaSHans Petter Selasky /* 2*d6b92ffaSHans Petter Selasky * Copyright (c) 2008 Lawrence Livermore National Laboratory 3*d6b92ffaSHans Petter Selasky * 4*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 5*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 6*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 7*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 8*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 9*d6b92ffaSHans Petter Selasky * 10*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 11*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 12*d6b92ffaSHans Petter Selasky * conditions are met: 13*d6b92ffaSHans Petter Selasky * 14*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 15*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 16*d6b92ffaSHans Petter Selasky * disclaimer. 17*d6b92ffaSHans Petter Selasky * 18*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 19*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 20*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 21*d6b92ffaSHans Petter Selasky * provided with the distribution. 22*d6b92ffaSHans Petter Selasky * 23*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30*d6b92ffaSHans Petter Selasky * SOFTWARE. 31*d6b92ffaSHans Petter Selasky * 32*d6b92ffaSHans Petter Selasky */ 33*d6b92ffaSHans Petter Selasky 34*d6b92ffaSHans Petter Selasky /** ========================================================================= 35*d6b92ffaSHans Petter Selasky * Define the internal data structures. 36*d6b92ffaSHans Petter Selasky */ 37*d6b92ffaSHans Petter Selasky 38*d6b92ffaSHans Petter Selasky #ifndef _INTERNAL_H_ 39*d6b92ffaSHans Petter Selasky #define _INTERNAL_H_ 40*d6b92ffaSHans Petter Selasky 41*d6b92ffaSHans Petter Selasky #include <infiniband/ibnetdisc.h> 42*d6b92ffaSHans Petter Selasky #include <complib/cl_qmap.h> 43*d6b92ffaSHans Petter Selasky 44*d6b92ffaSHans Petter Selasky #define IBND_DEBUG(fmt, ...) \ 45*d6b92ffaSHans Petter Selasky if (ibdebug) { \ 46*d6b92ffaSHans Petter Selasky printf("%s:%u; " fmt, __FILE__, __LINE__, ## __VA_ARGS__); \ 47*d6b92ffaSHans Petter Selasky } 48*d6b92ffaSHans Petter Selasky #define IBND_ERROR(fmt, ...) \ 49*d6b92ffaSHans Petter Selasky fprintf(stderr, "%s:%u; " fmt, __FILE__, __LINE__, ## __VA_ARGS__) 50*d6b92ffaSHans Petter Selasky 51*d6b92ffaSHans Petter Selasky /* HASH table defines */ 52*d6b92ffaSHans Petter Selasky #define HASHGUID(guid) ((uint32_t)(((uint32_t)(guid) * 101) ^ ((uint32_t)((guid) >> 32) * 103))) 53*d6b92ffaSHans Petter Selasky 54*d6b92ffaSHans Petter Selasky #define MAXHOPS 63 55*d6b92ffaSHans Petter Selasky 56*d6b92ffaSHans Petter Selasky #define DEFAULT_MAX_SMP_ON_WIRE 2 57*d6b92ffaSHans Petter Selasky #define DEFAULT_TIMEOUT 1000 58*d6b92ffaSHans Petter Selasky #define DEFAULT_RETRIES 3 59*d6b92ffaSHans Petter Selasky 60*d6b92ffaSHans Petter Selasky #define GINT_TO_POINTER(x) ((void *)(uintptr_t)(x)) 61*d6b92ffaSHans Petter Selasky 62*d6b92ffaSHans Petter Selasky typedef struct GHashTable GHashTable; 63*d6b92ffaSHans Petter Selasky 64*d6b92ffaSHans Petter Selasky #define g_hash_table_new_full(...) GHashTableNew() 65*d6b92ffaSHans Petter Selasky #define g_hash_table_destroy(...) GHashTableDestroy(__VA_ARGS__) 66*d6b92ffaSHans Petter Selasky #define g_hash_table_insert(...) GHashTableInsert(__VA_ARGS__) 67*d6b92ffaSHans Petter Selasky #define g_hash_table_lookup(...) GHashTableLookup(__VA_ARGS__) 68*d6b92ffaSHans Petter Selasky 69*d6b92ffaSHans Petter Selasky extern GHashTable *GHashTableNew(void); 70*d6b92ffaSHans Petter Selasky extern void GHashTableDestroy(GHashTable *); 71*d6b92ffaSHans Petter Selasky extern void GHashTableInsert(GHashTable *, void *key, void *value); 72*d6b92ffaSHans Petter Selasky extern void *GHashTableLookup(GHashTable *, void *key); 73*d6b92ffaSHans Petter Selasky 74*d6b92ffaSHans Petter Selasky typedef struct f_internal { 75*d6b92ffaSHans Petter Selasky ibnd_fabric_t fabric; 76*d6b92ffaSHans Petter Selasky GHashTable *lid2guid; 77*d6b92ffaSHans Petter Selasky } f_internal_t; 78*d6b92ffaSHans Petter Selasky f_internal_t *allocate_fabric_internal(void); 79*d6b92ffaSHans Petter Selasky void create_lid2guid(f_internal_t *f_int); 80*d6b92ffaSHans Petter Selasky void destroy_lid2guid(f_internal_t *f_int); 81*d6b92ffaSHans Petter Selasky void add_to_portlid_hash(ibnd_port_t * port, GHashTable *htable); 82*d6b92ffaSHans Petter Selasky 83*d6b92ffaSHans Petter Selasky typedef struct ibnd_scan { 84*d6b92ffaSHans Petter Selasky ib_portid_t selfportid; 85*d6b92ffaSHans Petter Selasky f_internal_t *f_int; 86*d6b92ffaSHans Petter Selasky struct ibnd_config *cfg; 87*d6b92ffaSHans Petter Selasky unsigned initial_hops; 88*d6b92ffaSHans Petter Selasky } ibnd_scan_t; 89*d6b92ffaSHans Petter Selasky 90*d6b92ffaSHans Petter Selasky typedef struct ibnd_smp ibnd_smp_t; 91*d6b92ffaSHans Petter Selasky typedef struct smp_engine smp_engine_t; 92*d6b92ffaSHans Petter Selasky typedef int (*smp_comp_cb_t) (smp_engine_t * engine, ibnd_smp_t * smp, 93*d6b92ffaSHans Petter Selasky uint8_t * mad_resp, void *cb_data); 94*d6b92ffaSHans Petter Selasky struct ibnd_smp { 95*d6b92ffaSHans Petter Selasky cl_map_item_t on_wire; 96*d6b92ffaSHans Petter Selasky struct ibnd_smp *qnext; 97*d6b92ffaSHans Petter Selasky smp_comp_cb_t cb; 98*d6b92ffaSHans Petter Selasky void *cb_data; 99*d6b92ffaSHans Petter Selasky ib_portid_t path; 100*d6b92ffaSHans Petter Selasky ib_rpc_t rpc; 101*d6b92ffaSHans Petter Selasky }; 102*d6b92ffaSHans Petter Selasky 103*d6b92ffaSHans Petter Selasky struct smp_engine { 104*d6b92ffaSHans Petter Selasky int umad_fd; 105*d6b92ffaSHans Petter Selasky int smi_agent; 106*d6b92ffaSHans Petter Selasky int smi_dir_agent; 107*d6b92ffaSHans Petter Selasky ibnd_smp_t *smp_queue_head; 108*d6b92ffaSHans Petter Selasky ibnd_smp_t *smp_queue_tail; 109*d6b92ffaSHans Petter Selasky void *user_data; 110*d6b92ffaSHans Petter Selasky cl_qmap_t smps_on_wire; 111*d6b92ffaSHans Petter Selasky struct ibnd_config *cfg; 112*d6b92ffaSHans Petter Selasky unsigned total_smps; 113*d6b92ffaSHans Petter Selasky }; 114*d6b92ffaSHans Petter Selasky 115*d6b92ffaSHans Petter Selasky int smp_engine_init(smp_engine_t * engine, char * ca_name, int ca_port, 116*d6b92ffaSHans Petter Selasky void *user_data, ibnd_config_t *cfg); 117*d6b92ffaSHans Petter Selasky int issue_smp(smp_engine_t * engine, ib_portid_t * portid, 118*d6b92ffaSHans Petter Selasky unsigned attrid, unsigned mod, smp_comp_cb_t cb, void *cb_data); 119*d6b92ffaSHans Petter Selasky int process_mads(smp_engine_t * engine); 120*d6b92ffaSHans Petter Selasky void smp_engine_destroy(smp_engine_t * engine); 121*d6b92ffaSHans Petter Selasky 122*d6b92ffaSHans Petter Selasky int add_to_nodeguid_hash(ibnd_node_t * node, ibnd_node_t * hash[]); 123*d6b92ffaSHans Petter Selasky 124*d6b92ffaSHans Petter Selasky int add_to_portguid_hash(ibnd_port_t * port, ibnd_port_t * hash[]); 125*d6b92ffaSHans Petter Selasky 126*d6b92ffaSHans Petter Selasky void add_to_type_list(ibnd_node_t * node, f_internal_t * fabric); 127*d6b92ffaSHans Petter Selasky 128*d6b92ffaSHans Petter Selasky void destroy_node(ibnd_node_t * node); 129*d6b92ffaSHans Petter Selasky 130*d6b92ffaSHans Petter Selasky #endif /* _INTERNAL_H_ */ 131