pax_global_header00006660000000000000000000000064125531747420014524gustar00rootroot0000000000000052 comment=8a408c90e372b5f21c0bec6b9f8f7e3dff230926 dapl-2.1.5/000077500000000000000000000000001255317474200124515ustar00rootroot00000000000000dapl-2.1.5/AUTHORS000066400000000000000000000004261255317474200135230ustar00rootroot00000000000000This is an incomplete list of people who have contributed to the DAPL project: Caitlin Bestler Philip Christopher Jay Danielsen Arlin Davis Tom Duffy Matthew Finlay Jimmy Hill James Lentini Gil Rubin Steve Sears Randy Smith Stan Smith Anthony Topper Steve Wise dapl-2.1.5/COPYING000066400000000000000000000023231255317474200135040ustar00rootroot00000000000000# # Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # Copyright (c) 2005 Voltaire Inc. All rights reserved. # Copyright (c) 2005-2010 Intel Corporation. All rights reserved. # Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. # Copyright (c) 2003 Topspin Corporation. All rights reserved. # Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # dapl-2.1.5/ChangeLog000066400000000000000000010447231255317474200142360ustar00rootroot00000000000000commit 2973531db7e0cb98c2524f33cd26d2dfc07c7435 Author: Arlin Davis Date: Tue May 26 10:06:44 2015 -0700 update release notes, readme files Signed-off-by: Arlin Davis commit 4aabeb14cae22822cc22c2eaffcd4e047d7aba02 Author: Arlin Davis Date: Tue May 26 09:37:40 2015 -0700 dat.conf: update comments regarding versions Signed-off-by: Arlin Davis commit 347e142c8b26f10cd87263f05f200dcde6200fd0 Author: Arlin Davis Date: Fri May 22 09:53:23 2015 -0700 dtest: add logging of provider private data size with -v Signed-off-by: Arlin Davis commit 2c9bf4fa108f7b7322974ab68f4aa6b1fcd1b363 Author: Arlin Davis Date: Fri May 22 09:52:31 2015 -0700 scm: remove use of msg.resv field for process id logging Signed-off-by: Arlin Davis commit 10debec2ec2df4dc87e9171a73ccc327a1af3e20 Author: Arlin Davis Date: Fri May 22 09:51:04 2015 -0700 cma: report correct CM req private data size on query Signed-off-by: Arlin Davis commit 14d85c68d76522b384ca38761472e7351cc3889d Author: Arlin Davis Date: Wed May 20 11:56:24 2015 -0700 mpxyd: memset ib_wr structure before post_send on WC and WR requests Signed-off-by: Arlin Davis commit 70aae776b355dd4fb2dfc6cb2cfc1b2e153aa251 Author: Arlin Davis Date: Wed May 20 11:43:03 2015 -0700 mcm: add HST side provider support for device without inline data capability Add registered WR buffers for HST->MXS (proxy in) mode when inline data is not supported by device. Use registered memory for source WR buffer instead of stack when sending RDMA write request to peer proxy-in service. Signed-off-by: Arlin Davis commit 62697218aa0a3eee8ba2aa80446ecde8ce8a46a5 Author: Arlin Davis Date: Mon May 18 14:51:08 2015 -0700 ucm: CM changes for UD extended port space and indexer Tested on 1200n 28ppn cluster, AlltoAll Intel MPI, UD mode. Both static and dynamic modes, over 500m connections. Change port manager to indexer and service ID manager to bitarray indexer. Reduces footprint for service IDs and allow direct lookup on CM messages. New insert, remove, lookup functions for processing ID based CM objects. Inbound requests, with the exception of new CM requests, will no longer parse list but use hash table lookups. AH caching is now used to prevent unnecessarily creating multiple AH's for same QP destination. Add 24-bit port space support to CM processing code and to wire protocol via DCM message reserve space. Add version check to limit to 16-bit for backward compatibility. Bump CM protocol version to 8 for xport and rtns fields. Signed-off-by: Arlin Davis commit 6d5869d4980cde888dafac1a9932d68e5004f80d Author: Arlin Davis Date: Mon May 18 14:36:28 2015 -0700 ucm: add device support for new port space hash table Allocate port space hash table during device open when creating CM services. Default settings are set to 4K entry chunks and 256K total port slots. Add environment variables for adjustments DAPL_UCM_ENTRY_BITS 11 DAPL_UCM_ARRAY_BITS 18 Signed-off-by: Arlin Davis commit 1a980379130e890bb5b0ab597f83b3ea5595a383 Author: Arlin Davis Date: Mon May 18 14:34:57 2015 -0700 ucm: allocate/free AH hash table for UD endpoint types Signed-off-by: Arlin Davis commit d8dd0942c3e60111324a928fd0900938c46cd1ac Author: Arlin Davis Date: Mon May 18 14:31:57 2015 -0700 ucm: check for AH caching when destroying via UD extension Signed-off-by: Arlin Davis commit ef42f3e739bfba13e4be75215208dca4d54803d4 Author: Arlin Davis Date: Mon May 18 14:21:07 2015 -0700 ucm: optimizations for large scale UD communication management AH caching per QP, AH space set to 48K for LID unicast Bump port space up to 24 bits Reduce CM object and reduce private data to 68 bytes Add xport space and rtns to DCM reserve fields. New indexer macros for port space hash table management Add hash table storage to ibtrans device objects Signed-off-by: Arlin Davis commit e750509148eaa7feb70c1353b6e353e0968b0852 Author: Arlin Davis Date: Fri May 15 15:51:31 2015 -0700 mpxyd: use wr opcode instead of wc opcode to support logging on error cases Signed-off-by: Arlin Davis commit 9ba178297231c4531c0ff6bc8b07076d96ffe495 Author: Arlin Davis Date: Fri May 15 15:47:38 2015 -0700 mcm: HST->MXS mode, using RDMA_WRITE_WITH_IMM, fails with dtest -w Host side incorrectly sets opcode to IBV_WR_RDMA_WRITE_WITH_IMM on every segment instead of just the last segment. Signed-off-by: Arlin Davis commit 142fa8fa58d5e0b92dccc52d7a3bd913456084b4 Author: Mark Salter Date: Wed May 13 16:40:58 2015 -0700 dapl: aarch64 support for linux Add atomic ops to fix builds for aarch64 Linux. Signed-off-by: Mark Salter Acked-by: Arlin Davis commit 0f8378347ca4f04a86ff1dc9701b349352042205 Author: Arlin Davis Date: Tue May 5 11:13:15 2015 -0700 dapltest: add scripts to dist, set default device to IPoIB Signed-off-by: Arlin Davis commit 78859905995ba0df229957dc3cd15d5153f4d0ef Author: Arlin Davis Date: Thu Apr 30 14:04:09 2015 -0700 mpxyd: add wc_flags to proxy work completions Signed-off-by: Arlin Davis commit 3d0f53bd26db0c2c5261740d8fefc6e03209996a Author: Arlin Davis Date: Thu Mar 19 17:05:08 2015 -0700 Release 2.1.4 Signed-off-by: Arlin Davis commit edf672349adbcb64246ef2465e7dd582a5243c6a Author: Arlin Davis Date: Thu Mar 19 16:54:17 2015 -0700 mpxyd: fix typo in configuration file Signed-off-by: Arlin Davis commit 9219bf696d7c69744a668a045c7f1d0bf36c471a Author: Arlin Davis Date: Thu Mar 12 16:02:40 2015 -0400 cma: RR attributes moved to common ib_cm struct Signed-off-by: Arlin Davis commit 7b5d3b8a58d651a819e0f9418e5014a1a55a5751 Author: Arlin Davis Date: Thu Mar 12 16:00:20 2015 -0400 mpxyd: tx thread incorrectly sleeps with negative pi_rw_cnt value Signed-off-by: Arlin Davis commit 670b6b34c4b4454ae801aa13bdfef94e98116774 Author: Arlin Davis Date: Mon Mar 9 10:31:13 2015 -0400 dat.conf: add entries for True Scale qib device Signed-off-by: Arlin Davis commit 0ef549e67056a2ddf8a631b2a318dd68cf674e2e Author: Arlin Davis Date: Thu Feb 12 15:21:37 2015 -0500 mpxyd: add support for devices without inline data support Add function to check for inline support during device open. If inline data is not supported, the CM service and Proxy data mover will not use inline data option on small IO. The PO->PI service will now allocate and register necessary memory to send mcm_wr_rx and mcm_wc_rx operations from registered memory locations if inline data not supported. If inline is supported, no extra memory will be allocated and src buffer will be built on stack as before. Cleanup some build warnings. Signed-off-by: Arlin Davis commit bdf22d43b6193537cd4def9fa80324cc02535b47 Author: Arlin Davis Date: Tue Feb 3 16:27:50 2015 -0800 ucm: long disconnect times with many-to-one applications Improve the DREQ/DREP handshake and state machine to handle DREQ crossings and dropped DREP with new timewait state. Change dat_ep_disconnect call to ensure non-blocking regardless of flags or state. Add adjustable disconnect reply timer and retry count. DCM_DREP_TIME, DCM_DREQ_RETRY Signed-off-by: Arlin Davis commit b5d72bb52401901a0fc551c64b09378e3e933550 Author: Arlin Davis Date: Thu Jan 22 15:49:25 2015 -0800 openib: add inline data support check during device open Not all rdma devices support inline data, however without a verbs device attribute the only way to determine support is with a QP create with max_inline_send set. Add a common function to verify inline data support before setting default to 64 bytes. Signed-off-by: Arlin Davis commit 3788335383b02325e20f35f455d355b061b468bc Author: Arlin Davis Date: Tue Jan 6 14:01:39 2015 -0800 cleanup ib/cm attribute management across openib providers Signed-off-by: Arlin Davis commit 1a917c0ee793971dbbd75503a5cbfb83336a81f5 Author: Arlin Davis Date: Tue Jan 6 13:43:57 2015 -0800 dapltest: fix -Werror=format-security issue with printf Signed-off-by: Arlin Davis commit b124919d0463377844bfbb98f1de3c4cfceefc3e Author: Arlin Davis Date: Mon Dec 15 12:47:44 2014 -0800 Release 2.1.3 Signed-off-by: Arlin Davis commit 4fad243dafcd64b956917020bc2eb6134dff3ce9 Author: Arlin Davis Date: Mon Dec 15 12:15:54 2014 -0800 dapl: mpxyd service changes to support multi-thread single-core option The proxy service has been changed to reduce the number of cores required on the host side. Provides new option, via mpxyd.conf, to use single-core and allow system adminitrator to bind to specific core id for all Intel Xeon Phi adapters in the platform. mcm_affinity = 2 will set to single core (per Intel Xeon Phi). mcm_affinity_base_mic will set to specific core for all adapters. Best performance can be acheived with mcm_affinity = 2 and mcm_affinity_base_mic == 0. This option will cause single core to remain busy, polling operations from clients, as long as long as device is open and being used by clients for data transfers. Default remains mcm_affinity = 1, multi-thread, multi-core. See mpxyd.conf for details. Proxy services work threads have been modified to yield and limit work processing when data flow is pending. Signed-off-by: Arlin Davis commit 7e7ceee5fdbe99f9241405b84ec6a4bba8978f03 Author: Arlin Davis Date: Mon Dec 15 12:05:33 2014 -0800 dapl: add rdma_write_imm and write only option to dtest New write_only (-w) option with rdma_write_imm can be used with providers that support IB extensions. Allows more options for write bandwith profiling with immediate data and signaling rate options to increase write data rates, especially on MIC clients that use proxy services. Signed-off-by: Arlin Davis commit 0ae79c2236cc3b80f52cb4a3b2a38a40f1cba8b7 Author: Arlin Davis Date: Tue Dec 9 15:35:59 2014 -0800 ucm: add time wait override capability for CM services New environment variable DAPL_UCM_WAIT_TIME (ms) to override the default wait_time for CM services. Default setting is 60 seconds. Signed-off-by: Arlin Davis commit 0bcd1e8ec1b85be02ce4c0b2c49b167c4a3cde74 Author: Arlin Davis Date: Tue Dec 9 14:40:08 2014 -0800 common: dapl_ep_free must serialize CM object destroy CM object could be destroyed from time_wait state from provider in separate thread. Destruction must be serialized with EP lock. Signed-off-by: Arlin Davis commit 6250e9791ee44de1d765c0e4a5d307e22f1e3680 Author: Arlin Davis Date: Thu Nov 13 10:36:33 2014 -0800 dtestx: allow scale up to 1000 EP's Signed-off-by: Arlin Davis commit 5428fe5d8ce1bdf8b9530bb4ce96fb5c95d9aa7f Author: Arlin Davis Date: Thu Nov 13 10:34:52 2014 -0800 ucm: RTU not retransmitted in TIMEWAIT state Signed-off-by: Arlin Davis commit aa1d68b1ef129eff56221fc316827c6161f8b36d Author: Arlin Davis Date: Wed Nov 5 10:10:55 2014 -0800 mpxyd: increase max open files for service Signed-off-by: Arlin Davis commit 1b30fa751e0b7f679fa1f48a48860cfb77cf1b2b Author: Arlin Davis Date: Fri Nov 21 14:26:40 2014 -0800 mpxyd: DTO completion ERR: status 12, op RDMA_WRITE running MPI alltoall test Running MIC scale-up configuration with mcm provider on a MXS node instead of shm causes DTO error due to heavy use of proxy-in buffer pools. Hit corner case where proxy buffer management hd ptr crossed tl ptr due to 64 byte alignment on start when hd < 64 bytes behind tl. Add additional checking on PO and PI buffer management to handle the case of HD passing TL on start locations. Also changed PO processing to hold lock until hd ptr is registered with buf_wc slot management to preserve order of memory usage across threads. Reduced the size of WC queue for PO and PI buffer management. Profiling, via MCM_PROFILE, was added to monitor and trigger buffer management errors. Signed-off-by: Arlin Davis commit 9692759bd2b5bb527eb2ad6442a4d04fef54ca61 Author: Arlin Davis Date: Mon Oct 13 14:10:36 2014 -0700 mcm: HST->MXS mode incorrectly signals multiple fragments per WR Signed-off-by: Arlin Davis commit 4a0f2fd605bfdc3b1dbd42c3128879ab0ab7514b Author: Arlin Davis Date: Thu Oct 9 15:23:24 2014 -0700 mcm: add segmentation to HST->MXS mode for improved performance Signed-off-by: Arlin Davis commit 5ac3c9342f57bf1cadbf9d97065eabb9be36f14c Author: Arlin Davis Date: Thu Oct 9 15:21:02 2014 -0700 mpxyd: set global seg_sz to 128KB for proxy data service Signed-off-by: Arlin Davis commit 78f3496bae4eb6c8e8a2c9606bc127dda562324c Author: Arlin Davis Date: Mon Oct 6 13:54:39 2014 -0700 openib: add port_num to provider named attributes Signed-off-by: Arlin Davis commit 07acb18e6495d04da78854ac06d3faf3aacb486e Author: Arlin Davis Date: Mon Oct 6 12:50:09 2014 -0700 mcm: provide CPU family/model attribute on both host and mic sides Signed-off-by: Arlin Davis commit 1efe38952c28fc757c035fa486ea1c9e440a43ae Author: Arlin Davis Date: Tue Sep 30 14:07:52 2014 -0700 dtestx: update IB extension example test with new v2.0.9 features Add support for new IB extensions for CM and AH resource cleanup. Check for v2.0.9 and call dat_ib_ud_cm_free after connection establishment and dat_ib_ud_ah_free after all data has been transfered on UD endpoints. Also add socket based address exchange to eliminate the need to include lid and qpn parameters on the client side. Change the multiple EP mode to send from EP 0 to EP[0-3] on server side and EP[0-3] to EP[0-3] on client side. Signed-off-by: Arlin Davis commit eb8acb83a4ee2eca22eaf1904bf1db343fd94e2d Author: Amir Hanania Date: Thu Sep 25 16:34:20 2014 -0700 dtest: add dtestsrq for SRQ example and provider testing Signed-off-by: Arlin Davis commit 3b778859648bda3fec346d5a992b82376885a540 Author: Amir Hanania Date: Thu Sep 25 16:32:06 2014 -0700 common: add srq support for openib verbs providers Add necessary components and hooks to support ib_verbs shared receive queues for both RC and UD QP's. External interfaces were already provided per DAT 2.0 specification but internal support was missing. A new dtestsrq will be provided with package for testing and example code. Acked-by: Arlin Davis commit 110425e3a7a59e3c108a1e59819eaa006be995ca Author: Arlin Davis Date: Thu Sep 25 16:06:33 2014 -0700 openib: add IB UD cm_free/ah_free extension support in UCM provider Make changes to UCM provider for new CM and AH destroy extensions. Allow consumer to schedule CM object destroy after CM connection event has been processed. Active side will put CM object in TIMEWAIT in case RTU is dropped, passive side can schedule CM object destroy immediatly when called. In the case where consumer requests CM object destroy, the provider will remove all internal references to AH since consumer will call AH destroy directly when finished with UD sends. All other providers, MCM, CMA, SCM will return UNSUPPORTED if new extensions are called. See dtestx source for code examples of new extensions. Signed-off-by: Arlin Davis commit 4eec39c98e8484cdd423a4eae8ae3e5771674099 Author: Arlin Davis Date: Thu Sep 25 16:01:33 2014 -0700 openib: add new TIMEWAIT state for CM Signed-off-by: Arlin Davis commit 7163e7e8e60301c7eef380c508bce23453d401f1 Author: Arlin Davis Date: Thu Sep 25 15:42:38 2014 -0700 extension: add IB UD extensions to reduce provider CM and AH memory footprint dat_ib_ud_cm_free, dat_ib_ud_ah_free added to allow consumers the option to free provider CM and AH objects, related to AH resolution, immediately after consuming CONN events instead of waiting for EP destroy. With existing UD service providers the CM and AH objects are linked to EP and not destroyed until consumer calls dat_ep_free. dat_ib_ud_cm_free() frees CM object after AH and private data are copied and stored by consumer. Provider will destroy internal object and memory associated with CM and AH resolution. MAY be called after CM establishment and before EP destroyed dat_ib_ud_ah_free() destroys UD Address Handle (AH). MUST be called after all UD sends are complete and before UD EP is destroyed. Signed-off-by: Arlin Davis commit f2d9e25c62d4eadb859dd9b5d4a0e8d37926d1d9 Author: Arlin Davis Date: Mon Sep 15 10:30:56 2014 -0700 mpxyd/mcm: add provider specific attribute DAT_IB_PROXY_VERSION Signed-off-by: Arlin Davis commit 63cbb9bf38185ca81a677efa7ec88fa2b8e3409d Author: Arlin Davis Date: Mon Sep 15 10:28:40 2014 -0700 mpxyd: log warning if running in COMPAT mode Signed-off-by: Arlin Davis commit 4996386d02bf536fcbed20ded88ca571f47ac56b Author: Arlin Davis Date: Fri Sep 5 08:07:04 2014 -0700 add provider and proxy support for GUID across platform Signed-off-by: Arlin Davis commit 9058c4d0717dd6ec9f5e780b1a664659d651856a Author: Arlin Davis Date: Wed Sep 3 15:47:51 2014 -0700 common: return appropriate handles with affiliated EP and EVD async events Signed-off-by: Arlin Davis commit 25568900892f9e72413e235ebc4ba77176343c84 Author: Arlin Davis Date: Tue Sep 2 14:54:51 2014 -0700 Release 2.1.2 Signed-off-by: Arlin Davis commit 9760d99201ab6a640a7bd4b18a06639aa2d79698 Author: Arlin Davis Date: Tue Sep 2 12:53:23 2014 -0700 mpxyd: add global routing support for proxy connections Signed-off-by: Arlin Davis commit 87fda7a3bbc3e79687ec5f45327f02fb02a4701b Author: Arlin Davis Date: Tue Sep 2 12:52:06 2014 -0700 mcm: only call mix_get_attr if running on MIC Signed-off-by: Arlin Davis commit 1ccc2dc9749a1e8f7f33e9f1afdf3ee3a5c9cb6a Author: Arlin Davis Date: Tue Sep 2 08:47:29 2014 -0700 openib: modify check for link_layer to handle unspecified Signed-off-by: Arlin Davis commit 7e833f29dabae799be5b60231ceb7be91cd2463f Author: Alexey Ishchuk Date: Tue Sep 2 08:34:19 2014 -0700 This patch adds the dapl_os_atopmic_inc, dapl_os_atomic_dec, and dapl_os_atomic_assign function implementatios to the dapl userspace package to provide the DAPL API support on the s390x platform by adding Assembler language implemenation of those platform specific functions. Signed-off-by: Alexey Ishchuk Acked-by: Arlin Davis commit fb8c10124f3399f34ae1f2096e6759fb01e1bc7f Author: Amir Hanania Date: Tue Aug 26 15:41:10 2014 -0700 dtest server exchange connection info with client The server and client create connection for the server to send the setup info to the client. When using dtest, the client only needs to use -h option and it will get the rest of the info from the server. Signed-off-by: Amir Hanania commit 380218f3b62918601d89c48a44fcfee2899fdb11 Author: Arlin Davis Date: Mon Aug 25 16:30:45 2014 -0700 mpxyd: 2 MICs in same numa_node will overlap CPU affinity, don't reset base Signed-off-by: Arlin Davis commit 622a1870843e770ec2b6a83caf0d6fcb5057bb56 Author: Arlin Davis Date: Mon Aug 25 08:59:50 2014 -0700 mcm: implement proxy mix_prov_attr function, add fields CPU model and family Provide MIC consumers with a provider specific query for proxy CPU model and family to identify platform type from MIC side. Supported in MCM provider only. The following provider specific name attributes were added to MCM: DAT_IB_PROXY_CPU_FAMILY DAT_IB_PROXY_CPU_MODEL Signed-off-by: Arlin Davis commit 1a6747faa5904e23a7b8c247a52b603aa24098a7 Author: Arlin Davis Date: Fri Aug 22 10:27:46 2014 -0700 mpxyd: tx thread may not be signaled on small segment writes Signed-off-by: Arlin Davis commit ce006692bcb5cabf241bdacf0dd62f5df8572f22 Author: Arlin Davis Date: Wed Aug 13 11:58:49 2014 -0700 Release 2.1.1 Signed-off-by: Arlin Davis commit 6eb73e080c87b12cf4f4ec577cfdff53472791e1 Author: Arlin Davis Date: Wed Aug 13 11:12:29 2014 -0700 common: add provider name to log messages Signed-off-by: Arlin Davis commit a62f9a98b38865ff0e02f3bd30e04613c7bdd7de Author: Arlin Davis Date: Wed Aug 13 11:10:03 2014 -0700 mpxyd: log warning message if numa_node invalid Signed-off-by: Arlin Davis commit 69cfea06c710a1a83af7df3bcdfc49fe43580b05 Author: Arlin Davis Date: Mon Aug 11 13:45:12 2014 -0700 include debuginfo with build Signed-off-by: Arlin Davis commit 8ccf314650204d609bcdaa692fedbcde505afc41 Author: Arlin Davis Date: Mon Aug 11 10:50:05 2014 -0700 mpxyd: tx thread doesn't sleep during no pending IO state Signed-off-by: Arlin Davis commit 86a4ff51b5da853c85dc290fe1b69725d8f18618 Author: Arlin Davis Date: Mon Aug 11 09:49:08 2014 -0700 mpxyd: change MIC cpu_mask to per numa node instead of adapter The proxy processing threads for multiple cards in same socket will overlap same cpu cores with existing cpumask per adapter. Change thread affinity and cpumask to a per socket method. Signed-off-by: Arlin Davis commit 4e0e6dc0ac02c651767d446a4f58eeb991fff983 Author: Arlin Davis Date: Fri Aug 1 11:10:47 2014 -0700 mpxyd: set to MXS mode if device numa_node is invalid (-1) Signed-off-by: Arlin Davis commit 4072fc3443418cc22e40a8e83d6660da0cb2819d Author: Arlin Davis Date: Fri Aug 1 10:54:14 2014 -0700 mpxyd: MXS based alltoall benchmark hangs or returns post_send timeout Clean-up shared proxy buffer slot management during IO completions. Current code adjusts proxy buffer tail, using m_idx, incorrectly if freeing multiple in order buffer slots. Also, when processing immediate in-order slot, m_po_buf_tl() failed to continue parsing list to free other in-order !busy slots. Signed-off-by: Arlin Davis commit 61c12d3815f8ced11d70e97cc9c806591edde420 Author: Arlin Davis Date: Thu Jul 31 09:50:30 2014 -0700 mpxyd: add IO profile capabilities to help debug alltoall stall cases Signed-off-by: Arlin Davis commit 807bb7262c4fefe6f857c06cb1ff979349abd19f Author: Arlin Davis Date: Thu Jul 31 09:37:27 2014 -0700 mpxyd: retry stalled inline post_send, init m_idx only when signaled Signed-off-by: Arlin Davis commit 776a2e359c60366683e2681365c12cf8a4fd132f Author: Arlin Davis Date: Fri Jul 25 08:35:31 2014 -0700 Release 2.1.0 Signed-off-by: Arlin Davis commit a761b9b5422eb4c0872c1518fa5c58798421ca6e Author: Arlin Davis Date: Wed Jul 23 15:32:06 2014 -0700 build: add missing NEWS file Signed-off-by: Arlin Davis commit 710dafc4cbac7fe5ea2b5d19f83e6f557a96ec7f Author: Arlin Davis Date: Mon Jul 21 12:55:54 2014 -0700 update autogen.sh Signed-off-by: Arlin Davis commit 09d80a9e8ecb67f7509a425950ed2d4430334430 Author: Arlin Davis Date: Mon Jul 21 12:33:12 2014 -0700 Add MCM provider and MPXYD service to build update package version to 2.1.0 MCM provider is dependent on Intel MPSS SCIF library. Signed-off-by: Arlin Davis commit 3d0fc81e2c39558f0c91b17fc84e32c755d3e92f Author: Arlin Davis Date: Mon Jul 21 12:05:44 2014 -0700 mpxyd: service startup script and configuration file mpxyd - Starts/Stops MIC SCIF/DAPL RDMA proxy server mpxyd.conf - Config details: service logs, CM timers, proxy buffers, data segment size, etc. Signed-off-by: Arlin Davis commit 2a4173f780a5183a0e2bf49ed99196f3a9655da5 Author: Arlin Davis Date: Mon Jul 21 11:55:09 2014 -0700 add readme for MCM provider and MPXYD service Signed-off-by: Arlin Davis commit 659f1dc384098ef838ba10ee8ab467b3c3221b3e Author: Arlin Davis Date: Mon Jul 21 11:51:11 2014 -0700 update Copyright dates Signed-off-by: Arlin Davis commit 713f41df5ff268d9d857a0fee9da6d93c0591ed2 Author: Arlin Davis Date: Mon Jul 21 11:18:07 2014 -0700 Add new MIC RDMA proxy service daemon (MPXYD) New service created to support MIC based proxy RDMA. Includes services to manage connectivity of multi-path heterogeneous endpoints and use data paths based on platform constraints. It will create and manage multiple QP's per endpoint if needed. This allows optimal performance per direction based on various platform constraints. For example, if the MIC is on same socket as HCA, only proxy out is needed and not proxy in. In this case, data can go direct from MPXYD->MIC. However, if the MIC is on a different CPU socket from HCA, the provider will use both proxy out and proxy in services to avoid additional constraints of the server platform. The MCM provider and MPXYD will support connections between MIC and non MIC endpoints. Signed-off-by: Arlin Davis commit 574a863607d1bad07aa4b97b1f35ce2b13a53df7 Author: Arlin Davis Date: Mon Jul 21 10:58:37 2014 -0700 add new dapl MIC provider (MCM) to support MIC RDMA proxy services Provider supports all modes of connectivity and will setup data paths based on endpoint locality and platform constraints. Provides transparent DAT API support for RDMA writes, RDMA write with immediate data, Sends, and Recvs. No RDMA read or atomic support. To use MCM provider an application can use the new ofa-v2-mcm device definations in dat.conf. Intel MPSS is required for for MCM provider build and usage. The following shows connectivity modes and data paths: HST -> HST to HCA MSS -> MIC to HCA same socket MXS -> MIC to HCA cross socket 1. HST->HST: Xeon->HCA->fabric->HCA->Xeon (direct->direct) HST<-HST: Xeon<-HCA<-fabric<-HCA<-Xeon (direct<-direct) 2. MSS->MSS: KNC->Xeon->HCA->fabric->HCA->KNC (proxy->direct) MSS<-MSS: KNC<-HCA<-fabric<-HCA<-Xeon<-KNC (direct<-proxy) 3. MSX->MSX: KNC->Xeon->HCA->fabric->HCA->Xeon->KNC (proxy->proxy) MSX<-MSX: KNC<-Xeon<-HCA<-fabric<-HCA<-Xeon<-KNC (proxy<-proxy) 4. MSS->MSX: KNC->Xeon->HCA->fabric->HCA->Xeon->KNC (proxy->proxy) MSS<-MXS: KNC<-HCA<-fabric<-HCA<-Xeon<-KNC (direct<-proxy) 5. MSS->HST: KNC->Xeon->HCA->fabric->HCA->Xeon (proxy->direct) MSS<-HST: KNC<-HCA<-fabric<-HCA<-Xeon (direct<-direct) 6. MSX->HST: KNC->Xeon->HCA->fabric->HCA->Xeon (proxy->direct) MSX<-HST: KNC<-Xeon<-HCA<-fabric<-HCA<-Xeon (proxy<-direct) Signed-off-by: Arlin Davis commit 4ca7c024e65cb7903bc3d32aa1ca5643e50775c1 Author: Arlin Davis Date: Mon Jul 21 08:03:46 2014 -0700 MCM: new MIC provider and proxy service definitions Definitions for MIC Proxy RDMA services MCM <-> MPXYD over SCI (Symmetric Communications InterFace) - ops, cm, events MCM <-> MCM over IB - CM, WR/WC proxy-in and proxy-out wire protocol This service enables MIC based DAPL provider (MCM) to use proxy data service (host CPU) for SND/RCV and RDMA write operations. RDMA reads and atomics are not supported. This service communicates within within a server platform over PCI-E bus using SCIF and a MCM specific MIX (MIC exchange) messaging protocol. The MCM provider uses a new MCM CM protocol on the wire along with a Proxy WR/WC protocol. This service is designed to improved bandwidth on larger IO when direct MIC based IO is contrained. This new MCM provider maintains the DAT level API semantics, including strict ordering requirements of data flow. RDMA write with immediate data is the only IB extension supported. Signed-off-by: Arlin Davis commit 7e09eb221ebb1db71d194e064645149203d7e827 Author: Arlin Davis Date: Fri Jul 18 11:17:03 2014 -0700 cleanup build warnings Signed-off-by: Arlin Davis commit d5643cb15bfa238605261485d22c67173acc3e42 Author: Arlin Davis Date: Fri Jul 18 08:51:00 2014 -0700 common: add CQ,QP,MR abstractions for new MIC provider and data proxy service The new MIC (many integrated core) based provider (MCM) has the capability to shadow QPs,CQs,MRs on the host side of the platform for optimial performance based on locality of endpoints and platform contraints. Each endpoint (DAPL_EP), transparent to consumer, may have multiple connections via MCM provider. openib_common ib_cq/ib_qp code base has been expanded, MCM only, to support separate send and receive channels per endpoint. openib_common dapl_mr code base has been expanded, MCM only, to support MIC base DMA interfaces for MIC to HOST communications. openib_common post_send,post_recv inline code base, MCM only, has been modified to proxy data services via the new MCM provider. dapl_ib_async_str added for better logging across openib providers. Signed-off-by: Arlin Davis commit 848f76611f0ce46165a9cb55eda34d937a44bdc8 Author: Arlin Davis Date: Wed Jul 16 15:25:44 2014 -0700 openib: cleanup, use inet_ntop for GIDs, remove some logs, destroy pipes on release Signed-off-by: Arlin Davis commit 77d04f2e07127cd4df918dbc207b6a41180fc015 Author: Arlin Davis Date: Tue Jul 15 15:06:08 2014 -0700 common: new dapls_evd_cqe_to_event call, cqe to event Signed-off-by: Arlin Davis commit f407d13bcf91db515e957b59655f0e56fb4c1971 Author: Arlin Davis Date: Tue Jul 15 14:39:44 2014 -0700 common: init ring_buffer, assign hd/tl pos in range Signed-off-by: Arlin Davis commit 5f2325d50faaa8a10a8024eb84cd71cfd3ce4971 Author: Arlin Davis Date: Fri Jul 11 11:32:43 2014 -0700 allow log level changes during device open Signed-off-by: Arlin Davis commit eb135e67a6c2082bacc6867217897fcc8c6219a2 Author: Arlin Davis Date: Fri Jul 11 09:53:27 2014 -0700 ucm: fix cm rbuf setup, include grh pad on initialization Signed-off-by: Arlin Davis commit f0ed5177c257294793fd49d25678d63270cee080 Author: Arlin Davis Date: Fri Jul 11 09:11:25 2014 -0700 ucm: remove duplicate async_event code, use common async event call Signed-off-by: Arlin Davis commit 3d5d3cc10a3f1181835a9c0ca227651649e923ff Author: Arlin Davis Date: Fri Jul 11 08:39:01 2014 -0700 new lightweight open_query/close_query IB extension for fast attribute query Consumers that need provider attributes must do a full device open in order to get any provider/device information. With so many static device entries in /etc/dat.conf consumers are building classification mechanisms to identify provider type, locality, name, device mode, and decide which device is appropriate. The existing DAT interface doesn't provide a lightweight mechanism for queries. The following fast query functions have been added to dat_ib_extensions.h: dat_ib_open_query(name, ia_handle, ia_mask, ia_attr, prov_mask, prov_attr) dat_ib_close_query(ia_handle) In addition, DAT extension interface, dat_extension_op, has been expanded to include new internal calls to handle quick provider load and function linkage via udat_extension_open, and udat_extension_close functions. Extended operations needing DAT open/close services need to be defined from a DAT_OPEN_EXTENSION_BASE or DAT_CLOSE_EXTENSION_BASE respectively. NOTE: The ia_handle returned with open query must be closed with subsequent close_query and not used with any other dat_ia_ operations. Attribute storage from query_open is not valid after close_query call. The IB extensions have been rolled to version 2.0.8 with this new API. The changes are backward compatible. Signed-off-by: Arlin Davis commit 5e5b104e35106a2b7d0026437bff8d4ced27446f Author: Arlin Davis Date: Wed Jul 9 09:43:47 2014 -0700 dtestcm: add more detailed debug during disconnect phase Signed-off-by: Arlin Davis commit e1360797208bcdd824945ee9b858d307bf5bd096 Author: Arlin Davis Date: Tue Jul 8 16:14:51 2014 -0700 cma: long delays when opening cma provider with no IPoIB configured The rdma_cm provider (ofa-v2-ib0) can take netdev, ip address, or hostname for local address bindings. When trying to open a non-existent netdev (ib0) the provider will fall through and use the getaddrinfo sys call assuming dat.conf parameter is either an IP address or hostname and not a netdev. This patch changes getipaddr() error handling when opening the cma provider on a non-existant netdev. It will only call getaddrinfo with AI_CANONNAME hints after checking for a valid hostname. Signed-off-by: Arlin Davis commit e01796baa6b0f6cf0e1fb310d2c42d3446898c24 Author: Arlin Davis Date: Tue Jul 8 14:20:27 2014 -0700 common: new debug levels for low system memory, IA stats, and package info DAPL_DBG_TYPE_SYS_WARN = 0x800000 DAPL_DBG_TYPE_VER = 0x1000000 DAPL_DBG_TYPE_IA_STATS = 0x2000000 export DAPL_DBG_SYS_MEM = 5 will set the checking for memory less than 5% when DAPL_DBG_TYPE is set with bit DAPL_DBG_TYPE_SYS_WARN. The package must be built with --enable-counters for memory checking and IA stats capabilities. In addition, if DAPL_DBG_TYPE is set with bit DAPL_DBG_TYPE_VER than the package rev and build date will be sent to stdout during library init. Signed-off-by: Arlin Davis commit 4116019695ea01db5f7f2046fbb0937cd299550b Author: Arlin Davis Date: Thu Jun 26 15:40:46 2014 -0700 build: remove library check for mverbs with --enable-fca Signed-off-by: Arlin Davis commit 9bb5212cfeca4a62288467fceac6b0611a11ffe4 Author: Arlin Davis Date: Tue Jun 24 15:49:20 2014 -0700 IB extension: segfault in create collective group with non-vector type IA handle" The dats_get_ia_handle call was change in 2.0.34 to convert IA handle from both vector to handle and handle to vector to fix query calls that incorrectly returned IA handles in non-vector form. If a caller uses a non vector IA handle it will get converted incorrectly to a vector and cause a segfault. Add additional check to verify a IA handle type before calling get ia handle to avoid incorrect translation. Signed-off-by: Arlin Davis commit 36d2db42865394c929f5f4a2316abe679da9d680 Author: Arlin Davis Date: Tue Jun 24 15:48:38 2014 -0700 build: change configure help to correctly state collective default=none Signed-off-by: Arlin Davis commit 11e6cd1516b4aad6a17656ff72f37c12712bf69b Author: Arlin Davis Date: Mon May 5 09:11:18 2014 -0700 Release 2.0.42 Signed-off-by: Arlin Davis commit 7c1fb7a46e1d94fb07a640bdd8a1f5292d82eb2b Author: Arlin Davis Date: Tue Apr 15 14:48:54 2014 -0700 dapltest: increase DTO evd size to prevent CQ overflow on limit_rpost test Signed-off-by: Arlin Davis commit 8bd2437ccb1299b5f82809b9f42d029625b4f647 Author: Arlin Davis Date: Tue Apr 15 13:44:16 2014 -0700 Creation of reserved SP moves EP state to DAT_EP_STATE_RESERVED even in failure cases. Reserve EP after successfully binding the listening port. Signed-off-by: Arlin Davis commit 80f9eed66c01afecd3553e66baa64fecbb9347ba Author: Dave Goodell Date: Mon Mar 24 14:07:37 2014 -0700 dapl: fix string bug in dapls_dto_op_str This led to indexing off the end of the array and gave surprising results for OP_RECV_UD. commit 2ce4712c357e6b796d63e38dddb536cac650fa5c Author: Arlin Davis Date: Mon Mar 17 14:20:08 2014 -0700 Release 2.0.41 Signed-off-by: Arlin Davis commit 43f35cd944b578162d8d4627b8419a1534cf1edc Author: Arlin Davis Date: Fri Mar 14 10:47:06 2014 -0700 dapltest: change server port, from 45278 to 62000, out of registered IANA range The existing port 45278 is in the registered port range. RFC 6335: System Ports, well known, 0-1023 (assigned by IANA) User Ports, registered, 1024-49151 (assigned by IANA) Dynamic Ports, private or Ephemeral, 49152-65535 (never assigned) Signed-off-by: Arlin Davis commit 12251e447cfee4cb8aea02c14549e990f7c92784 Author: Arlin Davis Date: Thu Mar 13 09:55:29 2014 -0700 dat: lower log level on load errors of provider library Signed-off-by: Arlin Davis commit 30ce6e3ab4f8cf375e0671be7f85c519b00fc1cb Author: Arlin Davis Date: Tue Mar 4 10:52:49 2014 -0800 dat: dat_ia_open should close provider after failure Signed-off-by: Arlin Davis commit 77630fdf56d478f25e0bee8bd9b0d1b0ce10e818 Author: Arlin Davis Date: Tue Mar 4 10:48:55 2014 -0800 dapltest: set default limit max to 1000 Signed-off-by: Arlin Davis commit 622daca65b403c9b561dff4ed57421bdeeac731f Author: Arlin Davis Date: Tue Mar 4 10:30:02 2014 -0800 openib: add new provider specific attributes DAT_IB_PROVIDER_NAME = UCM/CMA/SCM DAT_IB_DEVICE_NAME = ibv_get_device_name DAT_IB_CONNECTIVITY_MODE = DIRECT/PROXY DAT_IB_RDMA_READ = TRUE/FALSE DAT_IB_NODE_GUID = xxxx:xxxx:xxxx:xxxx DAT_IB_PORT_STATE = ibv_port_state_str Signed-off-by: Arlin Davis commit 2860312f368be59fa5027f3fe87bce2bcf6f5280 Author: Arlin Davis Date: Mon Mar 3 15:04:12 2014 -0800 dapltest: update scripts for regression testing purposes cl.sh and srv.sh update to provide better examples and a methods to quickly regression test any dapltest changes. usage: srv.sh devicename where devicename is provider (default = ofa-v2-mlx4_0-1) usage: cl.sh hostname testname devicename where testname stop - request DAPLtest server to exit. conn - simple connection with limited dater transfer trans - single transaction test transm - transaction test: multiple transactions [RW SND, RDMA] transt - transaction test: multi-threaded, single transaction transme - transaction test: multi-endpoints per thread transmet - transaction test: multi: threads and endpoints per thread transmete - transaction test: multi threads == endpoints perf - Performance test threads - multi-threaded single transaction test. threadsm - multi: threads and endpoints, single transaction test. rdma-write - RDMA write rdma-read - RDMA read bw - bandwidth latb - latency tests, blocking for events latp - latency tests, polling for events lim - limit tests. regression - loop over a collection of all tests. where devicename is provider (default = ofa-v2-mlx4_0-1) Signed-off-by: Arlin Davis commit f15ff784b9385e6964d7efad3219ca508df29f13 Author: swise@opengridcomputing.com Date: Mon Mar 3 14:35:43 2014 -0800 dapltest: Add final send/recv "sync" for transaction tests. The transaction tests need both sides to send a sync message after running the test. This ensures that all remote operations are complete before dapltest deregeisters memory and disconnects the endpoints. Without this logic, we see intermittent async errors on iwarp devices because a read response or write arrives after the rmr has been destroyed. I believe this is more likely to happen with iWARP than IB because iWARP completions only indicate the local buffer can be reused. It doesn't imply that the message has even arrived at the peer, let alone been placed in the peer application's memory. Changes from V1: - allocate new send/recv buffers for the Final Sync message. - post the Final Sync recv buffer at the beginning of the final iteration of a test. - tests ok on cxgb4 and mlx4 devices. Signed-off-by: Steve Wise commit 9457b7008424131e9c9d08e3dd09ff2becab78fe Author: Arlin Davis Date: Mon Feb 10 13:07:00 2014 -0800 Release 2.0.40 Signed-off-by: Arlin Davis commit 8d36d4b0250418b0a257f47d40c6ddcfebd6b614 Author: Arlin Davis Date: Sun Feb 9 23:34:43 2014 -0800 dist: ib collective extension include files missing Signed-off-by: Arlin Davis commit 3248d857058e3a1dfd0405adc71ae1002fe947d6 Author: Arlin Davis Date: Sun Feb 9 23:24:29 2014 -0800 dapltest: the quit command is missing changes for -n option. Server-port was not being set properly during param init phase on the client side. Signed-off-by: Arlin Davis commit 36beb63db58b79404902c5d55ba518147bdaa5ca Author: Arlin Davis Date: Sun Feb 9 22:55:17 2014 -0800 dat.conf: remove v1, add Mellanox Connect-IB and Intel Xeon Phi MIC Signed-off-by: Arlin Davis commit bf625e3eb450141b7dc924e6d40d83bbb02db354 Author: Arlin Davis Date: Mon Feb 10 13:01:47 2014 -0800 NULL undefined on Fedora, incorrectly using kernel stddef.h Signed-off-by: Arlin Davis commit ef14daf0585119ba3cae24e7fa0943ff032117ed Author: Arlin Davis Date: Thu Oct 3 16:05:06 2013 -0700 Release 2.0.39 Signed-off-by: Arlin Davis commit d398aef3c8bbd4fbadb113a5d8e324153e555cea Author: Arlin Davis Date: Thu Oct 3 15:21:08 2013 -0700 dapltest: fix endian swap issue with performance test Signed-off-by: Arlin Davis commit 53534445d649812061b1849b1a77a3499ba0cdd0 Author: Arlin Davis Date: Tue Oct 1 15:40:17 2013 -0700 SCM: getifaddrs modfications for better out of the box experience socket cm will now walk list of interfaces and ignore loopback and ignore IB devices, unless the IB netdev is the only device. Works better in a heterogenous environment with a mix of net device. Tested with br0, mic0, and mic0:ib netdev mixes. Overriding with DAPL_SCM_NETDEV still works as is. Signed-off-by: Patrick Mccormick Signed-off-by: Arlin Davis commit 3315b8148ba52da67e422cf9afe6fa35d2161885 Author: Arlin Davis Date: Tue Oct 1 14:03:51 2013 -0700 ucm, scm: UD mode triggers list_head assert with large scale alltoall test 1024+ ranks, IMB alltoall may hit assert when running Intel MPI in UD mode. CR clean up was implemented with EP to CR references still linked. During cr_accept, the CR remote_ia_address is linked to EP object by mistake with UD mode. UD mode my have multiple CRs per EP so no direct mappings to CR memory can exist unless RC mode which always has one EP to CR mapping. In scm, ucm: for CM object free with CR references the search and unlinking from SP must be under SP lock to serialize. Also, cleanup thread wakeup logic to only trigger the thread if reference count indicates the need for more processing. Signed-off-by: Arlin Davis commit 40bf5a11b3c8b9767fee95fdbb544c5ddb05777f Author: Arlin Davis Date: Mon Jul 22 12:37:21 2013 -0700 Release 2.0.38 Signed-off-by: Arlin Davis commit 54d5fb2180f6f27141455d5252d26f40fd04d28f Author: Arlin Davis Date: Tue Jul 16 16:12:37 2013 -0700 dapltest: add -n parameter to override default server port number (45278) Modify all tests and commands to take a new -n parameter option for server listen port. The default port, when running multiple EP's and threads, will sometimes collide and fail with EADDRINUSE on iWARP configurations using rdma_bind_addr with sin_port=0. Signed-off-by: Arlin Davis commit 617952fec1b8ca5ec5fc96d5568b90c1ba833ca3 Author: Arlin Davis Date: Fri Jul 12 11:52:33 2013 -0700 ucm,scm: UD mode creates many CR objects per EP that needs cleaned up After connection is established and the AH is provided to consumer on UD connect establishment there is no need to keep the CR object on the SP. For large clusters this results in a growing memory footprint for CR objects and long cleanup times on device close. Change ucm and scm providers to unlink and free CR resources during CM object free if this is a UD QP and CONN_EST state. Signed-off-by: Arlin Davis commit 43a4b28c39199ca47d3af1f456e065cf7fbd741c Author: Arlin Davis Date: Mon Jun 24 14:19:22 2013 -0700 cma: add DAPL_CM_TOS environment variable to enable passing a TOS to the RDMA CM Signed-off-by Matthew Finlay Acked-by: Arlin Davis commit 7e791ac2b328982d98cb88a41e0037b5cc26a693 Author: Arlin Davis Date: Thu Jun 6 18:22:52 2013 -0700 Release 2.0.37 Signed-off-by: Arlin Davis commit b10a904e2b782b77098b4bed03d244bdef5eba5b Author: Arlin Davis Date: Wed May 29 16:59:09 2013 -0700 common: add support for ia name during dat_ia_query the device name was not being updated during a query. Copy the hca name into ia_attr->adapter_name for consumers. Signed-off-by: Arlin Davis commit a1428ea1aa05567c806062f87428d204ea002c55 Author: Arlin Davis Date: Wed May 29 16:53:18 2013 -0700 common: dapl_os_atomic_inc/dec() not working as expected on ppc64 machines. Signed-off-by: Pradeep Satyanarayana Acked-by: Arlin Davis commit 704950f9ab6e03347dc4f1ac2bcd7d2b6b8fb8eb Author: Arlin Davis Date: Wed May 29 16:45:20 2013 -0700 dapltest: ppc64 endian issue with exchanged mem handle and address Signed-off-by: Pradeep Satyanarayana Signed-off-by: Aravinda Venkatramana Acked-by: Arlin Davis commit ee9dadbfe5a2b4f89419a2ce60953b987bf60144 Author: Arlin Davis Date: Thu Jul 5 10:00:28 2012 -0700 Release 2.0.36 Signed-off-by: Arlin Davis commit 30e1e33a7e5617ccd39da8b54df3fda8fe273f20 Author: Arlin Davis Date: Thu Jul 5 09:58:21 2012 -0700 scm: increase ACK timeout to 20 for a default value to match other providers. Signed-off-by: Arlin Davis commit cb18396c3a3a44e1d7f025be95d416a78ad1e4f0 Author: Arlin Davis Date: Mon May 14 14:51:38 2012 -0700 common: allow qp modify in init state Allow consumer to modify attributes via dat_ep_modify in init state. Signed-off-by: Arlin Davis commit 885ded2eed3be6d3b3fb8ff3d5ba3eadf9aeaa98 Author: Arlin Davis Date: Thu May 10 14:57:31 2012 -0700 common: check for valid states during ep posting Signed-off-by: Arlin Davis commit f23517eeef4d43445f14b9555829dc358d33eefd Author: Arlin Davis Date: Thu May 10 13:35:55 2012 -0700 dat.conf: keep list of providers in order for backward compatibility Signed-off-by: Arlin Davis commit 9e8f991ed9374a540ef8657f87993d6f81bd7a08 Author: Arlin Davis Date: Thu May 10 10:49:09 2012 -0700 ucm: record and silently drop a duplicate reject CM message Signed-off-by: Arlin Davis commit a135cfc506e28b12e27a31b80146699c31bd2282 Author: Arlin Davis Date: Wed Apr 25 13:37:53 2012 -0700 windows: new version of getlocalipaddr not portable revert to the original getaddrinfo method for windows Signed-off-by: Arlin Davis commit 4cedaeed09769be14ea16ad5a75b63d3889085d1 Author: Arlin Davis Date: Wed Apr 25 13:36:52 2012 -0700 dapltest: DFLT_QLEN is defined in multiple tests add #ifdef checking in transaction test. Signed-off-by: Arlin Davis commit 4726416988a587c8baa395a08787d16f0dd21374 Author: Arlin Davis Date: Wed Apr 25 13:10:39 2012 -0700 Release 2.0.35 Signed-off-by: Arlin Davis commit 4988c58427b9f54f7e0a1465513c9625fa1ac1d6 Author: Arlin Davis Date: Wed Apr 25 13:07:10 2012 -0700 config/build: remove post/postun hacking used to modify dat.conf Return to the tried and true method of managing configuration files via %config directive and remove ugly sed editing methods. The dat.conf includes both v1 and v2 device entries to insure backward compatibility. Add doc/dat.conf Signed-off-by: Arlin Davis commit 294aa2f58fe4c27826337dc44f8c2d238938d252 Author: Arlin Davis Date: Mon Apr 23 10:35:24 2012 -0700 config: clean up help option displays with ext-type options Signed-off-by: Arlin Davis commit e286d99817d28597a4c11b242c6c2278a284e396 Author: stan smith Date: Mon Apr 23 10:32:00 2012 -0700 windows: Provide auto-detect between RoCE and Infiniband for Windows. For RoCE, enable transport global ID use. Signed-off-by: Arlin Davis commit dd0003426101be19206ba68b22d27b55677e0589 Author: Arlin Davis Date: Thu Apr 19 17:40:45 2012 -0700 ucm: update UD cm provider to support new CM stat and error counters Signed-off-by: Arlin Davis commit 47685e12497a8f9eec4f37225a4b1e44649aab04 Author: Arlin Davis Date: Thu Apr 19 17:40:03 2012 -0700 scm: update socket cm provider to support new CM stat and error counters Signed-off-by: Arlin Davis commit 50ed4fcc7a998877dcb17af7cde2ee8896295b7f Author: Arlin Davis Date: Thu Apr 19 17:15:22 2012 -0700 commom: add cm, link, and diag event counters in IB extended builds Add additional event monitoring capabilities during runtime to help isolate issues during scaling in lieu of logging/printing warning messages. Counters have been added to provider CM services and counters have been added and mapped to sysfs ib_cm, device port and device diag counters. ibdev_path is used for device sysfs counters. uDAPL CM events are tracked on a per IA instance via internal provider counters. The ib_cm, link, and diag events are tracked on a per platform basis via sysfs. For these running counters a start and stop function is provided for sampling and mapping to DAPL 64 bit counters. All counters, along with new start and stop functions, are provided via dat_ib_extensions.h. New IB extension version is 2.0.7 New DCNT_IA_xx counters include 40 cm, 9 link, and 9 diag types. To enable new counters (default build is disabled): ./configure --enable-counters New bitmappings have been added to DAPL_DBG_TYPE environment variable to automatically start/stop counters and log errors if counters are enabled. The following will control CM, LINK, and DIAG respectively: DAPL_DBG_TYPE_CM_ERRS = 0x080000, DAPL_DBG_TYPE_LINK_ERRS = 0x100000, DAPL_DBG_TYPE_DIAG_ERRS = 0x400000, Signed-off-by: Arlin Davis commit 0fc4298cad74f47b10c59b1808c8077910fc7c9d Author: Arlin Davis Date: Tue Apr 17 15:24:22 2012 -0700 scm: use ioctl SIOCIFCONF to get complete list of configured netdev interfaces replace usage of getaddrinfo since is doesnt actually return bound addresses and can return the loopback address in some configurations. Some systems may not have eth0 configured so you cannot assume eth0 as a non-loopback default netdev. Signed-off-by: Arlin Davis commit 844076f2a0b749db4648c7a3cff16b328fc94b5b Author: Arlin Davis Date: Fri Feb 17 10:28:48 2012 -0800 ucm: UD send failures at scale, ucm_send ERR: get_smsg(hd=149,tl=150) Full sendq should retry polling completions instead of failing. When sendq is full and all requests are pending the get send message code should retry polling for completions and not return error on first empty CQ attempt. Give HCA a chance to complete some batched requests. Also, clean up the send message error logging. Signed-off-by: Arlin Davis commit d15865106ffbd37de07e5adea7c31a4e79b5fe5c Author: Arlin Davis Date: Mon Feb 6 14:04:37 2012 -0800 scm: fix retry count on connection pending timeout Retry count not being decremented on connection TIMEOUT. Also, cleanup log messages on CONN and REP pending and add local port to output. Signed-off-by: Arlin Davis commit c7a61ae813c8f8fe8b8fb326bf115bc77be8fea4 Author: Arlin Davis Date: Mon Feb 6 14:03:20 2012 -0800 ucm: cleanup debug message, ntohl on p_size is incorrect private data size is a short, change to ntohs on log message Signed-off-by: Arlin Davis commit 7779fe08d1577cf4949c48c6a7e7c2e52ff71a6b Author: Arlin Davis Date: Mon Jan 30 10:19:29 2012 -0800 cma, scm, ucm: allow EP (QP) creation without EVD (CQ) Provide ability to create a EP/QP with no EVD/CQ on either the request or receive queue. The current implementation allows on receive queue but not request queue. Not all ofa devices support a null CQ so if necessary create a dummy CQ at the time of QP creation. Also, if no CQ is specified set appropriate QP max wr/sge attributes to zero. Signed-off-by: Arlin Davis commit 79888537df15161107487378372fd8c1dc8c764f Author: Arlin Davis Date: Mon Jan 30 10:09:42 2012 -0800 common: add DAPL_DBG_TYPE_CM_STATS (0x40000) to debug log options Signed-off-by: Arlin Davis commit 16b0d53e4b734dbc2644ca9b08c536aebbc5d1cb Author: Arlin Davis Date: Wed Jan 25 11:54:29 2012 -0800 common: dapls_ep_flush_cq will segfault when no CQ is attached to EP add check for NULL request/receive EVD (cq) before flushing. Signed-off-by: Arlin Davis commit 960538d9c5cf944e1d58104e43483d91337bccd2 Author: Arlin Davis Date: Wed Jan 25 11:50:21 2012 -0800 common: ep_create should allow max_request_iov attribute setting of zero When creating an EP without a request EVD (cq) the max_request_iov and max_request_sge will be 0. Allow this combination when checking attribute settings for ARG6. Signed-off-by: Arlin Davis commit ae9bd7d8b18f0f63a5ab8c049aa7b1010ab27ce0 Author: Arlin Davis Date: Wed Jan 18 15:47:12 2012 -0800 common: add check for NULL handle on ext calls, SRQ free, and helper functions Signed-off-by: Arlin Davis commit f77dcf8ad81261f466e7bb0bb63dfed33c062e90 Author: Arlin Davis Date: Fri Jan 13 12:01:26 2012 -0800 common: add missing sub-types to dat_strerror() "unknown minor error" string returned with valid sub types. Update function for sub-type error codes in dat_error.h. Signed-off-by: Arlin Davis commit d4963d5b18220091e85fb8fab882906b29382739 Author: Arlin Davis Date: Thu Jan 12 09:54:59 2012 -0800 common: extended CR event processing missing rejects on errors When processing an inbound CR event callback a non-user reject should be sent to client in the case of a non-listening SP, allocation error, or EVD overrun. Changes made to dapls_evd_post_cr_event_ext callback. Signed-off-by: Arlin Davis commit 391006dfded6601488f32a3e10de329a575ab355 Author: Arlin Davis Date: Thu Jan 12 09:39:46 2012 -0800 ucm: incorrectly sends user reject during CR callback errors Add reason checking on provider rejects and set appropriate op type in reject message. Reject can be called from cr callback during failures. User reject will be IB_CM_REJ_REASON_CONSUMER_REJ. Add warning message on active side. Signed-off-by: Arlin Davis commit 292c633250b9e0b6644e4d529170123fc5f301e7 Author: Arlin Davis Date: Tue Jan 10 15:42:24 2012 -0800 common: change dbg level on CR callback if not listening on SP Change from from CM to CM_WARN level and include in non-debug build. Signed-off-by: Arlin Davis commit 3b35315460b7412605affff6f9a22532c738e1c9 Author: Arlin Davis Date: Mon Jan 9 15:03:21 2012 -0800 scm: incorrectly sends user reject during CR callback errors Add reason checking on provider rejects and set appropriate op type in reject message. Reject can be called from cr callback during failures. User reject will be IB_CM_REJ_REASON_CONSUMER_REJ. Signed-off-by: Arlin Davis commit 285f3798c1b006f0e614fee2ecd58049eb5fabd3 Author: Arlin Davis Date: Mon Jan 9 10:29:26 2012 -0800 dat: add check for NULL handle on IA calls check added to dats_get_ia_handle() Signed-off-by: Arlin Davis commit d29a85aecd0976be0ea677c4d55ee80b8c9b5f52 Author: Arlin Davis Date: Wed Dec 7 16:39:55 2011 -0800 cma,scm,ucm: extra reference on EP, with RSP, causes dat_ep_free() to hang Need to add check for RSP or PSP provider type service points during passive side accepts before taking CR reference on the EP. In these cases, the EP is already linked to inbound CR. Signed-off-by: Arlin Davis commit c5ff770c2ef572561f409181d2627d645334a9bf Author: Arlin Davis Date: Wed Dec 7 16:34:17 2011 -0800 common: RSP service points incorrectly freed during CR callback The RSP service point is being removed because of improper state/flag checking during CR callback. Add state check for DAPL_SP_STATE_RSP_LISTENING. Signed-off-by: Arlin Davis commit cf402be628dd54c3139cc66af30232b13ef0c70a Author: Arlin Davis Date: Fri Dec 2 15:45:30 2011 -0800 common: clean up dat_rsp_create log message Signed-off-by: Arlin Davis commit 2bdbcdb883dc1de3fc5f53b1a2accc9b56801b02 Author: Arlin Davis Date: Fri Dec 2 15:44:04 2011 -0800 common: cleanup debug message on EVD overflows Signed-off-by: Arlin Davis commit b880f8a612f1b031aa403a2a924ab605b28f2986 Author: Arlin Davis Date: Fri Dec 2 15:31:09 2011 -0800 scm: return correct event error code when remote host refuses requests changed from TIMEOUT to NON_PEER_REJECTED Signed-off-by: Arlin Davis commit 442588d75b3408fb2072c567cb673061c65c1f75 Author: Arlin Davis Date: Fri Dec 2 15:29:08 2011 -0800 dapltest: server CR EVD is too small for multi-client configurations. Increase default size from 8 to 32. Signed-off-by: Arlin Davis commit a5acb2355958501a0a0855bd9b1d533f29148626 Author: Arlin Davis Date: Fri Dec 2 15:28:31 2011 -0800 Common: CR EVD overflow causes segfault. The CR is freed up incorrectly before unlinking with SP. Signed-off-by: Arlin Davis commit df31e386354a4755b0cd416d27a1f9334340ca65 Author: Arlin Davis Date: Wed Nov 2 16:36:22 2011 -0700 Release 2.0.34 Signed-off-by: Arlin Davis commit be8891b39ab9817216fd5736c6e2cce98ec78e91 Author: Arlin Davis Date: Wed Nov 2 10:40:02 2011 -0700 scm: change debug message level for listen/bind errors reduce to CM_WARN instead of general WARN level. Signed-off-by: Arlin Davis commit a938e5db62a0fbbf8020eb1b526b090f44bc67c2 Author: Arlin Davis Date: Wed Nov 2 10:29:34 2011 -0700 common: increase default IB ack timer from 16 to 20 For larger, more congested fabrics, a larger ACK timer is needed. Consumers can still change default with environment variable DAPL_ACK_TIMER if they need to increase or decrease. This applies to SCM and UCM providers only. The CMA provider, which uses rdma_cm, has no way to control ack timer with current API. Signed-off-by: Arlin Davis commit 989628832a12f4f0124947f1896bef51b9bbb3c9 Author: Arlin Davis Date: Tue Nov 1 13:44:24 2011 -0700 common: remote ia address null pointer creates seg fault add NULL ptr check and return DAT_INVALID_PARAMETER, DAT_INVALID_ARG2 Signed-off-by: Arlin Davis commit 3c2dbc16a09a0fb430e44ba023e1cc5bb87fa529 Author: Arlin Davis Date: Tue Nov 1 12:40:21 2011 -0700 common: posting events on full queue returns wrong error code Return DAT_QUEUE_FULL instead of DAT_INSUFFICIENT_RESOURCES Signed-off-by: Arlin Davis commit ae55f888f976de8225178fdec343a89bdeb28001 Author: Arlin Davis Date: Tue Nov 1 11:43:55 2011 -0700 common: dat_ep_modify seg faults with null ep_param ptr add additional NULL ptr check for arg3 ep_param Signed-off-by: Arlin Davis commit edbd39693482397ec6d1e4b6783d42be8c66332b Author: Arlin Davis Date: Fri Oct 28 12:27:16 2011 -0700 common: dat_evd_free seg faults with resized software EVD dapl_evd_resize is attempting to resize a CQ but there is no CQ attached to a software EVD. Add check for cq_handle before resizing. Signed-off-by: Arlin Davis commit 6d23b0cf6487fc39367528e7673e9629fcc04ee2 Author: Arlin Davis Date: Fri Oct 28 10:23:51 2011 -0700 common: remove assert for incorrect events during cm_request Simply print a warning message. Connection callback doesn't forward invalid events to consumer so no need to assert. Signed-off-by: Arlin Davis commit e42b630d9866ec5ad4d2425c7ad96507a6e16b96 Author: Arlin Davis Date: Wed Oct 26 16:02:56 2011 -0700 dat: dat_cno_query with NULL cno_handle causes segmentation fault add check for NULL handle in dat library Signed-off-by: Arlin Davis commit f179ce281b382f005d1553d2401b05f50284aede Author: Arlin Davis Date: Wed Oct 26 13:03:50 2011 -0700 scm: dat_psp_create returns wrong error code on bind/listen failure The SCM provider changed to return DAT_INVALID_PARAMTER instead of incorrect DAT_CONN_QUAL_UNAVAILABLE error code on any bind or listen failure. Signed-off-by: Arlin Davis commit e8c41c05b356fc1a1305dbb80b41f0d3218a6aa2 Author: Arlin Davis Date: Wed Oct 26 09:12:10 2011 -0700 scm: socket connect request count is reset improperly on retry Include the current retry count with the new connect request call and set according after creating the new cm object. Signed-off-by: Arlin Davis commit e8d3537444e311b68d47f015d6de952e31234bc8 Author: Arlin Davis Date: Mon Oct 24 13:59:55 2011 -0700 scm: when hostname has loopback addr assigned, default to eth0 instead of failing There are some cases where the eth0 device is configured with an IP address but the getaddrinfo() will only return loopback address because the hostname is configured in the /etc/hosts file with 127.0.0.1. In this case, the provider will now retry address on eth0 before failing the open. Signed-off-by: Arlin Davis commit 0c13d50320cd8aeac6be809d2dd6f3d6ca675ab0 Author: Arlin Davis Date: Mon Oct 24 13:57:01 2011 -0700 scm: add port number to error log during hca_open failures Signed-off-by: Arlin Davis commit eb026ba0e9f37f131b84ea8971ba18ee2101d592 Author: Arlin Davis Date: Mon Oct 24 13:40:45 2011 -0700 common: query calls return incorrect IA handle to consumer The IA handle from the consumer perspective is an IA vector and not the provider IA address handle. Need to convert IA handle to IA vector for consumer calls. Modify dats_ia_get_handle call to convert both ways depending on handle type provided so a dapl provider can convert to vector on query calls. This fix is backward compatible with older libdat2 libraries. Function is already exported and syntax is unchanged. Signed-off-by: Arlin Davis commit 9b891e7ec048cdc8905c70780ef9ca27af0a4002 Author: Arlin Davis Date: Thu Sep 22 13:42:15 2011 -0700 common: srq create asserts with !dapl_llist_is_empty(head) failed return DAT_NOT_IMPLEMENTED before allocating any resources until there is a provider that supports SRQ's. Signed-off-by: Arlin Davis commit 7707d4d19e0359b621a3be1cee7ae59edb0a11b0 Author: Arlin Davis Date: Mon Aug 29 12:31:38 2011 -0700 Release 2.0.33 Signed-off-by: Arlin Davis commit c4fc0ba2038c771f3f2cd9d262c3a802603e6c7b Author: Arlin Davis Date: Sun Aug 28 19:10:37 2011 -0700 scm,ucm: fix compatibility issues and set minimum protocol support allow latest version to work with previous versions to allow compatibility back to OFED 1.5, dapl-2.0.23. If rdma_atomic_in is not exchanged default back to original settings set by consumer. Signed-off-by: Arlin Davis commit 2b118e5549e1d7a5cba0cf0f5e7877935c259360 Author: Arlin Davis Date: Fri Aug 19 13:19:38 2011 -0700 build: link librdmacm dependency to ib_acm usage for ucm and scm providers Add -lrdmacm to XLIBS for ucm and scm providers. Only set with conditional use of ib_acm as defined by DAPL_USE_IBACM. Signed-off-by: Arlin Davis commit 648d46ae8964cddee521aa6b8f2c00a37d286c32 Author: Arlin Davis Date: Fri Aug 19 12:40:24 2011 -0700 build: add selective enable/disable-xxx build switch for each provider The following switches have been added to configure: --disable-cma (disables the rdma_cm dapl provider build) --disable-scm (disables the socket cm provider build) --disable-ucm (disables the IB UD cm provider build) all providers are enabled by default. Signed-off-by: Arlin Davis commit d083cd1d0ee9dfceb14c9cc75a1129f2a247a8bf Author: Arlin Davis Date: Fri Aug 19 10:24:32 2011 -0700 build: add extended header files to EXTRA_DIST and fix missing backslash Signed-off-by: Arlin Davis commit e76221985709bc2aee356e621ec78dffabdc0aef Author: Arlin Davis Date: Fri Aug 19 10:23:42 2011 -0700 build: set IB extended coll-type to none by default Signed-off-by: Arlin Davis commit a55bac341a6d9e95965290d0c73cfe8b252b0dd5 Author: Arlin Davis Date: Sun Aug 7 23:02:54 2011 -0700 common: change errno mapping of EINVAL to DAT_INVALID_PARAMETER Signed-off-by: Arlin Davis commit aea52cce4dbc5fb42debbc77282784c64a826653 Author: Arlin Davis Date: Sun Aug 7 22:59:27 2011 -0700 build: add IB collective and FCA provider to dapl build package as an option New collective support and the FCA provider will only be built with configure option of "--enable-coll-type=fca". Dependencies include fca devel package, fca library, and mverbs library. This will not be included in default builds. Signed-off-by: Arlin Davis commit 66399e8a751474be605cc62050b2b1408f3418b6 Author: Arlin Davis Date: Sun Aug 7 22:54:36 2011 -0700 common: add new dapls_evd_post_event_ext call for extended events Add prototype and code to post extended events on dispatcher and include collective definitions to dat_event_str function. Signed-off-by: Arlin Davis commit cf704c68249f9f93c0624ebaf552b1811013f15f Author: Arlin Davis Date: Sun Aug 7 22:53:45 2011 -0700 ucm: add support for IB collective providers Add collective member address and threading information on a per transport basis. Call create/free service with HCA open/close. Signed-off-by: Arlin Davis commit 9911d103d8aa4c0ecf797fe653979aaa6b82b40d Author: Arlin Davis Date: Sun Aug 7 22:53:09 2011 -0700 scm: add support for IB collective providers Add collective member address and threading information on a per transport basis. Call create/free service with HCA open/close. Signed-off-by: Arlin Davis commit 65946e9ed1b4e57dda85ee8254f6bca4c8232b96 Author: Arlin Davis Date: Sun Aug 7 22:47:21 2011 -0700 cma: add support for IB collective providers Add collective member address and threading information on a per transport basis. Call create/free service with HCA open/close. Signed-off-by: Arlin Davis commit d7f275728eeca3341f10c720ed3325295327e2c1 Author: Arlin Davis Date: Sun Aug 7 22:45:04 2011 -0700 common: add supported collective types in named attributes for query Signed-off-by: Arlin Davis commit f5817ec85e0d43ee6aca287327cce06a92f65cc4 Author: Arlin Davis Date: Sun Aug 7 22:41:48 2011 -0700 common: add collective call mappings via standard dapli_post_ext() Signed-off-by: Arlin Davis commit cab8890d96b20e5afa7f8afe3af5fb087af9a104 Author: Arlin Davis Date: Sun Aug 7 22:39:32 2011 -0700 common: new debug bitmask definition for extension logging Signed-off-by: Arlin Davis commit 09ab18c78faf698811ec08fcfc001c755fa44faa Author: Arlin Davis Date: Wed Aug 17 10:29:01 2011 -0700 common: new IB collective provider for Mellanox Fabric Collective Agent Support for bcast, barrier, reduce, allreduce, allgather, allgatherv Signed-off-by: Arlin Davis commit 5dc60f1aba17becf0788bcb519b17a47dc4be69c Author: Arlin Davis Date: Sun Aug 7 22:06:09 2011 -0700 dat: add definitions for MPI offloaded collectives in IB transport extensions The collective extensions are designed to support MPI and general multicast operations over IB fabrics that support offloaded collectives. Where feasible, they come as close to MPI semantics as possible. Unless otherwise stated, all members participating in a data collective operation must call the associated collective routine for the data transfer operation to complete. Unless otherwise stated, the root collective member of a data operation will receive its own portion of the collective data. In most cases, the root member can prevent sending/receiving data when such operations would be redundant. When root data is already "in place" the root member may set the send and/or receive buffer pointer argument to NULL. Unlike standard DAPL movement operations that require registered memory and LMR objects, collective data movement operations employ pointers to user-virtual address space that do not require pre-registration by the application. From a resource usage point of view, the API user should consider that the provider implementation my perform memory registrations/deregistration on behalf of the application to accomplish a data transfer. Most collective calls are asynchronous. Upon completion, an event will be posted to the EVD specified when the collective was created. Signed-off-by: Arlin Davis commit d3ac07bc2caf82e8d2cd9d0ad50472f697538bd0 Author: sean.hefty@intel.com Date: Wed Jun 22 10:40:17 2011 -0700 common: cleanup debug messages when building with ibacm feature Signed-off-by: Arlin Davis commit d7778868d352e97be618523eeb0468e485490c0e Author: Arlin Davis Date: Sun Feb 13 21:14:33 2011 -0800 Release 2.0.32 Signed-off-by: Arlin Davis commit ef80301e5799bd5657071e6bf4a1787711b5c878 Author: Arlin Davis Date: Sat Feb 12 12:03:19 2011 -0800 cma: reduce output log level in disconnect from WARN to CM_WARN Signed-off-by: Arlin Davis commit 0ca585d4c3e5043e3000786eee7293c3fc4818e3 Author: Arlin Davis Date: Sat Feb 12 11:46:08 2011 -0800 ucm: delay freeing of active side UD cm object in case RTU is dropped The ucm was freeing the UD CM object to quickly so a retried REPLY was dropped and the passive side never received the AH info via RTU. Keep active side UD cm objects on work queue until QP is destroyed so RTU can be resent if necessary. Signed-off-by: Arlin Davis commit a4de5f009dfe303788e08e26d46c5e0c68f20e6e Author: Arlin Davis Date: Sat Feb 12 11:36:35 2011 -0800 ucm: cm object needs to be on work queue before req sent on wire With this delay in cm object queuing there is potential for replies being dropped coming back with a NO MATCH. Start with INIT state and queue it up, move to state REP_PENDING when sending out on the wire to start request timer. Signed-off-by: Arlin Davis commit 342d0eb23c7da570d6f787474389377f706e8f14 Author: Arlin Davis Date: Fri Feb 4 14:41:45 2011 -0800 ucm, scm: remove use of usec_sleep delays and use events for disc and destroy use pthread mutex when processing and waiting for disconnect completions and for CM object destruction. Add f_event, d_event to cm object. Signed-off-by: Arlin Davis commit 02a298eca46a00e3cd26f694d54b8194efc231d1 Author: Arlin Davis Date: Thu Jan 20 18:31:30 2011 -0800 common: reduce default max inline data size because of performance anomaly Increasing max inline causes small message rates to decrease from 4M/sec when set to 64 to about 1M/sec when set to 400. This has been observed on latest mlx4 adapters. Set default to 64 until resolved. Signed-off-by: Arlin Davis commit 14402cefc4ad90f4bd826f60bdeef7ad82909041 Author: Arlin Davis Date: Thu Jan 20 11:05:02 2011 -0800 common: dapls_evd_dto_wait() dbg message should print status and not errno Signed-off-by: Arlin Davis commit 7050cd7b4756ed98072513ee9c3672f0cb63a97d Author: Arlin Davis Date: Mon Jan 17 14:43:58 2011 -0800 ucm, scm: exchange max_qp_rd_atom and limit outstanding requests exchange and add proper checking to limit outstanding rdma reads and atomics. Use one of the reserve bytes in CM message protocol to exchange limits and reset EP attribute rdma_out and set QP RTS attribute properly. Signed-off-by: Arlin Davis commit 080b172cf26ab3202cfb4a1f231e849ea911473f Author: Arlin Davis Date: Tue Jan 4 20:22:12 2011 -0800 scm: retry socket connect on ECONNREFUSED under heavy load with large scale workloads a linux server starts rejecting socket connect requests. Add retry logic for connection refused errors. increasing net.ipv4.tcp_max_syn_backlog to 2048 will also reduce the chance of these errors when scaling up. Signed-off-by: Arlin Davis commit fee5b15e67c60d9d39005ff99655f2c41c418d37 Author: Arlin Davis Date: Tue Jan 4 16:25:29 2011 -0800 common: qp modify RTR using wrong ep attribute parameter for dest_rd_atomic max_rdma_read_in should be used instead of max_rdma_read_out Signed-off-by: Arlin Davis commit b2df3373fec12f16df712e6e2e35d8a3799f3452 Author: Arlin Davis Date: Fri Dec 10 14:26:07 2010 -0800 Release 2.0.31 Signed-off-by: Arlin Davis commit 2bebd3f72ecd73e2df80ca4712f0f470647f196b Author: Arlin Davis Date: Fri Dec 10 14:19:45 2010 -0800 common: clean up build warning for unused variable event_ptr Signed-off-by: Arlin Davis commit 07947b64b776e0c55051bd2db16829fec310db32 Author: Arlin Davis Date: Fri Dec 10 13:49:47 2010 -0800 scm, ucm: set RAI_NOROUTE flag with rdma_getaddrinfo() call to avoid blocking. if path is not returned, print warning message and use default SL. Signed-off-by: Arlin Davis commit 910f52dc040e56d80aa71ec2220c04d11184a9f7 Author: Arlin Davis Date: Fri Dec 10 13:47:15 2010 -0800 cma: definition for dapl_sp_remove_ep() is missing in cm.c Signed-off-by: Arlin Davis commit 04d577b6b5232d1eb7a741caa963e6181008ebd6 Author: Arlin Davis Date: Mon Dec 6 16:06:47 2010 -0800 libdat: static provider entries created for local SR database not freed During load (dat_sr_init) the SR database is created with all dat.conf entries but are never cleaned up during unload. Add new functions dat_sr_remove_all() and dat_sr_remove() calls to cleanup and deallocate SR database entries and database via dat_sr_fini(). Signed-off-by: Arlin Davis commit 9acb2c022a40d9a92a7aad5663be4ad02434de2f Author: Arlin Davis Date: Mon Dec 6 16:02:13 2010 -0800 libdat: memory leak in static registration during parsing The platform_params char string, allocated when parsing dat.conf, is not freed. Signed-off-by: Arlin Davis commit 384c1d71872fdd422b64e7b0e1f7b025f18a7ab2 Author: Arlin Davis Date: Fri Dec 3 16:13:31 2010 -0800 common: increase default IB inline send threshold to 400 Signed-off-by: Arlin Davis commit 70b05fed377f37665d9444d1710c0e251d63bf8a Author: Pradeep Satyanarayana Date: Fri Dec 3 15:52:55 2010 -0800 common cq: a mixup of errno and the -1 return from poll in dapls_wait_comp_channel call should return errno and not status returned from poll. Signed-off-by: Pradeep Satyanarayana commit f0984b3134ac6019e849dc3d449fa33c553344a8 Author: Arlin Davis Date: Fri Dec 3 14:56:21 2010 -0800 ucm: release UD cm objects after AH is exchanged to avoid duplicate request drops When EP is in UD mode, AH resolution is handled with DAT connection semantics connect and accept. Since AH info can be resolved for the same EPs you can get false duplicate requests because a previous CR from is still on the CM processing list. The CM object will remain on the EP free list and not be freed until EP is destroyed given the possibilty of consumer accessing CR private data buffer. Signed-off-by: Arlin Davis commit 334326f1e76c07c08f032df1f69f259a088639dd Author: Arlin Davis Date: Fri Dec 3 14:52:26 2010 -0800 ucm: decrease timeout retry count for disconnect requests Signed-off-by: Arlin Davis commit 48c594ba32507e49e4c28be0fc7094df96b52340 Author: Arlin Davis Date: Fri Dec 3 14:24:40 2010 -0800 ucm: hold lock when sending cm_msgs to sync timer start with packet send releasing the lock after setting start timer and before ucm_send could result in incorrect timeout on CM operations if thread is scheduled out when releasing lock. Signed-off-by: Arlin Davis commit 4395b4d95e39d460ead28fc7fe76a3cfcbf16935 Author: Arlin Davis Date: Fri Dec 3 14:02:25 2010 -0800 ucm: add debugging to include process id for better scale up debug aids use part of the resv[] area of the cm_msg to include local and remote process ids. Add more debug messages to help isolate problems related to many process problems. Signed-off-by: Arlin Davis commit c269c9ab83a72a2b4ffa972697b83572410d9cea Author: Arlin Davis Date: Fri Dec 3 10:25:46 2010 -0800 cma: disconnect can block for excessive times waiting for rdma_cm DREP timeout rdma_cm uses the same timeout values for connect and disconnect request/reply. Disconnect abrupt option allows DAT consumers to specify a prompt disconnect with immediate event. If the remote node goes down or is non-responsive a CM disconnect event could take minutes. Add a time limit waiting for event and move EP to disconnected state to prevent callback from issuing duplicate disconnect event via callback. The EP to CM linking will cleanup/cancel any pending events before destroying cm_id. Signed-off-by: Arlin Davis commit 4c8275ce6d6243fab26e09bff4227db600197c30 Author: Arlin Davis Date: Tue Nov 16 14:48:10 2010 -0800 ucm: configure the recv channel FD to non-blocking Signed-off-by: Arlin Davis commit 551ae2d65d6bf891183b0f9d6c68612120147d07 Author: Stan Smith Date: Fri Oct 29 10:11:41 2010 -0700 windows: Missing librdmacm include path for build Signed-off-by: stan smith commit 15148cdd23f641bd7d7642a17f7155c18ba0d76c Author: Arlin Davis Date: Thu Oct 28 11:12:33 2010 -0700 debug build: only timestamp if sending to stdout to avoid performance hit Signed-off-by: Arlin Davis commit f80928c991c6df0b6e9b344067f7f9c004c17263 Author: Arlin Davis Date: Thu Oct 28 11:11:12 2010 -0700 common: print out errors on free build and not just debug builds Signed-off-by: Arlin Davis commit 7479741ae44627c32af8f8265507ce589c96d8ed Author: Arlin Davis Date: Fri Oct 22 11:58:19 2010 -0700 cma: fix debug build issue Signed-off-by: Arlin Davis commit 4ae116163655e5042f57ec22233624065d652552 Author: Arlin Davis Date: Fri Oct 22 10:15:15 2010 -0700 scm, ucm: MPI spawn test on oversubcribed server taking excessive time to complete Simultanious DREQ processing from user and CM thread caused some improper state change on UCM. State change can incorrectly change from FREE back to DISC in certain corner cases. Add checking on internal disconnect call to prevent double callback events and improper state change. For SCM, a remote DREQ will shutdown socket which will cause POLLERR on the disconnected FD. This will in turn cause the cm_thread to wakeup continuously unnecessarily. Fix thread thrashing by moving CM object to FREE state and removing object FD from pollfd array. Signed-off-by: Arlin Davis commit e26513e47d75f96de47020951f1813c1a09d238d Author: Arlin Davis Date: Fri Oct 22 10:04:21 2010 -0700 common: add high resolution time stamps and thread id to sdtout debug logs Signed-off-by: Arlin Davis commit 794e3807b019df7163b09745048980632a48fcc2 Author: ardavis Date: Fri Oct 22 10:01:12 2010 -0700 common: modify debug in dat_evd_dequeue to reduce noise, only output on non-empty Signed-off-by: Arlin Davis commit 779f2a93f95d7e1d6b18061401cffb0ee56a2b37 Author: sean.hefty@intel.com Date: Tue Oct 19 13:54:42 2010 -0700 cma: rdma_destroy_id called twice during device open bind error Signed-off-by: Pradeep Satyanarayana commit 9c4026b3658f4f350d2b9cf4cbbda0cdc8f26482 Author: ardavis Date: Tue Oct 19 09:52:45 2010 -0700 common: dat_evd_dequeue (poll_cq) fails with invalid parameter after EP (qp) free Failure occured during Intel MPI spawn test on windows. The QP's need to be flushed and processed via EVD's during the EP (QP) destroy to avoid an error on poll_cq. IBAL provider was not moving to ERR state during QP destroy. Better flush CQ processing was added and pushed down to the provider level via dapls_ib_qp_free() where it can move QP to ERR, flush CQ, and then free QP after flushing. Because there is no QP_ERR_FLUSH state on a QP the spin on poll_cq (until empty) after modify_qp to ERR could return empty and before all WQE's are flushed. This could result in a CQE being added to CQ with a invalid QP reference. So, an additional check was added to flush_evds for the recv_q to poll_cq until all recv's pending are complete. For transmit_q there is no quarantee that the posted work is signaled and so the best that can be done is poll_cq until empty. Signed-off-by: Arlin Davis Signed-off-by: Sean Hefty commit 3685811d2c481d1e55d79962710f8779553c0d88 Author: ardavis Date: Mon Oct 11 12:24:31 2010 -0700 ucm: allow configuration of CM burst (signal) threshold on posting Add new DAPL_UCM_TX_BURST environment variable, default=50. Every 50 posted send messages will signal event which is 10 percent blocks of default 500 message limit. Signed-off-by: Arlin Davis commit 167f4d8e50f96f771d1ca50042f61713800e9987 Author: ardavis Date: Mon Oct 11 12:23:50 2010 -0700 cma: fix debug build Signed-off-by: Arlin Davis commit af828468ce884615b39afacae4e5270e38fba9a6 Author: ardavis Date: Thu Oct 7 14:29:21 2010 -0700 windows: debug version of windows does not build. Signed-off-by: Sean Hefty commit 3da73eccadfbec9b8725c53cf37eb9802342c4d0 Author: ardavis Date: Thu Oct 7 11:14:03 2010 -0700 Allow DAPL out of band connection models to use ibacm to obtain path record data. This will enable support for a wider range of topologies, where the SL is required from the SA to prevent deadlock. DAPL will obtain path record data using rdma_getaddrinfo, provided that IB ACM support is enabled. On failure, dapl will fall back to using its default SL value. The IB ACM can be configured to cache path information or always query the SA to ensure that the SL that is obtained is current. Signed-off-by: Sean Hefty commit 8be031e229dfc6afcf7b637d2ea78e43048b7223 Author: ardavis Date: Mon Sep 27 11:12:08 2010 -0700 ucm: add missing map file for UCM provider Signed-off-by: Arlin Davis commit 78ae5ca6bc5ca16772d70e4c4e7b76982efac0fa Author: ardavis Date: Fri Sep 24 10:47:30 2010 -0700 ibal: delay QP transition during disconnect phase ibal provider calls ib_cm_drep in response to receiving a dreq. The result is that the user's QP is transitioned through the error state, which fails any outstanding send operations and flushes all receives. The disconnect request is then reported to the user. Since a user can receive errors from the QP before they are aware of a pending disconnect request, the application may respond to the errors as, well, actual errors. Fix this by delaying the QP transition until the user responds to the dreq. This fixes an error with Intel MPI running over the ibal dapl provider with a 'spawn' test. Signed-off-by: Sean Hefty commit 17d4b3d1ef11ca4de535e64dfffa20e4771bfb1d Author: ardavis Date: Thu Sep 23 13:50:05 2010 -0700 Revert "ibal: delay QP transition during disconnect phase" This reverts commit 4eda455d9bc80c35743b3a2f6773e6c4a500affc. commit 4eda455d9bc80c35743b3a2f6773e6c4a500affc Author: Arlin Davis Date: Wed Sep 22 10:35:24 2010 -0700 ibal: delay QP transition during disconnect phase The ibal provider calls ib_cm_drep in response to receiving a dreq. The result is that the user's QP is transitioned through the error state, which fails any outstanding send operations and flushes all receives. The disconnect request is then reported to the user. Since a user can receive errors from the QP before they are aware of a pending disconnect request, the application may respond to the errors as, well, actual errors. Fix this by delaying the QP transition until the user responds to the dreq. Signed-off-by: Sean Hefty --- commit 6fefe33f9e691d4527a6e077ae1fe71bf138a41c Author: Arlin Davis Date: Mon Sep 20 10:42:41 2010 -0700 common: restructure EVD processing to handle EP destruction phase EVD processing in the common code will return unformated events if EP context is invalid as a result of destruction. During EP destruction, add changes to flush EVD and process DTO completions before the EP freeing is called. Simplified the locking in the EVD code to eliminate the unecessary and very confusing condition checking of evd_producer_locking_needed. new dapls_ep_flush_cqs() call created to syncronize flush and event processing. unnecessary KDAPL code removed in the EVD processing. Signed-off-by: Arlin Davis Signed-off-by: Sean Hefty commit 9a52436fab39201ccccc76cde10c0fc6f54f5585 Author: Arlin Davis Date: Mon Sep 13 16:19:44 2010 -0700 ibal: sync QP destruction and device close Make QP destruction synchronous to ensure that no callbacks are in progress for a QP after dapl has destroyed it. This fixes a use after free error accessing the dapl ep structure from a qp callback that results in an application crash. Signed-off-by: Sean Hefty commit 8b9b644ad2b33f1e21a43be364feee6dd4fc13ec Author: Arlin Davis Date: Mon Sep 13 15:06:42 2010 -0700 ucm: remove unnecessary debug warning in async callback The switch() cases print when necessary. signed-off-by: stan smith commit 9073d757198ea2aa43a7b97e75e64fcb1b4c40cf Author: Arlin Davis Date: Mon Aug 9 14:28:20 2010 -0700 Release 2.0.30 Signed-off-by: Arlin Davis commit f85be199252d12d27c7b7814771a4ca83a43d0c8 Author: Arlin Davis Date: Mon Aug 9 14:25:09 2010 -0700 common: increase default logging to include warnings Signed-off-by: Arlin Davis commit 59489448a7918ab2a1a4b9bcac7e4661cdd97a23 Author: Arlin Davis Date: Mon Aug 9 14:19:50 2010 -0700 common: add more debug levels for cm logging DAPL_DBG_TYPE_CM_EST = 0x8000, DAPL_DBG_TYPE_CM_WARN = 0x10000 Add level for connection establishment and events and for retries/timer events. Signed-off-by: Arlin Davis commit 70c509bca8409d55ad7c4a248f453956d163778b Author: Arlin Davis Date: Mon Aug 2 09:51:30 2010 -0700 common: cleanup CR linkings after DTO error on EP Add cleanup to remove CR from SP and EP during DTO errors in dapli_evd_cqe_to_event. dapl_sp_remove_ep needs to remove cr_ptr reference from EP before freeing cr object. Signed-off-by: Arlin Davis commit 319430b3bbfb8692dd3d21a21633bfee74cf5b7c Author: Arlin Davis Date: Mon Aug 2 09:49:23 2010 -0700 ucm: cleanup CM debug warning messages Signed-off-by: Arlin Davis commit 7118731a890e9188bb02dc7a5b21ffd832855e9e Author: Arlin Davis Date: Fri Jul 23 15:17:53 2010 -0700 scm, ucm: improperly handles pkey check/query in host order Convert consumer input to network order before verbs query pkey check. Signed-off-by: Arlin Davis commit c5504925b8b98006f421d53475e8ecd55b76f9dd Author: Arlin Davis Date: Mon Jul 12 15:57:34 2010 -0700 The linux compatability header file _errno.h is moving out of verbs.h. Include _errno.h in the windows osd header files, similar to how errno.h is included in the linux osd header files. Signed-off-by: Sean Hefty commit 455e9d6d0aeb753a9ecb4a130b0b237e1ffd4146 Author: Arlin Davis Date: Wed Jun 30 12:03:41 2010 -0700 windows: update SOURCES files to link winverbs.lib, which is needed for common ofa providers. Signed-off-by: Sean Hefty commit b441934f5e55582ef01a91c01da720334345a452 Author: Arlin Davis Date: Thu Jun 17 12:58:22 2010 -0700 Release 2.0.29 Signed-off-by: Arlin Davis commit 6c6a482b8ad33d134f0631019b249bd0fea71007 Author: Arlin Davis Date: Thu Jun 17 12:40:21 2010 -0700 scm, ucm: add pkey, pkey_index, sl override for QP's On a per open basis, add environment variables DAPL_IB_SL and DAPL_IB_PKEY and use on connection setup (QP modify) to override default values of 0 for SL and PKEY index. If pkey is provided then find the pkey index with ibv_query_pkey for dev_attr.max_pkeys. Will be used for RC and UD type QP's. Signed-off-by: Arlin Davis commit 876942781e9bf72302184f3534a2ddc4068550ac Author: Arlin Davis Date: Thu Jun 10 11:40:45 2010 -0700 cma: remove dependency on rdma_cma_abi.h Signed-off-by: Arlin Davis commit b34ea37650b5eefeedfc463345775ff568df259e Author: Arlin Davis Date: Wed Jun 2 14:13:05 2010 -0700 configure: need a false conditional for verbs attr.link_layer member check Signed-off-by: Arlin Davis commit 977f11871d3d4e98f602f890ade1c31cf4169c9c Author: Arlin Davis Date: Wed Jun 2 10:05:03 2010 -0700 ucm: incorrectly freeing port on passive side after reject cm_release was incorrectly freeing a client port assuming it was the server listening port. Move the listening port cleanup to remove_conn_listner and only cleanup client ports in cm_release. Error Messages indicating problem: CM_REQ retry 1 [lid, port, qpn]: 9 ff9a 340085 -> 9 6fa 34004e Time(ms) 1999 > 1600 DUPLICATE: op REQ st CM_CONNECTED [lid, port, qpn]: 9 6fa 0x0 <- 0x9 ff9a 0x340085 Signed-off-by: Arlin Davis commit 7aedfb1e9dcb9e2841ebe3496bb9aae33c1f6a5b Author: Arlin Davis Date: Wed Jun 2 09:45:42 2010 -0700 ucm: modify debug CM output for consistency, all ports, qpn in hex Signed-off-by: Arlin Davis commit 8e776ff0621cee1824be224b7a32f79e89b0ebc2 Author: Arlin Davis Date: Mon May 24 16:44:25 2010 -0700 Release 2.0.28 Signed-off-by: Arlin Davis commit 8fdbd949ef464aa57b13743ab087ea72f035fbc3 Author: Arlin Davis Date: Mon May 24 16:28:05 2010 -0700 config: add conditional check for new verbs port_attr.link_layer Check for link_layer type ETHERNET and set global for GID configuration on modify QP. Signed-off-by: Arlin Davis commit 1ce0875fb2ac6120cfee006b48a20a4ec38f599b Author: Arlin Davis Date: Mon May 24 10:30:28 2010 -0700 dat.conf: update manpage with latest provider information, add examples Add information regarding OpenFabrics provider choices and explain cma, scm, and ucm providers. Signed-off-by: Arlin Davis commit 9c42d5872feb07f25f003e01263a3062ebc3bdbb Author: Arlin Davis Date: Wed May 19 16:38:53 2010 -0700 cma, scm: new provider entries for Mellanox RDMA over Ethernet device Add options for netdev eth2 and eth3 for cma and for device mlx4_0 port 1 and 2 for scm. ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" "" ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" Signed-off-by: Arlin Davis commit d947e05317fe7fef19c90f772ec8f458ff52b196 Author: Arlin Davis Date: Wed May 19 15:17:58 2010 -0700 dapltest: server info devicename is not large enough for dapl_name storage Server info device name is a 80 char array but the dapl device name that is copied is 256 bytes. Increase started_server.devicename definition. Chalk one up for windows SDK OACR (auto code review). Signed-off-by: Sean Hefty commit c7a7a886af194cf735ee1eb62d9e14967d51249a Author: Arlin Davis Date: Wed May 19 14:48:49 2010 -0700 windows: comp_channel.cpp is included by util.c in the openib_common. Remove it from device.c in individual providers to avoid duplicate definitions. Line endings were corrected to linux format from windows as part of the change. Signed-off-by: Sean Hefty commit bcaa400778d14a977d5cd224056baa0cff06126d Author: Arlin Davis Date: Wed May 19 14:45:55 2010 -0700 windows: need to include linux directory to pick up _errno.h Signed-off-by: Sean Hefty commit c616a8549db461e39feed71f0f10228313d17b90 Author: Arlin Davis Date: Mon May 17 16:22:30 2010 -0700 scm: check for hca object before signaling thread There may not be an hca object attached to cm object when freeing during cleanup. Signed-off-by: Arlin Davis commit 1dbba72741da267f71903a9f2ec03628f3e8a47a Author: Arlin Davis Date: Mon May 17 16:15:21 2010 -0700 scm, cma: fini code can be called multiple times and hang via fork The providers should protect against forked child exits and not cleanup until the parent init actually exits. Otherwise, the child will hang trying to cleanup dapl thread. Modify to check process id for proper init to fini cleanup and limit cleanup to parent only. Signed-off-by: Arlin Davis commit b35cb1b16a9dda349dbb19bce9f9bd4afb7240a4 Author: Arlin Davis Date: Fri May 14 16:20:52 2010 -0700 scm: add option to use other network devices with environment variable DAPL_SCM_NETDEV New environment variable can be used to set the netdev for sockets to use instead of the default network device returned using gethostname. Signed-off-by: Arlin Davis commit cfdf8bb8951b1c19b8e42d58e4ec26070fdc078e Author: Arlin Davis Date: Fri May 14 10:27:50 2010 -0700 scm: cr_thread occasionally segv's when disconnecting all-to-all MPI static connections Note: no valid calltrace for segv on cr_thread because of state changing in switch statement from another thread, jumped unknown location. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x41a65940 (LWP 1328)] 0x00002b2e7d9d5134 in ?? () Add cm object locking on all state change/checking. When freeing CM object wakeup cr_thread to process state change to CM_FREE. Signed-off-by: Arlin Davis commit 4b04afc32940ac42fb2a9bc789a537b527d149fe Author: Arlin Davis Date: Thu May 13 10:31:17 2010 -0700 scm: SOCKOPT ERR Connection timed out on large clusters Large scale all to all connections on +1000 cores the listen backlog is reached and SYN's are dropped which causes the connect to timeout. Retry connect on timeout errors. Signed-off-by: Arlin Davis commit 625369f991982f020c04156f312ecf2ecafd77b3 Author: Arlin Davis Date: Mon May 10 12:46:17 2010 -0700 ucm: UD mode, active side cm object released to soon, the RTU could be lost. Will see following message with DAPL_DBG_TYPE set for Errors & Warnings (0x3): ucm_recv: NO MATCH op REP 0x120 65487 i0x60005e c0x60005e < 0xd2 19824 0x60006a The cm object was released on the active side after the connection was established, RTU sent. This is a problem if the RTU is lost and the remote side retries the REPLY. The RTU is never resent. Keep the cm object until the EP is destroyed. Signed-off-by: Arlin Davis commit 83eec7f19a7442fe568dea685cee7b02fef2f4d1 Author: Arlin Davis Date: Mon May 10 12:35:51 2010 -0700 cma, ucm: cleanup issues with dat_ep_free on a connected EP without disconnecting. During EP free, disconnecting with ABRUPT close flag, the disconnect should wait for the DISC event to fire to allow the CM to be properly destroyed upon return. The cma must also release the lock when calling the blocking rdma_destroy_id given the callback thread could attempt to acquire the lock for reference counting. Signed-off-by: Arlin Davis commit da83172db68d05f54b2c1c77b84ecf86dea0c693 Author: Arlin Davis Date: Wed Apr 28 15:37:27 2010 -0700 ucm: increase default UCM retry count for connect reply to 15 On very large clusters UCM is timing out with retries at 10. Signed-off-by: Arlin Davis commit 5c710a197bb60268e99e8d1cd7fa26f89b366172 Author: Arlin Davis Date: Tue Apr 27 11:20:08 2010 -0700 scm: remove modify QP to ERR state during disconnect on UD type QP The disconnect on a UD type QP should not modify QP to error since this is a shared QP. The disconnect should be treated as a NOP on the UD type QP and only be transitioned during the QP destroy (dat_ep_free). Signed-off-by: Arlin Davis commit 64c8009f7ba48c22a6829862447ab5f67c66ba55 Author: Arlin Davis Date: Thu Apr 8 16:32:02 2010 -0700 windows: remove static paths from dapltest scripts signed-off-by: stan smith commit 84b78b0b586ee25c7ab78e2c5f7f19a3ce3f21ee Author: Arlin Davis Date: Thu Apr 8 09:38:57 2010 -0700 common: EP links to EVD, PZ incorrectly released before provider CM objects freed. unlink/clear references after ALL CM objects linked to EP are freed. Otherwise, event processing via CM objects could reference the handles still linked to EP. After CM objects are freed (blocking) these handles linked to EP are guaranteed not to refereence from underlying provider. Signed-off-by: Arlin Davis commit 297e149e7af631663ecc60472a3ee093a7f72059 Author: Arlin Davis Date: Wed Apr 7 11:12:21 2010 -0700 common: remove unnecessary lmr lkey hashing and duplicate lkey checking lmr lkey hashing is too restrictive given the returned lkey could be the same value for different regions on some rdma devices. Actually, this checking is really unecesssary and requires considerable overhead for hashing so just remove hashing of lmr lkey's. Let verbs device level do the checking and validation. Signed-off-by: Arlin Davis commit 96fba2ee7a0a1766f200c9486e62aad46d18bb09 Author: Arlin Davis Date: Mon Mar 29 12:20:34 2010 -0800 ibal: output completion code in deciaml & hex as intended sign-off-by: stan smith commit 753f7d35c814367f431deeb307e6decd933a8b5a Author: Arlin Davis Date: Tue Mar 16 15:02:44 2010 -0800 ucm: set timer during RTU_PENDING state change. The timer thread may pick up an unitialized timer value and timeout before the reply was sent. Signed-off-by: Arlin Davis commit 9fc851021d91b282054cf28b4f83f7e5d376f228 Author: Arlin Davis Date: Tue Mar 16 14:47:58 2010 -0800 ucm: fix issues with new EP to CM linking changes Add EP locking around QP modify Remove release during disconnect event processing Add check in cm_free to check state and schedule thread if necessary. Add some additional debugging Add processing in disconnect_clean for conn_req timeout Remove extra CR's Signed-off-by: Arlin Davis commit a5da5e4dac52366a9fe9efeb9a128bd4511481e2 Author: Arlin Davis Date: Tue Mar 16 14:18:06 2010 -0800 scm: add EP locking and cm checking to socket cm disconnect Signed-off-by: Arlin Davis commit 7f733cd1a9acd4b9b270a807673290362050053d Author: Arlin Davis Date: Tue Mar 16 09:44:44 2010 -0800 scm: new cm_ep linking broke UD mode over socket cm Add EP locking around modify_qp for EP state. Add new dapli_ep_check for debugging EP Cleanup extra CR's Change socket errno to dapl_socket_errno() abstraction Signed-off-by: Arlin Davis commit a528267020972e0c449f240ba72a0cc80a5d372e Author: Arlin Davis Date: Tue Mar 16 09:17:01 2010 -0800 openib common: add some debug prints to help isolate QP type issues Signed-off-by: Arlin Davis commit fdfdc439d091c878c74d23b9ac46a3320379199d Author: Arlin Davis Date: Tue Mar 16 09:15:12 2010 -0800 common: dapl_event_str function missing 2 IB extended events Add all IB extended events in event string print function Signed-off-by: Arlin Davis commit 2bf3eb939e9a584ae0fe2de70f16cdcca8acf014 Author: Arlin Davis Date: Tue Mar 16 09:12:11 2010 -0800 common: dat_ep_connect should not set timer UD endpoints connect for UD type is simply AH resolution and doesn't need timed. The common code is not designed to handle multiple timed events on connect requests so just ignore timing UD AH requests. Signed-off-by: Arlin Davis commit 73ca06debe4735dfc11f44076a13dde079657b2e Author: Arlin Davis Date: Mon Mar 15 10:23:47 2010 -0800 ucm: fix error path during accept_usr reply failure if accept_usr fails when sending reply the EP was being linked to CM instead of properly unlinked. Signed-off-by: Arlin Davis commit 944ef4445faceeb90bb61d4e377274ad0fd6711f Author: Arlin Davis Date: Mon Mar 8 13:56:28 2010 -0800 ibal: add missing windows makefile Signed-off-by: Arlin Davis commit 1d53e8eb90e6f74b41e7767e1c71851ff4ec73fd Author: Arlin Davis Date: Mon Mar 8 12:53:45 2010 -0800 ibal: changes for EP to CM linking and synchronization. Windows IBAL changes to allocate and manage CM objects and to link them to the EP. This will insure the CM IBAL objects and cm_id's are not destroy before EP. Remove windows only ibal_cm_handle in EP structure. Signed-off-by: Arlin Davis commit 4b939076aa32bb52957fcc6791e187c9433d4c24 Author: Arlin Davis Date: Wed Feb 24 12:00:07 2010 -0800 scm: add support for canceling conn request that times out. print warning message during timeout. Signed-off-by: Arlin Davis commit f38fc04d517ee6c0560b271298293c56cc619522 Author: Arlin Davis Date: Wed Feb 24 11:28:04 2010 -0800 scm, cma, ucm: consolidate dat event/provider event translation Signed-off-by: Arlin Davis commit 41739dab38a4be8076ecd9e61b5e175cf91ab322 Author: Arlin Davis Date: Wed Feb 24 11:26:25 2010 -0800 common: missed linking changes from atomic to acquire/release Signed-off-by: Arlin Davis commit 7ff4f840bf1150fa2c2f541c93d810622ea9733b Author: Arlin Davis Date: Wed Feb 24 10:03:57 2010 -0800 common: add CM-EP linking to support mutiple CM's and proper protection during destruction Add linking for CM to EP, including reference counting, to insure syncronization during creation and destruction. A cm_list_head has been added to the EP object to support multiple CM objects (UD) per EP. If the CM object is linked to an EP it cannot be destroyed. Signed-off-by: Arlin Davis commit c9fbd6e7a8131d4077039d5da716b618727d4009 Author: Arlin Davis Date: Tue Feb 23 16:26:41 2010 -0800 Release 2.0.27-1 Signed-off-by: Arlin Davis commit 454c27b1f357c7c3070e459b25d12929f86304ca Author: Arlin Davis Date: Mon Feb 22 09:42:17 2010 -0800 windows: add scm makefile Signed-off-by: Arlin Davis commit 66ac48d5280bcf0453760c6e22909de6b8519b6d Author: Arlin Davis Date: Mon Feb 22 09:41:13 2010 -0800 Windows does not require rdma_cma_abi.h, move the include from common code and to OSD file. Signed-off-by: stan smith commit c05c41c31f01e1ddef91e92998ca66d258fafe3d Author: Arlin Davis Date: Fri Feb 19 14:52:01 2010 -0800 Windows patch to fix IB_INVALID_HANDLE name collision signed-off-by: stan smith commit 712e7e5ba71f8a4344dfff481a9be870eefefe25 Author: Arlin Davis Date: Mon Feb 8 13:49:35 2010 -0800 scm: dat_ep_connect fails on 32bit servers memcpy for remote IA address uses incorrect sizeof for a pointer type. Signed-off-by: Arlin Davis commit 3040fa78d7d22c8f76c88dc77cedde09f016eb67 Author: Arlin Davis Date: Fri Feb 5 11:51:16 2010 -0800 undefined symbol: dapls_print_cm_list call prototype should be dependent on DAPL_COUNTERS. Signed-off-by: Arlin Davis commit cbeebe422b952d679f49429be8ba045a62d7f4ac Author: Arlin Davis Date: Fri Feb 5 11:39:21 2010 -0800 Cleanup CM object lock before freeing CM object memory Running windows application verifiier for uDAPL validation for all 3 providers. Cleanup memory lock leaks found by verifier. Signed-off-by: Arlin Davis commit 855a8e4aa83fa2e4f7847122415106f49286f4ca Author: Arlin Davis Date: Wed Feb 3 16:21:30 2010 -0800 destroy verbs completion channels created via ia_open or ep_create. Completion channels are created with ia_open for CNO events and with ep_create in cases where DAT allows EP(qp) to be created with no EVD(cq) and IB doesn't. These completion channels need to be destroyed at close along with a CQ for the EP without CQ case. Signed-off-by: Arlin Davis commit 4da540591148e47dd912851cc7314776f2f7622e Author: Arlin Davis Date: Wed Feb 3 11:06:45 2010 -0800 Update Copyright file and include the 3 license files in distribution Signed-off-by: Arlin Davis commit 9011abd4b1470c65bfe81eef5a2f3a81060cec81 Author: Arlin Davis Date: Tue Feb 2 14:43:03 2010 -0800 When copying private_data out of rdma_cm events, use the reported private_data_len for the size, and not IB maximums. This fixes a bug running over the librdmacm on windows, where DAPL accessed invalid memory. Signed-off-by: Sean Hefty Signed-off-by: Arlin Davis commit 5da33bb3b9c230c08492f85d13caa330ce65906e Author: Sean Hefty Date: Thu Jan 28 10:19:20 2010 -0800 dapl/cma: fix referencing freed address DAPL uses a pointer to reference the local and remote addresses of an endpoint. It expects that those addresses are located in memory that is always accessible. Typically, for the local address, the pointer references the address stored with the DAPL HCA device. However, for the cma provider, it changes this pointer to reference the address stored with the rdma_cm_id. This causes a problem when that endpoint is connected on the passive side of a connection. When connect requests are given to DAPL, a new rdma_cm_id is associated with the request. The DAPL code replaces the current rdma_cm_id associated with a user's endpoint with the new rdma_cm_id. The old rdma_cm_id is then deleted. But the endpoint's local address pointer still references the address stored with the old rdma_cm_id. The result is that any reference to the address will access freed memory. Fix this by keeping the local address pointer always pointing to the address associated with the DAPL HCA device. This is about the best that can be done given the DAPL interface design. Signed-off-by: Sean Hefty commit 66dbb5f20bf494eb3f5041655b478059165c5f1b Author: Sean Hefty Date: Tue Jan 26 15:13:03 2010 -0800 dapl: move close device after async thread is done using it Before calling ibv_close_device, wait for the asynchronous processing thread to finish using the device. This prevents a use after free error. Signed-off-by: Sean Hefty commit 560b235adc799fa710571ca63cbc3e4fa6374ff2 Author: Arlin Davis Date: Mon Jan 11 09:03:10 2010 -0800 Release 2.0.26-1 Signed-off-by: Arlin Davis commit 73dfb32ace6aff2fdb21e54689342fd551822286 Author: Arlin Davis Date: Tue Dec 22 14:00:33 2009 -0800 openib_common: add check for both gid and global routing in RTR check for valid gid pointer along with global route setting during transition to RTR. Add more GID information to debug print statement in qp modify call. Signed-off-by: Arlin Davis commit 7aab18fd8ff3f201b0a4b6c76896667b29f103c4 Author: Arlin Davis Date: Fri Dec 4 12:31:22 2009 -0800 openib_common: remote memory read privilege set multi times duplicate setting of read privilege in dapls_convert_privileges Signed-off-by: Arlin Davis commit 016e2c40b8ac2fe18993e9fb7122ecb9b439e5eb Author: Arlin Davis Date: Fri Dec 4 12:25:30 2009 -0800 ucm, scm: DAPL_GLOBAL_ROUTING enabled causes segv socket cm and ud cm providers support QP modify with is_global set and GRH. New v2 providers didn't pass GID information in modify_qp RTR call and incorrectly byte swapped the already network order GID. Add debug print of GID during global modify. Signed-off-by: Arlin Davis commit 7b0c596c7b4ad619f65da9f79dcbc4376e651dde Author: Arlin Davis Date: Tue Nov 24 22:16:58 2009 -0800 Release 2.0.25-1 Signed-off-by: Arlin Davis commit 3197bffff478ad7ff5eff9220fa0528e42e6b56e Author: Arlin Davis Date: Tue Nov 24 22:15:46 2009 -0800 winof scm: initialize opt for NODELAY setsockopt Signed-off-by: Arlin Davis commit 8559ec069329249592f367b5b8f61427cbad0a46 Author: Arlin Davis Date: Tue Nov 24 11:29:46 2009 -0800 Release 2.0.25 Signed-off-by: Arlin Davis commit 0983c66cbd9511128c1fa221470c4c983903e420 Author: Arlin Davis Date: Tue Nov 24 08:58:44 2009 -0800 winof cma: windows definition for EADDRNOTAVAIL missing Signed-off-by: stan smith commit 4fbbcfa1d7bf7a843b27e351d35f3ffbc2ac4db8 Author: Arlin Davis Date: Tue Nov 24 08:54:26 2009 -0800 scm: client side setsockopt NODELAY fails if data arrives before setting Move setsockopt before connect to avoid race with data. Seems to fail on windows. Not seen on linux. Signed-off-by: Arlin Davis commit 9dfa9a06d55101fed0773028ce7ab85330514c67 Author: Arlin Davis Date: Wed Nov 18 09:52:40 2009 -0800 cma: setup_listener Cannot assign requested address Colliding with RDS port of 18634. rdma_cm can return either EADDRINUSE or EADDRNOTAVAIL if the bind fails. Add check for either and return proper DAT_CONN_QUAL_IN_USE. Signed-off-by: Arlin Davis commit 0698fb56d533a5225cbc3a5a4b8ab2e2d56b7502 Author: Arlin Davis Date: Wed Nov 18 09:43:38 2009 -0800 common: seg fault in dapl_evd_wait with multi-thread application using CNO's. If we are dealing with event streams besides a CQ event stream, be conservative and set producer side locking. Otherwise, no. Check for CNO is missing, CNO is not considered CQ event stream. Signed-off-by: Arlin Davis commit 4d26a280572a58248b0796e4d5ed01ea5d67be46 Author: Arlin Davis Date: Wed Nov 18 09:37:48 2009 -0800 ucm: inbound DREQ/DREP handshake should transition QP. During release, when receiving a disconnect request from remote peer instead of a disconnect call from the client, the QP didn't get properly set in ERR state and didn't flush the queue during disconnect processing. Signed-off-by: Arlin Davis commit 87965cd15bbfa38b00ed2d77a4ea5a76f76cf4a3 Author: Arlin Davis Date: Mon Nov 2 08:24:53 2009 -0800 winof: Remove duplicate include of comp_channel.cpp from cm.c as it is included in opensm_ucb/device.c. Signed-off-by: stan smith commit 737fa288b72fad19a1fc3e762eb9f2c471ce6ddd Author: Arlin Davis Date: Fri Oct 30 13:19:21 2009 -0800 Release 2.0.24 Signed-off-by: Arlin Davis commit 9fe7506ff9ddf1ae6297cfc6a9dd4d6a57e1939e Author: Arlin Davis Date: Fri Oct 30 12:57:22 2009 -0800 winof: Utilize WinOF version of inet_ntop() for Windows OSes which do not support inet_ntop(). Signed-off-by: stan smith commit d56c645a2bf234e9e0cf215b112c2aa9d5e01945 Author: Arlin Davis Date: Fri Oct 30 07:17:26 2009 -0800 ucm: windows build issue with new CQ completion channel Signed-off-by: Arlin Davis commit 2d2e7e1e185c08542ee31b0e77561a1eeb4bde6c Author: Arlin Davis Date: Fri Oct 30 06:35:33 2009 -0800 winof: add ucm provider to windows build Signed-off-by: Arlin Davis commit 94b2206093607214e0a9709651460692e8196e1c Author: Arlin Davis Date: Fri Oct 30 06:32:56 2009 -0800 winof: add missing build files for ibal, scm Signed-off-by: Arlin Davis commit 66b76d7a8035b9164b69781d7630a0c77ce1bb5a Author: Arlin Davis Date: Wed Oct 28 09:52:50 2009 -0800 scm: connection peer resets under heavy load, incorrect event on error Under heavy load, we get a peer reset from the remote stack. In this case retry the socket connection for this QP setup. Add debugging with PID's and socket ports to help isolate these types of socket scaling issues. Report correct UD event during error, check remote_ah creation. Fix dapl_poll return codes for single event type only. Signed-off-by: Arlin Davis commit f8108a9bda0200355107fdd6c43cb5885f47d648 Author: Arlin Davis Date: Wed Oct 28 09:47:37 2009 -0800 ucm: increase default reply and rtu timeout values. Signed-off-by: Arlin Davis commit 9c13d0d01c78eeb5071e802fbb53811cdb377059 Author: Arlin Davis Date: Wed Oct 28 07:48:20 2009 -0800 ucm: change some debug message levels and add check for valid UD REPLY during retries. Signed-off-by: Arlin Davis commit 1c404bb3dcc0a45e21ef3aa973d59714413beae0 Author: Arlin Davis Date: Tue Oct 27 10:37:45 2009 -0800 ucm: increase timers during subsequent retries check/process create_ah errors during connect phase cleanup some debug messaging. Signed-off-by: Arlin Davis commit cd8c48586f53e846de4fbe10994b73ba457f6406 Author: Arlin Davis Date: Mon Oct 19 10:38:36 2009 -0700 ucm, scm: address handles need destroyed when freeing Endpoints with UD QP's. Signed-off-by: Arlin Davis commit ce19f5744c0dd9461c09d999b309e8f0e2242767 Author: Arlin Davis Date: Fri Oct 16 14:42:00 2009 -0700 openib_common: ignore pd free errors, clear pd_handle and return. some older adapters have some issues with pd free so just clear handle and return Signed-off-by: Arlin Davis commit 81f5ac17d9039e2edcd8324f7d5ed5f66fcff9f2 Author: Arlin Davis Date: Fri Oct 16 08:52:21 2009 -0700 ucm: using UD type QP's, ucm reports wrong reject event when user rejects AH resolution request. During rejects, both usr and ucm internal, the qp_type does not get initialized so the check for UD type QP messages fail on active side and the wrong event gets generated. Initialize saddr.ib information before sending reject back to active side. Signed-off-by: Arlin Davis commit f0214e5a7a81a68819d308cb921eb75f5246207d Author: Arlin Davis Date: Fri Oct 16 07:57:25 2009 -0700 ucm, scm, cma: Fix CNO support on DTO type EVD's EVD wait_object should be used for CNO processing and not the direct CQ event channels. Add proper checking for DTO type EVD's with CNO at wait and wakeup. UCM missing support for collective EVD's under a CNO. Add support to create common channel for collective EVD's during device open. Add support in cm_thread to check this channel. Also, during disconnect, move QP to error to properly flush queue instead of moving to reset and init. Signed-off-by: Arlin Davis commit 960950a7d9f5437dd831bd56ca2ad0c06cb4e324 Author: Arlin Davis Date: Thu Oct 15 09:19:45 2009 -0700 ucm: fix lock init bug in ucm_cm_find the lock should be setup as pointer to lock not lock structure. Cleanup lock and list in cm_find function and cm_print function. Add debug aid by passing process id in msg resv area. cleanup cr references and change to cm for consistency. Signed-off-by: Arlin Davis commit f86fec772f2d82eaf60228d288b295e0b7b86c59 Author: Arlin Davis Date: Wed Oct 14 10:03:47 2009 -0700 ucm: fix build problem with latest windows ucm changes define dapls_thread_signal as inline Signed-off-by: Arlin Davis commit 87b6c8ba92f3063a35d49bdb49d6cd0a5100a36c Author: Sean Hefty Date: Wed Oct 14 09:34:22 2009 -0700 Signed-off-by: Sean Hefty commit 9fdd8d74f2cba83e9cf513256933f5241495c1da Author: Sean Hefty Date: Wed Oct 14 09:34:18 2009 -0700 The HCA should not be closed until all resources have been released. This results in a hang on windows, since closing the device frees the event processing thread. Signed-off-by: Sean Hefty commit f9833db469f2d686842bb1d52d1ea53b74fa72a8 Author: Sean Hefty Date: Wed Oct 14 09:34:13 2009 -0700 Fix build warning when compiling on 32-bit systems. Signed-off-by: Sean Hefty commit c80515bd4b1bd11a125dc17e3f7db44240ee1fff Author: Sean Hefty Date: Wed Oct 14 09:34:07 2009 -0700 Trying to deregister the same memory region twice leads to an application crash on windows. Signed-off-by: Sean Hefty commit 6aa2c0d901daa9cfca7e771c1df2ead074d230bd Author: Arlin Davis Date: Wed Oct 14 07:59:23 2009 -0700 dat: reduce debug message level when parsing for location of dat.conf Don't output failover to default /etc/dat.conf from sysconfdir at ERROR level. Reduce to DAT_OS_DBG_TYPE_SR. Signed-off-by: Arlin Davis commit e4038e078747201b57203f16ba793b7fc22c12f2 Author: Arlin Davis Date: Thu Oct 8 16:23:22 2009 -0700 ucm: update ucm provider for windows environment add dapls_thread_signal abstraction and a new cm_thread function specific for windows. Signed-off-by: Sean Hefty Signed-off-by: Arlin Davis commit d80ce42390eb57b9c4f816b4df063f90bd5699bc Author: Arlin Davis Date: Thu Oct 8 16:02:52 2009 -0700 ucm: add timer/retry CM logic to the ucm provider add reply, rtu and retry count options via environment variables. Times in msecs. DAPL_UCM_RETRY 10 DAPL_UCM_REP_TIME 400 DAPL_UCM_RTU_TIME 200 Add RTU_PENDING and DISC_RECV states Add check timer code to the cm_thread and the option to the select abstaction to take timeout values in msecs. DREQ, REQ, and REPLY will all be timed and retried. Split out reply code and disconnect_final code to better facilitate retry timers. Add checking for duplicate messages. Added new UD extension events for errors. DAT_IB_UD_CONNECTION_REJECT_EVENT DAT_IB_UD_CONNECTION_ERROR_EVENT Signed-off-by: Arlin Davis commit 1186bfc949f4bb7278c30c2c59b7fcb6d5142638 Author: Arlin Davis Date: Fri Oct 2 14:49:52 2009 -0700 Release 2.0.23 Signed-off-by: Arlin Davis commit a5f1220cfd96983c9c89a595d80fab7ddcb1a954 Author: Arlin Davis Date: Fri Oct 2 14:48:15 2009 -0700 cma: cannot reuse the cm_id and qp for new connection, must reallocate a new one. When merging common code base the dapls_ib_reinit_ep mistakely modified QP to reset then init for all providers. Will not work for rdma_cm (cma provider) since the cm_id cannot be reused. Add build check for _OPENIB_CMA_ to pull in correct free and reallocate method for reinit_ep. Signed-off-by: Arlin Davis commit 7b07435495de0938e59be064fe8642cfd739f1ac Author: Arlin Davis Date: Fri Oct 2 13:50:12 2009 -0700 scm, cma: update DAPL cm protocol revision with latest address/port changes CM protocol changed, roll revision to 6. The socket cm could be competing with address space if application is using sockets above to exchange information like dapltest, and MPI consumers. Adjust port on listen and connect to reduce the chance of port collision with application above. Signed-off-by: Arlin Davis commit 9cc1e76b672f7ff1231b4d113bd4dd1a016d1410 Author: Arlin Davis Date: Fri Oct 2 12:47:37 2009 -0700 ucm: modify IB address format to align better with sockaddr_in6 Restructure the dcm_addr union to map the IB side closer to sockaddr6 and initialize family to AF_INET6 to insure callee allocates enough memory for ucm dat_ia_address type. Put qpn in flowinfo and gid in sin6_addr. Change the test suites to print address information based on AF_INET or AF_INET6 instead of using specific IB address union from the provider. Signed-off-by: Arlin Davis commit f50dbe6e82bd471845adf27829b2e07234a0a86a Author: Sean Hefty Date: Wed Sep 30 14:29:03 2009 -0700 Add definition for getpid similar to that used by the other dtest apps. Signed-off-by: Sean Hefty commit 51147412fad72c00115b595955760e80ff0be7d5 Author: Sean Hefty Date: Wed Sep 30 14:28:57 2009 -0700 WinOF provides a common implementation of gettimeofday that should be used instead. Signed-off-by: Sean Hefty commit 732fc84cee036126282715ea157bdb619fc11ec7 Author: Sean Hefty Date: Wed Sep 30 14:27:50 2009 -0700 The completion manager was updated to provide an abstraction that better mimicked how fd's were used. Update dapl to use this abstraction, rather than the older completion manager api. This helps minimize changes between linux and windows. Signed-off-by: Sean Hefty commit fc1855b7738838d3865389405f017b87d223f743 Author: Arlin Davis Date: Wed Sep 30 14:26:47 2009 -0700 dtestcm: remove IB verb definitions Remove gid and qp_type references from test app. Print address infomation in sockaddr and ucm provider format with qpn and lid. Signed-off-by: Arlin Davis commit 36a885d4267be7b3c6c1086372d321121ae03dee Author: Arlin Davis Date: Wed Sep 30 10:44:14 2009 -0700 dtest, dtestx: remove IB verb definitions remove gid and qp_type checking from test suite. Print address infomation in sockaddr and ucm provider format with qpn and lid. Signed-off-by: Arlin Davis commit 23445bbbd3a09f7f5e666a000d5c7c3b22dd95b3 Author: Arlin Davis Date: Mon Sep 28 10:59:36 2009 -0700 scm: tighten up socket options to insure similiar behavior on Windows and Linux. Add IPPROTO_TCP to create socket. Specify device IP address when binding instead of INADDR_ANY and remove setsocketopt REUSEADDR on the listen socket to avoid any issues with portability. Don't want duplicate port bindings. Signed-off-by: Arlin Davis commit b31b64d60abe7c6c1a83484db97176d225076b30 Author: Arlin Davis Date: Mon Sep 28 10:46:26 2009 -0700 cma: improve serialization of destroy and event processing WinOF testing with slightly different scheduler and verbs showed some issues with cleanup. Add better protection around destroy and event processing thread. Remove destroy flag and add refs counting to conn objects to block destroy until all references are cleared. Add locking aroung ref counting and passive and active event processing. Signed-off-by: Arlin Davis commit a4adf463695ba75beaa1fe79d514346bf5fe2cb5 Author: Arlin Davis Date: Mon Sep 28 10:42:52 2009 -0700 scm: improve serialization of destroy and state changes WinOF testing with slightly different scheduler and verbs showed some issues with cleanup. Add better protection around destroy and move state change before socket send to insure correct state in multi-thread environment targeting the same device on send and recv. Change DCM_RTU_PENDING to DCM_REP_PENDING and and add static definition to local routines for better readability. Signed-off-by: Arlin Davis commit 29358ccc587db55fe5f5a1b14eed9e0e31f5f02c Author: Arlin Davis Date: Thu Sep 17 08:56:06 2009 -0700 common: no cleanup/release code for timer thread dapl_set_timer() creates a thread to process timers for dat_ep_connect but provides no mechanism to destroy/exit during dapl library unload. Timers are initialized in library init code and should be released in the fini code. Add a dapl_timer_release call to the dapl_fini function to check state of timer thread and destroy before exiting. Signed-off-by: Arlin Davis commit e287ce12f5b0108ef83186aae305f25af8cdd02c Author: Arlin Davis Date: Thu Sep 17 08:53:29 2009 -0700 scm, cma: dapli_thread doesn't always get teminated on library close. DAPL doesn't actually wait for the async processing thread to exit before allowing the library to close. It will wait up to 10 seconds, which under heavy load isn't enough time. Since the thread is created by an application level thread, it will continue to run as long as the application runs. But if the application closes the library, then all library data and code is invalid, which can result in the thread running something that's not library code and accessing freed memory. With this change, I was able to run mpi ping-pong, 16 ranks on a single system (scm provider) without crashes 1300 times. Signed-off-by: Sean Hefty commit 5bffe521c6ad7a5ce10457a5d7b25814522a0cde Author: Arlin Davis Date: Wed Sep 9 13:10:35 2009 -0700 ucm: tighten up locking with CM processing, state changes tighten up locking on CM processing and state changes and reduce the send completion threshold to 50 from 100 to replenish the request message faster. Signed-off-by: Arlin Davis commit e38daa8448bc3b73c53e54ffc9ac47b9cfc2af89 Author: Arlin Davis Date: Wed Sep 9 09:44:03 2009 -0700 ucm: For UD type QP's, return CR p_data with CONN_EST event on passive side. Intel MPI uses the p_data provided with CONN_EST as a reference to the UD pair and remote rank. The ucm provider was overwriting the CR p_data with the ACCEPT p_data. Change to save CR p_data but also provide storage for user provided ACCEPT p_data in case the REPLY is lost and needs retransmitted. p_data size was provided to event processing in network order instead of host order. For new QP's create new address handles and do not use existing AH's created for the CM. Different PD's are associated with each. Signed-off-by: Arlin Davis commit 0bc6a0954bc1a1a61e1b1cbc5c280f69ed168453 Author: Arlin Davis Date: Tue Sep 8 09:14:46 2009 -0700 ucm: cleanup extra cr/lf Signed-off-by: Arlin Davis commit 6e7df65a884b4e068135e64dcb3ec660f4c7ab14 Author: Arlin Davis Date: Tue Sep 8 09:11:37 2009 -0700 ucm: fix issues with UD QP's. private data size not in host order when processing connection events. ud extentions event should include original ia_addr and qpn used during connection and not the IB qpn. ucm QP service resource cleanup in wrong order. cleanup extra cr/lf device.c Signed-off-by: Arlin Davis commit e7c3090945c13f80abb929643fc975465afeeb53 Author: Arlin Davis Date: Thu Sep 3 10:45:56 2009 -0700 winof: Convert windows version of dapl and dat libaries to use private heaps. This allows for better support of memory registration caching by upper level libaries (MPI) that use SecureMemoryCacheCallback. It also makes it easier to debug heap corruption issues. Signed-off-by: Sean Hefty commit bc3c8a34558880c8d09a03e3eb7c3f50d7762c67 Author: Arlin Davis Date: Wed Sep 2 14:01:51 2009 -0700 dtest, dtestx: modifications for UD QP testing with ucm provider. remote_addr is wrong for IP remote address. The dtestx requires the server connect back to the client for the UD test. With the ucm provider you need to provide the QPN and the LID which you cannot get until the dtest client starts. So, for now, don't support UD testing on UCM providers. Signed-off-by: Arlin Davis commit e4555143ca71ebe18d8c9f027e2e7a5282088a30 Author: Arlin Davis Date: Wed Sep 2 13:54:59 2009 -0700 scm, ucm: UD QP support was broken when porting to common openib code base. create remote_ah was moved out of modify_qp_state function but not included in the RTU and ACCEPT code for UD QP's. qp type check should be on daddr not saddr in ucm cm code. QP number must be converted to host order before supplying remote_ah, and qp number to consumer. Modify QP state to RTR for UD QP mask setting incorrect. Signed-off-by: Arlin Davis commit 375d368494bb2f9bb44c82073abc60e01ac28615 Author: Arlin Davis Date: Tue Sep 1 13:02:24 2009 -0700 cma: cleanup warning with unused local variable, ret, in disconnect Signed-off-by: Arlin Davis commit 72d1c0c984919809ecd94b2e4ede31ec56668518 Author: Arlin Davis Date: Tue Sep 1 12:36:31 2009 -0700 cma: remove debug message after rdma_disconnect failure DAPL automatically calls rdma_disconnect() when a disconnect request is received. If the user also calls disconnect, that calls rdma_disconnect() as well, but the connection has already been disconnected by DAPL and is no longer valid. The result is that the user's call to rdma_disconnect() will fail. Do not display an error message if this occurs. Locking could be added to prevent calling rdma_disconnect() multiple times, but since the librdmacm provides synchronization to trap this, we might as well take advantage of it. Signed-off-by: Sean Hefty commit 290c568030da6df398a4afb932b5d4f9bd585c26 Author: Arlin Davis Date: Tue Sep 1 12:27:43 2009 -0700 scm: socket errno check needs O/S dependent wrapper Intel MPI checks the uDAPL error code when calling dat_psp_create() to see if the port number that it provides is in use or not. Convert winsock error codes to unix errno values. This fixes the following error reported by Intel MPI: 'DAPL provider is not found and fallback device is not enabled' Signed-off-by: Sean Hefty commit 03b6d1b58ae03058a509c54ffe27147cc44d1851 Author: Arlin Davis Date: Tue Sep 1 12:13:16 2009 -0700 dapltest: update script files for WinOF Cleanup 64-bit paths now that WinOF is always installed into '\Program Files\WinOF'. Signed-off-by: Arlin Davis commit e38585be89e9fa8f139002a3fe1a82eb86438f93 Author: Arlin Davis Date: Tue Sep 1 12:10:21 2009 -0700 cma: conditional check for new rdma_cm definition. RDMA_CM_EVENT_TIMEWAIT_EXIT is new to OFED 1.4 add conditional check so dapl can build and run against older OFED 1.3 stacks Signed-off-by: Arlin Davis commit 83af586b77aa905b63de6dd6010cd60e91487a9e Author: Arlin Davis Date: Thu Aug 20 09:13:43 2009 -0700 Release 2.0.22 Signed-off-by: Arlin Davis commit 48bc0dc95093ccbfe5e01cef4877c128e2caaf77 Author: Arlin Davis Date: Thu Aug 20 09:12:47 2009 -0700 dapltest: add mdep processor yield and use with dapltest Be thread scheduler friendly and release the current thread thus allowing other threads to run. Signed off by Stan Smith stan.smith@intel.com commit e13f255a06b9d2a2ed4eec9a62f9fe105d0c26d7 Author: Arlin Davis Date: Tue Aug 18 10:15:15 2009 -0700 ucm: Add new provider using a DAPL based IB-UD cm mechanism for MPI implementations. New provider uses it's own CM protocol on top of IB-UD queue pairs. During device open, this provider creates a UD queue pair and returns local address information via dat_ia_query. This 24 byte opaque address must be exchange out-of-band before connecting to a server via dat_ep_connect. This provider is targeted for MPI implementations that already exchange address information during mpi_init phase. Future release may provide some ARP mechanism via multicast. dtest, dtestx, and dtestcm was modified to report the lid and qpn information on the server side so you can provide appropriate destination address information for the client test suite. dapltest will not work with this provider. Signed-off-by: Arlin Davis commit 38d224dd95896c7e60f0bc0ffa52b26ab78f489b Author: Arlin Davis Date: Tue Aug 4 20:54:12 2009 -0700 Release 2.0.21 Signed-off-by: Arlin Davis commit ed4999a26043c9c3c73c792b21d24ced1df1553c Author: Arlin Davis Date: Tue Aug 4 20:49:09 2009 -0700 scm: Fix disconnect. QP's need to move to ERROR state in order to flush work requests and notify consumer. Moving to RESET removed all requests but did not notify consumer. Signed-off-by: Arlin Davis commit 512f1d7a480f06a1fa491d21870e560ad111c4d0 Author: Arlin Davis Date: Tue Aug 4 20:48:03 2009 -0700 modify dtest.c to cleanup CNO wait code and consolidate into collect_event() call. After waking up from CNO wait the consumer must check all EVD's. The EVD's under the CNO could be dropped if already triggered or could come in any order. DT_RetToString changed to DT_RetToStr and DT_EventToSTr changed to DT_EventToStr for consistency. Signed-off-by: Arlin Davis commit 024e36975d37a1556bf68145e1573f637d269bfc Author: Arlin Davis Date: Tue Aug 4 20:47:17 2009 -0700 CNO events, once triggered will not be returned during the cno wait. Check for triggered state before going to sleep in cno_wait. Reset triggered EVD reference after reporting. Signed-off-by: Arlin Davis commit 6d6c72a49158d10825929111d6b4df1c6d2bb589 Author: Arlin Davis Date: Sun Aug 2 14:21:09 2009 -0700 CNO support broken in both CMA and SCM providers. CQ thread/callback mechanism was removed by mistake. Still need indirect DTO callbacks when CNO is attached to EVD's. Add CQ event channel to cma provider's thread and add to select for rdma_cm and async channels. For scm provider there is not easy way to add this channel to the select across sockets on windows. So, for portablity reasons 2 thread is started to process the ASYNC and CQ channels for events. Must disable EVD (evd_endabled=FALSE) during destroy to prevent EVD events firing for CNOs and re-arming CQ while CQ is being destroyed. Change dtest to check EVD after CNO timesout. Signed-off-by: Arlin Davis commit 6fe8bd1d8f44777211e816b72e0b2a6d22900207 Author: Arlin Davis Date: Thu Jul 30 08:02:30 2009 -0700 common osd: include winsock2.h for IPv6 definitions. Signed-off-by: Arlin Davis commit bd26383900d18962aeeff54fa59922009091ecfc Author: Arlin Davis Date: Wed Jul 29 08:02:15 2009 -0700 common osd: include w2tcpip.h for sockaddr_in6 definitions. Signed-off-by: Arlin Davis commit f25544f14554200a6714accef5f761b0269b5819 Author: Sean Hefty Date: Mon Jul 27 15:07:33 2009 -0700 DAPL introduced the concept of directly waiting on the CQ for events by adding a compile time flag and special handling in the common code. Rather than using the compile time flag and modifying the common code, let the provider implement the best way to wait for CQ events. This simplifies the code and allows the common openib providers to optimize for Linux and Windows platforms independently, rather than assuming a specific implementation for signaling events. Signed-off-by: Sean Hefty commit 1548405a377d2bd17938df69419e9bcf3364d91a Author: Arlin Davis Date: Thu Jul 16 12:41:22 2009 -0700 dapltest: Implement a malloc() threshold for the completion reaping. change byte vector allocation to stack in functions: DT_handle_send_op, DT_handle_rdma_op & DT_handle_recv_op. When allocation size is under the threshold, use a stack local allocation instead of malloc/free. Move redundant bzero() to be called only in the case of using local stack allocation as DT_Mdep_malloc() already does a bzero(). Consolidate error handling return and free()check to a single point by using goto. Signed-off-by: Stan Smith commit f6311ca7295230bf9efbcddc639fa8e1065b1f3d Author: Arlin Davis Date: Thu Jul 16 12:32:09 2009 -0700 scm: handle connected state when freeing CM objects The QP could be freed before being disconnected so the provider needs process disconnect before freeing the CM object. The disconnect clean will finish the destroy process during the disc callback. Signed-off-by: Arlin Davis commit 4387359106ce398b29847982883016f7fd48b372 Author: Arlin Davis Date: Wed Jul 8 12:49:43 2009 -0700 scm, dtest: changes for winof gettimeofday and FD_SETSIZE settings. scm changes to set FD_SETSIZE with expected value and prevent windows override. dtest: remove gettimeofday implementation for windows specific implemenation etc\user\gtod.c general EOL cleanup Signed-off-by: Arlin Davis commit 3542a83d8a31f5ac68adf3aa44e3ebf1265068df Author: Arlin Davis Date: Mon Jul 6 09:24:07 2009 -0700 scm: set TCP_NODELAY sockopt on the server side for sends. scm provider sends small messages from both server and client sides. Set NODELAY on both sides to avoid send delays either way. Signed-off-by: Arlin Davis commit 9d591180392856935b9c3befbab2243dd8daf628 Author: Arlin Davis Date: Thu Jul 2 14:16:52 2009 -0700 windows: remove obsolete files in dapl/udapl source tree SOURCES,makefile,udapl.r,udapl_exports.src,udapl_sources.c Signed-off-by: Arlin Davis commit 85c238ee0a41dd0a4a24b3d422f34674b0183161 Author: Arlin Davis Date: Thu Jul 2 14:11:20 2009 -0700 dtestcm: add UD type QP option to test Add -u for UD type QP's during connection setup. Will setup UD QPs and provide remote AH in connect establishment event. Measures setup/exchange rates. Signed-off-by: Arlin Davis commit 89a2211526e37b1db58fc0ea663b330bc19125c8 Author: Arlin Davis Date: Thu Jul 2 14:07:36 2009 -0700 scm: destroy QP called before disconnect Handle the case where QP is destroyed before disconnect processing. Windows supports reinit_qp during a disconnect call by destroying the QP and recreating the QO instead of state change from reset to init. Call disconnect in destroy CM code to handle this unexpected state. Signed-off-by: Arlin Davis commit 6eb35b7d69a896c256b1031337d3353575cd07b4 Author: Arlin Davis Date: Thu Jul 2 14:03:12 2009 -0700 cma: add support for rdma_cm TIME_WAIT event. Nothing to process, simply ack the event. Signed-off-by: Arlin Davis commit b6c56b3052ecd3e36c32092ee62ff0c724da5ad4 Author: Arlin Davis Date: Wed Jul 1 07:58:32 2009 -0700 scm: remove old udapl_scm code replaced by openib_scm. Signed-off-by: Arlin Davis commit 5bbae42a56e1cca678d590ac4c841dd61e839d74 Author: Arlin Davis Date: Wed Jul 1 07:53:18 2009 -0700 winof: fix build issues after consolidating cma, scm code base. Signed-off-by: Arlin Davis commit 6bd1d931c4d0d4cbafac383f225140120aee4c51 Author: Arlin Davis Date: Wed Jul 1 07:51:59 2009 -0700 cma: lock held when exiting as a result of a rdma_create_event_channel failure. Signed-off-by: Arlin Davis commit b8a14ff1cc257defa2f74373d143600f5f471823 Author: Sean Hefty Date: Mon Jun 29 12:34:54 2009 -0700 windows: all dlist functions have been moved to the header file. remove references to dlist.c Signed-off-by: Sean Hefty commit 1a081a0a467e4773a641e8edc876a7a4d7a30ca8 Author: Arlin Davis Date: Mon Jun 29 12:13:48 2009 -0700 dtestcm windows: add build infrastructure for new dtestcm test suite Signed-off-by: Arlin Davis commit c37d7a25dca97011ea76e2a541f936d10ca658e0 Author: Arlin Davis Date: Mon Jun 29 08:57:46 2009 -0700 openib_common: reorganize provider code base to share common mem, cq, qp, dto functions add new openib_common directory with cq, qp, util, dto, mem function calls and definitions. This basically leaves the unique CM and Device definitions and functions to the individual providers directory of openib_scm and openib_cma. modifications to dapl_cr_accept required. ep->cm_handle is allocated and managed entirely in provider so dapl common code should not update ep_handle->cm_handle from the cr->cm_handle automatically. The provider should determine which cm_handle is required for the accept. openib_cma defines _OPENIB_CMA_ and openib_scm defines _OPENIB_SCM_ for provider specific build needs in common code. commit 961a4083ffb646c070137abd33e9ba2ea9482685 Author: Arlin Davis Date: Fri Jun 26 14:45:34 2009 -0700 scm: fixes and optimizations for connection scaling Prioritize accepts on listen ports via FD_READ process the accepts ahead of other work to avoid socket half_connection (SYN_RECV) stalls. Fix dapl_poll to return DAPL_FD_ERROR on all event error types. Add new state for socket released, but CR not yet destroyed. This enables scm to release the socket resources immediately after exchanging all QP information. Also, add state to str call. Only add the CR reference to the EP if it is RC type. UD has multiple CR's per EP so when a UD EP disconnect_clean was called, from a timeout, it destroyed the wrong CR. Signed-off-by: Arlin Davis commit a60a9e1fce5588cb23f41391b48acf04edd82499 Author: Arlin Davis Date: Fri Jun 26 14:31:19 2009 -0700 scm: double the default fd_set_size Signed-off-by: Arlin Davis commit 17d5e1692db4ae1eb09aa919d5607f22851d7ec5 Author: Arlin Davis Date: Fri Jun 26 14:28:30 2009 -0700 scm: EP reference in CR should be cleared during ep_destroy The EP reference in the CR should be set to null during the EP free call to insure no further reference back to a mem freed EP. Signed-off-by: Arlin Davis commit ebb820364cec9d72285c005a0874e7d459a9ff7d Author: Arlin Davis Date: Fri Jun 26 14:23:35 2009 -0700 dtestx: fix conn establishment event checking not catching error cases on client side when checking for event number and UD type && should have been || Signed-off-by: Arlin Davis commit 747b793898042e3011fbad4b2d1285d2c040cb13 Author: Arlin Davis Date: Fri Jun 26 14:18:37 2009 -0700 dtestcm: new test to measure dapl connection rates. new test suite added to measure connection rates of providers. Used to compare cma, scm, and other providers under development. dtestcm USAGE s: server c: connections (default = 1000) b: burst rate of conn_reqs (default = 100) m: multi-listens (set to burst setting ) v: verbose w: wait on event (default, polling) d: delay before accept h: hostname/address of server, specified on client P: provider name (default = OpenIB-v2-ib0) Signed-off-by: Arlin Davis commit d58fbc3a870a060ead882e1d15c6d245cdf39096 Author: Arlin Davis Date: Fri Jun 19 20:59:16 2009 -0700 Release 2.0.20 Signed-off-by: Arlin Davis commit beebe0066b47d7bf476925ff280bad2a3db38324 Author: Arlin Davis Date: Fri Jun 19 20:52:51 2009 -0700 common,scm: add debug capabilities to print in-process CM lists Add a new debug bit DAPL_DBG_TYPE_CM_LIST. If set, the pending CM requests will be dumped when dat_print_counters is called. Only provided when built with -DDAPL_COUNTERS Add new dapl_cm_state_str() call for state to string conversion for debug prints. Signed-off-by: Arlin Davis commit b1c51f1e68993d9306e3ebd48bd3a1f0e9878fa3 Author: Arlin Davis Date: Tue Jun 16 09:22:31 2009 -0700 scm: disconnect EP before cleaning up orphaned CR's during dat_ep_free There is the possibility of dat_ep_free being called with RC CR's still in connected state. Call disconnect on the CR before marking for destroy. Signed-off-by: Arlin Davis commit 531d223455a88c885d6c5f7b1d7e158c1079fbce Author: Arlin Davis Date: Wed Jun 10 12:05:17 2009 -0700 dapltest: windows scripts updated Support added for provider specification and general simplification of internal workings. Signed-off-by: Stan Smith commit 049d1ea08643d4c4eff761741641d37bb3f01fc1 Author: Arlin Davis Date: Wed Jun 10 09:18:09 2009 -0700 scm: private data is not handled properly via CR rejects. For both RC and UD connect requests, the private data is not being received on socket and passed back via the active side REJECT event. UD requires new extended reject event type of DAT_IB_UD_CONNECTION_REJECT_EVENT to distiquish between RC and UD type rejects. cr_thread exit/cleanup processing fixed to insure all items are off the list before exiting. Signed-off-by: Arlin Davis commit 3c26870e276a934e2009090e0fca8bdc36c1be67 Author: Arlin Davis Date: Wed Jun 10 09:09:56 2009 -0700 scm: cleanup orphaned UD CR's when destroying the EP UD CR objects are kept active because of direct private data references from CONN events. The cr->socket is closed and marked inactive but the object remains allocated and queued on the CR resource list. There can be multiple CR's associated with a given EP and there is no way to determine when consumer is finished with event until the dat_ep_free. Schedule destruction for all CR's associated with this EP during free call. cr_thread will complete cleanup with state of SCM_DESTROY. Signed-off-by: Arlin Davis commit 73abd3f58fa7b14241fad98912ef27c7b4fdb47e Author: Arlin Davis Date: Wed Jun 10 09:05:32 2009 -0700 scm: provider specific query for default UD MTU is wrong. Change the provider specific query DAT_IB_TRANSPORT_MTU to report 2048 for new default MTU size. Signed-off-by: Arlin Davis commit 27c0d7edc4c931b808a7c5a24bd5aa2625b48aa1 Author: Arlin Davis Date: Wed Jun 10 10:06:59 2009 -0700 scm: update CM code to shutdown before closing socket data could be lost without calling shutdown on the socket before closing. Update to shutdown and then close. Add definition for SHUT_RW to SD_BOTH for windows. Signed-off-by: Arlin Davis --- commit 536ec3103c15c1fed4367326c9117660345e0eab Author: Arlin Davis Date: Thu Jun 4 13:48:18 2009 -0700 dapltest: windows script dt-cli.bat updated scn should be scm Signed-off-by: Arlin Davis commit e8991b8f0877b0e2e857717e1140c679e9266abe Author: Sean Hefty Date: Thu Jun 4 08:19:12 2009 -0700 dapl/windows cma provider: add support for network devices based on index The linux cma provider provides support for named network devices, such as 'ib0' or 'eth0'. This allows the same dapl configuration file to be used easily across a cluster. To allow similar support on Windows, allow users to specify the device name 'rdma_devN' in the dapl.conf file. The given index, N, is map to a corresponding IP address that is associated with an RDMA device. Signed-off-by: Sean Hefty commit 79fa3e7d241f740bc886dd075f24fcbc611306de Author: Arlin Davis Date: Thu Jun 4 08:00:29 2009 -0700 openib: remove 1st gen provider, replaced with openib_cma and openib_scm Signed-off-by: Arlin Davis commit 624039247cdc0db7aa040dfbb4dced00f2cf9006 Author: Arlin Davis Date: Fri May 29 08:21:10 2009 -0700 dapltest: update windows script files Enhancement to take DAPL provider name as cmd-line arguement. Signed-off-by: Arlin Davis commit b93baa07b7bbaeb7a55fa817c354d0c94783d61f Author: Arlin Davis Date: Thu May 28 15:30:05 2009 -0700 dapltest: update windows batch files in sripts directory Signed-off-by: Arlin Davis commit 2f185c6b5e464c4fc9e84ad3e90cc2b86aebf9aa Author: Arlin Davis Date: Mon May 18 14:00:02 2009 -0700 windows_osd/linux_osd: new dapl_os_gettid macro to return thread id Change dapl_os_getpid inline to macro on windows and add dapl_os_gettid macros on linux and windows to return thread id. Signed-off-by: Arlin Davis commit 984303824cd0c3e248a789066cf665ced8e1ae5b Author: Arlin Davis Date: Mon May 18 13:53:59 2009 -0700 windows: missing build files for common and udapl sub-directories Add dapl/dapl_common_src.c and dapl/dapl_udapl_src.c Signed-off-by: Arlin Davis commit 3be4ccf9681a975e74a5aa05e3f7912477f342a7 Author: Arlin Davis Date: Mon May 18 09:06:19 2009 -0700 windows: add build files for openib_scm, remove /Wp64 build option. Add build files for windows socket cm and change build option on windows providers. The new Win7 WDK issues a depreciated compiler option warning for /Wp64 (Enable 64-bit porting warnings) Signed-off-by: Arlin Davis commit 163112cfeb6e409886b3cb7f85da7ce003300d5c Author: Arlin Davis Date: Mon May 18 08:50:35 2009 -0700 scm: multi-hca CM processing broken. Need cr thread wakeup mechanism per HCA. Currently there is only one pipe across all device opens. This results in some posted CR work getting delayed or not processed at all. Provide pipe for each device open and cr thread created and manage on a per device level. Signed-off-by: Arlin Davis commit e6e799f623df6ef136ffc5388251d3f3a38c8a91 Author: Arlin Davis Date: Fri May 15 11:06:19 2009 -0700 dtest: add connection timers on client side Add timers for active connections and print results. Allow polling or wait on conn event. Signed-off-by: Arlin Davis commit d656bbf619123deaed6e8985e52207e5415f359f Author: Arlin Davis Date: Fri May 15 09:48:38 2009 -0700 linux_osd: use pthread_self instead of getpid for debug messages getpid provides process ids which are not unique. Use unique thread id's in debug messages to help isolate issues across many device opens with multiple CM threads. Signed-off-by: Arlin Davis commit 92bb0d2933d3d1546e18f0479475f3daf5b92052 Author: Arlin Davis Date: Fri May 1 10:18:05 2009 -0700 windows ibal-scm: dapl/dirs file needs updated to remove ibal-scm Signed-off-by: Arlin Davis commit 9c37d9d667fb7e8f21841bbec4a84b2c652fffe1 Author: Arlin Davis Date: Wed Apr 29 23:13:36 2009 -0700 Release 2.0.19 Signed-off-by: Arlin Davis commit 0ef94459e0a0175233b43b3fcbaaac2596e1042d Author: Arlin Davis Date: Wed Apr 29 14:33:28 2009 -0700 scm, cma: dat max_lmr_block_size is 32 bit, verbs max_mr_size is 64 bit mismatch of device attribute size restricts max_lmr_block_size to 32 bit value. Add check, if larger then limit to 4G-1 until DAT v2 spec changes. Consumers should use max_lmr_virtual_address for actual max registration block size until attribute interface changes. Signed-off-by: Arlin Davis commit f91f27eaaab28b13a631adf75b933b7be3afbc0f Author: Arlin Davis Date: Wed Apr 29 10:51:03 2009 -0700 scm: increase default MTU size from 1024 to 2048 Signed-off-by: Arlin Davis commit 8d6846056f4c86b6a06346147df55d37c4ba9933 Author: Arlin Davis Date: Wed Apr 29 10:49:09 2009 -0700 openib_scm, cma: use direct SGE mappings from dat_lmr_triplet to ibv_sge no need to rebuild scatter gather list given that DAT v2.0 is now aligned with verbs ibv_sge. Fix ib_send_op_type_t typedef. Signed-off-by: Arlin Davis commit c61f75b3412935e7d4a7a1acc9c495dcb4ac7e24 Author: Arlin Davis Date: Wed Apr 29 08:39:37 2009 -0700 dtest: add flush EVD call after data transfer errors Flush and print entries on async, request, and receive queues after any data transfer error. Will help identify failing operation during operations without completion events requested. Fix -B0 so burst size of 0 works. Signed-off-by: Arlin Davis commit c88a191c7a408b0fb3dfb418a77a5b3b5afc778e Author: Arlin Davis Date: Wed Apr 22 13:16:19 2009 -0700 dtest/dapltest: Cleanup code with Lindent Signed-off-by: Arlin Davis commit 8699a9f1bd2bb45b04b87f887698707ba7b62d0a Author: Arlin Davis Date: Tue Apr 21 15:51:24 2009 -0700 ibal-scm: remove, obsolete Signed-off-by: Arlin Davis commit 67ddd6bfba46f1f7a61b772257132f1257d05c96 Author: Arlin Davis Date: Tue Apr 21 15:44:15 2009 -0700 scm, cma provider: Cleanup code with Lindent Signed-off-by: Arlin Davis commit d0898091090ff19be7929fed0d14f1ca696d5e53 Author: Arlin Davis Date: Tue Apr 21 15:39:01 2009 -0700 udapl: Cleanup code with Lindent Signed-off-by: Arlin Davis commit a688d1cfb52fde256c5bfd95a27f940dd17e7ced Author: Arlin Davis Date: Tue Apr 21 15:31:20 2009 -0700 dapl common: Cleanup code with Lindent Signed-off-by: Arlin Davis commit 2bded73c7f68cfb870e432ab3ebae7427d595cbe Author: Arlin Davis Date: Tue Apr 21 12:52:29 2009 -0700 dat: Cleanup code with Lindent Signed-off-by: Arlin Davis commit 31e7b9210fc5334ff3be62558e74e3fdf01d6cbd Author: Arlin Davis Date: Mon Apr 20 12:28:08 2009 -0700 Release 2.0.18 Signed-off-by: Arlin Davis commit 29bf0a24f54c45d2742026756f31f1a1f26fb6f3 Author: Arlin Davis Date: Thu Apr 16 14:35:18 2009 -0700 dapltest: reset server listen ports to avoid collisions during long runs If server is running continuously the port number increments from base without reseting between tests. This will eventually cause collisions in port space. Signed-off-by: Arlin Davis commit c27af8de0501d132b8152ec8546023cdba212de5 Author: Sean Hefty Date: Thu Apr 16 10:21:51 2009 -0700 To avoid duplicating port numbers between different tests, the next port number to use must increment based on the number of endpoints per thread * the number of threads. Signed-off-by: Sean Hefty commit 3084310197c20aaa50abe82260fc835786f591f5 Author: Sean Hefty Date: Thu Apr 16 10:21:45 2009 -0700 dapltest assumes that events across multiple endpoints occur in a specific order. Since this is a false assumption, avoid this by directing events to per endpoint EVDs, rather than using shared EVDs. Signed-off-by: Sean Hefty commit ef87a0a462f4fa07ac252e28d3aeb44af73cc202 Author: Sean Hefty Date: Thu Apr 16 10:21:41 2009 -0700 Synchronization is missing between removing items from an EVD and queuing them. Since the removal thread is the user's, but the queuing thread is not, the synchronization must be provided by DAPL. Hold the evd lock around any calls to dapls_rbuf_*. Signed-off-by: Sean Hefty commit f5e86d28f803162ffdf94b41ec7435dec92f728d Author: Sean Hefty Date: Thu Apr 16 10:21:26 2009 -0700 Communication to the CR thread is done using an internal socket. When a new connection request is ready for processing, an object is placed on the CR list, and data is written to the internal socket. The write causes the CR thread to wake-up and process anything on its cr list. If multiple objects are placed on the CR list around the same time, then the CR thread will read in a single character, but process the entire list. This results in additional data being left on the internal socket. When the CR does a select(), it will find more data to read, read the data, but not have any real work to do. The result is that the thread spins in a loop checking for changes when none have occurred until all data on the internal socket has been read. Avoid this overhead by reading all data off the internal socket before processing the CR list. Signed-off-by: Sean Hefty commit 2ab52e9b1ab37c6eb44206c135e0568a8c2d01fa Author: Sean Hefty Date: Thu Apr 16 10:21:13 2009 -0700 The dapl connect call takes as input an address (sockaddr) and a port number as separate input parameters. It modifies the sockaddr address to set the port number before trying to connect. This leads to a situation in dapltest with multiple threads that reference the same buffer for their address, but specify different port numbers, where the different threads end up trying to connect to the same remote port. To solve this, do not modify the caller's address buffer and instead use a local buffer. This fixes an issue seen running multithreaded tests with dapltest. Signed-off-by: Sean Hefty commit 7947026ede478f08b4a7b8cb607f457765bf2afa Author: Sean Hefty Date: Thu Apr 16 10:21:03 2009 -0700 Windows socket calls should check return values against SOCKET_ERROR to determine if an error occurred. Signed-off-by: Sean Hefty commit e66e42fc44c50c8202f7c98f76d799a69aa3f1b6 Author: Arlin Davis Date: Fri Apr 10 08:33:41 2009 -0700 Build: add new file dapl/openib_cma/linux/openib_osd.h to EXTRA_DIST Fix rpmbuild problem with new cma osd include file. Signed-off-by: Arlin Davis commit acb213adb3268e9bf6999e2bf040d4a71212b701 Author: Arlin Davis Date: Fri Apr 10 08:32:24 2009 -0700 dapl scm: reduce wait time for thread startup. thread startup wait reduce to 2ms to reduce open times. Signed-off-by: Arlin Davis commit 55459699fa9c0e5fb7e2b17822f0916412c64b35 Author: Arlin Davis Date: Fri Apr 10 08:31:22 2009 -0700 dapl-scm: getsockopt optlen needs initialized to size of optval Signed-off-by: Arlin Davis commit d710c5327e05a40796341d16b45a2b098b03f588 Author: Sean Hefty Date: Fri Apr 10 08:17:32 2009 -0700 The connection request thread adds sockets to a select list unless the cr->socket is invalid and the cr request state is set to destroy. If the cr->socket is invalid, but the cr->state is not destroy, then the cr->socket is added to an FD set for select/poll. This results in select/poll returning an error when select is called. As a result, the cr thread never actually blocks during this state. Fix this by only destroying a cr based on its state being set to destroy and skip adding cr->sockets to the FD set when they are invalid. Signed-off-by: Sean Hefty commit 0be961c432f897d4f92d9a24dcb7c42ad30ea160 Author: Sean Hefty Date: Fri Apr 10 08:08:16 2009 -0700 Make sure all locks are initialized properly and don't zero their memory once they are. Signed-off-by: Sean Hefty commit 9abdc26cd6154aa55588759ba54c9ca69e3fe2b5 Author: Sean Hefty Date: Fri Apr 10 08:08:13 2009 -0700 The lock functions are defined just a few lines beneath the prototypes as inline. Remove the duplicate prototypes. Signed-off-by: Sean Hefty commit 9578c4aeb9878d98374e4b7abc02db182aef82c6 Author: Sean Hefty Date: Fri Apr 10 08:08:07 2009 -0700 Make sure all locks are initialized and don't zero out their memory once they are. Signed-off-by: Sean Hefty commit 97edcbb662b489303ef68c0da02831efaddeed91 Author: Sean Hefty Date: Fri Apr 10 08:08:03 2009 -0700 The IBAL library allocates a small number of threads for callbacks to the user. If the user blocks all of the callback threads, no additional callbacks can be invoked. The DAPL IBAL provider cancels listen requests from within an IBAL callback, then waits for a second callback to confirm that the listen has been canceled. If there is a single IBAL callback thread, or multiple listens are canceled simultaneously, then the provider can deadlock waiting for a cancel callback that never occurs. This problem is seen when running dapltest with multiple threads. Signed-off-by: Sean Hefty commit 3e56e63bcb68de352edadafdcfcc4cb222c08c7b Author: Sean Hefty Date: Fri Apr 10 08:07:57 2009 -0700 We need to check the return value from select for errors before checking the FD sets. An item may be in an FD set but select could have returned an error. Signed-off-by: Sean Hefty commit a8a977becaeefe0d7f8e01e01631a11988d2d54e Author: Sean Hefty Date: Fri Apr 10 08:07:53 2009 -0700 Signed-off-by: Sean Hefty commit ecc79cc0a1ae2bdbb3dfd19e15b3b562ac9a2957 Author: Sean Hefty Date: Fri Apr 10 08:07:49 2009 -0700 Enable building with CQ_WAIT_OBJECTS support to directly wait on CQ completion channels in the Windows version of the openib_scm provider. Also minor fixup to use DAPL_DBG_TYPE_UTIL for debug log messages instead of DAPL_DBG_TYPE_CM. Signed-off-by: Sean Hefty commit 73728763666a46df5789af93b50db53cdf64afd6 Author: Sean Hefty Date: Fri Apr 10 08:07:44 2009 -0700 The IBAL-SCM provider will run into an inifinite loop if the check for cr->socket > SCM_MAX_CONN - 1 fails. The code continues back to the start of the while loop without moving to the next connection request entry in the list. Signed-off-by: Sean Hefty commit 9b1b396539926d36ffacfff04fbe7c081e436b45 Author: Sean Hefty Date: Fri Apr 10 08:07:40 2009 -0700 next_cr is set just before and inside the check if ((cr->socket == DAPL_INVALID_SOCKET && cr->state == SCM_DESTROY) Remove setting it inside the if statement. Signed-off-by: Sean Hefty commit 7b49a9850f62276bb7bfccb2d85a1e94e311813c Author: Sean Hefty Date: Fri Apr 10 08:07:35 2009 -0700 Some errors on windows are more easily interpretted in hex than decimal. Signed-off-by: Sean Hefty commit 08ee072a1396ac2c28983878dbc6b02feb035787 Author: Sean Hefty Date: Fri Apr 10 08:07:32 2009 -0700 The WinOF HCA driver cannot handle transitioning from RTS -> RESET -> INIT -> ERROR. Simply delete the QP and re-create it to reinitialize the endpoint until the bug is fixed. Signed-off-by: Sean Hefty commit 51ef5d96ce67d6141ec02b2a318f1b6e12be1bcf Author: Sean Hefty Date: Fri Apr 10 08:07:23 2009 -0700 Signed-off-by: Sean Hefty commit a8582be0e1fc89e856f1d0b43a3c1b271295a352 Author: Sean Hefty Date: Fri Apr 10 08:07:18 2009 -0700 Convert the openib_cma provider to common code between linux and windows. Signed-off-by: Sean Hefty commit cc2a71dfe0c35a70f6b1ba66070a3a06059a8bb5 Author: Sean Hefty Date: Fri Apr 10 08:06:53 2009 -0700 Move from using pipes to sockets for internal communication. This avoids issues with windows only supporting select() on sockets. Remove windows specific definition of dapl_dbg_log. Update to latest windows libibverbs implementation using completion channel abstraction to improve windows scalability and simplify porting where FD's are accessed directly in Linux. Signed-off-by: Sean Hefty commit b3ad2ed97399a24a869841e17d1314e11c379aae Author: Arlin Davis Date: Tue Mar 31 05:41:50 2009 -0800 Release 2.0.17 Signed-off-by: Arlin Davis commit 5d732929f8a90a490994e8e35a3666c3647ad4fe Author: Arlin Davis Date: Tue Mar 31 05:22:11 2009 -0800 dapl: ia64 build problem on SuSE 11, atomic.h no longer exists. Add autotools check for SuSE 11 and include intrinsics.h Signed-off-by: Arlin Davis commit d7b8654db3a1f4ead16cb2e6d15f0902a322a188 Author: Arlin Davis Date: Mon Mar 16 13:23:50 2009 -0800 Release 2.0.16 Fix changelog year in spec file. Signed-off-by: Arlin Davis commit 08d9e26a85911f99d47cbb92ec8bccfc7f073be0 Author: Arlin Davis Date: Mon Mar 16 13:15:22 2009 -0800 Release 2.0.16 Signed-off-by: Arlin Davis commit 42c97b2a11d63ac6ba8a15fe8c82061e7da6e136 Author: Arlin Davis Date: Fri Mar 13 12:39:12 2009 -0800 uDAPL: scm provider, remove query gid/lid from connection setup phase move lid/gid queries from the connection setup phase and put them in the open call to avoid overhead of more fd's during connections. No need to query during connection setup since uDAPL binds to specific hca/ports via dat_ia_open. Signed-off-by: Arlin Davis commit 775394b73980a7bc0af018a33d2a5bb795469c78 Author: Arlin Davis Date: Thu Mar 12 12:44:43 2009 -0800 Build: missing new linux/osd include file in EXTRA_DIST Add dapl/openib_scm/linux/openib_osd.h to EXTRA_DIST Signed-off-by: Arlin Davis commit 647e288c1c9af5261495a5ed88e6ecbe1daf6d6e Author: Arlin Davis Date: Thu Mar 12 12:11:21 2009 -0800 Build: spec files missing Requires(post) statements for sed/coreutils needed for anaconda install Signed-off-by: Arlin Davis commit 1f5b3b7cab0785b64e8dab035dd4cd27111497d3 Author: Arlin Davis Date: Wed Mar 4 10:04:13 2009 -0800 dapl scm: remove unecessary thread when using direct objects A thread is created for processing events on devices without direct event objecti support. Since all openfabrics devices support direct events there is no need to start a thread. Move this under Signed-off-by: Arlin Davis commit 66e4236e2c57dbaf860b7c20809b65a4fbbafa6f Author: Arlin Davis Date: Tue Mar 3 11:08:12 2009 -0800 dtestx: add missing F64u definition for windows Signed-off-by: Arlin Davis commit d9e771da16ec2b360a222ceccbbca5d088e20ee5 Author: Arlin Davis Date: Tue Mar 3 09:25:26 2009 -0800 uDAPL common: add 64 bit counters for IA, EP, and EVD's. -DDAPL_COUNTERS to build-in counters for cma and scm providers. New extension calls in dat_ib_extensions.h for counters dat_print_counters, dat_query_counters Counters for operations, async errors, and data Update dtestx (-p) with print and query counter examples Signed-off-by: Arlin Davis commit 5e6ad3cdaa1d72523ad6b38d8306e0a2d0f1ada6 Author: Sean Hefty Date: Tue Feb 17 07:24:27 2009 -0800 Modify the openib_scm provider to support both OFED and WinOF releases. This takes advantage of having a libibverbs compatibility library. Signed-off-by: Sean Hefty commit 0425c24c3b66e672bba346a1d0946b11c7b8b11e Author: Stan Smith Date: Fri Jan 30 09:52:33 2009 -0800 Update the dapl.git tree with the latest SVN version of the ibal-scm provider. Signed-off-by: Sean Hefty commit 83543b6cca342e25fd6408454f1261ec6835a172 Author: Stan Smith Date: Fri Jan 30 09:52:25 2009 -0800 Merge SVN IBAL provider code back into the main git tree. Signed-off-by: Sean Hefty commit be0b6122d0fe4f93afc8cf3ec961702faf82fb44 Author: Sean Hefty Date: Fri Jan 30 09:52:11 2009 -0800 Changes to dtest to support building on Windows. Signed-off-by: Sean Hefty commit 9f87610c4b37e4db4d74205c14028582a2f6a79e Author: Stan Smith Date: Fri Jan 30 09:48:26 2009 -0800 Add return codes to various functions. Add script (batch file) for Windows testing. Signed-off-by: Sean Hefty commit 723067550265defdcfe6e00460a4f89f7a81fbf1 Author: Sean Hefty Date: Fri Jan 30 09:46:40 2009 -0800 Merge OFED and WinOF trees for common dapl code. Signed-off-by: Sean Hefty commit 5b37e080e1ecc6903b3ab1ac9b0d4c9f8a18b790 Author: Arlin Davis Date: Fri Jan 16 08:16:13 2009 -0800 dtest/dapltest: use $(top_builddir) for .la files during test builds Signed-off-by: Arlin Davis commit bd655d4fdd7e63e7fdeed3979926da5582f71e4b Author: Arlin Davis Date: Wed Nov 26 07:12:30 2008 -0800 Release 2.0.15 Signed-off-by: Arlin Davis commit 5d5dec42717c963d1644ee3e716459dc5d58e930 Author: Arlin Davis Date: Mon Oct 27 08:48:53 2008 -0800 dapltest: transaction test moves to cleanup stage before rdma_read processing is complete With multiple treads, the transaction server tread can move to cleanup stage and unregister memory before the remote client process has completed the rdma read. In lieu of a rewrite to add sync messages at the end of transaction test phase, just add a delay before cleanup. Signed-off-by: Arlin Davis commit 101a843e59b881bc131dfd5c2aec7e54d44f35c0 Author: Arlin Davis Date: Tue Oct 14 11:56:35 2008 -0700 Current static registration (SR) assumes DAT_OVERRIDE or /etc/dat.conf. Change SR to include sysconfdir. SR file access in the following order: - DAT_OVERRIDE - sysconfdir - /etc if DAT_OVERRIDE is set, assume administration override and do not failover to other locations. Add debug messages for each failure and retries. Signed-off-by: Arlin Davis Acked-by: Doug Ledford commit c98d2169b839a73d76691acf510dd8976ddc850a Author: Arlin Davis Date: Fri Oct 3 08:00:56 2008 -0700 Release 2.0.14 Signed-off-by: Arlin Davis commit c26d0bb065f3734f09058e1e6d26dde4a3738e55 Author: Arlin Davis Date: Fri Oct 3 05:40:04 2008 -0700 dat.conf: add ofa-v2-iwarp entry for iwarp devices Signed-off-by: Arlin Davis commit d54c35c8a9ba33a464ca15f4a65b914688e5194d Author: Arlin Davis Date: Fri Oct 3 05:30:10 2008 -0700 dapl: adjust max_rdma_read_iov to 1 for query on iWARP devices iWarp spec allows only one iov on rdma reads Signed-off-by: Arlin Davis commit 9584df22d0cb3aa5a2a2a04bf427524d17650ef7 Author: Arlin Davis Date: Wed Oct 1 08:17:49 2008 -0700 dtest: reduce default IOV's during dat_ep_create for iWARP devices iWarp adapters tend to have less IOV resources then IB adapters. Signed-off-by: Arlin Davis commit 8ca9898621acf5b9769d46ea34ee8ca1eecaf2ff Author: Arlin Davis Date: Fri Sep 26 12:43:13 2008 -0700 dtest: fix 32-bit build issues in dtest and dtestx examples. Signed-off-by: Arlin Davis commit 42a3a4edf30115a35d9d599b51f8756814e62368 Author: Arlin Davis Date: Fri Sep 26 08:48:31 2008 -0700 Revert "Release 2.0.14" This reverts commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63. missed some fixes for package release. commit 816d1c3acfb4a457c6b1cc07d657f018312f2a63 Author: Arlin Davis Date: Wed Sep 24 12:13:37 2008 -0700 Release 2.0.14 Signed-off-by: Arlin Davis commit c00d858da3113ce5463d408ab5e13e17cc9529e4 Author: Arlin Davis Date: Wed Sep 24 08:33:32 2008 -0700 build: $(DESTDIR) prepend needed on install hooks for dat.conf All install directives that automake creates automatically have $(DESTDIR) prepended to them so that a make DESTDIR= install will work. The hand written install hooks for dat.conf was missing DESTDIR. Signed-off-by: Doug Ledford commit 860db3be4907c8ff290ce7c6b631b2117f5080bd Author: Arlin Davis Date: Wed Sep 24 08:26:28 2008 -0700 dapl scm: UD shares EP's which requires serialization add locking around the modify_qp state changes to avoid unnecessary modify_qp calls during multiple resolve remote AH connection events on a single EP. Signed-off-by: Arlin Davis commit f2c214647b5ce53e52052d6b6bea3fbace7cc20a Author: Arlin Davis Date: Sat Sep 20 16:02:00 2008 -0700 dtestx: Add new options to test UD. - many to one/many EP remote AH resolution, data flow - bi-directional EP remote AH resolution, data flow Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 3c218b5ed65d0b7349a86eb0fe6f6bf57e3eccd6 Author: Arlin Davis Date: Sat Sep 20 15:58:59 2008 -0700 dapl: fixes for IB UD extensions in common code and socket cm provider. - Manage EP states base on attribute service type. - Allow multiple connections (remote_ah resolution) and accepts on UD type endpoints. - Supply private data on CR conn establishment - Add UD extension conn event type - DAT_IB_UD_PASSIVE_REMOTE_AH Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 01cdd688ddebec8df6f17f92c3b72a410f50dd6f Author: Arlin Davis Date: Sat Sep 20 15:49:40 2008 -0700 dapl: add provider specific attribute query option for IB UD MTU size Signed-off by: Arlin Davis ardavis@ichips.intel.com commit ee3d9ce2389a14c85405dfdff67f04a5f5679e32 Author: Arlin Davis Date: Mon Sep 1 15:52:37 2008 -0700 Release 2.0.13 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit f37589927fabf0feb3a09c4c7c03e18df5749fef Author: Arlin Davis Date: Mon Sep 1 12:24:49 2008 -0700 dapl build: add correct CFLAGS, set non-debug build by default for v2 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 280f3aec6d0fa9d7e36f75711471e35333ee34cf Author: Arlin Davis Date: Mon Sep 1 12:22:19 2008 -0700 dapl providers: fix compiler warnings in cma and scm providers Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 60c0589a2aba520ae67b1c8eaad5a167edb6fba3 Author: Arlin Davis Date: Mon Sep 1 12:20:08 2008 -0700 dat: fix compiler warnings in dat common code Signed-off by: Arlin Davis ardavis@ichips.intel.com commit fb3e368db07d02a3daa1d12d71f62ac4e7a5ef23 Author: Arlin Davis Date: Mon Sep 1 12:18:48 2008 -0700 dapl: fix compiler warnings in common code Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 38a53ae75bce5059a84262fe1b40eacf92b22287 Author: Arlin Davis Date: Mon Sep 1 12:16:58 2008 -0700 dtest/dapltest: fix compiler warnings Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 45900087764917b354411fdd2b3880473d553ab8 Author: Arlin Davis Date: Fri Aug 22 14:51:22 2008 -0700 dapl cma: debug message during query needs definition for inet_ntoa Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 99d46313a03af18771966cf86fcc934d179627b5 Author: Arlin Davis Date: Thu Aug 21 12:54:58 2008 -0700 Release 2.0.12 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 0b2a3fac8d28d5b3c2e1416fa696fe4cbc672f00 Author: Arlin Davis Date: Wed Aug 20 18:51:00 2008 -0700 dapl scm: fix corner case that delivers duplicate disconnect events Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 96f6822b90fa880a6c6a64b1e183064a449f7237 Author: Arlin Davis Date: Wed Aug 20 18:47:19 2008 -0700 dat: include stddef.h for NULL definition in dat_platform_specific.h Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 283e37c09ad072d69d29e28225e9a6e8bf3f75f0 Author: Arlin Davis Date: Wed Aug 20 18:27:08 2008 -0700 dapl: add debug messages during async and overflow events Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 4a7965ac07b7f2ee1deb5b144ed50b30c1749d38 Author: Arlin Davis Date: Wed Aug 20 18:24:33 2008 -0700 dapltest: add check for duplicate disconnect events in transaction test Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 7e8986f2c6496851b724a007458881c3248ac998 Author: Arlin Davis Date: Wed Aug 20 18:22:42 2008 -0700 dtestx: fix stack corruption problem with hostname strcpy Signed-off by: Arlin Davis ardavis@ichips.intel.com commit ee2a553762abd6ebede99db5d26d1ba1d74ba3cb Author: Arlin Davis Date: Thu Aug 14 09:42:57 2008 -0700 dapl scm: use correct device attribute for max_rdma_read_out, max_qp_init_rd_atom Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 142a8e4a99259fa6fe31f74ce6d0dac1017f381b Author: Arlin Davis Date: Thu Aug 14 09:19:53 2008 -0700 dapl scm: change IB RC qp inline and timer defaults. rnr nak can be the result of any operation not just message send recevier not ready. Timer is much too large given this case. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 36088a92d87e833bae535fcea0c45417dec34e65 Author: Arlin Davis Date: Thu Aug 14 09:12:38 2008 -0700 dapl scm: add mtu adjustments via environment, default = 1024. DAPL_IB_MTU adjusts path mtu setting for RC qp's. Default setting is min of 1024 and active mtu on IB device. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit a7dabdc4c1ddc62cc0384d60e8157ee829f12898 Author: Arlin Davis Date: Wed Aug 13 14:17:40 2008 -0700 dapl scm: change connect and accept to non-blocking to avoid blocking user thread. The connect socket that is used to exchange QP information is now non-blocking and the data exchange is done via the cr thread. New state RTU_PENDING added. On the passive side there is a new state ACCEPT_DATA used to avoid read blocking on the user accept call. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 7e25c0f21d755cce3aa7aff993fb0baddaafc0e8 Author: Arlin Davis Date: Tue Jul 29 08:18:25 2008 -0700 dapl scm: update max_rdma_read_iov, max_rdma_write_iov EP attributes during query Signed-off by: Arlin Davis ardavis@ichips.intel.com commit fd9909618fdfff0eb2c8ce97bff61ea98ec44a8e Author: Arlin Davis Date: Sun Jul 20 13:20:45 2008 -0700 Release 2.0.11 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 0003bb7866af3ba73cc79c703b565a8012439bb1 Author: Arlin Davis Date: Sun Jul 20 13:17:22 2008 -0700 dtestx: add -d option to test new IB UD extension. modify dtestx to connect peer UD QP's and exchange/verify messages as an example for new extension. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 9816ac15f98f6e73cf7b371ac6e1e312d4171c0b Author: Arlin Davis Date: Sun Jul 20 13:13:09 2008 -0700 dapl scm: add support for UD extensions in Openfabrics socket cm provider add qp_type in connection information exchange add new post_send_ud call changes to connection manager to support qp types beyond RC. changes to connection events to use new extended event calls. exchange address handle information during connection phase. changes to modify_qp to handle both RC and UD types. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 927dac5b61e64868089acd49d468b98327e14a1a Author: Arlin Davis Date: Sun Jul 20 13:07:34 2008 -0700 dapl: add support for UD extensions in common code. allow EP create for extended service types. extend connection event types to include UD AH resolution/exchange. add new extended connect and connect request upcalls for providers. - dapls_evd_post_cr_event_ext - dapls_evd_post_connection_event_ext Signed-off by: Arlin Davis ardavis@ichips.intel.com commit be3d6a53f3340294697706ce50a05faf151aacc7 Author: Arlin Davis Date: Sun Jul 20 12:57:49 2008 -0700 dat: New definitions for IB unreliable datagram extension Extend EP dat_service_type, with DAT_IB_SERVICE_TYPE_UD Add IB extension call dat_ib_post_send_ud(). Add address handle definition for UD calls. Add IB event definitions to provide remote AH via connect and connect requests Roll IB extension version to 2.0.2 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 8f65d4c96a7e13f7092d82f2f5aad477a61a57c1 Author: Arlin Davis Date: Fri Jul 18 07:46:20 2008 -0700 dat: allow TYPE_ERR messages to be turned off with DAT_DBG_TYPE Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 4fefc6bca4e21c9d757923bf13bc93c62dbff17d Author: Arlin Davis Date: Wed Jun 25 08:02:11 2008 -0700 dapltest: manpage - rdma write example incorrect parameter for rdma write should be RW and not WR Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 68638bde71b529a142c13ac332cd44435cabc896 Author: Arlin Davis Date: Mon Jun 23 15:26:30 2008 -0700 dapl: remove needless terminating 0 in dto_op_str functions. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit cb1f2a144ecd375d2143d6e176a6a92a18556d7e Author: Arlin Davis Date: Mon Jun 23 10:52:46 2008 -0700 Release 2.0.10 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit d9b3c06ae98ac4d3b264384f6510137166d78cb0 Author: Arlin Davis Date: Mon Jun 23 10:35:17 2008 -0700 remove reference to doc/dat.conf in makefile.am Signed-off by: Arlin Davis ardavis@ichips.intel.com commit b052d402e09ac78281a25af2c8fe902fa71f5c6f Author: Arlin Davis Date: Thu Jun 19 13:34:49 2008 -0700 dapl scm: fix ibv_destroy_cq busy error condition during dat_evd_free. Problem surfaced while running Intel MPI 3.1 and mpich2-test suite. dapli_destroy_cm was incorrectly removing reference to qp_handle in endpoint and destroy_cq and destroy_pd code was ignoring verbs errors. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit e466d8e330c45176c5f00efda79ad745bf3f71a4 Author: Arlin Davis Date: Wed Jun 18 14:21:28 2008 -0700 dapl scm: add stdout logging for uname and gethostbyname errors during open. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 8e1f4db702cacdd2b9b95083db54ec38c9d2f5e5 Author: Arlin Davis Date: Wed Jun 18 14:19:51 2008 -0700 dapl scm: support global routing and set mtu based on active_mtu Signed-off by: Arlin Davis ardavis@ichips.intel.com commit fc65a08727c59c304dad20337a8bff803f2302c0 Author: Arlin Davis Date: Wed Jun 18 13:59:44 2008 -0700 dapl scm: Adding socket cm provider for better scalability on large homogeneous clusters. Bring socket cm provider back to life with some changes: better threading support for exchanging QP information. Avoid blocking during connect to support dynamic connection model with MPI implementations. consumer control of ack timeout/retries. disconnect/reject capabilities via socket exchange. version support for wire protocol to insure compatibility with peer scm provider. Add gids to exchange. validated with Intel MPI on a 14,000+ core fabric using IB DDR. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 0855af175fec2f1bec8391ebae2a2cdff26a3359 Author: Arlin Davis Date: Wed Jun 11 10:43:24 2008 -0700 dapl: add opcode to string function to report opcode during failures. Need to use cookie opcode during failures in lieu of cqe opcode. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit ec6296e7f0a843c69231f8284ae780014fa26fbe Author: Arlin Davis Date: Mon Jun 16 14:59:43 2008 -0700 dapl: remove unused iov buffer allocation on the endpoint provider's manage iov space on stack during posting. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit c678414ced8bc9cbe21b2fc1d54aa2af73ba6528 Author: Arlin Davis Date: Mon Jun 16 13:59:11 2008 -0700 dapl: endpoint pending request count is wrong The code assumes every cookie allocated during posting of requests gets completed. This incorrect assumption results in wrong pending count. Remove request_pending field and replace with direct call, dapl_cb_pending, to provide accurate data to consumer. Add debug print if consumer overruns request queue. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit c446a3a3f3ecbd91ab583fee35bf613ab10defcd Author: Arlin Davis Date: Mon Jun 2 12:40:45 2008 -0700 dapl extension: dapli_post_ext should always allocate cookie for requests. extension didn't allocate cookie if completion was suppressed which resulted segfault during provider post call. Provider's expect cookie for wr_id, even with surpressed completions, to handle events during errors. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 2583f07d9d0f55eee14e0b0e6074bc6fd0712177 Author: Arlin Davis Date: Tue May 20 14:35:43 2008 -0700 Release 2.0.9 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 9b38e7b792c48ea63c2078fc6c10bb843d96bd06 Author: Arlin Davis Date: Tue May 20 21:56:06 2008 -0700 dtest,dtestx,dapltest: fix build issues with Redhat EL5.1 need include files/definitions for sleep, getpid, gettimeofday Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 8084ebf39729bac310447467b518df4248e9e2b6 Author: Arlin Davis Date: Tue May 20 14:31:09 2008 -0700 dapl: Fix long delays with the cma provider open call when DNS is not configure on server. Open call should default to netdev names when resolving local IP address for cma binding to match dat.conf settings. The open code attempts to resolve with IP or Hostname first and if there is no DNS services setup the failover to netdev name resolution is delayed for as much as 20 seconds. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 2f603b03f4cebe7c414cbaeecb7155f7bf1fb115 Author: Arlin Davis Date: Tue May 20 14:30:05 2008 -0700 dapl: change cma provider to use max_rdma_read_in,out from ep_attr instead of HCA max values when connecting. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 7a0e5fad6de7c6affc4ba3c608b0c56f4206c48c Author: Arlin Davis Date: Wed Apr 30 14:48:21 2008 -0700 Release 2.0.8 Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 561f09ab6f9fd46a6075ecb54ca7693f2b12f311 Author: Arlin Davis Date: Wed Apr 30 13:51:41 2008 -0700 dapl: fix post_send, post_recv to handle 0 byte's and NULL iov handles Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 0289daa3fcc4451bace8cc6b6e20ddb7bbade07e Author: Arlin Davis Date: Wed Apr 30 13:25:53 2008 -0700 dat: udat_sr_parser ia_name will fail on comments, turn down debug message Signed-off by: Arlin Davis ardavis@ichips.intel.com commit b93b91d48186d100c48f1a479776d56476847607 Author: Arlin Davis Date: Tue Apr 29 16:15:44 2008 -0700 dat: cleanup error handling with static registry parsing of dat.conf change asserts to return codes, add log messages, and report errors via open instead of asserts during dat library load. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit b6b1f152efabe064ab8bdcdeecbd1edd30eb732f Author: Arlin Davis Date: Mon Apr 28 10:14:20 2008 -0700 dapl: cma provider needs to support lower inline send default for iWARP IB and iWARP work best with different defaults. Add transport check and set default accordingly. 64 for iWARP, 200 for IB. DAPL_MAX_INLINE environment variable is still used to override. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit be32d7d5beeeceac5dbb1974d3217265dc4d5461 Author: Arlin Davis Date: Mon Apr 28 09:44:12 2008 -0700 dtestx: need to include string.h for memset/strcpy declarations Signed-off by: Arlin Davis ardavis@ichips.intel.com commit a192465714e7607529303a80d8f9a312e0c7aec6 Author: Arlin Davis Date: Mon Apr 28 08:41:05 2008 -0700 dapl: add vendor_err with DTO error logging DAPL_GET_CQE_VENDOR_ERR added to get vendor_err via cq entry. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 6ac657a4e7e5e27254a024fca7fdead569043f9a Author: Arlin Davis Date: Fri Apr 25 15:12:34 2008 -0700 dapl: add check before destroying cm event channel in release library may be loaded and unloaded without calling open in which case the cm event channel is not created. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit c1eb23352f44aec6faeef37d8f0c3180f6259cf8 Author: Arlin Davis Date: Tue Apr 22 12:55:13 2008 -0700 dapl: evd_alloc doesn't check for direct_object_create errors. Fix error check in dapls_ib_wait_object_create() and dat_evd_alloc. When attempting to create large number of evd's that exceed open files limit the error was not propagated up causing a segfault. Note: there are 3 FD's required for each EVD 2 for pipe, and one for cq event_channel. Change the error reporting to indicate correct return code and send to log with non-debug builds. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit c5c6229b3e7744782cace0ca1f5f1fa89198bd3a Author: Arlin Davis Date: Mon Apr 14 13:10:13 2008 -0700 dapl: change packaging to modify OFA provider contents of dat.conf instead of file replacement. Change the packaging to update only the OFA provider contents in dat.conf. This allows other dapl providers, other then OFA, to co-exist and configure properly. Adding manpage to explain syntax of this static configuration file. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit d32b27d991bc1314eea055ce3f55bb585b11aaac Author: Arlin Davis Date: Fri Apr 11 11:37:48 2008 -0700 dapl openib_cma: fix hca query to use correct max_rd_atom values Signed-off by: Arlin Davis ardavis@ichips.intel.com commit ac4ccfd144c01b7f4285b0cecc6218c58d0482a8 Author: Arlin Davis Date: Wed Apr 9 17:26:06 2008 -0700 dat: add logging by default during library load failures. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 1794e94754a1e58fcf214c2802e950124bbd1316 Author: Arlin Davis Date: Tue Apr 8 17:32:03 2008 -0700 dtest: add private data validation with connect and accept. Include code, with build option, to validate private data with consumer rejects. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 46f21284bc05e76e82b9ad6cd9f1dbc9bcde0a28 Author: Arlin Davis Date: Tue Apr 8 17:25:11 2008 -0700 dapl: add hooks in evd connection callback code to deliver private data with consumer reject. PEER rejects can include private data. The common code didn't support delivery via the connect event data structure. Add the necessary hooks in dapl_evd_connection_callback function and include checks in openib_cma provider to check and delivery properly. Also, fix the private data size check in dapls_ib_reject_connection function. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 90e04c6f76dd5cfebd2f2867bfe22e85b0c2f461 Author: Arlin Davis Date: Mon Apr 7 15:47:57 2008 -0700 dapl: increase reject private data size to avoid odd byte offets. remove reject type checking on passive side since it will always be non-consumer from active side. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 353a1c8a00bb2a1380fd7a372973a5a70828da35 Author: Arlin Davis Date: Fri Apr 4 16:04:11 2008 -0800 dapl: update vendor information for OFA v2 provider. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit dbf1ea37f43caec61911dea06af801c2f906db0a Author: Arlin Davis Date: Fri Apr 4 16:03:03 2008 -0800 dapl: add provider vendor revision data in private data with reject Add 1 byte header containing provider/vendor major revision to distinguish between consumer and non-consumer rejects. Validate size of consumer reject privated data. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 0f71b9be594739a1fba7d74929eacd42a8cee392 Author: Arlin Davis Date: Thu Apr 3 17:06:27 2008 -0800 dapl: add support for logging errors in non-debug build. Add debug logging (stdout, syslog) for error cases during device open, cm, async, and dto operations. Default settings are ERR for DAPL_DBG_TYPE, and stdout for DAPL_DBG_DEST. Change default configuration to build non-debug. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit bea882ad9b11ac7188628a939f5227e22c914169 Author: Arlin Davis Date: Thu Apr 3 16:23:29 2008 -0800 dapl: add support for private data in CR reject. Private data support via dat_cr_reject was added to the v2 DAT specification but dapl was never extended to support at the provider level. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit b5b096b6b6949fcb9fa711ab4784f41f1bb87525 Author: Arlin Davis Date: Tue Apr 1 11:02:37 2008 -0800 dapl: calculate private data size based on transport type and cma_hdr overhead Need to adjust CM private date size based on different transport types. Add hca_ptr to dapls_ib_private_data_size call for transport type validation via verbs device. Add definitions to include iWARP size of 512 and subtract 36 bytes for cma_hdr overhead. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 632af34f0ea15e12b572c656fe2ef561a0ad62b7 Author: Arlin Davis Date: Wed Mar 26 17:58:17 2008 -0800 Remove improperly licensed GETOPT code from dtest source tree. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 88069fdd21f92923388dec7adbde0d1bc334e7c4 Author: Arlin Davis Date: Tue Mar 18 15:04:34 2008 -0800 remove unnecessary assert from dapl_ep_free. dat_ep_free must handle the case where a consumer calls free in CONNECTED or DISCONNECT_PENDING states. After free calls disconnect, there may be a pending event, in which case the providers dapls_ib_qp_free will block accordingly and handle pending events. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit b3f020e5cba765077049a8cf61c4ce5009fa1031 Author: Patrick Marchand Latifi Date: Fri Mar 14 14:31:40 2008 -0700 fix openib_scm compiler warning Cast to socklen_t since accept(2) expects an unsigned argument. Makes the openib_scm provider now build successfully when using make VERBS= (the -Werror flag was causing the build failure) Signed-off-by: Patrick Marchand Latifi commit 441996f05d3cc8b09c94c166ef736bc50c24de7e Author: Patrick Marchand Latifi Date: Fri Mar 14 14:31:34 2008 -0700 fix provider-specific compiler warnings Initialize ds_array_start_p otherwise the compiler would claim that this variable could be used with an uninitialized value. Makes the uDAPL providers now build successfully when using make VERBS= (the -Werror flag was causing the build failure) Signed-off-by: Patrick Marchand Latifi commit 5a710fc43ad004ecb4603db1359abb4a4fcd77e3 Author: Arlin Davis Date: Tue Mar 11 09:25:07 2008 -0800 uDAPL: fix query to adjust max sge for default inline of 64 bytes and include missing max_rdma_write_iov ep_attr field Signed-off by: Arlin Davis ardavis@ichips.intel.com commit e2c6bf57f78dfebc21e168df01e5876202053e08 Author: Patrick Marchand Latifi Date: Fri Mar 7 09:39:22 2008 -0800 uDAT: fix reuse of va_list in debugging mode Make sure we reinitialize the va_list since va_list is undefined if a function traverses the va_list with va_arg. This patch fixes the uDAT debugging case when both stdout and syslog output is wanted. Signed-off-by: Patrick Marchand Latifi commit 4c9cd7a7268c0d8afb5b4d9b31537bc50cac18fe Author: Arlin Davis Date: Thu Mar 6 15:40:35 2008 -0800 Add hostname and process id to debug output to aid scale-up and out debug. Signed-off by: Arlin Davis ardavis@ichips.intel.com commit 460aa6f089fcdb34d78af1c8391cbecbcc6b0db3 Author: Patrick Marchand Latifi Date: Sat Feb 23 21:03:21 2008 -0800 fix reuse of va_list in debugging mode Make sure we reinitialize the va_list since va_list is undefined if a function traverses the va_list with va_arg. This patch fixes the debugging case when both stdout and syslog output is wanted. Signed-off-by: Patrick Marchand Latifi commit da80af8c76f220508407a2e171c8b28b43b35bf9 Author: Patrick Marchand Latifi Date: Tue Feb 19 16:54:45 2008 -0800 Fix memory leak in provider specific post send/recv if there's more than DEFAULT_DS_ENTRIES iovecs. Signed-off-by: Patrick Marchand Latifi commit d78ee9f95fbe48f71eb247b01c598994edfa4d17 Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:42 2008 -0800 Guarantee NUL termination if hostname gets truncated. Signed-off-by: Patrick Marchand Latifi commit 3484fa0d2b1a5549d83ecc82d89b72bb86f8fe4e Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:37 2008 -0800 Make sure we don't leak the hash table if dapl_hca_alloc fails. Signed-off-by: Patrick Marchand Latifi commit e4ed56be6bd64684564169d89df7ca30faffdb53 Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:32 2008 -0800 Fix memory leak. Signed-off-by: Patrick Marchand Latifi commit 9efd005b185cfd970d2f8c58f05cf2eaae0dcdc8 Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:27 2008 -0800 Fix memory leak in error path. Signed-off-by: Patrick Marchand Latifi commit d971e799bb5385a8c847cf3f863f19854e95c1b2 Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:22 2008 -0800 Fix memory leak Signed-off-by: Patrick Marchand Latifi commit c21f2f455af7934675a58ff825bed6cf54d457c9 Author: Patrick Marchand Latifi Date: Tue Feb 19 03:19:17 2008 -0800 Fix memory leak. Signed-off-by: Patrick Marchand Latifi commit ee46aa47e2a4deeded347fe18bd6321db61c6594 Author: Arlin Davis Date: Fri Feb 15 10:10:01 2008 -0800 Release 2.0.7 Signed-off by: Arlin Davis commit f0ca504bc2639cb7a48528d45e9026b54dab3e57 Author: Arlin Davis Date: Thu Feb 14 09:46:56 2008 -0800 uDAT: Make sure we initialize the dictionary entry early enough so that we can base our cleanup decisions on that variable being initialized. Signed-off-by: Patrick Marchand Latifi commit 6b11838043a6012668c7e1a22a869e9e84dc40d6 Author: Arlin Davis Date: Thu Feb 14 09:46:18 2008 -0800 uDAT: Make sure we stay within bounds when manipulating the ia_name. Signed-off-by: Patrick Marchand Latifi Signed-off by: Arlin Davis commit 3eab70b4d34f850661b51dc1b856cd8d672a5cc9 Author: Arlin Davis Date: Thu Feb 14 09:44:56 2008 -0800 uDAT: Make sure we stay within bounds when manipulating the ia handle. Fix typo in comment. Signed-off-by: Patrick Marchand Latifi commit 7fe64f10874667062e067efb7ea8c3d385ae90b7 Author: Arlin Davis Date: Thu Feb 14 09:43:39 2008 -0800 uDAT: Zero-out memory otherwise we might base our cleanup decisions on uninitialized memory. Signed-off-by: Patrick Marchand Latifi commit f510e7e8f5b72a6262a7f8b255926cf96c65b654 Author: Arlin Davis Date: Wed Feb 13 20:39:26 2008 -0800 Modify default configure options to match rpm spec file --enable-debug, --enable-ext-type=ib Signed-off by: Arlin Davis commit 75273f1a5c599777bb43add93f30563689fdbc10 Author: Arlin Davis Date: Mon Feb 11 15:43:03 2008 -0800 udapl OFA provider: set listen backlog to default cma backlog max. Signed-off by: Arlin Davis commit 7f173ecd7e18f25bc21a42651603922e7d71f7c7 Author: Arlin Davis Date: Mon Feb 11 14:50:33 2008 -0800 The OFA dapl provider is checking for incorrect return code from rdma_bind_addr and rdma_listen calls. This causes an error to be returned back to the consumer instead of correctly incrementing the seed port and re-calling the OFA provider until a valid port is issued. The seed value (1000) is also incorrect and should start a non-privledged port (1024) to avoid EPERM errors when seeding the starting port value. Signed-off by: Arlin Davis commit 7bcb67ba7c9b37d7c122773f542c7f7f718d4a49 Author: Arlin Davis Date: Mon Feb 4 16:16:10 2008 -0800 Release 2.0.6 - ChangeLog commit bead5f36542a8a4c790bda8ecc8dde3e630c15e6 Author: Arlin Davis Date: Mon Feb 4 16:14:02 2008 -0800 Release 2.0.6 Signed-off by: Arlin Davis commit 8c5beb870048aca286f7396549771ccb075c5c1b Author: Arlin Davis Date: Mon Feb 4 16:12:47 2008 -0800 Fix OFED v2 package to build against and target /dat2/include directory. Prevous patch missed dat_osd.h, dapltest/dtest incorrect. Signed-off by: Arlin Davis commit 42a63bb0271f91541e7b3c3967a9a977ef6660ae Author: Arlin Davis Date: Mon Feb 4 13:00:45 2008 -0800 uDAT/DAPL: Fix package to build against and target /dat2/include directory. Signed-off by: Arlin Davis commit b3294c738d61f44ae4d0888662bdd6b64f6d6b1f Author: Arlin Davis Date: Tue Jan 29 16:34:49 2008 -0800 Release 2.0.5 - ChangeLog updated Signed-off by: Arlin Davis commit 356cf91905d39ade06d76ab9ace6203cd7907d93 Author: Arlin Davis Date: Tue Jan 29 16:33:10 2008 -0800 libdat: rename libdat.so to libdat2.so to coexist with v1 devel Signed-off by: Arlin Davis commit d9a9f46ee220ec9c479756acc306ed68060a662f Author: Arlin Davis Date: Mon Jan 28 13:55:35 2008 -0800 Release 2.0.4 - README Signed-off by: Arlin Davis commit 533983cec914a7ecc6829934a56f867d7870e301 Author: Arlin Davis Date: Mon Jan 28 12:06:03 2008 -0800 Release 2.0.4 Changelog Signed-off by: Arlin Davis commit bfc5bd4b4190c7302b08c3922c17e2131bfbe605 Author: Arlin Davis Date: Mon Jan 28 12:04:18 2008 -0800 Relase package 2.0.4 commit 95935648f81ac5177ae7120b35e55483902b8c64 Author: Arlin Davis Date: Wed Jan 23 16:40:48 2008 -0800 dapltest does not include definitions for inet_ntoa. At load time the symbol was resolved but with the default definition of int, instead of char*, it caused segfault. Add correct include files in dapl_mdep_user.h for linux. Signed-off by: Arlin Davis commit 3c1bb0e56c14c5ad50876820e25933c1f4c3dde4 Author: Arlin Davis Date: Wed Jan 23 14:46:30 2008 -0800 Add freeaddrinfo to deallocate getaddrinfo buffer. Cleanup a few printf messages. Signed-off by: Arlin Davis commit a4a8ad5eb1b15be19b3a343dee71ad3013d3f4bd Author: Arlin Davis Date: Wed Jan 23 14:25:21 2008 -0800 Fix for uDAPL v2 using extended operation. After extension completion, the DTO cookie must be checked for type before deallocating to handle inbound immediate data in receive. The sample dtestx client will fail when running loopback if the rdma immediate is received from remote before the rdma immediate request completion fires. Bug causes following dtestx client error: dat_ib_post_rdma_write_immed returned DAT_INSUFFICIENT_RESOURCES : DAT_RESOURCE_MEMORY Signed-off by: Arlin Davis commit 6dcf1763c153c27c29ba76bac35be4f6935ddd96 Author: Arlin Davis Date: Thu Jan 17 11:30:27 2008 -0800 WinOF: update dapltest,dtest directories for windows build WinOF: add README.windows Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 9bececbb32dd31d4a3528e8f000a773e5c593430 Author: Arlin Davis Date: Thu Jan 17 11:24:46 2008 -0800 WinOF: update dtestx for windows build Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 4dc8c5defef0f52da751a1eca4d4f35de911c3c0 Author: Arlin Davis Date: Thu Jan 17 11:23:21 2008 -0800 WinOF: add build enviroment, cleanup old makefiles Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 5a9e035fa33a6307b3d2b370f64639b14dfca87e Author: Arlin Davis Date: Tue Jan 15 16:59:34 2008 -0800 WinOF: name collision with ibal verbs ib_cm_handle_t Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 7c5418a781c1dfdb37b09450b5df40363dce84b4 Author: Arlin Davis Date: Tue Jan 15 16:06:10 2008 -0800 dtest: dat_evd_query for correct size Signed-off by: Arlin Davis commit 6de5e635c01e78bde6e153b727926da900677d52 Author: Arlin Davis Date: Tue Jan 15 16:03:27 2008 -0800 dapltest: WinOF support. Signed-off by: Stan Smith commit c680e95b96e57bd8b69b1c73e95730854fcea028 Author: Arlin Davis Date: Tue Jan 15 14:54:57 2008 -0800 openib_cma: fix cleanup issues in destroy_cm_id add macros to convert SID and PORT fix init/responder settings in accept Signed-off by: Arlin Davis commit f8f867e52ffc36a31830dd4003eb2a4b4d265c93 Author: Arlin Davis Date: Tue Jan 15 14:49:54 2008 -0800 Modifications for WinOF build and endian support for RMR info Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 4c1fc48d2825efcffaa8cdf7efbdd2d41aeb56ab Author: Arlin Davis Date: Tue Jan 15 14:39:18 2008 -0800 WinOF: DAT_API changes, white space and tab cleanup IBAL provider code added Common code: initialize cookie pool buffer add dapl extension DTO counter add get_cqe_op_str debug call remove excess dbg in evd_dequeue add dbg assert to sp_search_cr IBAL provider support _VENDOR_IBAL_ Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 68f2ad0af3623dec27b1223aeaca6357348eef4b Author: Arlin Davis Date: Fri Jan 4 08:32:39 2008 -0800 Windows specific - IBAL support in evd_create Build IB extensions by default Common code - check return status, evd_free, evd_wait add dapl_event_str function definitions for dat_os_library_error, dat_os_ungetc Signed-off by: Stan Smith Signed-off by: Arlin Davis commit d21f36406408245ac979f0b9594e7d1d0b9a3852 Author: Arlin Davis Date: Fri Jan 4 08:32:19 2008 -0800 Common code - Missing DAT_API defs casting to fix build issues bitmaps for extension debug DAPL_BAD_PTR macro Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 258678a381c6a0170020c48b0ba627e820abd3e7 Author: Arlin Davis Date: Fri Jan 4 08:31:59 2008 -0800 Common code - Add DAT_API definitions for dat_redirection.h, udat_redirection.h Signed-off by: Stan Smith Signed-off by: Arlin Davis commit 87d0b46a0c0f25e8828d7425e0173a0304a23f8b Author: Arlin Davis Date: Fri Jan 4 08:31:27 2008 -0800 Windows specific - Add dapl_ep fields ibal_cm_handle, recv_disc, sent_disc for IBAL provider Support for direct object on CQ INIT and FINI changes setup dat.conf default path, fix sr parsing Common code - Add Stan Smith as contributor O/S independent dat_os_library_error() Signed-off by: Stan Smith Signed-off by: Arlin Davis commit b3ba3dc9743baf3bff243e8969edf3395d1118dd Author: Arlin Davis Date: Tue Dec 11 14:44:24 2007 -0800 2/2 uDAPL changes to sync common code base with WinOF - add DAT_API to specify calling conventions (windows=__stdcall, linux= ) - cleanup platform specific definitions for windows - c++ support - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE commit 92d7eef38877ad472a91e5e9f88e4e49657716bf Author: Arlin Davis Date: Tue Dec 11 14:43:05 2007 -0800 1/2 uDAT changes to sync common code base with WinOF - add DAT_API to specify calling conventions (windows=__stdcall, linux= ) - cleanup platform specific definitions for windows - c++ support - add handle check macros DAT_IA_HANDLE_TO_UL and DAT_UL_TO_IA_HANDLE Signed-off by: Arlin Davis Signed-off by: Stan Smith commit 95764c6da28284d29071cf01d1a09bdcb967a971 Author: Arlin Davis Date: Tue Dec 4 13:19:27 2007 -0800 - Fix size of evd request queue on creation - Add query and checking of DTO request queue Signed-off by: Arlin Davis commit 9bc97e65c1240224d7dc9d6ac9a48e7aed199ee6 Merge: 11a165a abb4356 Author: Arlin Davis Date: Tue Nov 27 13:31:32 2007 -0800 master_dat2.0_merge commit abb4356cd765d38cf5cff2dfbdb610b380f944a2 Author: Arlin Davis Date: Tue Nov 20 12:10:39 2007 -0800 Release 2.0.3 commit d2c66eb7363234c5a9fb82aa92df1c132e46477e Author: Arlin Davis Date: Tue Nov 20 12:07:58 2007 -0800 - Lower default settings (rdma ops, inline sends) for latest iWARP/IB devices - Add missing ia_query for max_iov_segments_per_rdma_write - Cleanup CMA code no longer supported by rdma_cm Signed-off by: Arlin Davis commit 3a3519167bd65bd999424788f139b930b099b405 Author: Arlin Davis Date: Mon Nov 19 15:26:44 2007 -0800 Change dapltest timers to use gettimeofday instead of get_cycles for better portability. Signed-off by: Arlin Davis commit 11a165a1868b1748fe476e08fc40af620f961cd2 Author: Arlin Davis Date: Wed Oct 31 10:58:51 2007 -0800 - DAT/DAPL Version 1.2.3 Release 1 Signed-off by: Arlin Davis commit bc2d39a78e31c5e9463c8fa16f0ecaf49f75a15f Author: Arlin Davis Date: Wed Oct 31 10:55:48 2007 -0800 ChangeLog update commit 7d3ec3d68a756f895a6c6ba8ed3d7a1d602468e9 Author: Arlin Davis Date: Wed Oct 31 10:55:05 2007 -0800 - DAT/DAPL Version 2.0.2 Release 1 Signed-off by: Arlin Davis commit 43931378b9d4f5f721da828623f1e391f32f446b Author: Arlin Davis Date: Tue Oct 30 09:06:24 2007 -0800 - Add ChangeLog - update cma provider to report remote and local ports via dat_ep_query. Signed-off by: Arlin Davis commit a65da8a86ed637bacc32e3518d6c37eeb3b496bf Author: Arlin Davis Date: Thu Oct 25 14:37:14 2007 -0700 Fix dapltest endian issue with mem_handle, mem_address. Signed-off-by: Shirley Ma commit 8196f1655fe6088c66dafa6ad8e4474ea8ebe1d9 Author: Arlin Davis Date: Thu Oct 25 14:36:12 2007 -0700 Fix dapltest endian issue with mem_handle, mem_address. Signed-off-by: Shirley Ma commit 39667dbb0160d395fb20eb53a1b4e995e2e623dd Author: Arlin Davis Date: Tue Oct 16 14:23:17 2007 -0700 Fix dtest to build properly with extensions. Modify dat.h dat_event to include event_extension_data[8]. Extend struct dat_event outside of extension build switch to enable non-extended applications to work with extended libraries. Otherwise, there is a potential for the event callee to write back too much event data and exceed callers non-extended event buffer. Signed-off by: Arlin Davis commit d7134fb2bcad6f4f68410af997f8791edd788cfb Author: Arlin Davis Date: Tue Oct 16 14:10:52 2007 -0700 Use inet_ntoa instead of open coding it. IP addresses were being reversed on PowerPC. On PowerPC the timebase ticks at a different frequency to the CPU. dapltest currently assumes a 1:1 relationship, and gives bogus values when scaling timebase to real time. To fix this, look at the timebase field in /proc/cpuinfo instead. To keep things consistent with x86, scale that value to MHz. Signed-off-by: Anton Blanchard commit c6710c291a4f7c0845a4535767d41d66f092fabf Author: Arlin Davis Date: Tue Oct 16 14:09:56 2007 -0700 Use inet_ntoa instead of open coding it. IP addresses were being reversed on PowerPC. On PowerPC the timebase ticks at a different frequency to the CPU. dapltest currently assumes a 1:1 relationship, and gives bogus values when scaling timebase to real time. To fix this, look at the timebase field in /proc/cpuinfo instead. To keep things consistent with x86, scale that value to MHz. Signed-off-by: Anton Blanchard commit 9446029979a55e6e477fb31cfdf9ce0dc77ffa8f Author: Arlin Davis Date: Tue Oct 16 14:02:36 2007 -0700 Minor clean-up of cr/lf Signed-off by: Arlin Davis commit 33fd0628497911df11dea640aea4660e54989ed6 Author: Arlin Davis Date: Tue Oct 2 16:01:37 2007 -0700 Final changes for 2.0.1-1 package, OFED 1.3 ALPHA Fix build issue with SLES 10, gcc++ compiler Signed-off-by: Jimmy Hill Signed-off-by: Arlin Davis commit bc5f16991d75ff9d09e3e3a3cc8c2d6801a9d61f Author: Arlin Davis Date: Tue Oct 2 14:50:02 2007 -0700 Final changes for package 1.2.2-1, OFED 1.3 ALPHA Signed-off by: Arlin Davis commit 52bc16939e87587f8208e775dd061f54196a9acb Author: Arlin Davis Date: Tue Oct 2 11:58:46 2007 -0700 Change v2 dat.conf provider names to associate with ib net devices Signed-off by: Arlin Davis commit d22e62f989dd16d503d5430ffe6f55075139e057 Author: Arlin Davis Date: Tue Oct 2 11:43:34 2007 -0700 Change DT_Mdep_GetTime to use gettimeofday() which has more resolution than times(). Signed-off-by: Anton Blanchard commit a64eae5bd36598a5c93010e07869e95599aa8ceb Author: Arlin Davis Date: Tue Oct 2 11:41:40 2007 -0700 Change v2 dat.conf provider names to associate with ib net devices Signed-off by: Arlin Davis commit 870764dfad8df0ffe6d3d449e7a8e296cfee8ef5 Author: Arlin Davis Date: Tue Oct 2 11:35:21 2007 -0700 Change DT_Mdep_GetTime to use gettimeofday() which has more resolution than times(). Signed-off-by: Anton Blanchard commit 66bf23e3e53f370c92803f162144947f29ce06d8 Author: Arlin Davis Date: Tue Oct 2 11:30:15 2007 -0700 Change DT_Mdep_GetTime to use gettimeofday() which has more resolution than times(). Signed-off-by: Anton Blanchard commit c220760bbb1f6357b6e187ff6c5e576dd74fd504 Author: Arlin Davis Date: Tue Oct 2 10:39:09 2007 -0700 Fix dapl to compile as both 32bit and 64bit on PowerPC. Instead of using the kernel atomic routines, code them explicitely like x86 does. Signed-off-by: Anton Blanchard commit 9ffdf3722e5a9cde3fd6add5d7b3940a7ea9f71f Author: Arlin Davis Date: Fri Sep 28 17:04:54 2007 -0700 Clean up packaging, modify dat.conf for v2.0 cma provider name change to ofa Signed-off by: Arlin Davis commit 493e65b5b47f47e4824f775959fd98e56aeaccc4 Author: Arlin Davis Date: Fri Sep 28 17:03:41 2007 -0700 Clean up packaging, modify dat.conf for cma provider name change to ofa Signed-off by: Arlin Davis commit 99f0a0bf0a0d99fee0729fba0fcdf6f3e89e2ec4 Author: Arlin Davis Date: Thu Sep 20 12:25:55 2007 -0700 Modifications to coexist with 2.0 libraries - fix RPM specfile, configure.in, 1.2.2 package - modify dat.conf Signed-off by: Arlin Davis commit 7ff4a8a8e861b0701b5b2a6fc95e6aa8b36d2662 Author: Arlin Davis Date: Thu Sep 20 10:55:19 2007 -0700 Modifications to coexist with 1.2 libraries - cleanup CR-LF in dtestx - fix RPM specfile, 2.0.1 package Signed-off by: Arlin Davis commit 230767742b8287490373c09d1bd346337b375b48 Author: Arlin Davis Date: Fri Jun 22 11:48:20 2007 -0700 Update copyright in specfile commit 5294cbe5e58f67d0a98862edea3684fff6e773bb Author: Arlin Davis Date: Fri Jun 22 11:47:14 2007 -0700 Update Copyright in specfile commit 3654c6ef425f94b9f27a593b0b8c1f3d7cc39029 Author: Arlin Davis Date: Wed Jun 6 13:20:38 2007 -0700 Update specfile to reflect DAT/DAPL 1.2.1 release commit babb95eff1bcef88bed46e92c323193d8f039eff Author: Arlin Davis Date: Wed Jun 6 11:48:07 2007 -0700 More changes to the release notes commit 0f299bf1deb9198b2f008c3ffa717bef252b6097 Author: Arlin Davis Date: Tue Jun 5 15:56:17 2007 -0700 Update release notes commit ad70f98a228ade4a863ca349990eaa7ab1e82ec2 Author: Arlin Davis Date: Tue Jun 5 15:52:18 2007 -0700 Add release notes updated for OFED 1.2 release commit f332badb80f0b1d88bf2d70dba0c90afc40f088f Author: Arlin Davis Date: Thu May 31 12:43:28 2007 -0700 Add provider specific interface to uDAPL for extensions support. Fix memory leak with extensions, missing cookie deallocation when processing extended DTO events Remove unnecessary check on dats_set_ia_handle in dat_ia_openv Clean up specfile and some extra LF's commit 4d7e30586402149228a30bea3036466395577ec4 Author: Arlin Davis Date: Wed May 16 12:56:39 2007 -0700 add iwarp extension include file commit d9963cc9984c06f147b92877945e847f657cd512 Author: Arlin Davis Date: Wed May 16 12:52:38 2007 -0700 clean up some CR's in include files commit 80f4e8c4be02bac5d472e1e6c4937079882a0388 Author: Arlin Davis Date: Wed May 9 16:21:16 2007 -0700 Take out references to specific 1.1 verbs definitions (ibv_comp_channel). commit 544fbb873d5320e9606f176c4b71bcba0e257d7d Author: Arlin Davis Date: Wed May 9 12:51:53 2007 -0700 Bug Fixes: - 606: Return local and remote ports with dat_ep_query - 585: Add bonding example to dat.conf commit e64079f7b961aa9a672711f0e933a77f3999d302 Author: Arlin Davis Date: Mon May 7 15:54:59 2007 -0700 Update dapltest to use default device OpenIB-cma Fix dapltest manpage, example for performance test wrong commit 7cda2304a6880371ec2d9451a4f83a7a254bc474 Author: Arlin Davis Date: Mon May 7 12:49:18 2007 -0700 Fix issues with IB DTO extensions - debug print_cqe updated for latest IBV definitions - dapli_evd_cq_to_event modified to handle both post and receive extensions - dtestx example tested with rdma_write_imm, fetch_add, and cmp_swap - modify cookie DTO types to support extensions properly commit 82a6750d31cd432c7e09298fc98c0e7e74abd012 Author: Arlin Davis Date: Fri May 4 17:17:41 2007 -0700 Add new dapl functions for 2.0 (stubs for now) - dapl_ep_post_send_invalidate - dapl_ep_post_rdma_read_to_rmr - dapl_ia_ha - dapl_csp_create, query, free - dapl_cno_trigger - dapl_cno_fd_create - dapl_extensions Add new 2.0 parameters to existing API's - dapl_cr_reject - dapl_rmr_bind commit 8679aaf56c781715adc132a38a731e36194570f1 Author: Arlin Davis Date: Thu May 3 09:44:43 2007 -0700 update dtestx.c, default provider OpenIB-cma commit 527f6d19125e9eec7ecef03a8633626b0043a2f4 Author: Arlin Davis Date: Wed May 2 17:27:44 2007 -0700 Added IB extensions and dtestx as an example program using rdma write with immediate and atomic operations commit 83ac961b505346708f12d59152146f3b04c8306f Author: Arlin Davis Date: Mon Apr 30 10:55:59 2007 -0700 Fixes atomic operation build problem with ia64 and RHEL5. commit 04da88bb70ee33b249a4cf2f5a92122eeec83e3c Author: Arlin Davis Date: Thu Apr 26 17:29:37 2007 -0700 Update README and dapltest manpage commit 9a951d0a8713657da90568c0613eb48f5010cf1e Author: Arlin Davis Date: Tue Apr 3 16:35:17 2007 -0700 Cleanup RPM specfile for the dapl package, move to 1.2-1 release. commit a93f0ffcd6a46735c97ec34de564a7a91f9fc5c2 Author: Arlin Davis Date: Tue Apr 3 14:38:31 2007 -0700 Add support for multiple IB devices to dat.conf to support IPoIB HA failover. commit 5434b720b36de2f262a02ff9dfccd99953c09e59 Author: Arlin Davis Date: Thu Mar 15 10:46:33 2007 -0800 Fix ia64 builds on SUSE commit b0f9eef1aa7f279802da233480cf6c495e16565b Author: Arlin Davis Date: Wed Mar 14 13:29:08 2007 -0800 DAT 2.0 support for new DAT_VA_TYPE added to uDAPL and openib-cma provider commit 61858b925f4c1a6f9edba6389a5bd601daf936e9 Author: Arlin Davis Date: Wed Mar 14 11:08:19 2007 -0800 change DAT_VERSION major and minor numbers to 2.0 commit 6dcb2e083bda8f2521bd3515b329c5465e1ac724 Author: Arlin Davis Date: Wed Mar 14 10:43:56 2007 -0800 add provider support to dtest, set default to OpenIB-cma commit ff8eb667c1000be6c68ca291e7ed7bd080cb73f4 Author: Arlin Davis Date: Tue Mar 13 16:20:20 2007 -0800 add provider option to dtest, set default to OpenIB-cma commit 76a43cace54567135bac7ae54e336c6595b65fd9 Author: Arlin Davis Date: Fri Mar 9 13:09:14 2007 -0800 Initial build with DAT 2.0 definitions and IB extensions. IB extensions configurable with --enable-ext-type=ib commit 921687efed992e6ab72dfb731687b6816324a024 Author: Arlin Davis Date: Thu Mar 8 16:01:29 2007 -0800 Update the README commit 52ed210ae99b291f72441e71459006b5f2c851ce Author: Arlin Davis Date: Wed Mar 7 15:34:41 2007 -0800 - Fix bug 408, dapltest compilation failure on 32 bit arch - Update libdat.spec.in file to build uDAPL RPMs correctly commit e3f6aca57a8fa5cbaaf872bf6844feb7d5e1e66c Author: Arlin Davis Date: Mon Mar 5 14:15:49 2007 -0800 Fix build issues with dtest and dapltest. Define build tree path to dat/include. commit f1f829a28e645831c3bcd1eb2d465fcb7a1fd5d8 Author: Arlin Davis Date: Wed Feb 28 17:14:55 2007 -0800 Add dapltest headers to EXTRA_DIST Modify dtest to delay before accepting Signed-off-by: Vladimir Sokolovsky Signed-off-by: Arlin Davis commit 46b830a4664d5fee2daf1ebdc4e95ecb7c580e80 Author: Arlin Davis Date: Mon Feb 26 13:54:15 2007 -0800 Adding dtest and dapltest to the build. Manual pages created. commit d245664e27148e54469268ad81f41b2a894a131a Author: Arlin Davis Date: Fri Jan 19 16:21:30 2007 -0800 uDAPL changes to support exchanging and validation of the device responder_resources and the initiator_depth during connection establishment commit 2280f833090aa9f750d5be8f9b06e7e08e642da5 Author: Arlin Davis Date: Wed Dec 6 11:49:27 2006 -0800 Update cma provider to sync with rdma_ucm changes commit 89448545b415b6dff57e3314b020619f6b979ef8 Author: Arlin Davis Date: Mon Dec 4 13:54:20 2006 -0800 Update autogen to create config directory commit 0a917b104eba0aae6c6ef49c7990a2dc7efc759d Author: Arlin Davis Date: Tue Nov 7 20:22:05 2006 +0000 r10074: Added support for new ib verbs client register event. No extra processing required at the uDAPL level. Fix some issues supporting create qp without recv cq handle or recv qp resources. IB verbs assume a recv_cq handle and uDAPL dapl_ep_create assumes there is always recv_sge resources specified. Fix some timeout and long disconnect delay issues discovered during scale-out testing. Added support to retry rdma_cm address and route resolution with configuration options. Provide a disconnect call when receiving the disconnect request to guarantee a disconnect reply and event on the remote side. The rdma_disconnect was not being called from dat_ep_disconnect() as a result of the state changing to DISCONNECTED in the event callback. Here are the new options (environment variables) with the default setting: DAPL_CM_ARP_TIMEOUT_MS 4000 DAPL_CM_ARP_RETRY_COUNT 15 DAPL_CM_ROUTE_TIMEOUT_MS 4000 DAPL_CM_ROUTE_RETRY_COUNT 15 commit c73aeb904504a0bc6cce0fb1248af9ba39521395 Author: Arlin Davis Date: Thu Oct 12 22:41:33 2006 +0000 r9802: Remove Socket CM provider from build and dat.conf configuration. No longer needed nor supported. commit b1d94b26610f682cdd43bde2aecf5004e0865422 Author: Steve Wise Date: Tue Sep 12 18:15:39 2006 +0000 r9442: Update obsolete CLK_TCK to CLOCKS_PER_SEC Signed-off-by: Steve Wise Signed-off-by: James Lentini commit 99a5dddd07d4c271ebb075b5b0f800101f850a56 Author: Arlin Davis Date: Thu Sep 7 18:09:11 2006 +0000 r9346: inadvertently added evdtest to makefile when testing dat_evd_set_unwaitable fix with openib_cma provider commit b53a87c856d9754313da9543a1dac5c6f1307085 Author: Arlin Davis Date: Wed Sep 6 20:36:09 2006 +0000 r9315: Fill out some unitialized fields in the ia_attr structure returned by dat_ia_query(). Signed-off by: Arlin Davis Signed-off by: Robert Walsh commit b6c4e84399d0aa44c72c6ca870409c3666d7e79b Author: Arlin Davis Date: Fri Aug 11 20:44:23 2006 +0000 r8895: Update dtest to support multiple segments on rdma write and change makefile to use OpenIB-cma by default. commit 4737c63d79b23c3aff329e864dd50e3cffb6a17f Author: Arlin Davis Date: Wed Jul 19 17:15:06 2006 +0000 r8592: Add support for dat_evd_set_unwaitable on a DTO evd in openib_cma provider commit 25fb8c376547de895a170194c09b2d72dfea789d Author: Arlin Davis Date: Mon Jul 17 22:59:17 2006 +0000 r8565: Added errno reporting (message and return codes) during open to help diagnose create thread issues. commit f3a1ed6232ccdee7d193e8e3b9b0013b2bd222af Author: Anton Blanchard Date: Mon Jul 17 21:26:03 2006 +0000 r8562: Fix some suspicious inline assembly: - EIEIO_ON_SMP and ISYNC_ON_SMP are in kernel UP build optimisations, we shouldnt export them to userspace. Replace it with lwsync and isync. - The comment says its implemenenting cmpxchg64 but in fact its implementing cmpxchg32. Fix the comment. Signed-off-by: Anton Blanchard Signed-off-by: James Lentini commit 63759108a1376b6e45a4491551f71d8cafdcddc1 Author: James Lentini Date: Wed Jul 12 14:56:26 2006 +0000 r8503: Fix IA64 build problems reported by John Partridge Signed-off-by: James Lentini commit 51362c9781cb65fd8f9a3cb5b7c12c88e4c8527a Author: Arlin Davis Date: Thu Jun 22 22:02:56 2006 +0000 r8182: Lower the reject debug message level so we don't see warnings when consumers reject. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit f14889bb0cd22e897148ea2f6931a6b4f23143b0 Author: Arlin Davis Date: Thu Jun 22 21:13:37 2006 +0000 r8181: Added support for active side TIMED_OUT event from a provider. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 14fc704ae20b6a3ad0d433d7de9c02ce99e095b3 Author: Arlin Davis Date: Thu Jun 22 20:58:06 2006 +0000 r8180: Fix bug in dapls_ib_get_dat_event() call after adding new unreachable event. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 893698c31a0d8e60227806d992485a44375840cb Author: James Lentini Date: Mon Jun 19 17:20:45 2006 +0000 r8112: Update for new rdma_create_id() function signature. Signed-off-by: James Lentini commit 53483d84b0d02c432d9435d2f8e840cab3ded320 Author: Arlin Davis Date: Wed Jun 14 16:17:39 2006 +0000 r8008: Set max rdma read per EP attributes Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 6cb854cd72d9492ddc1c5da01dbfb24b3f30af83 Author: Arlin Davis Date: Mon Jun 12 15:42:50 2006 +0000 r7931: Report the proper error and timeout events. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 44a97ff1f599f4bf882a801ead7aa495ea9ba936 Author: Arlin Davis Date: Mon Jun 12 14:51:14 2006 +0000 r7928: Socket CM fix to guard against using a loopback address as the local device address. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 152219cf83c61e459fdf3de03d4e83ddba045230 Author: Arlin Davis Date: Tue Jun 6 21:46:44 2006 +0000 r7755: Use the uCM set_option feature to adjust connect request timeout and retry values. Also, a fix to disallow any event after a disconnect event. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 3a0686a2624ed28c7ea37b650415801f1cedbd10 Author: James Lentini Date: Wed May 31 19:55:57 2006 +0000 r7608: Correct comment. Signed-off-by: James Lentini commit eb760157c90f59183b424ac8e71474fe0b46094c Author: James Lentini Date: Thu May 18 21:54:12 2006 +0000 r7347: Undo inadvertent change. Signed-off-by: James Lentini commit 27256222b42fecfac8a44b3f82fe2524ecc72de2 Author: James Lentini Date: Thu May 18 21:50:27 2006 +0000 r7346: Fix for uCMA provider to return the correct event as a result of rejects. Also, ran into a segv bug with dapl_ep_create when creating without a conn_evd. Signed-off by: Arlin Davis Signed-off-by: James Lentini commit b1b6e16f3e41e123cd347bc78b01e3272076362b Author: Arlin Davis Date: Fri May 12 19:50:19 2006 +0000 r7141: Update the uDAPL openib_cma provider to work with the new uCMA event channel interface. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 27f9f0c106662cc7b41bcb747495860a1b6c7133 Author: Steve Wise Date: Tue May 2 21:33:35 2006 +0000 r6873: Transaction test change to comply with the iWARP MPA protocol's "Connection Startup Rules". Signed-off-by: Steve Wise Signed-off-by: James Lentini commit 060d09f974ffbe73672e17641b2f18d3821d31a7 Author: Arlin Davis Date: Fri Apr 28 13:44:17 2006 +0000 r6736: getaddrinfo() fix for debug builds and some additional debug messages for connect errors and rejects. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 4e8b95bbeaf6e5c27de59ef347ec2ef0aa2e5e6b Author: James Lentini Date: Wed Apr 19 16:49:34 2006 +0000 r6520: Fix compilation warning. Signed-off-by: James Lentini commit 115fcc396164066326f9447d71af798a381d063f Author: Steve Wise Date: Wed Apr 19 16:32:01 2006 +0000 r6518: Do not always generate an event for an abrupt disconnect. Signed-off-by: Steve Wise Signed-off-by: James Lentini commit f959bb786cd884bf4d2a5da4d299da6297d65293 Author: James Lentini Date: Wed Apr 19 16:30:37 2006 +0000 r6517: Generate a disconnect event for providers that do not generate one automatically. Signed-off-by: James Lentini commit bb467511cf6e217147817ba12bbe800aae97cab5 Author: James Lentini Date: Wed Apr 19 16:25:33 2006 +0000 r6516: Fix compilation error. Signed-off-by: James Lentini commit 117a9856c269bf08b738a1923c92f5a1949f6cc1 Author: James Lentini Date: Mon Apr 10 20:16:44 2006 +0000 r6392: Fix for RDMA cm id destruction and debug builds. Signed-off by: Arlin Davis Signed-off-by: James Lentini commit 5f56b2b7339c17276188464dfff12b1be9e1dbb7 Author: James Lentini Date: Thu Apr 6 15:32:47 2006 +0000 r6289: Set max_iov_segments_per_rdma_read and max_rdma_read_iov using the correct attribute. Signed-off-by: James Lentini commit 304f48370adcaa12463c1a7d99e513164b83810c Author: Steve Wise Date: Thu Apr 6 15:16:10 2006 +0000 r6286: Set the IA attribute max_iov_segments_per_rdma_read and the EP attribute max_rdma_read_iov based on the openib max_sge_rd device attribute. Signed-off-by: Steve Wise Signed-off-by: James Lentini commit fe27222d2a00d7c5c4d98f39d2926fe14c7f32bc Author: James Lentini Date: Tue Apr 4 18:29:00 2006 +0000 r6221: Change the mechanism by which library init and fini functions are specified Signed-off-by: James Lentini commit 5a0598b90ab021cb2115e3791cb38dcfc0347948 Author: James Lentini Date: Mon Apr 3 17:29:55 2006 +0000 r6182: Remove unused variables. Signed-off-by: James Lentini commit b8084c4edc21b5ac2191ec654a882b65bad0c77d Author: James Lentini Date: Mon Apr 3 15:29:30 2006 +0000 r6179: Fix dapltest compiler warnings. Signed-off-by: James Lentini commit abdbec194670d72012d481b98b2e6f728e9c5b48 Author: James Lentini Date: Mon Apr 3 14:08:48 2006 +0000 r6168: Fixed debug prints of 64-bit values and removed compile warnings. Signed-off-by: James Lentini commit 52de2a35e02ddeb15887d0d690b52a4e02812e57 Author: James Lentini Date: Tue Mar 21 22:28:10 2006 +0000 r5939: Move libdat.spec to libdat.spec.in Signed-off-by: James Lentini commit 6b1a6356a1757ae9b9d1557bd2ae67e0913d04c2 Author: Arlin Davis Date: Fri Mar 17 22:02:18 2006 +0000 r5879: Add GNU Autotools support and an RPM spec file Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 9d00582b8be33add8d3e4173e8311b1a222b0b34 Author: Arlin Davis Date: Thu Mar 16 22:40:18 2006 +0000 r5871: Fixes a corner case where a CMA event was not acknowledged during disconnect processing. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit ede1d714a8e7ae99246eb382c1c1165f238cf7c3 Author: James Lentini Date: Mon Mar 13 18:15:49 2006 +0000 r5789: Reduces some debug output in the async thread and fixes listen processing of EBUSY. Signed-off by: Arlin Davis Signed-off by: James Lentini commit afd558cbdada66e01aa553364b9a126da00dbe65 Author: Arlin Davis Date: Wed Mar 8 14:24:26 2006 +0000 r5684: Remove unused NO_EP_STATE. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 4c36aca16b9b492a91c0b05002af5fc954f3b44e Author: James Lentini Date: Tue Feb 28 15:41:03 2006 +0000 r5529: Fix to destroy QPs in all cases and close the HCA. Signed-off by: Arlin Davis Signed-off by: James Lentini commit 5874fdb26436c58365a7096b9b68c8e45a51d7a3 Author: James Lentini Date: Mon Jan 9 20:17:33 2006 +0000 r4855: Make use of dat_evd_wait the default. Signed-off-by: James Lentini commit 254bd0e349bafbd970d6475efcafd7e52f05415e Author: Arlin Davis Date: Mon Jan 9 16:59:38 2006 +0000 r4852: Fix disconnect event processing and update dtest to validate. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit f69d737ee51f6b00a1e6cf8531695a61a322651b Author: Arlin Davis Date: Fri Dec 16 02:03:05 2005 +0000 r4502: Query for rd_atomic values. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 86566b556920a51f1e538d245674058682012668 Author: James Lentini Date: Fri Dec 16 01:57:30 2005 +0000 r4501: Allow a network name, network address, or device name in the dat.conf file. Singed-off-by: Arlin Davis Signed-off-by: James Lentini commit 9e0ca3d4ccb92b9c0337efbadce405076a365f0f Author: Roland Dreier Date: Wed Dec 14 20:44:36 2005 +0000 r4466: Change libibverbs API for listing all known devices from ibv_get_devices() to ibv_get_device_list(), and update all in-tree uses of this API. Signed-off-by: Roland Dreier commit 73a80143ab7b3f9aad19f84f904f99b489dca6cf Author: James Lentini Date: Mon Dec 5 16:37:46 2005 +0000 r4308: Fix a gcc 4.0 warning Signed-off-by: James Lentini commit aa8b16b7e83f321eaaa18b38e6c165c2f120bcec Author: Arlin Davis Date: Thu Dec 1 15:03:10 2005 +0000 r4279: Added CMA API support. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 74d3c32e42ab54f3d6f2eec3d0a66d08f800e075 Author: James Lentini Date: Thu Nov 10 21:39:34 2005 +0000 r4018: Fixed some problems with the free build openib_scm version and turned down some debugging and added some debug prints for uAT path records. Signed-off by: Arlin Davis Signed-off by: James Lentini commit 70a2f23c5604e55f8f76672f78b4bf92f6a79b98 Author: James Lentini Date: Mon Oct 31 18:27:13 2005 +0000 r3917: Fix printing of debug statements. Signed off by: Aniruddha Bohra Signed off by: James Lentini Date: Wed Oct 26 21:10:26 2005 +0000 r3882: uDAPL provider for OpenIB socket CM. Signed-off by: Arlin Davis Signed-off by: James Lentini commit 42a64ec2ec1d8ec71492bfebba077b006684ce97 Author: James Lentini Date: Thu Oct 13 20:45:22 2005 +0000 r3774: Fix the async error handling and callback mappings. Updated TODO list. Signed-off by: Arlin Davis Signed-off by: James Lentini commit fea8ed1188fbeef8291cfd7e681cd48c06ff5bde Author: Robert Walsh Date: Fri Oct 7 21:15:00 2005 +0000 r3693: Update some more ignores. commit 303147143afa9aa72906246a9f1973e4172f75b8 Author: Todd Bowman Date: Thu Oct 6 21:13:32 2005 +0000 r3687: Add PPC64 support for udapl Signed-off-by: Todd Bowman Signed-off-by: James Lentini commit 103c7db321e24a7b5b06c7c26b0e0a65d1dd11ce Author: Todd Bowman Date: Thu Oct 6 15:22:08 2005 +0000 r3683: Remove the dtest qualifier from the sdp range. Signed-off-by: Todd Bowman Signed-off-by: James Lentini commit 33fbf9c81ac29492394e419588d856533e7fffb8 Author: James Lentini Date: Mon Oct 3 14:59:22 2005 +0000 r3637: Support CQ_WAIT_OBJECT with channels and sync with latest verbs. Signed-off by: Arlin Davis Signed-off by: James Lentini commit f01dac62b08d8f4fd417c336be48fb3bc8cd15c5 Author: James Lentini Date: Thu Sep 29 18:13:25 2005 +0000 r3619: Makefile fix. Signed-off-by: James Lentini commit 634b199218b775a8ed071c1faea519c4cc4ee4e3 Author: James Lentini Date: Wed Sep 28 21:50:13 2005 +0000 r3606: Fixes IA64 build problems (atomics) with the latest Redhat EL4.0 update and adds support for SuSe. Signed-off by: Arlin Davis Signed-off by: James Lentini commit 3a23c7135905666ff969b86dab3e90f90ac73008 Author: Robert Walsh Date: Tue Sep 27 16:59:14 2005 +0000 r3567: Setup svn:ignore on a bunch of directories. commit d41ea62125636a58e8748871e372810c09865b0a Author: James Lentini Date: Thu Sep 22 21:24:38 2005 +0000 r3525: Improve dtest and measure RDMA reads Signed-off by: Arlin Davis Signed-off-by: James Lentini commit 32258d13af6aaf76078ec6ba187d8129a0f70397 Author: James Lentini Date: Wed Sep 21 19:54:07 2005 +0000 r3513: Temporary workaround for the RDMA read performance anomaly Signed-off by: Arlin Davis Signed-off by: James Lentini commit 990bdc4320809e0b989c90c24bef361c1bc91c7f Author: James Lentini Date: Tue Sep 20 17:00:37 2005 +0000 r3494: Moved dapl_evd_modify_cno.c to match SourceForge Signed-off-by: James Lentini commit 4509fb64fdbf99db7bdcaad4d8e3884718184d86 Author: James Lentini Date: Tue Sep 20 16:17:59 2005 +0000 r3493: Support ib_cm_init_qp_attr(), add cm event processing on a per device basis, and add copyrights for kDAPL cm work that was used in uDAPL. Signed-off by: Arlin Davis Signed-off by: James Lentini commit c1d45137c2e26024142f24207344e3e48a577b83 Author: Sean Hefty Date: Thu Sep 15 21:43:21 2005 +0000 r3453: Bind communication identifiers to a device to support device removal. Export per HCA CM devices to userspace. Signed-off-by: Sean Hefty commit 5146689f1dbbce01cc46e23d749c28828e7e3ca8 Author: James Lentini Date: Wed Sep 14 17:44:44 2005 +0000 r3432: Request address resolution using ATS. Signed-off-by: James Lentini commit 780b8237f2bf6884cf1abcc11190f97ed5c0a343 Author: James Lentini Date: Mon Sep 12 19:14:43 2005 +0000 r3378: Added DAPL documentation. Signed-off-by: James Lentini commit 8911b60eb16770d28907c14e45556444317dd276 Author: James Lentini Date: Mon Sep 12 19:10:13 2005 +0000 r3377: Removed executable premission. Signed-off-by: James Lentini commit dec4d2eafebdfe7e6b495a36dd16bd5a98417e04 Author: Sean Hefty Date: Fri Sep 9 21:51:58 2005 +0000 r3349: Update DAPL to match the verbs and CM event processing APIs. Signed-off-by: Sean Hefty Signed-off-by: James Lentini commit d06dcfd25e5d37310d089bcb7f3d3d75fcece75a Author: Arlin Davis Date: Tue Sep 6 19:34:46 2005 +0000 r3326: Changes to support async events. Also consolidated the uAT,uCM,uCQ threads into one processing thread. Signed-off-by: Arlin Davis Signed-off-by: James Lentini commit 1dd8c28ce515675ee8df37cc1596bca17587eaf6 Author: James Lentini Date: Mon Aug 29 15:07:44 2005 +0000 r3232: validate default settings so they don't exceed device maximums Signed-off by: Arlin Davis Signed-off by: James Lentini commit ac5308b4aac7de79a356439dfec2312faf7705ae Author: James Lentini Date: Mon Aug 29 14:15:23 2005 +0000 r3227: Support for ibv_query_port, device, and gid. Signed-off by: Arlin Davis Signed-off by: James Lentini commit ef8c7a3a4896487ff0d37a7d7234746c15fe5cf7 Author: Sean Hefty Date: Sun Aug 21 22:30:08 2005 +0000 r3143: - Add user specified context to all uCM events. Users will not retrieve any events associated with the context after destroying the corresponding cm_id. - Provide the ib_cm_init_qp_attr() call to userspace clients of the CM. This call may be used to set QP attributes properly before modifying the QP. - Fixes some error handling syncrhonization and cleanup issues. - Performs some minor code cleanup. - Replaces the ucm_simple test program with a userspace version of cmpost. - Updates DAPL to the new API. Signed-off-by: Sean Hefty commit ec0f86d7c55830c6dffded585c04754cc6ac2a83 Author: James Lentini Date: Tue Aug 16 14:10:13 2005 +0000 r3107: Removed unused debug counter macros Signed-off-by: James Lentini commit 49087ba27bd93769bb64d7ac5c454de1b94005bc Author: James Lentini Date: Tue Aug 16 14:07:42 2005 +0000 r3106: Implemented debug counters Signed-off by: Arlin Davis Signed-off by: James Lentini commit f98e3af7dfc56b288cc77a9103b90f8d6a927fc5 Author: James Lentini Date: Thu Aug 11 20:23:56 2005 +0000 r3072: Update from SourceForge DAPL: use the LMR context in calls to dapls_hash_remove() Signed-off-by: James Lentini commit 878e524c5cc63a62802d28fdc215a2b69ceb1141 Author: James Lentini Date: Thu Aug 11 20:07:06 2005 +0000 r3071: Updates from SourceForge DAPL: EVD updates Signed-off-by: James Lentini commit 8dc70f7d972615f40e624d8f1272e5e7c16ba34f Author: James Lentini Date: Thu Aug 11 19:57:40 2005 +0000 r3070: Update from SourceForge DAPL: set async evd to null in dapli_ia_release_hca Signed-off-by: James Lentini commit f2801ae6caf010d660fe302970dabddc8948e1bf Author: James Lentini Date: Thu Aug 11 19:46:39 2005 +0000 r3069: Updates from SourceForge DAPL: size EP IOV correctly Signed-off-by: James Lentini commit c87fd235eaf0b3a30e005422f7d347c406c14f2c Author: James Lentini Date: Thu Aug 11 19:35:05 2005 +0000 r3068: Update from SourceForge DAPL: removed duplicate ia pointer in SP structure and fixed the spelling of ib_hca_transport_t. Signed-off-by: James Lentini commit a88bebc09a9655e462b3d32dfddec823024eab59 Author: James Lentin Date: Thu Aug 11 19:24:56 2005 +0000 r3067: Update from SourceForge DAPL: use include guard Signed-off-by: James Lentin commit d2da08920de882a9a266f0606b81150c625fa003 Author: James Lentini Date: Thu Aug 11 19:21:56 2005 +0000 r3066: Update from SourceForge DAPL: optimization to dapl_ep_query Signed-off-by: James Lentini commit 4ca3b0cbc59227a90b5450eea1ffeeb91826dd6d Author: James Lentini Date: Thu Aug 11 18:39:34 2005 +0000 r3065: Update from DAPL SourceForge: indicate which handle is invalid Signed-off-by: James Lentini commit 6d8f34137776c32149251bdec493c017b399cd10 Author: James Lentini Date: Thu Aug 11 18:35:58 2005 +0000 r3064: Update from DAPL SourceForge: set ep param values. Signed-off-by: James Lentini commit 0f35002a1942303ff46cb9a2b70056f9a38aebdb Author: James Lentini Date: Thu Aug 11 18:33:47 2005 +0000 r3063: Updates from DAPL SourceForge: QP state and connection event fix. Signed-off-by: James Lentini commit 3fc876339693c6f0eed5e57780e5342f301bd95c Author: James Lentini Date: Thu Aug 11 18:23:33 2005 +0000 r3062: Update from DAPL SourceForge: remove unused DAPL_CNO_PROXY_CALL Signed-off-by: James Lentini commit 70f8e7a2e6bde4e757ddc8c7f59d3a5c6a13adf9 Author: Hal Rosenstock Date: Fri Aug 5 17:59:38 2005 +0000 r2989: Fix dtest makefile Signed-off-by: Hal Rosenstock Signed-off-by: James Lentini commit 864695cfef37d84359ada8838ab4cd4f4dafc6bb Author: James Lentini Date: Fri Aug 5 17:57:31 2005 +0000 r2988: Remove kernel directory. Signed-off-by: James Lentini commit 9c4e246a5baf43cadc6380e91fd5a6e319777278 Author: James Lentini Date: Fri Aug 5 17:56:56 2005 +0000 r2987: Remove kernel code directory. Signed-off-by: James Lentini commit 26706cb0de471ba47279de0cb949ba5a41de82cc Author: James Lentini Date: Fri Aug 5 16:41:12 2005 +0000 r2986: Add uDAPL to the trunk Signed-off-by: James Lentini commit 76aa2de7fe38a8595d88669842450084cfa88316 Author: Roland Dreier Date: Thu Nov 4 17:54:50 2004 +0000 r1139: Copy roland-merge branch to trunk commit 3bd72a559dfe22685aae33599c99d021d2ae4aca Author: Roland Dreier Date: Tue Jul 20 21:34:32 2004 +0000 r502: Move 2.6-only source away from trunk commit 4f05b6ed3fd1d14161664c677264846eeb51dba5 Author: Roland Dreier Date: Tue Jul 20 21:34:32 2004 +0000 r502: Move 2.6-only source away from trunk commit 6da8b951c069072a2afc6aba03a3dca2c44db022 Author: Roland Dreier Date: Tue Jul 20 01:41:16 2004 +0000 r497: Move 2.6-only tree to gen2 dapl-2.1.5/INSTALL000066400000000000000000000366051255317474200135140ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. dapl-2.1.5/LICENSE.txt000066400000000000000000000272601255317474200143030ustar00rootroot00000000000000Common Public License 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross- claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. dapl-2.1.5/LICENSE2.txt000066400000000000000000000027421255317474200143630ustar00rootroot00000000000000Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the Network Appliance, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dapl-2.1.5/LICENSE3.txt000066400000000000000000000423471255317474200143710ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. dapl-2.1.5/Makefile.am000077500000000000000000001036731255317474200145220ustar00rootroot00000000000000# $Id: $ ACLOCAL_AMFLAGS = -I m4 OSFLAGS = -DOS_RELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 + `uname -r | cut -f2 -d.`) # Check for RedHat, needed for ia64 udapl atomic operations (IA64_FETCHADD syntax) # and built-in atomics for RedHat EL5 if OS_SUSE11 OSFLAGS += -DSUSE_11 endif if EXT_TYPE_IB XFLAGS = -DDAT_EXTENSIONS XPROGRAMS = dapl/openib_common/ib_extensions.c XHEADERS = XDAT = dat/include/dat2/dat_ib_extensions.h XLIBS = if DEFINE_COUNTERS XFLAGS += -DDAPL_COUNTERS endif if COLL_TYPE_FCA XFLAGS += -DDAT_IB_COLLECTIVES -DDAT_FCA_PROVIDER XPROGRAMS += dapl/openib_common/collectives/fca_provider.c XHEADERS += dapl/openib_common/collectives/ib_collectives.h dapl/openib_common/collectives/fca_provider.h XLIBS += -lfca endif else XFLAGS = XPROGRAMS = XHEADERS = XDAT = XLIBS = endif if DAPL_USE_IBACM XLIBS += -lrdmacm endif if DEFINE_ATTR_LINK_LAYER XFLAGS += -DDEFINE_ATTR_LINK_LAYER endif if DEBUG AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAPL_DBG -DDAT_CONF="\"$(sysconfdir)/dat.conf\"" else AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_CONF="\"$(sysconfdir)/dat.conf\"" endif AM_CFLAGS += -DMPXYD_CONF="\"$(sysconfdir)/mpxyd.conf\"" AM_CFLAGS += -DPACKAGE_DATE=$$(date +'%Y%m%d') sysconf_DATA = doc/dat.conf datlibdir = $(libdir) if DEFINE_CMA dapllibofadir = $(libdir) endif if DEFINE_SCM daplliboscmdir = $(libdir) endif if DEFINE_UCM daplliboucmdir = $(libdir) endif if DEFINE_MCM dapllibomcmdir = $(libdir) endif datlib_LTLIBRARIES = dat/udat/libdat2.la if DEFINE_CMA dapllibofa_LTLIBRARIES = dapl/udapl/libdaplofa.la endif if DEFINE_SCM daplliboscm_LTLIBRARIES = dapl/udapl/libdaploscm.la endif if DEFINE_UCM daplliboucm_LTLIBRARIES = dapl/udapl/libdaploucm.la endif if DEFINE_MCM dapllibomcm_LTLIBRARIES = dapl/udapl/libdaplomcm.la endif dat_udat_libdat2_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -I$(srcdir)/dat/include/ -I$(srcdir)/dat/udat/ \ -I$(srcdir)/dat/udat/linux -I$(srcdir)/dat/common/ if DEFINE_CMA dapl_udapl_libdaplofa_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -DOPENIB -DCQ_WAIT_OBJECT \ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ -I$(srcdir)/dapl/openib_common \ -I$(srcdir)/dapl/openib_cma \ -I$(srcdir)/dapl/openib_cma/linux endif if DEFINE_SCM dapl_udapl_libdaploscm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -DOPENIB -DCQ_WAIT_OBJECT \ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ -I$(srcdir)/dapl/openib_common \ -I$(srcdir)/dapl/openib_scm \ -I$(srcdir)/dapl/openib_scm/linux endif if DEFINE_UCM dapl_udapl_libdaploucm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -DOPENIB -DCQ_WAIT_OBJECT \ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ -I$(srcdir)/dapl/openib_common \ -I$(srcdir)/dapl/openib_ucm \ -I$(srcdir)/dapl/openib_ucm/linux endif if DEFINE_MCM dapl_udapl_libdaplomcm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -DOPENIB -DCQ_WAIT_OBJECT \ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ -I$(srcdir)/dapl/openib_common \ -I$(srcdir)/dapl/svc \ -I$(srcdir)/dapl/openib_mcm \ -I$(srcdir)/dapl/openib_mcm/linux endif if HAVE_LD_VERSION_SCRIPT dat_version_script = -Wl,--version-script=$(srcdir)/dat/udat/libdat2.map if DEFINE_CMA daplofa_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplofa.map endif if DEFINE_SCM daploscm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploscm.map endif if DEFINE_UCM daploucm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploucm.map endif if DEFINE_MCM daplomcm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplomcm.map endif else dat_version_script = if DEFINE_CMA daplofa_version_script = endif if DEFINE_SCM daploscm_version_script = endif if DEFINE_UCM daploucm_version_script = endif if DEFINE_MCM daplopcm_version_script = endif endif # # uDAT: libdat2.so # dat_udat_libdat2_la_SOURCES = dat/udat/udat.c \ dat/udat/udat_api.c \ dat/udat/udat_sr_parser.c \ dat/udat/linux/dat_osd.c \ dat/common/dat_api.c \ dat/common/dat_dictionary.c \ dat/common/dat_strerror.c \ dat/common/dat_init.c \ dat/common/dat_dr.c \ dat/common/dat_sr.c dat_udat_libdat2_la_LDFLAGS = -version-info 2:0:0 $(dat_version_script) -ldl if DEFINE_CMA # # uDAPL OpenFabrics rdma_cm version: libdaplofa.so # dapl_udapl_libdaplofa_la_SOURCES = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c \ dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c \ dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c \ dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c \ dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c \ dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c \ dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c \ dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c \ dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c \ dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c \ dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c \ dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c \ dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c \ dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c \ dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c \ dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c \ dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c \ dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c \ dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c \ dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c \ dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c \ dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c \ dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c \ dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c \ dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c \ dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c \ dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c \ dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c \ dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c \ dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c \ dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c \ dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c \ dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c \ dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c \ dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c \ dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c \ dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c \ dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c \ dapl/openib_common/cq.c \ dapl/openib_common/qp.c \ dapl/openib_common/util.c \ dapl/openib_common/srq.c \ dapl/openib_cma/cm.c \ dapl/openib_cma/device.c $(XPROGRAMS) dapl_udapl_libdaplofa_la_LDFLAGS = -version-info 2:0:0 $(daplofa_version_script) \ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ -lpthread -libverbs -lrdmacm $(XLIBS) endif if DEFINE_SCM # # uDAPL OpenFabrics Socket CM version for IB: libdaplscm.so # dapl_udapl_libdaploscm_la_SOURCES = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c \ dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c \ dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c \ dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c \ dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c \ dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c \ dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c \ dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c \ dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c \ dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c \ dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c \ dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c \ dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c \ dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c \ dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c \ dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c \ dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c \ dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c \ dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c \ dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c \ dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c \ dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c \ dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c \ dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c \ dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c \ dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c \ dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c \ dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c \ dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c \ dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c \ dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c \ dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c \ dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c \ dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c \ dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c \ dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c \ dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c \ dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c \ dapl/openib_common/cq.c \ dapl/openib_common/qp.c \ dapl/openib_common/util.c \ dapl/openib_common/srq.c \ dapl/openib_scm/cm.c \ dapl/openib_scm/device.c $(XPROGRAMS) dapl_udapl_libdaploscm_la_LDFLAGS = -version-info 2:0:0 $(daploscm_version_script) \ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ -lpthread -libverbs $(XLIBS) endif if DEFINE_UCM # # uDAPL OpenFabrics UD CM version for IB: libdaplucm.so # dapl_udapl_libdaploucm_la_SOURCES = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c \ dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c \ dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c \ dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c \ dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c \ dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c \ dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c \ dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c \ dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c \ dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c \ dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c \ dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c \ dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c \ dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c \ dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c \ dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c \ dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c \ dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c \ dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c \ dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c \ dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c \ dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c \ dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c \ dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c \ dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c \ dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c \ dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c \ dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c \ dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c \ dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c \ dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c \ dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c \ dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c \ dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c \ dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c \ dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c \ dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c \ dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c \ dapl/openib_common/cq.c \ dapl/openib_common/qp.c \ dapl/openib_common/util.c \ dapl/openib_common/srq.c \ dapl/openib_ucm/cm.c \ dapl/openib_ucm/device.c $(XPROGRAMS) dapl_udapl_libdaploucm_la_LDFLAGS = -version-info 2:0:0 $(daploucm_version_script) \ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ -lpthread -libverbs $(XLIBS) endif if DEFINE_MCM # # uDAPL OpenFabrics MIC Proxy CM for IB: libdaplmcm.so # Proxy MIC Infiniband RDMA via SCIF using mpxyd server # dapl_udapl_libdaplomcm_la_SOURCES = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c \ dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c \ dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c \ dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c \ dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c \ dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c \ dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c \ dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c \ dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c \ dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c \ dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c \ dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c \ dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c \ dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c \ dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c \ dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c \ dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c \ dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c \ dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c \ dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c \ dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c \ dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c \ dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c \ dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c \ dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c \ dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c \ dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c \ dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c \ dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c \ dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c \ dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c \ dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c \ dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c \ dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c \ dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c \ dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c \ dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c \ dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c \ dapl/openib_common/cq.c \ dapl/openib_common/qp.c \ dapl/openib_common/util.c \ dapl/openib_common/srq.c \ dapl/openib_mcm/cm.c \ dapl/openib_mcm/mix.c \ dapl/openib_mcm/proxy.c \ dapl/openib_mcm/device.c $(XPROGRAMS) dapl_udapl_libdaplomcm_la_LDFLAGS = -version-info 2:0:0 $(daplomcm_version_script) \ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ -lpthread -libverbs -lscif $(XLIBS) endif libdatincludedir = $(includedir)/dat2 libdatinclude_HEADERS = dat/include/dat2/dat.h \ dat/include/dat2/dat_error.h \ dat/include/dat2/dat_platform_specific.h \ dat/include/dat2/dat_redirection.h \ dat/include/dat2/dat_registry.h \ dat/include/dat2/dat_vendor_specific.h \ dat/include/dat2/udat_config.h \ dat/include/dat2/udat.h \ dat/include/dat2/udat_redirection.h \ dat/include/dat2/udat_vendor_specific.h $(XDAT) man_MANS = man/dtest.1 man/dapltest.1 man/dat.conf.5 EXTRA_DIST = dat/common/dat_dictionary.h \ dat/common/dat_dr.h \ dat/common/dat_init.h \ dat/common/dat_sr.h \ dat/udat/udat_sr_parser.h \ dat/udat/linux/dat_osd.h \ dat/include/dat2/dat.h \ dat/include/dat2/dat_error.h \ dat/include/dat2/dat_platform_specific.h \ dat/include/dat2/dat_redirection.h \ dat/include/dat2/dat_registry.h \ dat/include/dat2/dat_vendor_specific.h \ dat/include/dat2/udat_config.h \ dat/include/dat2/udat.h \ dat/include/dat2/udat_redirection.h \ dat/include/dat2/udat_vendor_specific.h \ dat/include/dat2/dat_ib_extensions.h \ dapl/common/dapl_adapter_util.h \ dapl/common/dapl_cno_util.h \ dapl/common/dapl_cookie.h \ dapl/common/dapl_cr_util.h \ dapl/common/dapl_ep_util.h \ dapl/common/dapl_evd_util.h \ dapl/common/dapl_hash.h \ dapl/common/dapl_hca_util.h \ dapl/common/dapl_ia_util.h \ dapl/common/dapl_init.h \ dapl/common/dapl_lmr_util.h \ dapl/common/dapl_mr_util.h \ dapl/common/dapl_name_service.h \ dapl/common/dapl_provider.h \ dapl/common/dapl_pz_util.h \ dapl/common/dapl_ring_buffer_util.h \ dapl/common/dapl_rmr_util.h \ dapl/common/dapl_sp_util.h \ dapl/common/dapl_srq_util.h \ dapl/common/dapl_timer_util.h \ dapl/udapl/linux/dapl_osd.h \ dapl/include/dapl.h \ dapl/include/dapl_debug.h \ dapl/include/dapl_ipoib_names.h \ dapl/include/dapl_vendor.h \ dapl/openib_common/dapl_ib_dto.h \ dapl/openib_common/dapl_ib_common.h \ dapl/openib_common/dapl_mic_common.h \ dapl/openib_common/collectives/ib_collectives.h \ dapl/openib_common/collectives/fca_provider.h \ dapl/openib_cma/dapl_ib_util.h \ dapl/openib_cma/linux/openib_osd.h \ dapl/openib_scm/dapl_ib_util.h \ dapl/openib_scm/linux/openib_osd.h \ dapl/openib_ucm/dapl_ib_util.h \ dapl/openib_ucm/linux/openib_osd.h \ dapl/openib_mcm/dapl_ib_util.h \ dapl/openib_mcm/linux/openib_osd.h \ dapl/svc/mpxyd.h \ dat/udat/libdat2.map \ dapl/udapl/libdaplofa.map \ dapl/udapl/libdaploscm.map \ dapl/udapl/libdaploucm.map \ dapl/udapl/libdaplomcm.map \ README \ README.mcm \ LICENSE.txt \ LICENSE.txt \ LICENSE2.txt \ LICENSE3.txt \ doc/dat.conf \ doc/mpxyd.conf \ dapl.spec.in \ mpxyd.init.in \ $(man_MANS) \ test/dapltest/scripts/cl.sh \ test/dapltest/scripts/srv.sh \ test/dapltest/scripts/regress.sh \ test/dapltest/include/dapl_bpool.h \ test/dapltest/include/dapl_client_info.h \ test/dapltest/include/dapl_common.h \ test/dapltest/include/dapl_execute.h \ test/dapltest/include/dapl_fft_cmd.h \ test/dapltest/include/dapl_fft_util.h \ test/dapltest/include/dapl_getopt.h \ test/dapltest/include/dapl_global.h \ test/dapltest/include/dapl_limit_cmd.h \ test/dapltest/include/dapl_mdep.h \ test/dapltest/include/dapl_memlist.h \ test/dapltest/include/dapl_params.h \ test/dapltest/include/dapl_performance_cmd.h \ test/dapltest/include/dapl_performance_stats.h \ test/dapltest/include/dapl_performance_test.h \ test/dapltest/include/dapl_proto.h \ test/dapltest/include/dapl_quit_cmd.h \ test/dapltest/include/dapl_server_cmd.h \ test/dapltest/include/dapl_server_info.h \ test/dapltest/include/dapl_tdep.h \ test/dapltest/include/dapl_tdep_print.h \ test/dapltest/include/dapl_test_data.h \ test/dapltest/include/dapl_transaction_cmd.h \ test/dapltest/include/dapl_transaction_stats.h \ test/dapltest/include/dapl_transaction_test.h \ test/dapltest/include/dapl_version.h \ test/dapltest/mdep/linux/dapl_mdep_user.h if DEFINE_MCM sbin_PROGRAMS = svc/mpxyd svc_mpxyd_SOURCES = dapl/svc/mpxyd.c \ dapl/svc/util.c \ dapl/svc/mix.c \ dapl/svc/mcm.c \ dapl/svc/mpxy_out.c \ dapl/svc/mpxy_in.c svc_mpxyd_CFLAGS = $(AM_CFLAGS) -lscif -libverbs -lpthread -Idat/include -I$(srcdir)/dapl/openib_common sysconf_DATA += doc/mpxyd.conf install-exec-hook: install -D -m 755 mpxyd.init $(DESTDIR)$(sysconfdir)/init.d/mpxyd; echo %{_sbindir}/mpxyd > mcm-files echo %{_sysconfdir}/init.d/mpxyd >> mcm-files echo %{_sysconfdir}/mpxyd.conf >> mcm-files endif dist-hook: dapl.spec cp dapl.spec $(distdir)/ rpmcheck: dapl.spec dist mkdir -p rpmbuild/{SOURCES,BUILD,RPMS,SPECS,BUILDROOT} cp $(distdir).tar.gz rpmbuild/SOURCES srcrpms: rpmcheck rpmbuild -bs --define "_topdir ${PWD}/rpmbuild" dapl.spec rpms: rpmcheck rpmbuild -ba --define "_topdir ${PWD}/rpmbuild" dapl.spec SUBDIRS = . test/dtest test/dapltest dapl-2.1.5/Makefile.in000066400000000000000000030530071255317474200145260ustar00rootroot00000000000000# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # $Id: $ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # Check for RedHat, needed for ia64 udapl atomic operations (IA64_FETCHADD syntax) # and built-in atomics for RedHat EL5 @OS_SUSE11_TRUE@am__append_1 = -DSUSE_11 @DEFINE_COUNTERS_TRUE@@EXT_TYPE_IB_TRUE@am__append_2 = -DDAPL_COUNTERS @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__append_3 = -DDAT_IB_COLLECTIVES -DDAT_FCA_PROVIDER @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__append_4 = dapl/openib_common/collectives/fca_provider.c @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__append_5 = dapl/openib_common/collectives/ib_collectives.h dapl/openib_common/collectives/fca_provider.h @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__append_6 = -lfca @DAPL_USE_IBACM_TRUE@am__append_7 = -lrdmacm @DEFINE_ATTR_LINK_LAYER_TRUE@am__append_8 = -DDEFINE_ATTR_LINK_LAYER @DEFINE_MCM_TRUE@sbin_PROGRAMS = svc/mpxyd$(EXEEXT) @DEFINE_MCM_TRUE@am__append_9 = doc/mpxyd.conf subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in $(srcdir)/dapl.spec.in \ $(srcdir)/mpxyd.init.in $(top_srcdir)/config/depcomp \ $(am__libdatinclude_HEADERS_DIST) COPYING config/compile \ config/config.guess config/config.sub config/depcomp \ config/install-sh config/missing config/ltmain.sh \ $(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ $(top_srcdir)/config/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = dapl.spec mpxyd.init CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(dapllibofadir)" \ "$(DESTDIR)$(dapllibomcmdir)" "$(DESTDIR)$(daplliboscmdir)" \ "$(DESTDIR)$(daplliboucmdir)" "$(DESTDIR)$(datlibdir)" \ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(sysconfdir)" \ "$(DESTDIR)$(libdatincludedir)" LTLIBRARIES = $(dapllibofa_LTLIBRARIES) $(dapllibomcm_LTLIBRARIES) \ $(daplliboscm_LTLIBRARIES) $(daplliboucm_LTLIBRARIES) \ $(datlib_LTLIBRARIES) dapl_udapl_libdaplofa_la_LIBADD = am__dapl_udapl_libdaplofa_la_SOURCES_DIST = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c dapl/openib_common/cq.c \ dapl/openib_common/qp.c dapl/openib_common/util.c \ dapl/openib_common/srq.c dapl/openib_cma/cm.c \ dapl/openib_cma/device.c dapl/openib_common/ib_extensions.c \ dapl/openib_common/collectives/fca_provider.c @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__objects_1 = dapl_udapl_libdaplofa_la-fca_provider.lo @EXT_TYPE_IB_TRUE@am__objects_2 = \ @EXT_TYPE_IB_TRUE@ dapl_udapl_libdaplofa_la-ib_extensions.lo \ @EXT_TYPE_IB_TRUE@ $(am__objects_1) @DEFINE_CMA_TRUE@am_dapl_udapl_libdaplofa_la_OBJECTS = \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_init.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_wait.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_wait.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_disable.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_enable.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_osd.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cookie.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_accept.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_reject.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_callback.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_connect.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_reset.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_modify.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_resize.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_hash.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_hca_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ia_close.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ia_open.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ia_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ia_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_llist.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_mr_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_provider.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_sp_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_psp_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_psp_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_psp_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_pz_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_pz_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_pz_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_pz_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rmr_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rmr_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rmr_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rmr_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rsp_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rsp_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_rsp_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_cno_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_name_service.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_timer_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_create.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_free.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_query.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_resize.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_srq_util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_debug.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ia_ha.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_csp.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-mem.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-cq.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-qp.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-util.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-srq.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-cm.lo \ @DEFINE_CMA_TRUE@ dapl_udapl_libdaplofa_la-device.lo \ @DEFINE_CMA_TRUE@ $(am__objects_2) dapl_udapl_libdaplofa_la_OBJECTS = \ $(am_dapl_udapl_libdaplofa_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dapl_udapl_libdaplofa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) \ $(dapl_udapl_libdaplofa_la_LDFLAGS) $(LDFLAGS) -o $@ @DEFINE_CMA_TRUE@am_dapl_udapl_libdaplofa_la_rpath = -rpath \ @DEFINE_CMA_TRUE@ $(dapllibofadir) am__dirstamp = $(am__leading_dot)dirstamp dapl_udapl_libdaplomcm_la_LIBADD = am__dapl_udapl_libdaplomcm_la_SOURCES_DIST = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c dapl/openib_common/cq.c \ dapl/openib_common/qp.c dapl/openib_common/util.c \ dapl/openib_common/srq.c dapl/openib_mcm/cm.c \ dapl/openib_mcm/mix.c dapl/openib_mcm/proxy.c \ dapl/openib_mcm/device.c dapl/openib_common/ib_extensions.c \ dapl/openib_common/collectives/fca_provider.c @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__objects_3 = dapl_udapl_libdaplomcm_la-fca_provider.lo @EXT_TYPE_IB_TRUE@am__objects_4 = \ @EXT_TYPE_IB_TRUE@ dapl_udapl_libdaplomcm_la-ib_extensions.lo \ @EXT_TYPE_IB_TRUE@ $(am__objects_3) @DEFINE_MCM_TRUE@am_dapl_udapl_libdaplomcm_la_OBJECTS = \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_init.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_osd.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cookie.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_hash.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_hca_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ia_close.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ia_open.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ia_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ia_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_llist.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_mr_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_provider.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_sp_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_psp_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_psp_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_psp_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_pz_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_pz_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_pz_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_pz_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_cno_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_name_service.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_timer_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_create.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_free.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_query.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_srq_util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_debug.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_csp.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-mem.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-cq.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-qp.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-util.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-srq.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-cm.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-mix.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-proxy.lo \ @DEFINE_MCM_TRUE@ dapl_udapl_libdaplomcm_la-device.lo \ @DEFINE_MCM_TRUE@ $(am__objects_4) dapl_udapl_libdaplomcm_la_OBJECTS = \ $(am_dapl_udapl_libdaplomcm_la_OBJECTS) dapl_udapl_libdaplomcm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) \ $(dapl_udapl_libdaplomcm_la_LDFLAGS) $(LDFLAGS) -o $@ @DEFINE_MCM_TRUE@am_dapl_udapl_libdaplomcm_la_rpath = -rpath \ @DEFINE_MCM_TRUE@ $(dapllibomcmdir) dapl_udapl_libdaploscm_la_LIBADD = am__dapl_udapl_libdaploscm_la_SOURCES_DIST = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c dapl/openib_common/cq.c \ dapl/openib_common/qp.c dapl/openib_common/util.c \ dapl/openib_common/srq.c dapl/openib_scm/cm.c \ dapl/openib_scm/device.c dapl/openib_common/ib_extensions.c \ dapl/openib_common/collectives/fca_provider.c @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__objects_5 = dapl_udapl_libdaploscm_la-fca_provider.lo @EXT_TYPE_IB_TRUE@am__objects_6 = \ @EXT_TYPE_IB_TRUE@ dapl_udapl_libdaploscm_la-ib_extensions.lo \ @EXT_TYPE_IB_TRUE@ $(am__objects_5) @DEFINE_SCM_TRUE@am_dapl_udapl_libdaploscm_la_OBJECTS = \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_init.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_wait.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_wait.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_disable.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_enable.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_osd.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cookie.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_accept.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_reject.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_callback.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_connect.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_reset.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_modify.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_resize.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_hash.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_hca_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ia_close.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ia_open.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ia_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ia_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_llist.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_mr_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_provider.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_sp_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_psp_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_psp_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_psp_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_pz_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_pz_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_pz_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_pz_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rmr_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rmr_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rmr_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rmr_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rsp_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rsp_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_rsp_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_cno_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_name_service.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_timer_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_create.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_free.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_query.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_resize.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_srq_util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_debug.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ia_ha.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_csp.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-mem.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-cq.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-qp.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-util.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-srq.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-cm.lo \ @DEFINE_SCM_TRUE@ dapl_udapl_libdaploscm_la-device.lo \ @DEFINE_SCM_TRUE@ $(am__objects_6) dapl_udapl_libdaploscm_la_OBJECTS = \ $(am_dapl_udapl_libdaploscm_la_OBJECTS) dapl_udapl_libdaploscm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) \ $(dapl_udapl_libdaploscm_la_LDFLAGS) $(LDFLAGS) -o $@ @DEFINE_SCM_TRUE@am_dapl_udapl_libdaploscm_la_rpath = -rpath \ @DEFINE_SCM_TRUE@ $(daplliboscmdir) dapl_udapl_libdaploucm_la_LIBADD = am__dapl_udapl_libdaploucm_la_SOURCES_DIST = dapl/udapl/dapl_init.c \ dapl/udapl/dapl_evd_create.c dapl/udapl/dapl_evd_query.c \ dapl/udapl/dapl_cno_create.c \ dapl/udapl/dapl_cno_modify_agent.c dapl/udapl/dapl_cno_free.c \ dapl/udapl/dapl_cno_wait.c dapl/udapl/dapl_cno_query.c \ dapl/udapl/dapl_lmr_create.c dapl/udapl/dapl_evd_wait.c \ dapl/udapl/dapl_evd_disable.c dapl/udapl/dapl_evd_enable.c \ dapl/udapl/dapl_evd_modify_cno.c \ dapl/udapl/dapl_evd_set_unwaitable.c \ dapl/udapl/dapl_evd_clear_unwaitable.c \ dapl/udapl/linux/dapl_osd.c dapl/common/dapl_cookie.c \ dapl/common/dapl_cr_accept.c dapl/common/dapl_cr_query.c \ dapl/common/dapl_cr_reject.c dapl/common/dapl_cr_util.c \ dapl/common/dapl_cr_callback.c dapl/common/dapl_cr_handoff.c \ dapl/common/dapl_ep_connect.c dapl/common/dapl_ep_create.c \ dapl/common/dapl_ep_disconnect.c \ dapl/common/dapl_ep_dup_connect.c dapl/common/dapl_ep_free.c \ dapl/common/dapl_ep_reset.c dapl/common/dapl_ep_get_status.c \ dapl/common/dapl_ep_modify.c \ dapl/common/dapl_ep_post_rdma_read.c \ dapl/common/dapl_ep_post_rdma_write.c \ dapl/common/dapl_ep_post_recv.c \ dapl/common/dapl_ep_post_send.c dapl/common/dapl_ep_query.c \ dapl/common/dapl_ep_util.c dapl/common/dapl_evd_dequeue.c \ dapl/common/dapl_evd_free.c dapl/common/dapl_evd_post_se.c \ dapl/common/dapl_evd_resize.c dapl/common/dapl_evd_util.c \ dapl/common/dapl_evd_cq_async_error_callb.c \ dapl/common/dapl_evd_qp_async_error_callb.c \ dapl/common/dapl_evd_un_async_error_callb.c \ dapl/common/dapl_evd_connection_callb.c \ dapl/common/dapl_evd_dto_callb.c \ dapl/common/dapl_get_consumer_context.c \ dapl/common/dapl_get_handle_type.c dapl/common/dapl_hash.c \ dapl/common/dapl_hca_util.c dapl/common/dapl_ia_close.c \ dapl/common/dapl_ia_open.c dapl/common/dapl_ia_query.c \ dapl/common/dapl_ia_util.c dapl/common/dapl_llist.c \ dapl/common/dapl_lmr_free.c dapl/common/dapl_lmr_query.c \ dapl/common/dapl_lmr_util.c \ dapl/common/dapl_lmr_sync_rdma_read.c \ dapl/common/dapl_lmr_sync_rdma_write.c \ dapl/common/dapl_mr_util.c dapl/common/dapl_provider.c \ dapl/common/dapl_sp_util.c dapl/common/dapl_psp_create.c \ dapl/common/dapl_psp_create_any.c dapl/common/dapl_psp_free.c \ dapl/common/dapl_psp_query.c dapl/common/dapl_pz_create.c \ dapl/common/dapl_pz_free.c dapl/common/dapl_pz_query.c \ dapl/common/dapl_pz_util.c dapl/common/dapl_rmr_create.c \ dapl/common/dapl_rmr_free.c dapl/common/dapl_rmr_bind.c \ dapl/common/dapl_rmr_query.c dapl/common/dapl_rmr_util.c \ dapl/common/dapl_rsp_create.c dapl/common/dapl_rsp_free.c \ dapl/common/dapl_rsp_query.c dapl/common/dapl_cno_util.c \ dapl/common/dapl_set_consumer_context.c \ dapl/common/dapl_ring_buffer_util.c \ dapl/common/dapl_name_service.c dapl/common/dapl_timer_util.c \ dapl/common/dapl_ep_create_with_srq.c \ dapl/common/dapl_ep_recv_query.c \ dapl/common/dapl_ep_set_watermark.c \ dapl/common/dapl_srq_create.c dapl/common/dapl_srq_free.c \ dapl/common/dapl_srq_query.c dapl/common/dapl_srq_resize.c \ dapl/common/dapl_srq_post_recv.c dapl/common/dapl_srq_set_lw.c \ dapl/common/dapl_srq_util.c dapl/common/dapl_debug.c \ dapl/common/dapl_ia_ha.c dapl/common/dapl_csp.c \ dapl/common/dapl_ep_post_send_invalidate.c \ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ dapl/openib_common/mem.c dapl/openib_common/cq.c \ dapl/openib_common/qp.c dapl/openib_common/util.c \ dapl/openib_common/srq.c dapl/openib_ucm/cm.c \ dapl/openib_ucm/device.c dapl/openib_common/ib_extensions.c \ dapl/openib_common/collectives/fca_provider.c @COLL_TYPE_FCA_TRUE@@EXT_TYPE_IB_TRUE@am__objects_7 = dapl_udapl_libdaploucm_la-fca_provider.lo @EXT_TYPE_IB_TRUE@am__objects_8 = \ @EXT_TYPE_IB_TRUE@ dapl_udapl_libdaploucm_la-ib_extensions.lo \ @EXT_TYPE_IB_TRUE@ $(am__objects_7) @DEFINE_UCM_TRUE@am_dapl_udapl_libdaploucm_la_OBJECTS = \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_init.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_wait.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_wait.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_disable.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_enable.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_osd.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cookie.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_accept.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_reject.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_callback.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_connect.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_reset.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_modify.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_resize.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_hash.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_hca_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ia_close.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ia_open.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ia_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ia_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_llist.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_mr_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_provider.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_sp_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_psp_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_psp_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_psp_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_pz_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_pz_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_pz_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_pz_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rmr_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rmr_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rmr_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rmr_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rsp_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rsp_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_rsp_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_cno_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_name_service.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_timer_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_create.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_free.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_query.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_resize.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_srq_util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_debug.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ia_ha.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_csp.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-mem.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-cq.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-qp.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-util.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-srq.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-cm.lo \ @DEFINE_UCM_TRUE@ dapl_udapl_libdaploucm_la-device.lo \ @DEFINE_UCM_TRUE@ $(am__objects_8) dapl_udapl_libdaploucm_la_OBJECTS = \ $(am_dapl_udapl_libdaploucm_la_OBJECTS) dapl_udapl_libdaploucm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) \ $(dapl_udapl_libdaploucm_la_LDFLAGS) $(LDFLAGS) -o $@ @DEFINE_UCM_TRUE@am_dapl_udapl_libdaploucm_la_rpath = -rpath \ @DEFINE_UCM_TRUE@ $(daplliboucmdir) dat_udat_libdat2_la_LIBADD = am_dat_udat_libdat2_la_OBJECTS = dat_udat_libdat2_la-udat.lo \ dat_udat_libdat2_la-udat_api.lo \ dat_udat_libdat2_la-udat_sr_parser.lo \ dat_udat_libdat2_la-dat_osd.lo dat_udat_libdat2_la-dat_api.lo \ dat_udat_libdat2_la-dat_dictionary.lo \ dat_udat_libdat2_la-dat_strerror.lo \ dat_udat_libdat2_la-dat_init.lo dat_udat_libdat2_la-dat_dr.lo \ dat_udat_libdat2_la-dat_sr.lo dat_udat_libdat2_la_OBJECTS = $(am_dat_udat_libdat2_la_OBJECTS) dat_udat_libdat2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) \ $(dat_udat_libdat2_la_LDFLAGS) $(LDFLAGS) -o $@ PROGRAMS = $(sbin_PROGRAMS) am__svc_mpxyd_SOURCES_DIST = dapl/svc/mpxyd.c dapl/svc/util.c \ dapl/svc/mix.c dapl/svc/mcm.c dapl/svc/mpxy_out.c \ dapl/svc/mpxy_in.c @DEFINE_MCM_TRUE@am_svc_mpxyd_OBJECTS = svc_mpxyd-mpxyd.$(OBJEXT) \ @DEFINE_MCM_TRUE@ svc_mpxyd-util.$(OBJEXT) \ @DEFINE_MCM_TRUE@ svc_mpxyd-mix.$(OBJEXT) \ @DEFINE_MCM_TRUE@ svc_mpxyd-mcm.$(OBJEXT) \ @DEFINE_MCM_TRUE@ svc_mpxyd-mpxy_out.$(OBJEXT) \ @DEFINE_MCM_TRUE@ svc_mpxyd-mpxy_in.$(OBJEXT) svc_mpxyd_OBJECTS = $(am_svc_mpxyd_OBJECTS) svc_mpxyd_LDADD = $(LDADD) svc_mpxyd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(svc_mpxyd_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dapl_udapl_libdaplofa_la_SOURCES) \ $(dapl_udapl_libdaplomcm_la_SOURCES) \ $(dapl_udapl_libdaploscm_la_SOURCES) \ $(dapl_udapl_libdaploucm_la_SOURCES) \ $(dat_udat_libdat2_la_SOURCES) $(svc_mpxyd_SOURCES) DIST_SOURCES = $(am__dapl_udapl_libdaplofa_la_SOURCES_DIST) \ $(am__dapl_udapl_libdaplomcm_la_SOURCES_DIST) \ $(am__dapl_udapl_libdaploscm_la_SOURCES_DIST) \ $(am__dapl_udapl_libdaploucm_la_SOURCES_DIST) \ $(dat_udat_libdat2_la_SOURCES) $(am__svc_mpxyd_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 man5dir = $(mandir)/man5 NROFF = nroff MANS = $(man_MANS) DATA = $(sysconf_DATA) am__libdatinclude_HEADERS_DIST = dat/include/dat2/dat.h \ dat/include/dat2/dat_error.h \ dat/include/dat2/dat_platform_specific.h \ dat/include/dat2/dat_redirection.h \ dat/include/dat2/dat_registry.h \ dat/include/dat2/dat_vendor_specific.h \ dat/include/dat2/udat_config.h dat/include/dat2/udat.h \ dat/include/dat2/udat_redirection.h \ dat/include/dat2/udat_vendor_specific.h \ dat/include/dat2/dat_ib_extensions.h HEADERS = $(libdatinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 OSFLAGS = -DOS_RELEASE=$(shell expr `uname -r | cut -f1 -d.` \* 65536 \ + `uname -r | cut -f2 -d.`) $(am__append_1) @EXT_TYPE_IB_FALSE@XFLAGS = $(am__append_8) @EXT_TYPE_IB_TRUE@XFLAGS = -DDAT_EXTENSIONS $(am__append_2) \ @EXT_TYPE_IB_TRUE@ $(am__append_3) $(am__append_8) @EXT_TYPE_IB_FALSE@XPROGRAMS = @EXT_TYPE_IB_TRUE@XPROGRAMS = dapl/openib_common/ib_extensions.c \ @EXT_TYPE_IB_TRUE@ $(am__append_4) @EXT_TYPE_IB_FALSE@XHEADERS = @EXT_TYPE_IB_TRUE@XHEADERS = $(am__append_5) @EXT_TYPE_IB_FALSE@XDAT = @EXT_TYPE_IB_TRUE@XDAT = dat/include/dat2/dat_ib_extensions.h @EXT_TYPE_IB_FALSE@XLIBS = $(am__append_7) @EXT_TYPE_IB_TRUE@XLIBS = $(am__append_6) $(am__append_7) @DEBUG_FALSE@AM_CFLAGS = -g -Wall -D_GNU_SOURCE \ @DEBUG_FALSE@ -DDAT_CONF="\"$(sysconfdir)/dat.conf\"" \ @DEBUG_FALSE@ -DMPXYD_CONF="\"$(sysconfdir)/mpxyd.conf\"" \ @DEBUG_FALSE@ -DPACKAGE_DATE=$$(date +'%Y%m%d') @DEBUG_TRUE@AM_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAPL_DBG \ @DEBUG_TRUE@ -DDAT_CONF="\"$(sysconfdir)/dat.conf\"" \ @DEBUG_TRUE@ -DMPXYD_CONF="\"$(sysconfdir)/mpxyd.conf\"" \ @DEBUG_TRUE@ -DPACKAGE_DATE=$$(date +'%Y%m%d') sysconf_DATA = doc/dat.conf $(am__append_9) datlibdir = $(libdir) @DEFINE_CMA_TRUE@dapllibofadir = $(libdir) @DEFINE_SCM_TRUE@daplliboscmdir = $(libdir) @DEFINE_UCM_TRUE@daplliboucmdir = $(libdir) @DEFINE_MCM_TRUE@dapllibomcmdir = $(libdir) datlib_LTLIBRARIES = dat/udat/libdat2.la @DEFINE_CMA_TRUE@dapllibofa_LTLIBRARIES = dapl/udapl/libdaplofa.la @DEFINE_SCM_TRUE@daplliboscm_LTLIBRARIES = dapl/udapl/libdaploscm.la @DEFINE_UCM_TRUE@daplliboucm_LTLIBRARIES = dapl/udapl/libdaploucm.la @DEFINE_MCM_TRUE@dapllibomcm_LTLIBRARIES = dapl/udapl/libdaplomcm.la dat_udat_libdat2_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ -I$(srcdir)/dat/include/ -I$(srcdir)/dat/udat/ \ -I$(srcdir)/dat/udat/linux -I$(srcdir)/dat/common/ @DEFINE_CMA_TRUE@dapl_udapl_libdaplofa_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ @DEFINE_CMA_TRUE@ -DOPENIB -DCQ_WAIT_OBJECT \ @DEFINE_CMA_TRUE@ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ @DEFINE_CMA_TRUE@ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ @DEFINE_CMA_TRUE@ -I$(srcdir)/dapl/openib_common \ @DEFINE_CMA_TRUE@ -I$(srcdir)/dapl/openib_cma \ @DEFINE_CMA_TRUE@ -I$(srcdir)/dapl/openib_cma/linux @DEFINE_SCM_TRUE@dapl_udapl_libdaploscm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ @DEFINE_SCM_TRUE@ -DOPENIB -DCQ_WAIT_OBJECT \ @DEFINE_SCM_TRUE@ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ @DEFINE_SCM_TRUE@ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ @DEFINE_SCM_TRUE@ -I$(srcdir)/dapl/openib_common \ @DEFINE_SCM_TRUE@ -I$(srcdir)/dapl/openib_scm \ @DEFINE_SCM_TRUE@ -I$(srcdir)/dapl/openib_scm/linux @DEFINE_UCM_TRUE@dapl_udapl_libdaploucm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ @DEFINE_UCM_TRUE@ -DOPENIB -DCQ_WAIT_OBJECT \ @DEFINE_UCM_TRUE@ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ @DEFINE_UCM_TRUE@ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ @DEFINE_UCM_TRUE@ -I$(srcdir)/dapl/openib_common \ @DEFINE_UCM_TRUE@ -I$(srcdir)/dapl/openib_ucm \ @DEFINE_UCM_TRUE@ -I$(srcdir)/dapl/openib_ucm/linux @DEFINE_MCM_TRUE@dapl_udapl_libdaplomcm_la_CFLAGS = $(AM_CFLAGS) -D_GNU_SOURCE $(OSFLAGS) $(XFLAGS) \ @DEFINE_MCM_TRUE@ -DOPENIB -DCQ_WAIT_OBJECT \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dat/include/ -I$(srcdir)/dapl/include/ \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dapl/common -I$(srcdir)/dapl/udapl/linux \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dapl/openib_common \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dapl/svc \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dapl/openib_mcm \ @DEFINE_MCM_TRUE@ -I$(srcdir)/dapl/openib_mcm/linux @HAVE_LD_VERSION_SCRIPT_FALSE@dat_version_script = @HAVE_LD_VERSION_SCRIPT_TRUE@dat_version_script = -Wl,--version-script=$(srcdir)/dat/udat/libdat2.map @DEFINE_CMA_TRUE@@HAVE_LD_VERSION_SCRIPT_FALSE@daplofa_version_script = @DEFINE_CMA_TRUE@@HAVE_LD_VERSION_SCRIPT_TRUE@daplofa_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplofa.map @DEFINE_SCM_TRUE@@HAVE_LD_VERSION_SCRIPT_FALSE@daploscm_version_script = @DEFINE_SCM_TRUE@@HAVE_LD_VERSION_SCRIPT_TRUE@daploscm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploscm.map @DEFINE_UCM_TRUE@@HAVE_LD_VERSION_SCRIPT_FALSE@daploucm_version_script = @DEFINE_UCM_TRUE@@HAVE_LD_VERSION_SCRIPT_TRUE@daploucm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaploucm.map @DEFINE_MCM_TRUE@@HAVE_LD_VERSION_SCRIPT_TRUE@daplomcm_version_script = -Wl,--version-script=$(srcdir)/dapl/udapl/libdaplomcm.map @DEFINE_MCM_TRUE@@HAVE_LD_VERSION_SCRIPT_FALSE@daplopcm_version_script = # # uDAT: libdat2.so # dat_udat_libdat2_la_SOURCES = dat/udat/udat.c \ dat/udat/udat_api.c \ dat/udat/udat_sr_parser.c \ dat/udat/linux/dat_osd.c \ dat/common/dat_api.c \ dat/common/dat_dictionary.c \ dat/common/dat_strerror.c \ dat/common/dat_init.c \ dat/common/dat_dr.c \ dat/common/dat_sr.c dat_udat_libdat2_la_LDFLAGS = -version-info 2:0:0 $(dat_version_script) -ldl # # uDAPL OpenFabrics rdma_cm version: libdaplofa.so # @DEFINE_CMA_TRUE@dapl_udapl_libdaplofa_la_SOURCES = dapl/udapl/dapl_init.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_create.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_query.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_cno_create.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_cno_modify_agent.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_cno_free.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_cno_wait.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_cno_query.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_lmr_create.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_wait.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_disable.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_enable.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_modify_cno.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_set_unwaitable.c \ @DEFINE_CMA_TRUE@ dapl/udapl/dapl_evd_clear_unwaitable.c \ @DEFINE_CMA_TRUE@ dapl/udapl/linux/dapl_osd.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cookie.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_accept.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_reject.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_callback.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cr_handoff.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_connect.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_disconnect.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_dup_connect.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_reset.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_get_status.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_modify.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_rdma_read.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_rdma_write.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_recv.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_send.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_dequeue.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_post_se.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_resize.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_cq_async_error_callb.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_qp_async_error_callb.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_un_async_error_callb.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_connection_callb.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_evd_dto_callb.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_get_consumer_context.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_get_handle_type.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_hash.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_hca_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ia_close.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ia_open.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ia_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ia_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_llist.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_lmr_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_lmr_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_lmr_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_lmr_sync_rdma_read.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_lmr_sync_rdma_write.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_mr_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_provider.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_sp_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_psp_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_psp_create_any.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_psp_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_psp_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_pz_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_pz_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_pz_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_pz_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rmr_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rmr_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rmr_bind.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rmr_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rmr_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rsp_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rsp_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_rsp_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_cno_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_set_consumer_context.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ring_buffer_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_name_service.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_timer_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_create_with_srq.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_recv_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_set_watermark.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_create.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_free.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_query.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_resize.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_post_recv.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_set_lw.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_srq_util.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_debug.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ia_ha.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_csp.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_send_invalidate.c \ @DEFINE_CMA_TRUE@ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ @DEFINE_CMA_TRUE@ dapl/openib_common/mem.c \ @DEFINE_CMA_TRUE@ dapl/openib_common/cq.c \ @DEFINE_CMA_TRUE@ dapl/openib_common/qp.c \ @DEFINE_CMA_TRUE@ dapl/openib_common/util.c \ @DEFINE_CMA_TRUE@ dapl/openib_common/srq.c \ @DEFINE_CMA_TRUE@ dapl/openib_cma/cm.c \ @DEFINE_CMA_TRUE@ dapl/openib_cma/device.c $(XPROGRAMS) @DEFINE_CMA_TRUE@dapl_udapl_libdaplofa_la_LDFLAGS = -version-info 2:0:0 $(daplofa_version_script) \ @DEFINE_CMA_TRUE@ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ @DEFINE_CMA_TRUE@ -lpthread -libverbs -lrdmacm $(XLIBS) # # uDAPL OpenFabrics Socket CM version for IB: libdaplscm.so # @DEFINE_SCM_TRUE@dapl_udapl_libdaploscm_la_SOURCES = dapl/udapl/dapl_init.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_create.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_query.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_cno_create.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_cno_modify_agent.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_cno_free.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_cno_wait.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_cno_query.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_lmr_create.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_wait.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_disable.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_enable.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_modify_cno.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_set_unwaitable.c \ @DEFINE_SCM_TRUE@ dapl/udapl/dapl_evd_clear_unwaitable.c \ @DEFINE_SCM_TRUE@ dapl/udapl/linux/dapl_osd.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cookie.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_accept.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_reject.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_callback.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cr_handoff.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_connect.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_disconnect.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_dup_connect.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_reset.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_get_status.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_modify.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_rdma_read.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_rdma_write.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_recv.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_send.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_dequeue.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_post_se.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_resize.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_cq_async_error_callb.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_qp_async_error_callb.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_un_async_error_callb.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_connection_callb.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_evd_dto_callb.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_get_consumer_context.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_get_handle_type.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_hash.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_hca_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ia_close.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ia_open.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ia_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ia_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_llist.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_lmr_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_lmr_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_lmr_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_read.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_write.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_mr_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_provider.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_sp_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_psp_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_psp_create_any.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_psp_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_psp_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_pz_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_pz_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_pz_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_pz_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rmr_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rmr_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rmr_bind.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rmr_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rmr_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rsp_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rsp_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_rsp_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_cno_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_set_consumer_context.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ring_buffer_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_name_service.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_timer_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_create_with_srq.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_recv_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_set_watermark.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_create.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_free.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_query.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_resize.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_post_recv.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_set_lw.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_srq_util.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_debug.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ia_ha.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_csp.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_send_invalidate.c \ @DEFINE_SCM_TRUE@ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ @DEFINE_SCM_TRUE@ dapl/openib_common/mem.c \ @DEFINE_SCM_TRUE@ dapl/openib_common/cq.c \ @DEFINE_SCM_TRUE@ dapl/openib_common/qp.c \ @DEFINE_SCM_TRUE@ dapl/openib_common/util.c \ @DEFINE_SCM_TRUE@ dapl/openib_common/srq.c \ @DEFINE_SCM_TRUE@ dapl/openib_scm/cm.c \ @DEFINE_SCM_TRUE@ dapl/openib_scm/device.c $(XPROGRAMS) @DEFINE_SCM_TRUE@dapl_udapl_libdaploscm_la_LDFLAGS = -version-info 2:0:0 $(daploscm_version_script) \ @DEFINE_SCM_TRUE@ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ @DEFINE_SCM_TRUE@ -lpthread -libverbs $(XLIBS) # # uDAPL OpenFabrics UD CM version for IB: libdaplucm.so # @DEFINE_UCM_TRUE@dapl_udapl_libdaploucm_la_SOURCES = dapl/udapl/dapl_init.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_create.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_query.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_cno_create.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_cno_modify_agent.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_cno_free.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_cno_wait.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_cno_query.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_lmr_create.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_wait.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_disable.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_enable.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_modify_cno.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_set_unwaitable.c \ @DEFINE_UCM_TRUE@ dapl/udapl/dapl_evd_clear_unwaitable.c \ @DEFINE_UCM_TRUE@ dapl/udapl/linux/dapl_osd.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cookie.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_accept.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_reject.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_callback.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cr_handoff.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_connect.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_disconnect.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_dup_connect.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_reset.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_get_status.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_modify.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_rdma_read.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_rdma_write.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_recv.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_send.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_dequeue.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_post_se.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_resize.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_cq_async_error_callb.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_qp_async_error_callb.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_un_async_error_callb.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_connection_callb.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_evd_dto_callb.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_get_consumer_context.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_get_handle_type.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_hash.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_hca_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ia_close.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ia_open.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ia_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ia_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_llist.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_lmr_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_lmr_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_lmr_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_read.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_write.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_mr_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_provider.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_sp_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_psp_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_psp_create_any.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_psp_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_psp_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_pz_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_pz_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_pz_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_pz_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rmr_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rmr_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rmr_bind.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rmr_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rmr_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rsp_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rsp_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_rsp_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_cno_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_set_consumer_context.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ring_buffer_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_name_service.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_timer_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_create_with_srq.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_recv_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_set_watermark.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_create.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_free.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_query.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_resize.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_post_recv.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_set_lw.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_srq_util.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_debug.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ia_ha.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_csp.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_send_invalidate.c \ @DEFINE_UCM_TRUE@ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ @DEFINE_UCM_TRUE@ dapl/openib_common/mem.c \ @DEFINE_UCM_TRUE@ dapl/openib_common/cq.c \ @DEFINE_UCM_TRUE@ dapl/openib_common/qp.c \ @DEFINE_UCM_TRUE@ dapl/openib_common/util.c \ @DEFINE_UCM_TRUE@ dapl/openib_common/srq.c \ @DEFINE_UCM_TRUE@ dapl/openib_ucm/cm.c \ @DEFINE_UCM_TRUE@ dapl/openib_ucm/device.c $(XPROGRAMS) @DEFINE_UCM_TRUE@dapl_udapl_libdaploucm_la_LDFLAGS = -version-info 2:0:0 $(daploucm_version_script) \ @DEFINE_UCM_TRUE@ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ @DEFINE_UCM_TRUE@ -lpthread -libverbs $(XLIBS) # # uDAPL OpenFabrics MIC Proxy CM for IB: libdaplmcm.so # Proxy MIC Infiniband RDMA via SCIF using mpxyd server # @DEFINE_MCM_TRUE@dapl_udapl_libdaplomcm_la_SOURCES = dapl/udapl/dapl_init.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_create.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_query.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_cno_create.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_cno_modify_agent.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_cno_free.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_cno_wait.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_cno_query.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_lmr_create.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_wait.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_disable.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_enable.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_modify_cno.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_set_unwaitable.c \ @DEFINE_MCM_TRUE@ dapl/udapl/dapl_evd_clear_unwaitable.c \ @DEFINE_MCM_TRUE@ dapl/udapl/linux/dapl_osd.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cookie.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_accept.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_reject.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_callback.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cr_handoff.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_connect.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_disconnect.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_dup_connect.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_reset.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_get_status.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_modify.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_rdma_read.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_rdma_write.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_recv.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_send.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_dequeue.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_post_se.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_resize.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_cq_async_error_callb.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_qp_async_error_callb.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_un_async_error_callb.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_connection_callb.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_evd_dto_callb.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_get_consumer_context.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_get_handle_type.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_hash.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_hca_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ia_close.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ia_open.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ia_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ia_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_llist.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_lmr_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_lmr_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_lmr_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_read.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_lmr_sync_rdma_write.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_mr_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_provider.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_sp_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_psp_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_psp_create_any.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_psp_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_psp_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_pz_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_pz_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_pz_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_pz_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rmr_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rmr_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rmr_bind.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rmr_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rmr_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rsp_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rsp_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_rsp_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_cno_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_set_consumer_context.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ring_buffer_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_name_service.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_timer_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_create_with_srq.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_recv_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_set_watermark.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_create.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_free.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_query.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_resize.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_post_recv.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_set_lw.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_srq_util.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_debug.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ia_ha.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_csp.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_send_invalidate.c \ @DEFINE_MCM_TRUE@ dapl/common/dapl_ep_post_rdma_read_to_rmr.c \ @DEFINE_MCM_TRUE@ dapl/openib_common/mem.c \ @DEFINE_MCM_TRUE@ dapl/openib_common/cq.c \ @DEFINE_MCM_TRUE@ dapl/openib_common/qp.c \ @DEFINE_MCM_TRUE@ dapl/openib_common/util.c \ @DEFINE_MCM_TRUE@ dapl/openib_common/srq.c \ @DEFINE_MCM_TRUE@ dapl/openib_mcm/cm.c \ @DEFINE_MCM_TRUE@ dapl/openib_mcm/mix.c \ @DEFINE_MCM_TRUE@ dapl/openib_mcm/proxy.c \ @DEFINE_MCM_TRUE@ dapl/openib_mcm/device.c $(XPROGRAMS) @DEFINE_MCM_TRUE@dapl_udapl_libdaplomcm_la_LDFLAGS = -version-info 2:0:0 $(daplomcm_version_script) \ @DEFINE_MCM_TRUE@ -Wl,-init,dapl_init -Wl,-fini,dapl_fini \ @DEFINE_MCM_TRUE@ -lpthread -libverbs -lscif $(XLIBS) libdatincludedir = $(includedir)/dat2 libdatinclude_HEADERS = dat/include/dat2/dat.h \ dat/include/dat2/dat_error.h \ dat/include/dat2/dat_platform_specific.h \ dat/include/dat2/dat_redirection.h \ dat/include/dat2/dat_registry.h \ dat/include/dat2/dat_vendor_specific.h \ dat/include/dat2/udat_config.h \ dat/include/dat2/udat.h \ dat/include/dat2/udat_redirection.h \ dat/include/dat2/udat_vendor_specific.h $(XDAT) man_MANS = man/dtest.1 man/dapltest.1 man/dat.conf.5 EXTRA_DIST = dat/common/dat_dictionary.h \ dat/common/dat_dr.h \ dat/common/dat_init.h \ dat/common/dat_sr.h \ dat/udat/udat_sr_parser.h \ dat/udat/linux/dat_osd.h \ dat/include/dat2/dat.h \ dat/include/dat2/dat_error.h \ dat/include/dat2/dat_platform_specific.h \ dat/include/dat2/dat_redirection.h \ dat/include/dat2/dat_registry.h \ dat/include/dat2/dat_vendor_specific.h \ dat/include/dat2/udat_config.h \ dat/include/dat2/udat.h \ dat/include/dat2/udat_redirection.h \ dat/include/dat2/udat_vendor_specific.h \ dat/include/dat2/dat_ib_extensions.h \ dapl/common/dapl_adapter_util.h \ dapl/common/dapl_cno_util.h \ dapl/common/dapl_cookie.h \ dapl/common/dapl_cr_util.h \ dapl/common/dapl_ep_util.h \ dapl/common/dapl_evd_util.h \ dapl/common/dapl_hash.h \ dapl/common/dapl_hca_util.h \ dapl/common/dapl_ia_util.h \ dapl/common/dapl_init.h \ dapl/common/dapl_lmr_util.h \ dapl/common/dapl_mr_util.h \ dapl/common/dapl_name_service.h \ dapl/common/dapl_provider.h \ dapl/common/dapl_pz_util.h \ dapl/common/dapl_ring_buffer_util.h \ dapl/common/dapl_rmr_util.h \ dapl/common/dapl_sp_util.h \ dapl/common/dapl_srq_util.h \ dapl/common/dapl_timer_util.h \ dapl/udapl/linux/dapl_osd.h \ dapl/include/dapl.h \ dapl/include/dapl_debug.h \ dapl/include/dapl_ipoib_names.h \ dapl/include/dapl_vendor.h \ dapl/openib_common/dapl_ib_dto.h \ dapl/openib_common/dapl_ib_common.h \ dapl/openib_common/dapl_mic_common.h \ dapl/openib_common/collectives/ib_collectives.h \ dapl/openib_common/collectives/fca_provider.h \ dapl/openib_cma/dapl_ib_util.h \ dapl/openib_cma/linux/openib_osd.h \ dapl/openib_scm/dapl_ib_util.h \ dapl/openib_scm/linux/openib_osd.h \ dapl/openib_ucm/dapl_ib_util.h \ dapl/openib_ucm/linux/openib_osd.h \ dapl/openib_mcm/dapl_ib_util.h \ dapl/openib_mcm/linux/openib_osd.h \ dapl/svc/mpxyd.h \ dat/udat/libdat2.map \ dapl/udapl/libdaplofa.map \ dapl/udapl/libdaploscm.map \ dapl/udapl/libdaploucm.map \ dapl/udapl/libdaplomcm.map \ README \ README.mcm \ LICENSE.txt \ LICENSE.txt \ LICENSE2.txt \ LICENSE3.txt \ doc/dat.conf \ doc/mpxyd.conf \ dapl.spec.in \ mpxyd.init.in \ $(man_MANS) \ test/dapltest/scripts/cl.sh \ test/dapltest/scripts/srv.sh \ test/dapltest/scripts/regress.sh \ test/dapltest/include/dapl_bpool.h \ test/dapltest/include/dapl_client_info.h \ test/dapltest/include/dapl_common.h \ test/dapltest/include/dapl_execute.h \ test/dapltest/include/dapl_fft_cmd.h \ test/dapltest/include/dapl_fft_util.h \ test/dapltest/include/dapl_getopt.h \ test/dapltest/include/dapl_global.h \ test/dapltest/include/dapl_limit_cmd.h \ test/dapltest/include/dapl_mdep.h \ test/dapltest/include/dapl_memlist.h \ test/dapltest/include/dapl_params.h \ test/dapltest/include/dapl_performance_cmd.h \ test/dapltest/include/dapl_performance_stats.h \ test/dapltest/include/dapl_performance_test.h \ test/dapltest/include/dapl_proto.h \ test/dapltest/include/dapl_quit_cmd.h \ test/dapltest/include/dapl_server_cmd.h \ test/dapltest/include/dapl_server_info.h \ test/dapltest/include/dapl_tdep.h \ test/dapltest/include/dapl_tdep_print.h \ test/dapltest/include/dapl_test_data.h \ test/dapltest/include/dapl_transaction_cmd.h \ test/dapltest/include/dapl_transaction_stats.h \ test/dapltest/include/dapl_transaction_test.h \ test/dapltest/include/dapl_version.h \ test/dapltest/mdep/linux/dapl_mdep_user.h @DEFINE_MCM_TRUE@svc_mpxyd_SOURCES = dapl/svc/mpxyd.c \ @DEFINE_MCM_TRUE@ dapl/svc/util.c \ @DEFINE_MCM_TRUE@ dapl/svc/mix.c \ @DEFINE_MCM_TRUE@ dapl/svc/mcm.c \ @DEFINE_MCM_TRUE@ dapl/svc/mpxy_out.c \ @DEFINE_MCM_TRUE@ dapl/svc/mpxy_in.c @DEFINE_MCM_TRUE@svc_mpxyd_CFLAGS = $(AM_CFLAGS) -lscif -libverbs -lpthread -Idat/include -I$(srcdir)/dapl/openib_common SUBDIRS = . test/dtest test/dapltest all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 dapl.spec: $(top_builddir)/config.status $(srcdir)/dapl.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ mpxyd.init: $(top_builddir)/config.status $(srcdir)/mpxyd.init.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-dapllibofaLTLIBRARIES: $(dapllibofa_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(dapllibofa_LTLIBRARIES)'; test -n "$(dapllibofadir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(dapllibofadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dapllibofadir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dapllibofadir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dapllibofadir)"; \ } uninstall-dapllibofaLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(dapllibofa_LTLIBRARIES)'; test -n "$(dapllibofadir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dapllibofadir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dapllibofadir)/$$f"; \ done clean-dapllibofaLTLIBRARIES: -test -z "$(dapllibofa_LTLIBRARIES)" || rm -f $(dapllibofa_LTLIBRARIES) @list='$(dapllibofa_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-dapllibomcmLTLIBRARIES: $(dapllibomcm_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(dapllibomcm_LTLIBRARIES)'; test -n "$(dapllibomcmdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(dapllibomcmdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dapllibomcmdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(dapllibomcmdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(dapllibomcmdir)"; \ } uninstall-dapllibomcmLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(dapllibomcm_LTLIBRARIES)'; test -n "$(dapllibomcmdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(dapllibomcmdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(dapllibomcmdir)/$$f"; \ done clean-dapllibomcmLTLIBRARIES: -test -z "$(dapllibomcm_LTLIBRARIES)" || rm -f $(dapllibomcm_LTLIBRARIES) @list='$(dapllibomcm_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-daplliboscmLTLIBRARIES: $(daplliboscm_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(daplliboscm_LTLIBRARIES)'; test -n "$(daplliboscmdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(daplliboscmdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(daplliboscmdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(daplliboscmdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(daplliboscmdir)"; \ } uninstall-daplliboscmLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(daplliboscm_LTLIBRARIES)'; test -n "$(daplliboscmdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(daplliboscmdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(daplliboscmdir)/$$f"; \ done clean-daplliboscmLTLIBRARIES: -test -z "$(daplliboscm_LTLIBRARIES)" || rm -f $(daplliboscm_LTLIBRARIES) @list='$(daplliboscm_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-daplliboucmLTLIBRARIES: $(daplliboucm_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(daplliboucm_LTLIBRARIES)'; test -n "$(daplliboucmdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(daplliboucmdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(daplliboucmdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(daplliboucmdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(daplliboucmdir)"; \ } uninstall-daplliboucmLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(daplliboucm_LTLIBRARIES)'; test -n "$(daplliboucmdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(daplliboucmdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(daplliboucmdir)/$$f"; \ done clean-daplliboucmLTLIBRARIES: -test -z "$(daplliboucm_LTLIBRARIES)" || rm -f $(daplliboucm_LTLIBRARIES) @list='$(daplliboucm_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-datlibLTLIBRARIES: $(datlib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(datlib_LTLIBRARIES)'; test -n "$(datlibdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(datlibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(datlibdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(datlibdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(datlibdir)"; \ } uninstall-datlibLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(datlib_LTLIBRARIES)'; test -n "$(datlibdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(datlibdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(datlibdir)/$$f"; \ done clean-datlibLTLIBRARIES: -test -z "$(datlib_LTLIBRARIES)" || rm -f $(datlib_LTLIBRARIES) @list='$(datlib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } dapl/udapl/$(am__dirstamp): @$(MKDIR_P) dapl/udapl @: > dapl/udapl/$(am__dirstamp) dapl/udapl/libdaplofa.la: $(dapl_udapl_libdaplofa_la_OBJECTS) $(dapl_udapl_libdaplofa_la_DEPENDENCIES) $(EXTRA_dapl_udapl_libdaplofa_la_DEPENDENCIES) dapl/udapl/$(am__dirstamp) $(AM_V_CCLD)$(dapl_udapl_libdaplofa_la_LINK) $(am_dapl_udapl_libdaplofa_la_rpath) $(dapl_udapl_libdaplofa_la_OBJECTS) $(dapl_udapl_libdaplofa_la_LIBADD) $(LIBS) dapl/udapl/libdaplomcm.la: $(dapl_udapl_libdaplomcm_la_OBJECTS) $(dapl_udapl_libdaplomcm_la_DEPENDENCIES) $(EXTRA_dapl_udapl_libdaplomcm_la_DEPENDENCIES) dapl/udapl/$(am__dirstamp) $(AM_V_CCLD)$(dapl_udapl_libdaplomcm_la_LINK) $(am_dapl_udapl_libdaplomcm_la_rpath) $(dapl_udapl_libdaplomcm_la_OBJECTS) $(dapl_udapl_libdaplomcm_la_LIBADD) $(LIBS) dapl/udapl/libdaploscm.la: $(dapl_udapl_libdaploscm_la_OBJECTS) $(dapl_udapl_libdaploscm_la_DEPENDENCIES) $(EXTRA_dapl_udapl_libdaploscm_la_DEPENDENCIES) dapl/udapl/$(am__dirstamp) $(AM_V_CCLD)$(dapl_udapl_libdaploscm_la_LINK) $(am_dapl_udapl_libdaploscm_la_rpath) $(dapl_udapl_libdaploscm_la_OBJECTS) $(dapl_udapl_libdaploscm_la_LIBADD) $(LIBS) dapl/udapl/libdaploucm.la: $(dapl_udapl_libdaploucm_la_OBJECTS) $(dapl_udapl_libdaploucm_la_DEPENDENCIES) $(EXTRA_dapl_udapl_libdaploucm_la_DEPENDENCIES) dapl/udapl/$(am__dirstamp) $(AM_V_CCLD)$(dapl_udapl_libdaploucm_la_LINK) $(am_dapl_udapl_libdaploucm_la_rpath) $(dapl_udapl_libdaploucm_la_OBJECTS) $(dapl_udapl_libdaploucm_la_LIBADD) $(LIBS) dat/udat/$(am__dirstamp): @$(MKDIR_P) dat/udat @: > dat/udat/$(am__dirstamp) dat/udat/libdat2.la: $(dat_udat_libdat2_la_OBJECTS) $(dat_udat_libdat2_la_DEPENDENCIES) $(EXTRA_dat_udat_libdat2_la_DEPENDENCIES) dat/udat/$(am__dirstamp) $(AM_V_CCLD)$(dat_udat_libdat2_la_LINK) -rpath $(datlibdir) $(dat_udat_libdat2_la_OBJECTS) $(dat_udat_libdat2_la_LIBADD) $(LIBS) install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list svc/$(am__dirstamp): @$(MKDIR_P) svc @: > svc/$(am__dirstamp) svc/mpxyd$(EXEEXT): $(svc_mpxyd_OBJECTS) $(svc_mpxyd_DEPENDENCIES) $(EXTRA_svc_mpxyd_DEPENDENCIES) svc/$(am__dirstamp) @rm -f svc/mpxyd$(EXEEXT) $(AM_V_CCLD)$(svc_mpxyd_LINK) $(svc_mpxyd_OBJECTS) $(svc_mpxyd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-cm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-cq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_accept.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_callback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_handoff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_reject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_csp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_disconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_get_status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_modify.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_recv_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dequeue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_disable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_enable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_post_se.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_handle_type.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hca_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_ha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_llist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_mr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_name_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_osd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create_any.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_bind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_set_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_sp_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_set_lw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_timer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-fca_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-ib_extensions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-mem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-qp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplofa_la-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-cm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-cq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_accept.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_callback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_handoff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_reject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_csp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_get_status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_modify.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_disable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_enable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_post_se.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_handle_type.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hca_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_ha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_llist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_mr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_name_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_osd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create_any.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_bind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_sp_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_timer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-fca_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-ib_extensions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-mem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-mix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-proxy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-qp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaplomcm_la-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-cm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-cq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_accept.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_callback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_handoff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_reject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_csp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_disconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_get_status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_modify.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_recv_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dequeue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_disable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_enable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_post_se.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_handle_type.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hca_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_ha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_llist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_mr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_name_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_osd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create_any.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_bind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_set_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_sp_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_set_lw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_timer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-fca_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-ib_extensions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-mem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-qp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploscm_la-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-cm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-cq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cookie.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_accept.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_callback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_handoff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_reject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_csp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_disconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_get_status.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_modify.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_recv_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_reset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dequeue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_disable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_enable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_post_se.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_handle_type.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hca_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_close.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_ha.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_open.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_llist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_mr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_name_service.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_osd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create_any.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_bind.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_set_consumer_context.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_sp_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_create.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_free.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_post_recv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_query.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_resize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_set_lw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_timer_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-fca_provider.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-ib_extensions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-mem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-qp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-srq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapl_udapl_libdaploucm_la-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_dictionary.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_dr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_init.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_osd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_sr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-dat_strerror.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-udat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-udat_api.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dat_udat_libdat2_la-udat_sr_parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-mcm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-mix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-mpxy_in.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-mpxy_out.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-mpxyd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svc_mpxyd-util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< dapl_udapl_libdaplofa_la-dapl_init.lo: dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_init.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_init.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_init.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_init.c' object='dapl_udapl_libdaplofa_la-dapl_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c dapl_udapl_libdaplofa_la-dapl_evd_create.lo: dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_create.c' object='dapl_udapl_libdaplofa_la-dapl_evd_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c dapl_udapl_libdaplofa_la-dapl_evd_query.lo: dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_query.c' object='dapl_udapl_libdaplofa_la-dapl_evd_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c dapl_udapl_libdaplofa_la-dapl_cno_create.lo: dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_create.c' object='dapl_udapl_libdaplofa_la-dapl_cno_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo: dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_modify_agent.c' object='dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c dapl_udapl_libdaplofa_la-dapl_cno_free.lo: dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_free.c' object='dapl_udapl_libdaplofa_la-dapl_cno_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c dapl_udapl_libdaplofa_la-dapl_cno_wait.lo: dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_wait.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_wait.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_wait.c' object='dapl_udapl_libdaplofa_la-dapl_cno_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c dapl_udapl_libdaplofa_la-dapl_cno_query.lo: dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_query.c' object='dapl_udapl_libdaplofa_la-dapl_cno_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c dapl_udapl_libdaplofa_la-dapl_lmr_create.lo: dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_lmr_create.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c dapl_udapl_libdaplofa_la-dapl_evd_wait.lo: dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_wait.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_wait.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_wait.c' object='dapl_udapl_libdaplofa_la-dapl_evd_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c dapl_udapl_libdaplofa_la-dapl_evd_disable.lo: dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_disable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_disable.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_disable.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_disable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_disable.c' object='dapl_udapl_libdaplofa_la-dapl_evd_disable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c dapl_udapl_libdaplofa_la-dapl_evd_enable.lo: dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_enable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_enable.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_enable.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_enable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_enable.c' object='dapl_udapl_libdaplofa_la-dapl_evd_enable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo: dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_modify_cno.c' object='dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo: dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_set_unwaitable.c' object='dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo: dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_clear_unwaitable.c' object='dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c dapl_udapl_libdaplofa_la-dapl_osd.lo: dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_osd.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_osd.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_osd.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_osd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/linux/dapl_osd.c' object='dapl_udapl_libdaplofa_la-dapl_osd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c dapl_udapl_libdaplofa_la-dapl_cookie.lo: dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cookie.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cookie.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cookie.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cookie.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cookie.c' object='dapl_udapl_libdaplofa_la-dapl_cookie.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c dapl_udapl_libdaplofa_la-dapl_cr_accept.lo: dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_accept.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_accept.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_accept.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_accept.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_accept.c' object='dapl_udapl_libdaplofa_la-dapl_cr_accept.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c dapl_udapl_libdaplofa_la-dapl_cr_query.lo: dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_query.c' object='dapl_udapl_libdaplofa_la-dapl_cr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c dapl_udapl_libdaplofa_la-dapl_cr_reject.lo: dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_reject.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_reject.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_reject.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_reject.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_reject.c' object='dapl_udapl_libdaplofa_la-dapl_cr_reject.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c dapl_udapl_libdaplofa_la-dapl_cr_util.lo: dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_util.c' object='dapl_udapl_libdaplofa_la-dapl_cr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c dapl_udapl_libdaplofa_la-dapl_cr_callback.lo: dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_callback.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_callback.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_callback.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_callback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_callback.c' object='dapl_udapl_libdaplofa_la-dapl_cr_callback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo: dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_handoff.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_handoff.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cr_handoff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_handoff.c' object='dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c dapl_udapl_libdaplofa_la-dapl_ep_connect.lo: dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_connect.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_connect.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_connect.c' object='dapl_udapl_libdaplofa_la-dapl_ep_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c dapl_udapl_libdaplofa_la-dapl_ep_create.lo: dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create.c' object='dapl_udapl_libdaplofa_la-dapl_ep_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo: dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_disconnect.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_disconnect.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_disconnect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_disconnect.c' object='dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo: dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_dup_connect.c' object='dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c dapl_udapl_libdaplofa_la-dapl_ep_free.lo: dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_free.c' object='dapl_udapl_libdaplofa_la-dapl_ep_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c dapl_udapl_libdaplofa_la-dapl_ep_reset.lo: dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_reset.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_reset.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_reset.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_reset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_reset.c' object='dapl_udapl_libdaplofa_la-dapl_ep_reset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo: dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_get_status.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_get_status.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_get_status.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_get_status.c' object='dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c dapl_udapl_libdaplofa_la-dapl_ep_modify.lo: dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_modify.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_modify.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_modify.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_modify.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_modify.c' object='dapl_udapl_libdaplofa_la-dapl_ep_modify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo: dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo: dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_write.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo: dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_recv.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_recv.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo: dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c dapl_udapl_libdaplofa_la-dapl_ep_query.lo: dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_query.c' object='dapl_udapl_libdaplofa_la-dapl_ep_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c dapl_udapl_libdaplofa_la-dapl_ep_util.lo: dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_util.c' object='dapl_udapl_libdaplofa_la-dapl_ep_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo: dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dequeue.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dequeue.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dequeue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dequeue.c' object='dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c dapl_udapl_libdaplofa_la-dapl_evd_free.lo: dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_free.c' object='dapl_udapl_libdaplofa_la-dapl_evd_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo: dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_post_se.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_post_se.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_post_se.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_post_se.c' object='dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c dapl_udapl_libdaplofa_la-dapl_evd_resize.lo: dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_resize.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_resize.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_resize.c' object='dapl_udapl_libdaplofa_la-dapl_evd_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c dapl_udapl_libdaplofa_la-dapl_evd_util.lo: dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_util.c' object='dapl_udapl_libdaplofa_la-dapl_evd_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo: dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_cq_async_error_callb.c' object='dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo: dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_qp_async_error_callb.c' object='dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo: dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_un_async_error_callb.c' object='dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo: dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_connection_callb.c' object='dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo: dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dto_callb.c' object='dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo: dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_consumer_context.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_consumer_context.c' object='dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo: dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_handle_type.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_handle_type.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_get_handle_type.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_handle_type.c' object='dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c dapl_udapl_libdaplofa_la-dapl_hash.lo: dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_hash.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hash.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hash.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hash.c' object='dapl_udapl_libdaplofa_la-dapl_hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c dapl_udapl_libdaplofa_la-dapl_hca_util.lo: dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_hca_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hca_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hca_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_hca_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hca_util.c' object='dapl_udapl_libdaplofa_la-dapl_hca_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c dapl_udapl_libdaplofa_la-dapl_ia_close.lo: dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ia_close.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_close.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_close.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_close.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_close.c' object='dapl_udapl_libdaplofa_la-dapl_ia_close.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c dapl_udapl_libdaplofa_la-dapl_ia_open.lo: dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ia_open.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_open.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_open.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_open.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_open.c' object='dapl_udapl_libdaplofa_la-dapl_ia_open.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c dapl_udapl_libdaplofa_la-dapl_ia_query.lo: dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ia_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_query.c' object='dapl_udapl_libdaplofa_la-dapl_ia_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c dapl_udapl_libdaplofa_la-dapl_ia_util.lo: dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ia_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_util.c' object='dapl_udapl_libdaplofa_la-dapl_ia_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c dapl_udapl_libdaplofa_la-dapl_llist.lo: dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_llist.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_llist.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_llist.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_llist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_llist.c' object='dapl_udapl_libdaplofa_la-dapl_llist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c dapl_udapl_libdaplofa_la-dapl_lmr_free.lo: dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_free.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c dapl_udapl_libdaplofa_la-dapl_lmr_query.lo: dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_query.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c dapl_udapl_libdaplofa_la-dapl_lmr_util.lo: dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_util.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo: dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_read.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo: dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_write.c' object='dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c dapl_udapl_libdaplofa_la-dapl_mr_util.lo: dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_mr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_mr_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_mr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_mr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_mr_util.c' object='dapl_udapl_libdaplofa_la-dapl_mr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c dapl_udapl_libdaplofa_la-dapl_provider.lo: dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_provider.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_provider.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_provider.c' object='dapl_udapl_libdaplofa_la-dapl_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c dapl_udapl_libdaplofa_la-dapl_sp_util.lo: dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_sp_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_sp_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_sp_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_sp_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_sp_util.c' object='dapl_udapl_libdaplofa_la-dapl_sp_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c dapl_udapl_libdaplofa_la-dapl_psp_create.lo: dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_psp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create.c' object='dapl_udapl_libdaplofa_la-dapl_psp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo: dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create_any.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create_any.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_create_any.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create_any.c' object='dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c dapl_udapl_libdaplofa_la-dapl_psp_free.lo: dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_psp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_free.c' object='dapl_udapl_libdaplofa_la-dapl_psp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c dapl_udapl_libdaplofa_la-dapl_psp_query.lo: dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_psp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_psp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_query.c' object='dapl_udapl_libdaplofa_la-dapl_psp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c dapl_udapl_libdaplofa_la-dapl_pz_create.lo: dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_pz_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_create.c' object='dapl_udapl_libdaplofa_la-dapl_pz_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c dapl_udapl_libdaplofa_la-dapl_pz_free.lo: dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_pz_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_free.c' object='dapl_udapl_libdaplofa_la-dapl_pz_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c dapl_udapl_libdaplofa_la-dapl_pz_query.lo: dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_pz_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_query.c' object='dapl_udapl_libdaplofa_la-dapl_pz_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c dapl_udapl_libdaplofa_la-dapl_pz_util.lo: dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_pz_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_pz_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_util.c' object='dapl_udapl_libdaplofa_la-dapl_pz_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c dapl_udapl_libdaplofa_la-dapl_rmr_create.lo: dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_create.c' object='dapl_udapl_libdaplofa_la-dapl_rmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c dapl_udapl_libdaplofa_la-dapl_rmr_free.lo: dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_free.c' object='dapl_udapl_libdaplofa_la-dapl_rmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo: dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_bind.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_bind.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_bind.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_bind.c' object='dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c dapl_udapl_libdaplofa_la-dapl_rmr_query.lo: dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_query.c' object='dapl_udapl_libdaplofa_la-dapl_rmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c dapl_udapl_libdaplofa_la-dapl_rmr_util.lo: dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_util.c' object='dapl_udapl_libdaplofa_la-dapl_rmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c dapl_udapl_libdaplofa_la-dapl_rsp_create.lo: dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rsp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_create.c' object='dapl_udapl_libdaplofa_la-dapl_rsp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c dapl_udapl_libdaplofa_la-dapl_rsp_free.lo: dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rsp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_free.c' object='dapl_udapl_libdaplofa_la-dapl_rsp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c dapl_udapl_libdaplofa_la-dapl_rsp_query.lo: dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_rsp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_rsp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_query.c' object='dapl_udapl_libdaplofa_la-dapl_rsp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c dapl_udapl_libdaplofa_la-dapl_cno_util.lo: dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_cno_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_cno_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cno_util.c' object='dapl_udapl_libdaplofa_la-dapl_cno_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo: dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_set_consumer_context.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_set_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_set_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_set_consumer_context.c' object='dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo: dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ring_buffer_util.c' object='dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c dapl_udapl_libdaplofa_la-dapl_name_service.lo: dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_name_service.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_name_service.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_name_service.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_name_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_name_service.c' object='dapl_udapl_libdaplofa_la-dapl_name_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c dapl_udapl_libdaplofa_la-dapl_timer_util.lo: dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_timer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_timer_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_timer_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_timer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_timer_util.c' object='dapl_udapl_libdaplofa_la-dapl_timer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo: dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create_with_srq.c' object='dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo: dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_recv_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_recv_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_recv_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_recv_query.c' object='dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo: dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_set_watermark.c' object='dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c dapl_udapl_libdaplofa_la-dapl_srq_create.lo: dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_create.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_create.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_create.c' object='dapl_udapl_libdaplofa_la-dapl_srq_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c dapl_udapl_libdaplofa_la-dapl_srq_free.lo: dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_free.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_free.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_free.c' object='dapl_udapl_libdaplofa_la-dapl_srq_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c dapl_udapl_libdaplofa_la-dapl_srq_query.lo: dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_query.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_query.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_query.c' object='dapl_udapl_libdaplofa_la-dapl_srq_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c dapl_udapl_libdaplofa_la-dapl_srq_resize.lo: dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_resize.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_resize.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_resize.c' object='dapl_udapl_libdaplofa_la-dapl_srq_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo: dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_post_recv.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_post_recv.c' object='dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo: dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_set_lw.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_set_lw.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_set_lw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_set_lw.c' object='dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c dapl_udapl_libdaplofa_la-dapl_srq_util.lo: dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_srq_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_util.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_srq_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_util.c' object='dapl_udapl_libdaplofa_la-dapl_srq_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c dapl_udapl_libdaplofa_la-dapl_debug.lo: dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_debug.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_debug.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_debug.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_debug.c' object='dapl_udapl_libdaplofa_la-dapl_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c dapl_udapl_libdaplofa_la-dapl_ia_ha.lo: dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ia_ha.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_ha.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_ha.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ia_ha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_ha.c' object='dapl_udapl_libdaplofa_la-dapl_ia_ha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c dapl_udapl_libdaplofa_la-dapl_csp.lo: dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_csp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_csp.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_csp.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_csp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_csp.c' object='dapl_udapl_libdaplofa_la-dapl_csp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo: dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send_invalidate.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo: dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.Tpo -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read_to_rmr.c' object='dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c dapl_udapl_libdaplofa_la-mem.lo: dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-mem.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-mem.Tpo -c -o dapl_udapl_libdaplofa_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-mem.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-mem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/mem.c' object='dapl_udapl_libdaplofa_la-mem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c dapl_udapl_libdaplofa_la-cq.lo: dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-cq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-cq.Tpo -c -o dapl_udapl_libdaplofa_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-cq.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-cq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/cq.c' object='dapl_udapl_libdaplofa_la-cq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c dapl_udapl_libdaplofa_la-qp.lo: dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-qp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-qp.Tpo -c -o dapl_udapl_libdaplofa_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-qp.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-qp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/qp.c' object='dapl_udapl_libdaplofa_la-qp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c dapl_udapl_libdaplofa_la-util.lo: dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-util.Tpo -c -o dapl_udapl_libdaplofa_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-util.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/util.c' object='dapl_udapl_libdaplofa_la-util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c dapl_udapl_libdaplofa_la-srq.lo: dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-srq.Tpo -c -o dapl_udapl_libdaplofa_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-srq.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/srq.c' object='dapl_udapl_libdaplofa_la-srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c dapl_udapl_libdaplofa_la-cm.lo: dapl/openib_cma/cm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-cm.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-cm.Tpo -c -o dapl_udapl_libdaplofa_la-cm.lo `test -f 'dapl/openib_cma/cm.c' || echo '$(srcdir)/'`dapl/openib_cma/cm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-cm.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-cm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_cma/cm.c' object='dapl_udapl_libdaplofa_la-cm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-cm.lo `test -f 'dapl/openib_cma/cm.c' || echo '$(srcdir)/'`dapl/openib_cma/cm.c dapl_udapl_libdaplofa_la-device.lo: dapl/openib_cma/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-device.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-device.Tpo -c -o dapl_udapl_libdaplofa_la-device.lo `test -f 'dapl/openib_cma/device.c' || echo '$(srcdir)/'`dapl/openib_cma/device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-device.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_cma/device.c' object='dapl_udapl_libdaplofa_la-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-device.lo `test -f 'dapl/openib_cma/device.c' || echo '$(srcdir)/'`dapl/openib_cma/device.c dapl_udapl_libdaplofa_la-ib_extensions.lo: dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-ib_extensions.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-ib_extensions.Tpo -c -o dapl_udapl_libdaplofa_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-ib_extensions.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-ib_extensions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/ib_extensions.c' object='dapl_udapl_libdaplofa_la-ib_extensions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c dapl_udapl_libdaplofa_la-fca_provider.lo: dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplofa_la-fca_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplofa_la-fca_provider.Tpo -c -o dapl_udapl_libdaplofa_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplofa_la-fca_provider.Tpo $(DEPDIR)/dapl_udapl_libdaplofa_la-fca_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/collectives/fca_provider.c' object='dapl_udapl_libdaplofa_la-fca_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplofa_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplofa_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c dapl_udapl_libdaplomcm_la-dapl_init.lo: dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_init.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_init.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_init.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_init.c' object='dapl_udapl_libdaplomcm_la-dapl_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c dapl_udapl_libdaplomcm_la-dapl_evd_create.lo: dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_create.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c dapl_udapl_libdaplomcm_la-dapl_evd_query.lo: dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_query.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c dapl_udapl_libdaplomcm_la-dapl_cno_create.lo: dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_create.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo: dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_modify_agent.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c dapl_udapl_libdaplomcm_la-dapl_cno_free.lo: dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_free.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo: dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_wait.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_wait.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_wait.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c dapl_udapl_libdaplomcm_la-dapl_cno_query.lo: dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_query.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo: dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_lmr_create.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo: dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_wait.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_wait.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_wait.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo: dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_disable.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_disable.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_disable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_disable.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo: dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_enable.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_enable.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_enable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_enable.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo: dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_modify_cno.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo: dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_set_unwaitable.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo: dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_clear_unwaitable.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c dapl_udapl_libdaplomcm_la-dapl_osd.lo: dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_osd.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_osd.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_osd.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_osd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/linux/dapl_osd.c' object='dapl_udapl_libdaplomcm_la-dapl_osd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c dapl_udapl_libdaplomcm_la-dapl_cookie.lo: dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cookie.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cookie.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cookie.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cookie.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cookie.c' object='dapl_udapl_libdaplomcm_la-dapl_cookie.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo: dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_accept.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_accept.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_accept.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_accept.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c dapl_udapl_libdaplomcm_la-dapl_cr_query.lo: dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_query.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo: dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_reject.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_reject.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_reject.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_reject.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c dapl_udapl_libdaplomcm_la-dapl_cr_util.lo: dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_util.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo: dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_callback.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_callback.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_callback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_callback.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo: dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_handoff.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_handoff.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cr_handoff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_handoff.c' object='dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo: dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_connect.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_connect.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_connect.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c dapl_udapl_libdaplomcm_la-dapl_ep_create.lo: dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo: dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_disconnect.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo: dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_dup_connect.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c dapl_udapl_libdaplomcm_la-dapl_ep_free.lo: dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_free.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo: dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_reset.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_reset.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_reset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_reset.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo: dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_get_status.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_get_status.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_get_status.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_get_status.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo: dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_modify.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_modify.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_modify.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_modify.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo: dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo: dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_write.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo: dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_recv.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo: dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c dapl_udapl_libdaplomcm_la-dapl_ep_query.lo: dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_query.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c dapl_udapl_libdaplomcm_la-dapl_ep_util.lo: dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_util.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo: dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dequeue.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c dapl_udapl_libdaplomcm_la-dapl_evd_free.lo: dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_free.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo: dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_post_se.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_post_se.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_post_se.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_post_se.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo: dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_resize.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_resize.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_resize.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c dapl_udapl_libdaplomcm_la-dapl_evd_util.lo: dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_util.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo: dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_cq_async_error_callb.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo: dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_qp_async_error_callb.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo: dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_un_async_error_callb.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo: dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_connection_callb.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo: dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dto_callb.c' object='dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo: dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_consumer_context.c' object='dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo: dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_handle_type.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_handle_type.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_get_handle_type.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_handle_type.c' object='dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c dapl_udapl_libdaplomcm_la-dapl_hash.lo: dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_hash.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hash.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hash.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hash.c' object='dapl_udapl_libdaplomcm_la-dapl_hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c dapl_udapl_libdaplomcm_la-dapl_hca_util.lo: dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_hca_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hca_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hca_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_hca_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hca_util.c' object='dapl_udapl_libdaplomcm_la-dapl_hca_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c dapl_udapl_libdaplomcm_la-dapl_ia_close.lo: dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ia_close.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_close.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_close.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_close.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_close.c' object='dapl_udapl_libdaplomcm_la-dapl_ia_close.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c dapl_udapl_libdaplomcm_la-dapl_ia_open.lo: dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ia_open.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_open.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_open.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_open.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_open.c' object='dapl_udapl_libdaplomcm_la-dapl_ia_open.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c dapl_udapl_libdaplomcm_la-dapl_ia_query.lo: dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ia_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_query.c' object='dapl_udapl_libdaplomcm_la-dapl_ia_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c dapl_udapl_libdaplomcm_la-dapl_ia_util.lo: dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ia_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_util.c' object='dapl_udapl_libdaplomcm_la-dapl_ia_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c dapl_udapl_libdaplomcm_la-dapl_llist.lo: dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_llist.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_llist.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_llist.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_llist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_llist.c' object='dapl_udapl_libdaplomcm_la-dapl_llist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo: dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_free.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo: dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_query.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo: dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_util.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo: dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_read.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo: dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_write.c' object='dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c dapl_udapl_libdaplomcm_la-dapl_mr_util.lo: dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_mr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_mr_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_mr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_mr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_mr_util.c' object='dapl_udapl_libdaplomcm_la-dapl_mr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c dapl_udapl_libdaplomcm_la-dapl_provider.lo: dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_provider.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_provider.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_provider.c' object='dapl_udapl_libdaplomcm_la-dapl_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c dapl_udapl_libdaplomcm_la-dapl_sp_util.lo: dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_sp_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_sp_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_sp_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_sp_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_sp_util.c' object='dapl_udapl_libdaplomcm_la-dapl_sp_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c dapl_udapl_libdaplomcm_la-dapl_psp_create.lo: dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_psp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create.c' object='dapl_udapl_libdaplomcm_la-dapl_psp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo: dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create_any.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create_any.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_create_any.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create_any.c' object='dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c dapl_udapl_libdaplomcm_la-dapl_psp_free.lo: dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_psp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_free.c' object='dapl_udapl_libdaplomcm_la-dapl_psp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c dapl_udapl_libdaplomcm_la-dapl_psp_query.lo: dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_psp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_psp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_query.c' object='dapl_udapl_libdaplomcm_la-dapl_psp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c dapl_udapl_libdaplomcm_la-dapl_pz_create.lo: dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_pz_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_create.c' object='dapl_udapl_libdaplomcm_la-dapl_pz_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c dapl_udapl_libdaplomcm_la-dapl_pz_free.lo: dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_pz_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_free.c' object='dapl_udapl_libdaplomcm_la-dapl_pz_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c dapl_udapl_libdaplomcm_la-dapl_pz_query.lo: dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_pz_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_query.c' object='dapl_udapl_libdaplomcm_la-dapl_pz_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c dapl_udapl_libdaplomcm_la-dapl_pz_util.lo: dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_pz_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_pz_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_util.c' object='dapl_udapl_libdaplomcm_la-dapl_pz_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo: dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_create.c' object='dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo: dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_free.c' object='dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo: dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_bind.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_bind.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_bind.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_bind.c' object='dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo: dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_query.c' object='dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo: dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_util.c' object='dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo: dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_create.c' object='dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo: dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_free.c' object='dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo: dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_rsp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_query.c' object='dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c dapl_udapl_libdaplomcm_la-dapl_cno_util.lo: dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_cno_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_cno_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cno_util.c' object='dapl_udapl_libdaplomcm_la-dapl_cno_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo: dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_set_consumer_context.c' object='dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo: dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ring_buffer_util.c' object='dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c dapl_udapl_libdaplomcm_la-dapl_name_service.lo: dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_name_service.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_name_service.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_name_service.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_name_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_name_service.c' object='dapl_udapl_libdaplomcm_la-dapl_name_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c dapl_udapl_libdaplomcm_la-dapl_timer_util.lo: dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_timer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_timer_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_timer_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_timer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_timer_util.c' object='dapl_udapl_libdaplomcm_la-dapl_timer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo: dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create_with_srq.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo: dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_recv_query.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo: dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_set_watermark.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c dapl_udapl_libdaplomcm_la-dapl_srq_create.lo: dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_create.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_create.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_create.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c dapl_udapl_libdaplomcm_la-dapl_srq_free.lo: dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_free.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_free.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_free.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c dapl_udapl_libdaplomcm_la-dapl_srq_query.lo: dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_query.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_query.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_query.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo: dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_resize.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_resize.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_resize.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo: dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_post_recv.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo: dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_set_lw.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c dapl_udapl_libdaplomcm_la-dapl_srq_util.lo: dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_srq_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_util.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_srq_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_util.c' object='dapl_udapl_libdaplomcm_la-dapl_srq_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c dapl_udapl_libdaplomcm_la-dapl_debug.lo: dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_debug.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_debug.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_debug.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_debug.c' object='dapl_udapl_libdaplomcm_la-dapl_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo: dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_ha.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_ha.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ia_ha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_ha.c' object='dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c dapl_udapl_libdaplomcm_la-dapl_csp.lo: dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_csp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_csp.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_csp.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_csp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_csp.c' object='dapl_udapl_libdaplomcm_la-dapl_csp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo: dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send_invalidate.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo: dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.Tpo -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read_to_rmr.c' object='dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c dapl_udapl_libdaplomcm_la-mem.lo: dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-mem.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-mem.Tpo -c -o dapl_udapl_libdaplomcm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-mem.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-mem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/mem.c' object='dapl_udapl_libdaplomcm_la-mem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c dapl_udapl_libdaplomcm_la-cq.lo: dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-cq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-cq.Tpo -c -o dapl_udapl_libdaplomcm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-cq.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-cq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/cq.c' object='dapl_udapl_libdaplomcm_la-cq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c dapl_udapl_libdaplomcm_la-qp.lo: dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-qp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-qp.Tpo -c -o dapl_udapl_libdaplomcm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-qp.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-qp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/qp.c' object='dapl_udapl_libdaplomcm_la-qp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c dapl_udapl_libdaplomcm_la-util.lo: dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-util.Tpo -c -o dapl_udapl_libdaplomcm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-util.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/util.c' object='dapl_udapl_libdaplomcm_la-util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c dapl_udapl_libdaplomcm_la-srq.lo: dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-srq.Tpo -c -o dapl_udapl_libdaplomcm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-srq.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/srq.c' object='dapl_udapl_libdaplomcm_la-srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c dapl_udapl_libdaplomcm_la-cm.lo: dapl/openib_mcm/cm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-cm.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-cm.Tpo -c -o dapl_udapl_libdaplomcm_la-cm.lo `test -f 'dapl/openib_mcm/cm.c' || echo '$(srcdir)/'`dapl/openib_mcm/cm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-cm.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-cm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_mcm/cm.c' object='dapl_udapl_libdaplomcm_la-cm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-cm.lo `test -f 'dapl/openib_mcm/cm.c' || echo '$(srcdir)/'`dapl/openib_mcm/cm.c dapl_udapl_libdaplomcm_la-mix.lo: dapl/openib_mcm/mix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-mix.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-mix.Tpo -c -o dapl_udapl_libdaplomcm_la-mix.lo `test -f 'dapl/openib_mcm/mix.c' || echo '$(srcdir)/'`dapl/openib_mcm/mix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-mix.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-mix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_mcm/mix.c' object='dapl_udapl_libdaplomcm_la-mix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-mix.lo `test -f 'dapl/openib_mcm/mix.c' || echo '$(srcdir)/'`dapl/openib_mcm/mix.c dapl_udapl_libdaplomcm_la-proxy.lo: dapl/openib_mcm/proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-proxy.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-proxy.Tpo -c -o dapl_udapl_libdaplomcm_la-proxy.lo `test -f 'dapl/openib_mcm/proxy.c' || echo '$(srcdir)/'`dapl/openib_mcm/proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-proxy.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-proxy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_mcm/proxy.c' object='dapl_udapl_libdaplomcm_la-proxy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-proxy.lo `test -f 'dapl/openib_mcm/proxy.c' || echo '$(srcdir)/'`dapl/openib_mcm/proxy.c dapl_udapl_libdaplomcm_la-device.lo: dapl/openib_mcm/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-device.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-device.Tpo -c -o dapl_udapl_libdaplomcm_la-device.lo `test -f 'dapl/openib_mcm/device.c' || echo '$(srcdir)/'`dapl/openib_mcm/device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-device.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_mcm/device.c' object='dapl_udapl_libdaplomcm_la-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-device.lo `test -f 'dapl/openib_mcm/device.c' || echo '$(srcdir)/'`dapl/openib_mcm/device.c dapl_udapl_libdaplomcm_la-ib_extensions.lo: dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-ib_extensions.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-ib_extensions.Tpo -c -o dapl_udapl_libdaplomcm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-ib_extensions.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-ib_extensions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/ib_extensions.c' object='dapl_udapl_libdaplomcm_la-ib_extensions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c dapl_udapl_libdaplomcm_la-fca_provider.lo: dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaplomcm_la-fca_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaplomcm_la-fca_provider.Tpo -c -o dapl_udapl_libdaplomcm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaplomcm_la-fca_provider.Tpo $(DEPDIR)/dapl_udapl_libdaplomcm_la-fca_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/collectives/fca_provider.c' object='dapl_udapl_libdaplomcm_la-fca_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaplomcm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaplomcm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c dapl_udapl_libdaploscm_la-dapl_init.lo: dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_init.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_init.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_init.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_init.c' object='dapl_udapl_libdaploscm_la-dapl_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c dapl_udapl_libdaploscm_la-dapl_evd_create.lo: dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_create.c' object='dapl_udapl_libdaploscm_la-dapl_evd_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c dapl_udapl_libdaploscm_la-dapl_evd_query.lo: dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_query.c' object='dapl_udapl_libdaploscm_la-dapl_evd_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c dapl_udapl_libdaploscm_la-dapl_cno_create.lo: dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_create.c' object='dapl_udapl_libdaploscm_la-dapl_cno_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo: dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_modify_agent.c' object='dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c dapl_udapl_libdaploscm_la-dapl_cno_free.lo: dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_free.c' object='dapl_udapl_libdaploscm_la-dapl_cno_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c dapl_udapl_libdaploscm_la-dapl_cno_wait.lo: dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_wait.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_wait.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_wait.c' object='dapl_udapl_libdaploscm_la-dapl_cno_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c dapl_udapl_libdaploscm_la-dapl_cno_query.lo: dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_query.c' object='dapl_udapl_libdaploscm_la-dapl_cno_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c dapl_udapl_libdaploscm_la-dapl_lmr_create.lo: dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_lmr_create.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c dapl_udapl_libdaploscm_la-dapl_evd_wait.lo: dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_wait.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_wait.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_wait.c' object='dapl_udapl_libdaploscm_la-dapl_evd_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c dapl_udapl_libdaploscm_la-dapl_evd_disable.lo: dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_disable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_disable.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_disable.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_disable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_disable.c' object='dapl_udapl_libdaploscm_la-dapl_evd_disable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c dapl_udapl_libdaploscm_la-dapl_evd_enable.lo: dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_enable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_enable.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_enable.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_enable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_enable.c' object='dapl_udapl_libdaploscm_la-dapl_evd_enable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo: dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_modify_cno.c' object='dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo: dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_set_unwaitable.c' object='dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo: dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_clear_unwaitable.c' object='dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c dapl_udapl_libdaploscm_la-dapl_osd.lo: dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_osd.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_osd.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_osd.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_osd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/linux/dapl_osd.c' object='dapl_udapl_libdaploscm_la-dapl_osd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c dapl_udapl_libdaploscm_la-dapl_cookie.lo: dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cookie.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cookie.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cookie.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cookie.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cookie.c' object='dapl_udapl_libdaploscm_la-dapl_cookie.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c dapl_udapl_libdaploscm_la-dapl_cr_accept.lo: dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_accept.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_accept.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_accept.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_accept.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_accept.c' object='dapl_udapl_libdaploscm_la-dapl_cr_accept.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c dapl_udapl_libdaploscm_la-dapl_cr_query.lo: dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_query.c' object='dapl_udapl_libdaploscm_la-dapl_cr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c dapl_udapl_libdaploscm_la-dapl_cr_reject.lo: dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_reject.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_reject.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_reject.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_reject.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_reject.c' object='dapl_udapl_libdaploscm_la-dapl_cr_reject.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c dapl_udapl_libdaploscm_la-dapl_cr_util.lo: dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_util.c' object='dapl_udapl_libdaploscm_la-dapl_cr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c dapl_udapl_libdaploscm_la-dapl_cr_callback.lo: dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_callback.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_callback.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_callback.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_callback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_callback.c' object='dapl_udapl_libdaploscm_la-dapl_cr_callback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo: dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_handoff.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_handoff.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cr_handoff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_handoff.c' object='dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c dapl_udapl_libdaploscm_la-dapl_ep_connect.lo: dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_connect.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_connect.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_connect.c' object='dapl_udapl_libdaploscm_la-dapl_ep_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c dapl_udapl_libdaploscm_la-dapl_ep_create.lo: dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create.c' object='dapl_udapl_libdaploscm_la-dapl_ep_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo: dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_disconnect.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_disconnect.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_disconnect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_disconnect.c' object='dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo: dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_dup_connect.c' object='dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c dapl_udapl_libdaploscm_la-dapl_ep_free.lo: dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_free.c' object='dapl_udapl_libdaploscm_la-dapl_ep_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c dapl_udapl_libdaploscm_la-dapl_ep_reset.lo: dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_reset.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_reset.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_reset.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_reset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_reset.c' object='dapl_udapl_libdaploscm_la-dapl_ep_reset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo: dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_get_status.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_get_status.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_get_status.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_get_status.c' object='dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c dapl_udapl_libdaploscm_la-dapl_ep_modify.lo: dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_modify.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_modify.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_modify.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_modify.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_modify.c' object='dapl_udapl_libdaploscm_la-dapl_ep_modify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo: dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo: dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_write.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo: dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_recv.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_recv.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo: dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c dapl_udapl_libdaploscm_la-dapl_ep_query.lo: dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_query.c' object='dapl_udapl_libdaploscm_la-dapl_ep_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c dapl_udapl_libdaploscm_la-dapl_ep_util.lo: dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_util.c' object='dapl_udapl_libdaploscm_la-dapl_ep_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo: dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dequeue.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dequeue.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dequeue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dequeue.c' object='dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c dapl_udapl_libdaploscm_la-dapl_evd_free.lo: dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_free.c' object='dapl_udapl_libdaploscm_la-dapl_evd_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo: dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_post_se.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_post_se.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_post_se.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_post_se.c' object='dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c dapl_udapl_libdaploscm_la-dapl_evd_resize.lo: dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_resize.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_resize.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_resize.c' object='dapl_udapl_libdaploscm_la-dapl_evd_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c dapl_udapl_libdaploscm_la-dapl_evd_util.lo: dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_util.c' object='dapl_udapl_libdaploscm_la-dapl_evd_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo: dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_cq_async_error_callb.c' object='dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo: dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_qp_async_error_callb.c' object='dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo: dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_un_async_error_callb.c' object='dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo: dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_connection_callb.c' object='dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo: dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dto_callb.c' object='dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo: dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_consumer_context.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_consumer_context.c' object='dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo: dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_handle_type.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_handle_type.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_get_handle_type.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_handle_type.c' object='dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c dapl_udapl_libdaploscm_la-dapl_hash.lo: dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_hash.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hash.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hash.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hash.c' object='dapl_udapl_libdaploscm_la-dapl_hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c dapl_udapl_libdaploscm_la-dapl_hca_util.lo: dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_hca_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hca_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hca_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_hca_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hca_util.c' object='dapl_udapl_libdaploscm_la-dapl_hca_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c dapl_udapl_libdaploscm_la-dapl_ia_close.lo: dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ia_close.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_close.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_close.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_close.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_close.c' object='dapl_udapl_libdaploscm_la-dapl_ia_close.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c dapl_udapl_libdaploscm_la-dapl_ia_open.lo: dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ia_open.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_open.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_open.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_open.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_open.c' object='dapl_udapl_libdaploscm_la-dapl_ia_open.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c dapl_udapl_libdaploscm_la-dapl_ia_query.lo: dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ia_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_query.c' object='dapl_udapl_libdaploscm_la-dapl_ia_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c dapl_udapl_libdaploscm_la-dapl_ia_util.lo: dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ia_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_util.c' object='dapl_udapl_libdaploscm_la-dapl_ia_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c dapl_udapl_libdaploscm_la-dapl_llist.lo: dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_llist.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_llist.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_llist.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_llist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_llist.c' object='dapl_udapl_libdaploscm_la-dapl_llist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c dapl_udapl_libdaploscm_la-dapl_lmr_free.lo: dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_free.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c dapl_udapl_libdaploscm_la-dapl_lmr_query.lo: dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_query.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c dapl_udapl_libdaploscm_la-dapl_lmr_util.lo: dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_util.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo: dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_read.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo: dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_write.c' object='dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c dapl_udapl_libdaploscm_la-dapl_mr_util.lo: dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_mr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_mr_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_mr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_mr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_mr_util.c' object='dapl_udapl_libdaploscm_la-dapl_mr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c dapl_udapl_libdaploscm_la-dapl_provider.lo: dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_provider.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_provider.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_provider.c' object='dapl_udapl_libdaploscm_la-dapl_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c dapl_udapl_libdaploscm_la-dapl_sp_util.lo: dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_sp_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_sp_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_sp_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_sp_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_sp_util.c' object='dapl_udapl_libdaploscm_la-dapl_sp_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c dapl_udapl_libdaploscm_la-dapl_psp_create.lo: dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_psp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create.c' object='dapl_udapl_libdaploscm_la-dapl_psp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo: dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create_any.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create_any.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_create_any.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create_any.c' object='dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c dapl_udapl_libdaploscm_la-dapl_psp_free.lo: dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_psp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_free.c' object='dapl_udapl_libdaploscm_la-dapl_psp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c dapl_udapl_libdaploscm_la-dapl_psp_query.lo: dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_psp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_psp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_query.c' object='dapl_udapl_libdaploscm_la-dapl_psp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c dapl_udapl_libdaploscm_la-dapl_pz_create.lo: dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_pz_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_create.c' object='dapl_udapl_libdaploscm_la-dapl_pz_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c dapl_udapl_libdaploscm_la-dapl_pz_free.lo: dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_pz_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_free.c' object='dapl_udapl_libdaploscm_la-dapl_pz_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c dapl_udapl_libdaploscm_la-dapl_pz_query.lo: dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_pz_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_query.c' object='dapl_udapl_libdaploscm_la-dapl_pz_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c dapl_udapl_libdaploscm_la-dapl_pz_util.lo: dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_pz_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_pz_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_util.c' object='dapl_udapl_libdaploscm_la-dapl_pz_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c dapl_udapl_libdaploscm_la-dapl_rmr_create.lo: dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_create.c' object='dapl_udapl_libdaploscm_la-dapl_rmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c dapl_udapl_libdaploscm_la-dapl_rmr_free.lo: dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_free.c' object='dapl_udapl_libdaploscm_la-dapl_rmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo: dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_bind.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_bind.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_bind.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_bind.c' object='dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c dapl_udapl_libdaploscm_la-dapl_rmr_query.lo: dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_query.c' object='dapl_udapl_libdaploscm_la-dapl_rmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c dapl_udapl_libdaploscm_la-dapl_rmr_util.lo: dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_util.c' object='dapl_udapl_libdaploscm_la-dapl_rmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c dapl_udapl_libdaploscm_la-dapl_rsp_create.lo: dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rsp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_create.c' object='dapl_udapl_libdaploscm_la-dapl_rsp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c dapl_udapl_libdaploscm_la-dapl_rsp_free.lo: dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rsp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_free.c' object='dapl_udapl_libdaploscm_la-dapl_rsp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c dapl_udapl_libdaploscm_la-dapl_rsp_query.lo: dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_rsp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_rsp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_query.c' object='dapl_udapl_libdaploscm_la-dapl_rsp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c dapl_udapl_libdaploscm_la-dapl_cno_util.lo: dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_cno_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_cno_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cno_util.c' object='dapl_udapl_libdaploscm_la-dapl_cno_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo: dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_set_consumer_context.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_set_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_set_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_set_consumer_context.c' object='dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo: dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ring_buffer_util.c' object='dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c dapl_udapl_libdaploscm_la-dapl_name_service.lo: dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_name_service.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_name_service.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_name_service.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_name_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_name_service.c' object='dapl_udapl_libdaploscm_la-dapl_name_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c dapl_udapl_libdaploscm_la-dapl_timer_util.lo: dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_timer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_timer_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_timer_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_timer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_timer_util.c' object='dapl_udapl_libdaploscm_la-dapl_timer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo: dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create_with_srq.c' object='dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo: dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_recv_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_recv_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_recv_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_recv_query.c' object='dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo: dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_set_watermark.c' object='dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c dapl_udapl_libdaploscm_la-dapl_srq_create.lo: dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_create.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_create.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_create.c' object='dapl_udapl_libdaploscm_la-dapl_srq_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c dapl_udapl_libdaploscm_la-dapl_srq_free.lo: dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_free.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_free.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_free.c' object='dapl_udapl_libdaploscm_la-dapl_srq_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c dapl_udapl_libdaploscm_la-dapl_srq_query.lo: dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_query.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_query.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_query.c' object='dapl_udapl_libdaploscm_la-dapl_srq_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c dapl_udapl_libdaploscm_la-dapl_srq_resize.lo: dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_resize.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_resize.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_resize.c' object='dapl_udapl_libdaploscm_la-dapl_srq_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo: dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_post_recv.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_post_recv.c' object='dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo: dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_set_lw.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_set_lw.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_set_lw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_set_lw.c' object='dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c dapl_udapl_libdaploscm_la-dapl_srq_util.lo: dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_srq_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_util.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_srq_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_util.c' object='dapl_udapl_libdaploscm_la-dapl_srq_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c dapl_udapl_libdaploscm_la-dapl_debug.lo: dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_debug.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_debug.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_debug.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_debug.c' object='dapl_udapl_libdaploscm_la-dapl_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c dapl_udapl_libdaploscm_la-dapl_ia_ha.lo: dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ia_ha.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_ha.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_ha.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ia_ha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_ha.c' object='dapl_udapl_libdaploscm_la-dapl_ia_ha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c dapl_udapl_libdaploscm_la-dapl_csp.lo: dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_csp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_csp.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_csp.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_csp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_csp.c' object='dapl_udapl_libdaploscm_la-dapl_csp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo: dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send_invalidate.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo: dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.Tpo -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read_to_rmr.c' object='dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c dapl_udapl_libdaploscm_la-mem.lo: dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-mem.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-mem.Tpo -c -o dapl_udapl_libdaploscm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-mem.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-mem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/mem.c' object='dapl_udapl_libdaploscm_la-mem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c dapl_udapl_libdaploscm_la-cq.lo: dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-cq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-cq.Tpo -c -o dapl_udapl_libdaploscm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-cq.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-cq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/cq.c' object='dapl_udapl_libdaploscm_la-cq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c dapl_udapl_libdaploscm_la-qp.lo: dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-qp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-qp.Tpo -c -o dapl_udapl_libdaploscm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-qp.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-qp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/qp.c' object='dapl_udapl_libdaploscm_la-qp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c dapl_udapl_libdaploscm_la-util.lo: dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-util.Tpo -c -o dapl_udapl_libdaploscm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-util.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/util.c' object='dapl_udapl_libdaploscm_la-util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c dapl_udapl_libdaploscm_la-srq.lo: dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-srq.Tpo -c -o dapl_udapl_libdaploscm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-srq.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/srq.c' object='dapl_udapl_libdaploscm_la-srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c dapl_udapl_libdaploscm_la-cm.lo: dapl/openib_scm/cm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-cm.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-cm.Tpo -c -o dapl_udapl_libdaploscm_la-cm.lo `test -f 'dapl/openib_scm/cm.c' || echo '$(srcdir)/'`dapl/openib_scm/cm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-cm.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-cm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_scm/cm.c' object='dapl_udapl_libdaploscm_la-cm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-cm.lo `test -f 'dapl/openib_scm/cm.c' || echo '$(srcdir)/'`dapl/openib_scm/cm.c dapl_udapl_libdaploscm_la-device.lo: dapl/openib_scm/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-device.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-device.Tpo -c -o dapl_udapl_libdaploscm_la-device.lo `test -f 'dapl/openib_scm/device.c' || echo '$(srcdir)/'`dapl/openib_scm/device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-device.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_scm/device.c' object='dapl_udapl_libdaploscm_la-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-device.lo `test -f 'dapl/openib_scm/device.c' || echo '$(srcdir)/'`dapl/openib_scm/device.c dapl_udapl_libdaploscm_la-ib_extensions.lo: dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-ib_extensions.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-ib_extensions.Tpo -c -o dapl_udapl_libdaploscm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-ib_extensions.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-ib_extensions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/ib_extensions.c' object='dapl_udapl_libdaploscm_la-ib_extensions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c dapl_udapl_libdaploscm_la-fca_provider.lo: dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploscm_la-fca_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploscm_la-fca_provider.Tpo -c -o dapl_udapl_libdaploscm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploscm_la-fca_provider.Tpo $(DEPDIR)/dapl_udapl_libdaploscm_la-fca_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/collectives/fca_provider.c' object='dapl_udapl_libdaploscm_la-fca_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploscm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploscm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c dapl_udapl_libdaploucm_la-dapl_init.lo: dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_init.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_init.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_init.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_init.c' object='dapl_udapl_libdaploucm_la-dapl_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_init.lo `test -f 'dapl/udapl/dapl_init.c' || echo '$(srcdir)/'`dapl/udapl/dapl_init.c dapl_udapl_libdaploucm_la-dapl_evd_create.lo: dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_create.c' object='dapl_udapl_libdaploucm_la-dapl_evd_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_create.lo `test -f 'dapl/udapl/dapl_evd_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_create.c dapl_udapl_libdaploucm_la-dapl_evd_query.lo: dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_query.c' object='dapl_udapl_libdaploucm_la-dapl_evd_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_query.lo `test -f 'dapl/udapl/dapl_evd_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_query.c dapl_udapl_libdaploucm_la-dapl_cno_create.lo: dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_create.c' object='dapl_udapl_libdaploucm_la-dapl_cno_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_create.lo `test -f 'dapl/udapl/dapl_cno_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_create.c dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo: dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_modify_agent.c' object='dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_modify_agent.lo `test -f 'dapl/udapl/dapl_cno_modify_agent.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_modify_agent.c dapl_udapl_libdaploucm_la-dapl_cno_free.lo: dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_free.c' object='dapl_udapl_libdaploucm_la-dapl_cno_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_free.lo `test -f 'dapl/udapl/dapl_cno_free.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_free.c dapl_udapl_libdaploucm_la-dapl_cno_wait.lo: dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_wait.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_wait.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_wait.c' object='dapl_udapl_libdaploucm_la-dapl_cno_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_wait.lo `test -f 'dapl/udapl/dapl_cno_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_wait.c dapl_udapl_libdaploucm_la-dapl_cno_query.lo: dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_cno_query.c' object='dapl_udapl_libdaploucm_la-dapl_cno_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_query.lo `test -f 'dapl/udapl/dapl_cno_query.c' || echo '$(srcdir)/'`dapl/udapl/dapl_cno_query.c dapl_udapl_libdaploucm_la-dapl_lmr_create.lo: dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_lmr_create.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_create.lo `test -f 'dapl/udapl/dapl_lmr_create.c' || echo '$(srcdir)/'`dapl/udapl/dapl_lmr_create.c dapl_udapl_libdaploucm_la-dapl_evd_wait.lo: dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_wait.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_wait.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_wait.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_wait.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_wait.c' object='dapl_udapl_libdaploucm_la-dapl_evd_wait.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_wait.lo `test -f 'dapl/udapl/dapl_evd_wait.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_wait.c dapl_udapl_libdaploucm_la-dapl_evd_disable.lo: dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_disable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_disable.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_disable.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_disable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_disable.c' object='dapl_udapl_libdaploucm_la-dapl_evd_disable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_disable.lo `test -f 'dapl/udapl/dapl_evd_disable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_disable.c dapl_udapl_libdaploucm_la-dapl_evd_enable.lo: dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_enable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_enable.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_enable.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_enable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_enable.c' object='dapl_udapl_libdaploucm_la-dapl_evd_enable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_enable.lo `test -f 'dapl/udapl/dapl_evd_enable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_enable.c dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo: dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_modify_cno.c' object='dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_modify_cno.lo `test -f 'dapl/udapl/dapl_evd_modify_cno.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_modify_cno.c dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo: dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_set_unwaitable.c' object='dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_set_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_set_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_set_unwaitable.c dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo: dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/dapl_evd_clear_unwaitable.c' object='dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_clear_unwaitable.lo `test -f 'dapl/udapl/dapl_evd_clear_unwaitable.c' || echo '$(srcdir)/'`dapl/udapl/dapl_evd_clear_unwaitable.c dapl_udapl_libdaploucm_la-dapl_osd.lo: dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_osd.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_osd.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_osd.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_osd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/udapl/linux/dapl_osd.c' object='dapl_udapl_libdaploucm_la-dapl_osd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_osd.lo `test -f 'dapl/udapl/linux/dapl_osd.c' || echo '$(srcdir)/'`dapl/udapl/linux/dapl_osd.c dapl_udapl_libdaploucm_la-dapl_cookie.lo: dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cookie.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cookie.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cookie.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cookie.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cookie.c' object='dapl_udapl_libdaploucm_la-dapl_cookie.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cookie.lo `test -f 'dapl/common/dapl_cookie.c' || echo '$(srcdir)/'`dapl/common/dapl_cookie.c dapl_udapl_libdaploucm_la-dapl_cr_accept.lo: dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_accept.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_accept.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_accept.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_accept.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_accept.c' object='dapl_udapl_libdaploucm_la-dapl_cr_accept.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_accept.lo `test -f 'dapl/common/dapl_cr_accept.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_accept.c dapl_udapl_libdaploucm_la-dapl_cr_query.lo: dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_query.c' object='dapl_udapl_libdaploucm_la-dapl_cr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_query.lo `test -f 'dapl/common/dapl_cr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_query.c dapl_udapl_libdaploucm_la-dapl_cr_reject.lo: dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_reject.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_reject.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_reject.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_reject.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_reject.c' object='dapl_udapl_libdaploucm_la-dapl_cr_reject.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_reject.lo `test -f 'dapl/common/dapl_cr_reject.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_reject.c dapl_udapl_libdaploucm_la-dapl_cr_util.lo: dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_util.c' object='dapl_udapl_libdaploucm_la-dapl_cr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_util.lo `test -f 'dapl/common/dapl_cr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_util.c dapl_udapl_libdaploucm_la-dapl_cr_callback.lo: dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_callback.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_callback.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_callback.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_callback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_callback.c' object='dapl_udapl_libdaploucm_la-dapl_cr_callback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_callback.lo `test -f 'dapl/common/dapl_cr_callback.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_callback.c dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo: dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_handoff.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_handoff.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cr_handoff.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cr_handoff.c' object='dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cr_handoff.lo `test -f 'dapl/common/dapl_cr_handoff.c' || echo '$(srcdir)/'`dapl/common/dapl_cr_handoff.c dapl_udapl_libdaploucm_la-dapl_ep_connect.lo: dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_connect.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_connect.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_connect.c' object='dapl_udapl_libdaploucm_la-dapl_ep_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_connect.lo `test -f 'dapl/common/dapl_ep_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_connect.c dapl_udapl_libdaploucm_la-dapl_ep_create.lo: dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create.c' object='dapl_udapl_libdaploucm_la-dapl_ep_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_create.lo `test -f 'dapl/common/dapl_ep_create.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create.c dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo: dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_disconnect.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_disconnect.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_disconnect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_disconnect.c' object='dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_disconnect.lo `test -f 'dapl/common/dapl_ep_disconnect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_disconnect.c dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo: dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_dup_connect.c' object='dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_dup_connect.lo `test -f 'dapl/common/dapl_ep_dup_connect.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_dup_connect.c dapl_udapl_libdaploucm_la-dapl_ep_free.lo: dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_free.c' object='dapl_udapl_libdaploucm_la-dapl_ep_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_free.lo `test -f 'dapl/common/dapl_ep_free.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_free.c dapl_udapl_libdaploucm_la-dapl_ep_reset.lo: dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_reset.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_reset.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_reset.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_reset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_reset.c' object='dapl_udapl_libdaploucm_la-dapl_ep_reset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_reset.lo `test -f 'dapl/common/dapl_ep_reset.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_reset.c dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo: dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_get_status.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_get_status.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_get_status.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_get_status.c' object='dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_get_status.lo `test -f 'dapl/common/dapl_ep_get_status.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_get_status.c dapl_udapl_libdaploucm_la-dapl_ep_modify.lo: dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_modify.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_modify.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_modify.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_modify.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_modify.c' object='dapl_udapl_libdaploucm_la-dapl_ep_modify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_modify.lo `test -f 'dapl/common/dapl_ep_modify.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_modify.c dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo: dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read.lo `test -f 'dapl/common/dapl_ep_post_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read.c dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo: dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_write.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_write.lo `test -f 'dapl/common/dapl_ep_post_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_write.c dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo: dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_recv.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_recv.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_recv.lo `test -f 'dapl/common/dapl_ep_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_recv.c dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo: dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_send.lo `test -f 'dapl/common/dapl_ep_post_send.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send.c dapl_udapl_libdaploucm_la-dapl_ep_query.lo: dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_query.c' object='dapl_udapl_libdaploucm_la-dapl_ep_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_query.lo `test -f 'dapl/common/dapl_ep_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_query.c dapl_udapl_libdaploucm_la-dapl_ep_util.lo: dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_util.c' object='dapl_udapl_libdaploucm_la-dapl_ep_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_util.lo `test -f 'dapl/common/dapl_ep_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_util.c dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo: dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dequeue.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dequeue.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dequeue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dequeue.c' object='dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_dequeue.lo `test -f 'dapl/common/dapl_evd_dequeue.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dequeue.c dapl_udapl_libdaploucm_la-dapl_evd_free.lo: dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_free.c' object='dapl_udapl_libdaploucm_la-dapl_evd_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_free.lo `test -f 'dapl/common/dapl_evd_free.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_free.c dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo: dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_post_se.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_post_se.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_post_se.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_post_se.c' object='dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_post_se.lo `test -f 'dapl/common/dapl_evd_post_se.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_post_se.c dapl_udapl_libdaploucm_la-dapl_evd_resize.lo: dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_resize.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_resize.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_resize.c' object='dapl_udapl_libdaploucm_la-dapl_evd_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_resize.lo `test -f 'dapl/common/dapl_evd_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_resize.c dapl_udapl_libdaploucm_la-dapl_evd_util.lo: dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_util.c' object='dapl_udapl_libdaploucm_la-dapl_evd_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_util.lo `test -f 'dapl/common/dapl_evd_util.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_util.c dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo: dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_cq_async_error_callb.c' object='dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_cq_async_error_callb.lo `test -f 'dapl/common/dapl_evd_cq_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_cq_async_error_callb.c dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo: dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_qp_async_error_callb.c' object='dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_qp_async_error_callb.lo `test -f 'dapl/common/dapl_evd_qp_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_qp_async_error_callb.c dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo: dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_un_async_error_callb.c' object='dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_un_async_error_callb.lo `test -f 'dapl/common/dapl_evd_un_async_error_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_un_async_error_callb.c dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo: dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_connection_callb.c' object='dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_connection_callb.lo `test -f 'dapl/common/dapl_evd_connection_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_connection_callb.c dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo: dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_evd_dto_callb.c' object='dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_evd_dto_callb.lo `test -f 'dapl/common/dapl_evd_dto_callb.c' || echo '$(srcdir)/'`dapl/common/dapl_evd_dto_callb.c dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo: dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_consumer_context.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_consumer_context.c' object='dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_get_consumer_context.lo `test -f 'dapl/common/dapl_get_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_get_consumer_context.c dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo: dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_handle_type.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_handle_type.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_get_handle_type.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_get_handle_type.c' object='dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_get_handle_type.lo `test -f 'dapl/common/dapl_get_handle_type.c' || echo '$(srcdir)/'`dapl/common/dapl_get_handle_type.c dapl_udapl_libdaploucm_la-dapl_hash.lo: dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_hash.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hash.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hash.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hash.c' object='dapl_udapl_libdaploucm_la-dapl_hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_hash.lo `test -f 'dapl/common/dapl_hash.c' || echo '$(srcdir)/'`dapl/common/dapl_hash.c dapl_udapl_libdaploucm_la-dapl_hca_util.lo: dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_hca_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hca_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hca_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_hca_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_hca_util.c' object='dapl_udapl_libdaploucm_la-dapl_hca_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_hca_util.lo `test -f 'dapl/common/dapl_hca_util.c' || echo '$(srcdir)/'`dapl/common/dapl_hca_util.c dapl_udapl_libdaploucm_la-dapl_ia_close.lo: dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ia_close.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_close.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_close.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_close.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_close.c' object='dapl_udapl_libdaploucm_la-dapl_ia_close.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ia_close.lo `test -f 'dapl/common/dapl_ia_close.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_close.c dapl_udapl_libdaploucm_la-dapl_ia_open.lo: dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ia_open.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_open.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_open.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_open.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_open.c' object='dapl_udapl_libdaploucm_la-dapl_ia_open.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ia_open.lo `test -f 'dapl/common/dapl_ia_open.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_open.c dapl_udapl_libdaploucm_la-dapl_ia_query.lo: dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ia_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_query.c' object='dapl_udapl_libdaploucm_la-dapl_ia_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ia_query.lo `test -f 'dapl/common/dapl_ia_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_query.c dapl_udapl_libdaploucm_la-dapl_ia_util.lo: dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ia_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_util.c' object='dapl_udapl_libdaploucm_la-dapl_ia_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ia_util.lo `test -f 'dapl/common/dapl_ia_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_util.c dapl_udapl_libdaploucm_la-dapl_llist.lo: dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_llist.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_llist.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_llist.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_llist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_llist.c' object='dapl_udapl_libdaploucm_la-dapl_llist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_llist.lo `test -f 'dapl/common/dapl_llist.c' || echo '$(srcdir)/'`dapl/common/dapl_llist.c dapl_udapl_libdaploucm_la-dapl_lmr_free.lo: dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_free.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_free.lo `test -f 'dapl/common/dapl_lmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_free.c dapl_udapl_libdaploucm_la-dapl_lmr_query.lo: dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_query.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_query.lo `test -f 'dapl/common/dapl_lmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_query.c dapl_udapl_libdaploucm_la-dapl_lmr_util.lo: dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_util.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_util.lo `test -f 'dapl/common/dapl_lmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_util.c dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo: dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_read.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_read.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_read.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_read.c dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo: dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_lmr_sync_rdma_write.c' object='dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_lmr_sync_rdma_write.lo `test -f 'dapl/common/dapl_lmr_sync_rdma_write.c' || echo '$(srcdir)/'`dapl/common/dapl_lmr_sync_rdma_write.c dapl_udapl_libdaploucm_la-dapl_mr_util.lo: dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_mr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_mr_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_mr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_mr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_mr_util.c' object='dapl_udapl_libdaploucm_la-dapl_mr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_mr_util.lo `test -f 'dapl/common/dapl_mr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_mr_util.c dapl_udapl_libdaploucm_la-dapl_provider.lo: dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_provider.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_provider.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_provider.c' object='dapl_udapl_libdaploucm_la-dapl_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_provider.lo `test -f 'dapl/common/dapl_provider.c' || echo '$(srcdir)/'`dapl/common/dapl_provider.c dapl_udapl_libdaploucm_la-dapl_sp_util.lo: dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_sp_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_sp_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_sp_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_sp_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_sp_util.c' object='dapl_udapl_libdaploucm_la-dapl_sp_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_sp_util.lo `test -f 'dapl/common/dapl_sp_util.c' || echo '$(srcdir)/'`dapl/common/dapl_sp_util.c dapl_udapl_libdaploucm_la-dapl_psp_create.lo: dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_psp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create.c' object='dapl_udapl_libdaploucm_la-dapl_psp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_psp_create.lo `test -f 'dapl/common/dapl_psp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create.c dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo: dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create_any.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create_any.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_create_any.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_create_any.c' object='dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_psp_create_any.lo `test -f 'dapl/common/dapl_psp_create_any.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_create_any.c dapl_udapl_libdaploucm_la-dapl_psp_free.lo: dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_psp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_free.c' object='dapl_udapl_libdaploucm_la-dapl_psp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_psp_free.lo `test -f 'dapl/common/dapl_psp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_free.c dapl_udapl_libdaploucm_la-dapl_psp_query.lo: dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_psp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_psp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_psp_query.c' object='dapl_udapl_libdaploucm_la-dapl_psp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_psp_query.lo `test -f 'dapl/common/dapl_psp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_psp_query.c dapl_udapl_libdaploucm_la-dapl_pz_create.lo: dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_pz_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_create.c' object='dapl_udapl_libdaploucm_la-dapl_pz_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_pz_create.lo `test -f 'dapl/common/dapl_pz_create.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_create.c dapl_udapl_libdaploucm_la-dapl_pz_free.lo: dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_pz_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_free.c' object='dapl_udapl_libdaploucm_la-dapl_pz_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_pz_free.lo `test -f 'dapl/common/dapl_pz_free.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_free.c dapl_udapl_libdaploucm_la-dapl_pz_query.lo: dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_pz_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_query.c' object='dapl_udapl_libdaploucm_la-dapl_pz_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_pz_query.lo `test -f 'dapl/common/dapl_pz_query.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_query.c dapl_udapl_libdaploucm_la-dapl_pz_util.lo: dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_pz_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_pz_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_pz_util.c' object='dapl_udapl_libdaploucm_la-dapl_pz_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_pz_util.lo `test -f 'dapl/common/dapl_pz_util.c' || echo '$(srcdir)/'`dapl/common/dapl_pz_util.c dapl_udapl_libdaploucm_la-dapl_rmr_create.lo: dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rmr_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_create.c' object='dapl_udapl_libdaploucm_la-dapl_rmr_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rmr_create.lo `test -f 'dapl/common/dapl_rmr_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_create.c dapl_udapl_libdaploucm_la-dapl_rmr_free.lo: dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rmr_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_free.c' object='dapl_udapl_libdaploucm_la-dapl_rmr_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rmr_free.lo `test -f 'dapl/common/dapl_rmr_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_free.c dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo: dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_bind.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_bind.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_bind.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_bind.c' object='dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rmr_bind.lo `test -f 'dapl/common/dapl_rmr_bind.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_bind.c dapl_udapl_libdaploucm_la-dapl_rmr_query.lo: dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rmr_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_query.c' object='dapl_udapl_libdaploucm_la-dapl_rmr_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rmr_query.lo `test -f 'dapl/common/dapl_rmr_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_query.c dapl_udapl_libdaploucm_la-dapl_rmr_util.lo: dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rmr_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rmr_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rmr_util.c' object='dapl_udapl_libdaploucm_la-dapl_rmr_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rmr_util.lo `test -f 'dapl/common/dapl_rmr_util.c' || echo '$(srcdir)/'`dapl/common/dapl_rmr_util.c dapl_udapl_libdaploucm_la-dapl_rsp_create.lo: dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rsp_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_create.c' object='dapl_udapl_libdaploucm_la-dapl_rsp_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rsp_create.lo `test -f 'dapl/common/dapl_rsp_create.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_create.c dapl_udapl_libdaploucm_la-dapl_rsp_free.lo: dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rsp_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_free.c' object='dapl_udapl_libdaploucm_la-dapl_rsp_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rsp_free.lo `test -f 'dapl/common/dapl_rsp_free.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_free.c dapl_udapl_libdaploucm_la-dapl_rsp_query.lo: dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_rsp_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_rsp_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_rsp_query.c' object='dapl_udapl_libdaploucm_la-dapl_rsp_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_rsp_query.lo `test -f 'dapl/common/dapl_rsp_query.c' || echo '$(srcdir)/'`dapl/common/dapl_rsp_query.c dapl_udapl_libdaploucm_la-dapl_cno_util.lo: dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_cno_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_cno_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_cno_util.c' object='dapl_udapl_libdaploucm_la-dapl_cno_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_cno_util.lo `test -f 'dapl/common/dapl_cno_util.c' || echo '$(srcdir)/'`dapl/common/dapl_cno_util.c dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo: dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_set_consumer_context.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_set_consumer_context.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_set_consumer_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_set_consumer_context.c' object='dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_set_consumer_context.lo `test -f 'dapl/common/dapl_set_consumer_context.c' || echo '$(srcdir)/'`dapl/common/dapl_set_consumer_context.c dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo: dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ring_buffer_util.c' object='dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ring_buffer_util.lo `test -f 'dapl/common/dapl_ring_buffer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_ring_buffer_util.c dapl_udapl_libdaploucm_la-dapl_name_service.lo: dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_name_service.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_name_service.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_name_service.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_name_service.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_name_service.c' object='dapl_udapl_libdaploucm_la-dapl_name_service.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_name_service.lo `test -f 'dapl/common/dapl_name_service.c' || echo '$(srcdir)/'`dapl/common/dapl_name_service.c dapl_udapl_libdaploucm_la-dapl_timer_util.lo: dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_timer_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_timer_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_timer_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_timer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_timer_util.c' object='dapl_udapl_libdaploucm_la-dapl_timer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_timer_util.lo `test -f 'dapl/common/dapl_timer_util.c' || echo '$(srcdir)/'`dapl/common/dapl_timer_util.c dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo: dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_create_with_srq.c' object='dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_create_with_srq.lo `test -f 'dapl/common/dapl_ep_create_with_srq.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_create_with_srq.c dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo: dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_recv_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_recv_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_recv_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_recv_query.c' object='dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_recv_query.lo `test -f 'dapl/common/dapl_ep_recv_query.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_recv_query.c dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo: dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_set_watermark.c' object='dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_set_watermark.lo `test -f 'dapl/common/dapl_ep_set_watermark.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_set_watermark.c dapl_udapl_libdaploucm_la-dapl_srq_create.lo: dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_create.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_create.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_create.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_create.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_create.c' object='dapl_udapl_libdaploucm_la-dapl_srq_create.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_create.lo `test -f 'dapl/common/dapl_srq_create.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_create.c dapl_udapl_libdaploucm_la-dapl_srq_free.lo: dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_free.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_free.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_free.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_free.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_free.c' object='dapl_udapl_libdaploucm_la-dapl_srq_free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_free.lo `test -f 'dapl/common/dapl_srq_free.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_free.c dapl_udapl_libdaploucm_la-dapl_srq_query.lo: dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_query.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_query.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_query.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_query.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_query.c' object='dapl_udapl_libdaploucm_la-dapl_srq_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_query.lo `test -f 'dapl/common/dapl_srq_query.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_query.c dapl_udapl_libdaploucm_la-dapl_srq_resize.lo: dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_resize.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_resize.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_resize.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_resize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_resize.c' object='dapl_udapl_libdaploucm_la-dapl_srq_resize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_resize.lo `test -f 'dapl/common/dapl_srq_resize.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_resize.c dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo: dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_post_recv.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_post_recv.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_post_recv.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_post_recv.c' object='dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_post_recv.lo `test -f 'dapl/common/dapl_srq_post_recv.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_post_recv.c dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo: dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_set_lw.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_set_lw.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_set_lw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_set_lw.c' object='dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_set_lw.lo `test -f 'dapl/common/dapl_srq_set_lw.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_set_lw.c dapl_udapl_libdaploucm_la-dapl_srq_util.lo: dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_srq_util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_util.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_srq_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_srq_util.c' object='dapl_udapl_libdaploucm_la-dapl_srq_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_srq_util.lo `test -f 'dapl/common/dapl_srq_util.c' || echo '$(srcdir)/'`dapl/common/dapl_srq_util.c dapl_udapl_libdaploucm_la-dapl_debug.lo: dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_debug.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_debug.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_debug.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_debug.c' object='dapl_udapl_libdaploucm_la-dapl_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_debug.lo `test -f 'dapl/common/dapl_debug.c' || echo '$(srcdir)/'`dapl/common/dapl_debug.c dapl_udapl_libdaploucm_la-dapl_ia_ha.lo: dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ia_ha.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_ha.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_ha.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ia_ha.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ia_ha.c' object='dapl_udapl_libdaploucm_la-dapl_ia_ha.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ia_ha.lo `test -f 'dapl/common/dapl_ia_ha.c' || echo '$(srcdir)/'`dapl/common/dapl_ia_ha.c dapl_udapl_libdaploucm_la-dapl_csp.lo: dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_csp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_csp.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_csp.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_csp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_csp.c' object='dapl_udapl_libdaploucm_la-dapl_csp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_csp.lo `test -f 'dapl/common/dapl_csp.c' || echo '$(srcdir)/'`dapl/common/dapl_csp.c dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo: dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_send_invalidate.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_send_invalidate.lo `test -f 'dapl/common/dapl_ep_post_send_invalidate.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_send_invalidate.c dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo: dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.Tpo -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/common/dapl_ep_post_rdma_read_to_rmr.c' object='dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-dapl_ep_post_rdma_read_to_rmr.lo `test -f 'dapl/common/dapl_ep_post_rdma_read_to_rmr.c' || echo '$(srcdir)/'`dapl/common/dapl_ep_post_rdma_read_to_rmr.c dapl_udapl_libdaploucm_la-mem.lo: dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-mem.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-mem.Tpo -c -o dapl_udapl_libdaploucm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-mem.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-mem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/mem.c' object='dapl_udapl_libdaploucm_la-mem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-mem.lo `test -f 'dapl/openib_common/mem.c' || echo '$(srcdir)/'`dapl/openib_common/mem.c dapl_udapl_libdaploucm_la-cq.lo: dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-cq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-cq.Tpo -c -o dapl_udapl_libdaploucm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-cq.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-cq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/cq.c' object='dapl_udapl_libdaploucm_la-cq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-cq.lo `test -f 'dapl/openib_common/cq.c' || echo '$(srcdir)/'`dapl/openib_common/cq.c dapl_udapl_libdaploucm_la-qp.lo: dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-qp.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-qp.Tpo -c -o dapl_udapl_libdaploucm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-qp.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-qp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/qp.c' object='dapl_udapl_libdaploucm_la-qp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-qp.lo `test -f 'dapl/openib_common/qp.c' || echo '$(srcdir)/'`dapl/openib_common/qp.c dapl_udapl_libdaploucm_la-util.lo: dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-util.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-util.Tpo -c -o dapl_udapl_libdaploucm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-util.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/util.c' object='dapl_udapl_libdaploucm_la-util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-util.lo `test -f 'dapl/openib_common/util.c' || echo '$(srcdir)/'`dapl/openib_common/util.c dapl_udapl_libdaploucm_la-srq.lo: dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-srq.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-srq.Tpo -c -o dapl_udapl_libdaploucm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-srq.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-srq.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/srq.c' object='dapl_udapl_libdaploucm_la-srq.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-srq.lo `test -f 'dapl/openib_common/srq.c' || echo '$(srcdir)/'`dapl/openib_common/srq.c dapl_udapl_libdaploucm_la-cm.lo: dapl/openib_ucm/cm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-cm.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-cm.Tpo -c -o dapl_udapl_libdaploucm_la-cm.lo `test -f 'dapl/openib_ucm/cm.c' || echo '$(srcdir)/'`dapl/openib_ucm/cm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-cm.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-cm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_ucm/cm.c' object='dapl_udapl_libdaploucm_la-cm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-cm.lo `test -f 'dapl/openib_ucm/cm.c' || echo '$(srcdir)/'`dapl/openib_ucm/cm.c dapl_udapl_libdaploucm_la-device.lo: dapl/openib_ucm/device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-device.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-device.Tpo -c -o dapl_udapl_libdaploucm_la-device.lo `test -f 'dapl/openib_ucm/device.c' || echo '$(srcdir)/'`dapl/openib_ucm/device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-device.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_ucm/device.c' object='dapl_udapl_libdaploucm_la-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-device.lo `test -f 'dapl/openib_ucm/device.c' || echo '$(srcdir)/'`dapl/openib_ucm/device.c dapl_udapl_libdaploucm_la-ib_extensions.lo: dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-ib_extensions.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-ib_extensions.Tpo -c -o dapl_udapl_libdaploucm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-ib_extensions.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-ib_extensions.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/ib_extensions.c' object='dapl_udapl_libdaploucm_la-ib_extensions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-ib_extensions.lo `test -f 'dapl/openib_common/ib_extensions.c' || echo '$(srcdir)/'`dapl/openib_common/ib_extensions.c dapl_udapl_libdaploucm_la-fca_provider.lo: dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -MT dapl_udapl_libdaploucm_la-fca_provider.lo -MD -MP -MF $(DEPDIR)/dapl_udapl_libdaploucm_la-fca_provider.Tpo -c -o dapl_udapl_libdaploucm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapl_udapl_libdaploucm_la-fca_provider.Tpo $(DEPDIR)/dapl_udapl_libdaploucm_la-fca_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/openib_common/collectives/fca_provider.c' object='dapl_udapl_libdaploucm_la-fca_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapl_udapl_libdaploucm_la_CFLAGS) $(CFLAGS) -c -o dapl_udapl_libdaploucm_la-fca_provider.lo `test -f 'dapl/openib_common/collectives/fca_provider.c' || echo '$(srcdir)/'`dapl/openib_common/collectives/fca_provider.c dat_udat_libdat2_la-udat.lo: dat/udat/udat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-udat.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-udat.Tpo -c -o dat_udat_libdat2_la-udat.lo `test -f 'dat/udat/udat.c' || echo '$(srcdir)/'`dat/udat/udat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-udat.Tpo $(DEPDIR)/dat_udat_libdat2_la-udat.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/udat/udat.c' object='dat_udat_libdat2_la-udat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-udat.lo `test -f 'dat/udat/udat.c' || echo '$(srcdir)/'`dat/udat/udat.c dat_udat_libdat2_la-udat_api.lo: dat/udat/udat_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-udat_api.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-udat_api.Tpo -c -o dat_udat_libdat2_la-udat_api.lo `test -f 'dat/udat/udat_api.c' || echo '$(srcdir)/'`dat/udat/udat_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-udat_api.Tpo $(DEPDIR)/dat_udat_libdat2_la-udat_api.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/udat/udat_api.c' object='dat_udat_libdat2_la-udat_api.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-udat_api.lo `test -f 'dat/udat/udat_api.c' || echo '$(srcdir)/'`dat/udat/udat_api.c dat_udat_libdat2_la-udat_sr_parser.lo: dat/udat/udat_sr_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-udat_sr_parser.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-udat_sr_parser.Tpo -c -o dat_udat_libdat2_la-udat_sr_parser.lo `test -f 'dat/udat/udat_sr_parser.c' || echo '$(srcdir)/'`dat/udat/udat_sr_parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-udat_sr_parser.Tpo $(DEPDIR)/dat_udat_libdat2_la-udat_sr_parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/udat/udat_sr_parser.c' object='dat_udat_libdat2_la-udat_sr_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-udat_sr_parser.lo `test -f 'dat/udat/udat_sr_parser.c' || echo '$(srcdir)/'`dat/udat/udat_sr_parser.c dat_udat_libdat2_la-dat_osd.lo: dat/udat/linux/dat_osd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_osd.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_osd.Tpo -c -o dat_udat_libdat2_la-dat_osd.lo `test -f 'dat/udat/linux/dat_osd.c' || echo '$(srcdir)/'`dat/udat/linux/dat_osd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_osd.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_osd.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/udat/linux/dat_osd.c' object='dat_udat_libdat2_la-dat_osd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_osd.lo `test -f 'dat/udat/linux/dat_osd.c' || echo '$(srcdir)/'`dat/udat/linux/dat_osd.c dat_udat_libdat2_la-dat_api.lo: dat/common/dat_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_api.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_api.Tpo -c -o dat_udat_libdat2_la-dat_api.lo `test -f 'dat/common/dat_api.c' || echo '$(srcdir)/'`dat/common/dat_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_api.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_api.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_api.c' object='dat_udat_libdat2_la-dat_api.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_api.lo `test -f 'dat/common/dat_api.c' || echo '$(srcdir)/'`dat/common/dat_api.c dat_udat_libdat2_la-dat_dictionary.lo: dat/common/dat_dictionary.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_dictionary.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_dictionary.Tpo -c -o dat_udat_libdat2_la-dat_dictionary.lo `test -f 'dat/common/dat_dictionary.c' || echo '$(srcdir)/'`dat/common/dat_dictionary.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_dictionary.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_dictionary.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_dictionary.c' object='dat_udat_libdat2_la-dat_dictionary.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_dictionary.lo `test -f 'dat/common/dat_dictionary.c' || echo '$(srcdir)/'`dat/common/dat_dictionary.c dat_udat_libdat2_la-dat_strerror.lo: dat/common/dat_strerror.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_strerror.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_strerror.Tpo -c -o dat_udat_libdat2_la-dat_strerror.lo `test -f 'dat/common/dat_strerror.c' || echo '$(srcdir)/'`dat/common/dat_strerror.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_strerror.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_strerror.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_strerror.c' object='dat_udat_libdat2_la-dat_strerror.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_strerror.lo `test -f 'dat/common/dat_strerror.c' || echo '$(srcdir)/'`dat/common/dat_strerror.c dat_udat_libdat2_la-dat_init.lo: dat/common/dat_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_init.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_init.Tpo -c -o dat_udat_libdat2_la-dat_init.lo `test -f 'dat/common/dat_init.c' || echo '$(srcdir)/'`dat/common/dat_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_init.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_init.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_init.c' object='dat_udat_libdat2_la-dat_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_init.lo `test -f 'dat/common/dat_init.c' || echo '$(srcdir)/'`dat/common/dat_init.c dat_udat_libdat2_la-dat_dr.lo: dat/common/dat_dr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_dr.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_dr.Tpo -c -o dat_udat_libdat2_la-dat_dr.lo `test -f 'dat/common/dat_dr.c' || echo '$(srcdir)/'`dat/common/dat_dr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_dr.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_dr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_dr.c' object='dat_udat_libdat2_la-dat_dr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_dr.lo `test -f 'dat/common/dat_dr.c' || echo '$(srcdir)/'`dat/common/dat_dr.c dat_udat_libdat2_la-dat_sr.lo: dat/common/dat_sr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -MT dat_udat_libdat2_la-dat_sr.lo -MD -MP -MF $(DEPDIR)/dat_udat_libdat2_la-dat_sr.Tpo -c -o dat_udat_libdat2_la-dat_sr.lo `test -f 'dat/common/dat_sr.c' || echo '$(srcdir)/'`dat/common/dat_sr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dat_udat_libdat2_la-dat_sr.Tpo $(DEPDIR)/dat_udat_libdat2_la-dat_sr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dat/common/dat_sr.c' object='dat_udat_libdat2_la-dat_sr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dat_udat_libdat2_la_CFLAGS) $(CFLAGS) -c -o dat_udat_libdat2_la-dat_sr.lo `test -f 'dat/common/dat_sr.c' || echo '$(srcdir)/'`dat/common/dat_sr.c svc_mpxyd-mpxyd.o: dapl/svc/mpxyd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxyd.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxyd.Tpo -c -o svc_mpxyd-mpxyd.o `test -f 'dapl/svc/mpxyd.c' || echo '$(srcdir)/'`dapl/svc/mpxyd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxyd.Tpo $(DEPDIR)/svc_mpxyd-mpxyd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxyd.c' object='svc_mpxyd-mpxyd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxyd.o `test -f 'dapl/svc/mpxyd.c' || echo '$(srcdir)/'`dapl/svc/mpxyd.c svc_mpxyd-mpxyd.obj: dapl/svc/mpxyd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxyd.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxyd.Tpo -c -o svc_mpxyd-mpxyd.obj `if test -f 'dapl/svc/mpxyd.c'; then $(CYGPATH_W) 'dapl/svc/mpxyd.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxyd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxyd.Tpo $(DEPDIR)/svc_mpxyd-mpxyd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxyd.c' object='svc_mpxyd-mpxyd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxyd.obj `if test -f 'dapl/svc/mpxyd.c'; then $(CYGPATH_W) 'dapl/svc/mpxyd.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxyd.c'; fi` svc_mpxyd-util.o: dapl/svc/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-util.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-util.Tpo -c -o svc_mpxyd-util.o `test -f 'dapl/svc/util.c' || echo '$(srcdir)/'`dapl/svc/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-util.Tpo $(DEPDIR)/svc_mpxyd-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/util.c' object='svc_mpxyd-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-util.o `test -f 'dapl/svc/util.c' || echo '$(srcdir)/'`dapl/svc/util.c svc_mpxyd-util.obj: dapl/svc/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-util.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-util.Tpo -c -o svc_mpxyd-util.obj `if test -f 'dapl/svc/util.c'; then $(CYGPATH_W) 'dapl/svc/util.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-util.Tpo $(DEPDIR)/svc_mpxyd-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/util.c' object='svc_mpxyd-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-util.obj `if test -f 'dapl/svc/util.c'; then $(CYGPATH_W) 'dapl/svc/util.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/util.c'; fi` svc_mpxyd-mix.o: dapl/svc/mix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mix.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-mix.Tpo -c -o svc_mpxyd-mix.o `test -f 'dapl/svc/mix.c' || echo '$(srcdir)/'`dapl/svc/mix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mix.Tpo $(DEPDIR)/svc_mpxyd-mix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mix.c' object='svc_mpxyd-mix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mix.o `test -f 'dapl/svc/mix.c' || echo '$(srcdir)/'`dapl/svc/mix.c svc_mpxyd-mix.obj: dapl/svc/mix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mix.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-mix.Tpo -c -o svc_mpxyd-mix.obj `if test -f 'dapl/svc/mix.c'; then $(CYGPATH_W) 'dapl/svc/mix.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mix.Tpo $(DEPDIR)/svc_mpxyd-mix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mix.c' object='svc_mpxyd-mix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mix.obj `if test -f 'dapl/svc/mix.c'; then $(CYGPATH_W) 'dapl/svc/mix.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mix.c'; fi` svc_mpxyd-mcm.o: dapl/svc/mcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mcm.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-mcm.Tpo -c -o svc_mpxyd-mcm.o `test -f 'dapl/svc/mcm.c' || echo '$(srcdir)/'`dapl/svc/mcm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mcm.Tpo $(DEPDIR)/svc_mpxyd-mcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mcm.c' object='svc_mpxyd-mcm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mcm.o `test -f 'dapl/svc/mcm.c' || echo '$(srcdir)/'`dapl/svc/mcm.c svc_mpxyd-mcm.obj: dapl/svc/mcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mcm.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-mcm.Tpo -c -o svc_mpxyd-mcm.obj `if test -f 'dapl/svc/mcm.c'; then $(CYGPATH_W) 'dapl/svc/mcm.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mcm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mcm.Tpo $(DEPDIR)/svc_mpxyd-mcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mcm.c' object='svc_mpxyd-mcm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mcm.obj `if test -f 'dapl/svc/mcm.c'; then $(CYGPATH_W) 'dapl/svc/mcm.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mcm.c'; fi` svc_mpxyd-mpxy_out.o: dapl/svc/mpxy_out.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxy_out.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxy_out.Tpo -c -o svc_mpxyd-mpxy_out.o `test -f 'dapl/svc/mpxy_out.c' || echo '$(srcdir)/'`dapl/svc/mpxy_out.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxy_out.Tpo $(DEPDIR)/svc_mpxyd-mpxy_out.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxy_out.c' object='svc_mpxyd-mpxy_out.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxy_out.o `test -f 'dapl/svc/mpxy_out.c' || echo '$(srcdir)/'`dapl/svc/mpxy_out.c svc_mpxyd-mpxy_out.obj: dapl/svc/mpxy_out.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxy_out.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxy_out.Tpo -c -o svc_mpxyd-mpxy_out.obj `if test -f 'dapl/svc/mpxy_out.c'; then $(CYGPATH_W) 'dapl/svc/mpxy_out.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxy_out.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxy_out.Tpo $(DEPDIR)/svc_mpxyd-mpxy_out.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxy_out.c' object='svc_mpxyd-mpxy_out.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxy_out.obj `if test -f 'dapl/svc/mpxy_out.c'; then $(CYGPATH_W) 'dapl/svc/mpxy_out.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxy_out.c'; fi` svc_mpxyd-mpxy_in.o: dapl/svc/mpxy_in.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxy_in.o -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxy_in.Tpo -c -o svc_mpxyd-mpxy_in.o `test -f 'dapl/svc/mpxy_in.c' || echo '$(srcdir)/'`dapl/svc/mpxy_in.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxy_in.Tpo $(DEPDIR)/svc_mpxyd-mpxy_in.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxy_in.c' object='svc_mpxyd-mpxy_in.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxy_in.o `test -f 'dapl/svc/mpxy_in.c' || echo '$(srcdir)/'`dapl/svc/mpxy_in.c svc_mpxyd-mpxy_in.obj: dapl/svc/mpxy_in.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -MT svc_mpxyd-mpxy_in.obj -MD -MP -MF $(DEPDIR)/svc_mpxyd-mpxy_in.Tpo -c -o svc_mpxyd-mpxy_in.obj `if test -f 'dapl/svc/mpxy_in.c'; then $(CYGPATH_W) 'dapl/svc/mpxy_in.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxy_in.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/svc_mpxyd-mpxy_in.Tpo $(DEPDIR)/svc_mpxyd-mpxy_in.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dapl/svc/mpxy_in.c' object='svc_mpxyd-mpxy_in.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(svc_mpxyd_CFLAGS) $(CFLAGS) -c -o svc_mpxyd-mpxy_in.obj `if test -f 'dapl/svc/mpxy_in.c'; then $(CYGPATH_W) 'dapl/svc/mpxy_in.c'; else $(CYGPATH_W) '$(srcdir)/dapl/svc/mpxy_in.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf dapl/udapl/.libs dapl/udapl/_libs -rm -rf dat/udat/.libs dat/udat/_libs -rm -rf svc/.libs svc/_libs distclean-libtool: -rm -f libtool config.lt install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-sysconfDATA: $(sysconf_DATA) @$(NORMAL_INSTALL) @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ done uninstall-sysconfDATA: @$(NORMAL_UNINSTALL) @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir) install-libdatincludeHEADERS: $(libdatinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(libdatinclude_HEADERS)'; test -n "$(libdatincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(libdatincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdatincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libdatincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libdatincludedir)" || exit $$?; \ done uninstall-libdatincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(libdatinclude_HEADERS)'; test -n "$(libdatincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(libdatincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) \ config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(dapllibofadir)" "$(DESTDIR)$(dapllibomcmdir)" "$(DESTDIR)$(daplliboscmdir)" "$(DESTDIR)$(daplliboucmdir)" "$(DESTDIR)$(datlibdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(sysconfdir)" "$(DESTDIR)$(libdatincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f dapl/udapl/$(am__dirstamp) -rm -f dat/udat/$(am__dirstamp) -rm -f svc/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @DEFINE_MCM_FALSE@install-exec-hook: clean: clean-recursive clean-am: clean-dapllibofaLTLIBRARIES clean-dapllibomcmLTLIBRARIES \ clean-daplliboscmLTLIBRARIES clean-daplliboucmLTLIBRARIES \ clean-datlibLTLIBRARIES clean-generic clean-libtool \ clean-sbinPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dapllibofaLTLIBRARIES \ install-dapllibomcmLTLIBRARIES install-daplliboscmLTLIBRARIES \ install-daplliboucmLTLIBRARIES install-datlibLTLIBRARIES \ install-libdatincludeHEADERS install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-sbinPROGRAMS install-sysconfDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-man5 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dapllibofaLTLIBRARIES \ uninstall-dapllibomcmLTLIBRARIES \ uninstall-daplliboscmLTLIBRARIES \ uninstall-daplliboucmLTLIBRARIES uninstall-datlibLTLIBRARIES \ uninstall-libdatincludeHEADERS uninstall-man \ uninstall-sbinPROGRAMS uninstall-sysconfDATA uninstall-man: uninstall-man1 uninstall-man5 .MAKE: $(am__recursive_targets) all install-am install-exec-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope \ clean-dapllibofaLTLIBRARIES clean-dapllibomcmLTLIBRARIES \ clean-daplliboscmLTLIBRARIES clean-daplliboucmLTLIBRARIES \ clean-datlibLTLIBRARIES clean-generic clean-libtool \ clean-sbinPROGRAMS cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-dapllibofaLTLIBRARIES \ install-dapllibomcmLTLIBRARIES install-daplliboscmLTLIBRARIES \ install-daplliboucmLTLIBRARIES install-data install-data-am \ install-datlibLTLIBRARIES install-dvi install-dvi-am \ install-exec install-exec-am install-exec-hook install-html \ install-html-am install-info install-info-am \ install-libdatincludeHEADERS install-man install-man1 \ install-man5 install-pdf install-pdf-am install-ps \ install-ps-am install-sbinPROGRAMS install-strip \ install-sysconfDATA installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dapllibofaLTLIBRARIES \ uninstall-dapllibomcmLTLIBRARIES \ uninstall-daplliboscmLTLIBRARIES \ uninstall-daplliboucmLTLIBRARIES uninstall-datlibLTLIBRARIES \ uninstall-libdatincludeHEADERS uninstall-man uninstall-man1 \ uninstall-man5 uninstall-sbinPROGRAMS uninstall-sysconfDATA @DEFINE_MCM_TRUE@install-exec-hook: @DEFINE_MCM_TRUE@ install -D -m 755 mpxyd.init $(DESTDIR)$(sysconfdir)/init.d/mpxyd; @DEFINE_MCM_TRUE@ echo %{_sbindir}/mpxyd > mcm-files @DEFINE_MCM_TRUE@ echo %{_sysconfdir}/init.d/mpxyd >> mcm-files @DEFINE_MCM_TRUE@ echo %{_sysconfdir}/mpxyd.conf >> mcm-files dist-hook: dapl.spec cp dapl.spec $(distdir)/ rpmcheck: dapl.spec dist mkdir -p rpmbuild/{SOURCES,BUILD,RPMS,SPECS,BUILDROOT} cp $(distdir).tar.gz rpmbuild/SOURCES srcrpms: rpmcheck rpmbuild -bs --define "_topdir ${PWD}/rpmbuild" dapl.spec rpms: rpmcheck rpmbuild -ba --define "_topdir ${PWD}/rpmbuild" dapl.spec # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dapl-2.1.5/NEWS000066400000000000000000000000001255317474200131360ustar00rootroot00000000000000dapl-2.1.5/README000066400000000000000000000577141255317474200133470ustar00rootroot00000000000000 ========== 1.0 BUILD: ========== The default build includes a non-debug version of libdat and libdapl-cma uDAPL provider. It will also builds test suites dtest and dapltest and provides manpages for each. This version requires libibverbs and librdmacm installation, IPoIB installation, and IPoIB configuration with an IP address. Building : ---------- ./autogen.sh ./configure make Building debug version: ---------------------- ./autogen.sh ./configure --enable-debug make Build example with OFED prefix (x86_64) --------------------------------------------- ./autogen.sh ./configure --prefix /usr --sysconf=/etc --libdir /usr/lib64 LDFLAGS=-L/usr/lib64 CPPFLAGS="-I/usr/include" make Installing: ---------- make install NOTE: to link these libraries you must either use libtool and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. =================== 2.0 CONFIGURATION: =================== /etc/dat.conf # DAT v2.0 # # Note: Both API and Provider versions are based on DAT specification, v2.0 # # Each entry should have the following fields: # # \ # # # For uDAPL cma provder, is one of the following: # network address, network hostname, or netdev name and 0 for port # # For uDAPL scm provider, is device name and port # For uDAPL ucm provider, is device name and port # For uDAPL iWARP provider, is netdev device name and 0 # For uDAPL iWARP provider, is netdev device name and 0 # For uDAPL RoCE provider, is device name and 0 # ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "ib0 0" "" ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "ib1 0" "" ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mthca0 1" "" ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mthca0 2" "" ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ipath0 1" "" ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ipath0 2" "" ofa-v2-ehca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ehca0 1" "" ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mthca0 1" "" ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mthca0 2" "" ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" "" ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mcm-1 u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mcm-2 u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-scif0 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "scif0 1" "" ofa-v2-scif0-u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "scif0 1" "" ofa-v2-mic0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "mic0:ib 1" "" ofa-v2-mlx4_0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mlx4_1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx4_1-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx4_0-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mlx4_1-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx5_0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-mlx5_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-mlx5_0-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-qib0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib0 1" "" ofa-v2-qib0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib0 2" "" ofa-v2-qib1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib1 1" "" ofa-v2-qib1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib1 2" "" ============================= 3.0 Environment Variables ============================= - IB UD options using UCM provider, large scale settings (Xeon) export DAPL_UCM_REP_TIME=2000 /* REQUEST timer, waiting on REPLY, msecs, default = 800 */ export DAPL_UCM_RTU_TIME=1000 /* REPLY timer, waiting for RTU in msecs, default=400 */ export DAPL_UCM_RETRY=7 /* REQUEST & REPLY retries, default = 7 */ export DAPL_UCM_QP_SIZE=1000 /* CM req/reply work queue size, default = 500 entries */ export DAPL_UCM_CQ_SIZE=1000 /* CM req/reply completion queue size, default = 500 entries */ export DAPL_UCM_TX_BURST=100 /* CM signal rate on send messages */ - IB RC options using UCM provider, large scale settings (Xeon) export DAPL_MAX_INLINE=64 /* IB RC inline optimization, best small msg latency, def=64 */ export DAPL_ACK_RETRY=7 /* IB RC Ack retry count, default 7 */ export DAPL_ACK_TIMER=20 /* IB RC Ack retry timer, default 20 */ IB formula:: 5 bits, 4.096us*2^ack_timer. 16== 268ms, 20==4.2s - IB RC options using SCM provider export DAPL_SCM_NETDEV=mic0 /* default is first non-loopback netdev, use mic0 with KNCs */ Other IB settings: export DAPL_IB_MTU=2048 /* IB MTU size, default = 2048 */ export DAPL_RNR_TIMER=12 /* 5 bits, 12 =.64ms, 28 =163ms, 31 =491ms */ export DAPL_RNR_RETRY=7 /* 3 bits, 7 == infinite */ export DAPL_IB_PKEY= 0 /* override IB partition key, default is pkey index 0 */ export DAPL_IB_SL=0 /* override IB Sevice level, default = 0 */ - Other options: export DAPL_WR_MAX=500 /* used to reduce max qp depth on all IB providers, default = dev attributes */ Debug logging and Counter settings ( --enable-counters) export DAPL_DBG_SYS_MEM=10 /* threshold for low sys memory warning, def = 10 percent */ export DAPL_DBG_TYPE=0x0000003 /* set log, monitor, and error checking, default = warnings and errors */ DAPL_DBG_TYPE bit settings as follow: DAPL_DBG_TYPE_ERR = 0x0001, DAPL_DBG_TYPE_WARN = 0x0002, DAPL_DBG_TYPE_EVD = 0x0004, DAPL_DBG_TYPE_CM = 0x0008, DAPL_DBG_TYPE_EP = 0x0010, DAPL_DBG_TYPE_UTIL = 0x0020, DAPL_DBG_TYPE_CALLBACK = 0x0040, DAPL_DBG_TYPE_DTO_COMP_ERR = 0x0080, DAPL_DBG_TYPE_API = 0x0100, DAPL_DBG_TYPE_RTN = 0x0200, DAPL_DBG_TYPE_EXCEPTION = 0x0400, DAPL_DBG_TYPE_SRQ = 0x0800, DAPL_DBG_TYPE_CNTR = 0x1000, DAPL_DBG_TYPE_CM_LIST = 0x2000, DAPL_DBG_TYPE_THREAD = 0x4000, DAPL_DBG_TYPE_CM_EST = 0x8000, DAPL_DBG_TYPE_CM_WARN = 0x10000, DAPL_DBG_TYPE_EXTENSION = 0x20000, DAPL_DBG_TYPE_CM_STATS = 0x40000, DAPL_DBG_TYPE_CM_ERRS = 0x80000, /* print any cm errors on device close */ DAPL_DBG_TYPE_LINK_ERRS = 0x100000, /* print any link errors on device close */ DAPL_DBG_TYPE_LINK_WARN = 0x200000, /* print any link warning on device close */ DAPL_DBG_TYPE_DIAG_ERRS = 0x400000, /* print any diag_counter errors on dev close */ DAPL_DBG_TYPE_SYS_WARN = 0x800000, /* print low mem warning during alloc, reg_mem */ DAPL_DBG_TYPE_VER = 0x1000000, /* print dapl ver and build date during dev open */ ============================= 4.0 Bugs/Known issues ============================= mlx5 support included, new dat.conf entries. beta level. ============================= 5.0 SAMPLE uDAPL APPLICATION: ============================= There are 2 sample programs, with manpages, provided with this package. (dapl/test/dtest/) NAME dtest - simple uDAPL send/receive and RDMA test SYNOPSIS dtest [-P provider] [-b buf size] [-B burst count][-v] [-c] [-p] [-d] [-s] dtest [-P provider] [-b buf size] [-B burst count][-v] [-c] [-p] [-d] [-h HOSTNAME] DESCRIPTION dtest is a simple test used to exercise and verify the uDAPL interfaces. At least two instantia- tions of the test must be run. One acts as the server and the other the client. The server side of the test, once invoked listens for connection requests, until timing out or killed. Upon receipt of a cd connection request, the connection is established, the server and client sides exchange information necessary to perform RDMA writes and reads. OPTIONS -P=PROVIDER use PROVIDER to specify uDAPL interface using /etc/dat.conf (default OpenIB-cma) -b=BUFFER_SIZE use buffer size BUFFER_SIZE for RDMA(default 64) -B=BURST_COUNT use busrt count BURST_COUNT for interations (default 10) -v, verbose output(default off) -c, use consumer notification events (default off) -p, use polling (default wait for event) -d, delay in seconds before close (default off) -s, run as server (default - run as server) -h=HOSTNAME use HOSTNAME to specify server hostname or IP address (default - none) EXAMPLES dtest -P OpenIB-cma -v -s Starts a server process with debug verbosity using provider OpenIB-cma. dtest -P OpenIB-cma -h server1-ib0 Starts a client process, using OpenIB-cma provider to connect to hostname server1-ib0. SEE ALSO dapltest(1) AUTHORS Arlin Davis BUGS /dapl/test/dapltest/ NAME dapltest - test for the Direct Access Programming Library (DAPL) DESCRIPTION Dapltest is a set of tests developed to exercise, characterize, and verify the DAPL interfaces during development and porting. At least two instantiations of the test must be run. One acts as the server, fielding requests and spawning server-side test threads as needed. Other client invo- cations connect to the server and issue test requests. The server side of the test, once invoked, listens continuously for client connection requests, until quit or killed. Upon receipt of a con- nection request, the connection is established, the server and client sides swap version numbers to verify that they are able to communicate, and the client sends the test request to the server. If the version numbers match, and the test request is well-formed, the server spawns the threads needed to run the test before awaiting further connections. USAGE dapltest [ -f script_file_name ] [ -T S|Q|T|P|L ] [ -D device_name ] [ -d ] [ -R HT|LL|EC|PM|BE ] With no arguments, dapltest runs as a server using default values, and loops accepting requests from clients. The -f option allows all arguments to be placed in a file, to ease test automation. The following arguments are common to all tests: [ -T S|Q|T|P|L ] Test function to be performed: S - server loop Q - quit, client requests that server wait for any outstanding tests to complete, then clean up and exit T - transaction test, transfers data between client and server P - performance test, times DTO operations L - limit test, exhausts various resources, runs in client w/o server interaction Default: S [ -D device_name ] Specifies the interface adapter name as documented in the /etc/dat.conf static configura- tion file. This name corresponds to the provider library to open. Default: none [ -d ] Enables extra debug verbosity, primarily tracing of the various DAPL operations as they progress. Repeating this parameter increases debug spew. Errors encountered result in the test spewing some explanatory text and stopping; this flag provides more detail about what lead up to the error. Default: zero [ -R BE ] Indicate the quality of service (QoS) desired. Choices are: HT - high throughput LL - low latency EC - economy (neither HT nor LL) PM - premium BE - best effort Default: BE Usage - Quit test client dapltest [Common_Args] [ -s server_name ] Quit testing (-T Q) connects to the server to ask it to clean up and exit (after it waits for any outstanding test runs to complete). In addition to being more polite than simply killing the server, this test exercises the DAPL object teardown code paths. There is only one argument other than those supported by all tests: -s server_name Specifies the name of the server interface. No default. Usage - Transaction test client dapltest [Common_Args] [ -s server_name ] [ -t threads ] [ -w endpoints ] [ -i iterations ] [ -Q ] [ -V ] [ -P ] OPclient OPserver [ op3, Transaction testing (-T T) transfers a variable amount of data between : client and server. The data transfer can be described as a sequence of individual operations; that entire sequence is transferred ’iterations’ times by each thread over all of its endpoint(s). The following parameters determine the behavior of the transaction test: -s server_name Specifies the name or IP address of the server interface. No default. [ -t threads ] Specify the number of threads to be used. Default: 1 [ -w endpoints ] Specify the number of connected endpoints per thread. Default: 1 [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -Q ] Funnel completion events into a CNO. Default: use EVDs [ -V ] Validate the data being transferred. Default: ignore the data [ -P ] Turn on DTO completion polling Default: off OP1 OP2 [ OP3, ... ] A single transaction (OPx) consists of: server|client Indicates who initiates the data transfer. SR|RR|RW Indicates the type of transfer: SR send/recv RR RDMA read RW RDMA write Defaults: none [ seg_size [ num_segs ] ] : Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) [ -f ] For SR transfers only, indicates that a client’s send transfer completion should be reaped when the next recv completion is reaped. Sends and receives must be paired (one client, one server, and in that order) for this option to be used. Restrictions: Due to the flow control algorithm used by the transaction test, there must be at least one SR OP for both the client and the server. Requesting data validation (-V) causes the test to automatically append three OPs to those specified. These additional operations provide synchronization points during each iteration, at which all user-specified transaction buffers are checked. These three appended operations satisfy the "one SR in each direction" requirement. The transaction OP list is printed out if -d is supplied. Usage - Performance test client dapltest [Common_Args] -s server_name [ -m p|b ] [ -i iterations ] [ -p pipeline ] OP Performance testing (-T P) times the transfer of an operation. The operation is posted ’iterations’ times. The following parameters determine the behavior of the transaction test: -s server_name Specifies the name or IP address of the server interface. No default. -m b|p Used to choose either blocking (b) or polling (p) Default: blocking (b) [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -p pipeline ] Specify the pipline length, valid arguments are in the range [0,MAX_SEND_DTOS]. If a value greater than MAX_SEND_DTOS is requested the value will be adjusted down to MAX_SEND_DTOS. Default: MAX_SEND_DTOS OP Specifies the operation as follow: RR|RW Indicates the type of transfer: RR RDMA read RW RDMA write Defaults: none [ seg_size [ num_segs ] ] Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) Usage - Limit test client Limit testing (-T L) neither requires nor connects to any server instance. The client runs one or more tests which attempt to exhaust various resources to determine DAPL limits and exercise DAPL error paths. If no arguments are given, all tests are run. Limit testing creates the sequence of DAT objects needed to move data back and forth, attempting to find the limits supported for the DAPL object requested. For example, if the LMR creation limit is being examined, the test will create a set of {IA, PZ, CNO, EVD, EP} before trying to run dat_lmr_create() to failure using that set of DAPL objects. The ’width’ parameter can be used to control how many of these parallel DAPL object sets are created before beating upon the requested constructor. Use of -m limits the number of dat_*_create() calls that will be attempted, which can be helpful if the DAPL in use supports essentailly unlimited numbers of some objects. The limit test arguments are: [ -m maximum ] Specify the maximum number of dapl_*_create() attempts. Default: run to object creation failure [ -w width ] Specify the number of DAPL object sets to create while initializing. Default: 1 [ limit_ia ] Attempt to exhaust dat_ia_open() [ limit_pz ] Attempt to exhaust dat_pz_create() [ limit_cno ] Attempt to exhaust dat_cno_create() [ limit_evd ] Attempt to exhaust dat_evd_create() [ limit_ep ] Attempt to exhaust dat_ep_create() [ limit_rsp ] Attempt to exhaust dat_rsp_create() [ limit_psp ] Attempt to exhaust dat_psp_create() [ limit_lmr ] Attempt to exhaust dat_lmr_create(4KB) [ limit_rpost ] Attempt to exhaust dat_ep_post_recv(4KB) [ limit_size_lmr ] Probe maximum size dat_lmr_create() Default: run all tests EXAMPLES dapltest -T S -d -D OpenIB-cma Starts a server process with debug verbosity. dapltest -T T -d -s host1-ib0 -D OpenIB-cma -i 100 client SR 4096 2 server SR 4096 2 Runs a transaction test, with both sides sending one buffer with two 4KB segments, one hundred times. dapltest -T P -d -s host1-ib0 -D OpenIB-cma -i 100 SR 4096 2 Runs a performance test, with the client sending one buffer with two 4KB segments, one hundred times. dapltest -T Q -s host1-ib0 -D OpenIB-cma Asks the server to clean up and exit. dapltest -T L -D OpenIB-cma -d -w 16 -m 1000 Runs all of the limit tests, setting up 16 complete sets of DAPL objects, and creating at most a thousand instances when trying to exhaust resources. dapltest -T T -V -d -t 2 -w 4 -i 55555 -s linux3 -D OpenIB-cma client RW 4096 1 server RW 2048 4 client SR 1024 4 server SR 4096 2 client SR 1024 3 -f server SR 2048 1 -f Runs a more complicated transaction test, with two thread using four EPs each, sending a more complicated buffer pattern for a larger number of iterations, validating the data received. BUGS (and To Do List) Use of CNOs (-Q) is not yet supported. Further limit tests could be added. dapl-2.1.5/README.mcm000066400000000000000000000235151255317474200141120ustar00rootroot00000000000000 uDAPL MCM Provider and MPXYD Daemon (CCL-proxy) dapl-2.1.x May 2015 MCM is a new uDAPL provider that is an extension to standard DAT 2.0 libraries. The purpose of this service is to proxy RDMA writes from the MIC to the HOST to improve large IO performance. The provider will support MIC to MIC, HOST to HOST, and MIC to HOST environments. The mcm client will NOT use MPXYD when running on the host. It requires a new MPXYD daemon service when clients are running on a MIC KNC adapter. This package installs all the host side libraries and daemon service. The MIC libraries must be built and moved over to MIC adapter. This verion is currently included with MPSS and all libraries and services will be installed by default. Current release package: dapl-2.1.5.tar.gz * Sample host build from source package (ofed must installed) ./autogen.sh ./configure \ --enable-mcm \ --prefix=/usr \ --libdir=/usr/lib64 \ --sysconfdir=/etc make sudo make install * Sample /home/user1 MIC build from source package for MPSS 3.x (MPSS must be installed) source /opt/mpss/3.x/environment-setup-k1om-mpss-linux ./autogen.sh ./configure \ --enable-mcm --host=x86_64-k1om-linux \ --prefix=/home/user1/dapl-mic-install \ CC=/usr/linux-k1om-4.7/bin/x86_64-k1om-linux-gcc \ CFLAGS="-I/opt/mpss/3.x/sysroots/k1om-mpss-linux/usr/include LDFLAGS="-L/opt/mpss/3.x/sysroots/k1om-mpss-linux/usr/lib64" make sudo make install * Sample /home/user1 MIC build from source package for MPSS 2.x (MPSS must be installed) export PATH=$PATH:/usr/linux-k1om-4.7/bin ./autogen.sh ./configure \ --enable-mcm \ --prefix=/home/user1/dapl-mic-install \ --libdir=/opt/intel/mic/ofed/card/usr/lib64 \ --sysconfdir=/opt/intel/mic/ofed/card/etc \ --host=x86_64-k1om-linux \ CFLAGS="-I/opt/intel/mic/ofed/card/usr/include" \ LDFLAGS="-L/opt/intel/mic/ofed/card/usr/lib64" make sudo make install * Cluster deployment (1) Build once on the head or on one of the nodes as described in the above steps. (2) Replicate these files on all the nodes: /etc/dat.conf /etc/mpxyd.conf /usr/sbin/mpxyd /usr/lib64/libdaplomcm.so.2 /opt/intel/mic/ofed/card/etc/dat.conf /opt/intel/mic/ofed/card/usr/lib64/libdaplomcm.so.2 /opt/intel/mic/ofed/card/ofed.filelist (3) Unload and then restart MPSS on all the nodes. * Start the proxy daemon on all the nodes (host only) sudo /usr/sbin/mpxyd * Use the MCM provider with Intel MPI 4.1.3 or greater for best out of box experiences. (1) Recommended settings: export I_MPI_MIC=1 export I_MPI_DEBUG=2 export I_MPI_FALLBACK=0 export I_MPI_MIC_DAPL_DIRECT_COPY_THRESHOLD=8192,262144 With these settings on MIC, messages less than 8192 bytes will be sent via pre-registered buffers; messages between 8192 and 262144 bytes will be sent via the Rendezvous protocol throught the first provider; and larger messages will be sent via the Rendezvous protocol through the second provider. Fine tune these two sizes for the best performance. * Setup for non-root CCL Proxy testing, MPXYD running as process with different service port from your /home directory: Using build instructions above, change prefix as follow and "make install": Build MIC: --prefix=/home/username/ccl-proxy-mic Build host: --prefix=/home/username/ccl-proxy-host edit /home/username/ccl-proxy-host/etc/mpxyd.conf and change the following entries: log_file /var/log/mpxyd.log to log_file /tmp/username/mpxyd.log lock_file /var/log/mpxyd.pid to lock_file /tmp/username/mpxyd.log scif_port_id 68 to scif_port_id 1068 start the mpxyd process on each node ssh node1-hostname /home/username/ccl-proxy-host/sbin/mpxyd -P -O /home/username/ccl-proxy-host/etc/mpxyd.conf& Note: override default port id using following environment variable: export DAPL_MCM_PORT_ID=1068 * Notes (1) Modify "/etc/mpxyd.conf" to change the settings for the proxy. Especially, try different values of "buffer_segment_size" for performance tuning. Use a smaller value for "buffer_pool_mb" to reduce the memory foorprint of mpxyd. Use a larger value for "scif_listen_qlen" to run more MPI ranks per card. Also modify mcm_affinity_base to the desired CPU_id to insure socket to adapter affinity. Best performance when HCA, MIC, and CPU are on same socket. Default settings are on CPU socket 0. (2) By default, only writes originated from MIC is proxied. However, it is also possible to proxy host-originated writes (e.g. for debugging purpose). To do this, set the environment variable "DAPL_MCM_ALWAYS_PROXY=1". This variable applies to the provider, not the proxy. ChangeLog: Release 2.1.5 (OFED 3.18 RC3) dat.conf: update comments regarding versions dtest: add logging of provider private data size with -v scm: remove use of msg.resv field for process id logging cma: report correct CM req private data size on query mpxyd: memset ib_wr structure before post_send on WC and WR requests mcm: add HST side provider support for device without inline data capability ucm: CM changes for UD extended port space and indexer ucm: add device support for new port space hash table ucm: allocate/free AH hash table for UD endpoint types ucm: check for AH caching when destroying via UD extension ucm: optimizations for large scale UD communication management mpxyd: use wr opcode instead of wc opcode to support logging on error cases mcm: HST->MXS mode, using RDMA_WRITE_WITH_IMM, fails with dtest -w dapl: aarch64 support for linux dapltest: add scripts to dist, set default device to IPoIB mpxyd: add wc_flags to proxy work completions Release 2.1.4 (OFED 3.18 RC1) mpxyd: fix typo in configuration file cma: RR attributes moved to common ib_cm struct mpxyd: tx thread incorrectly sleeps with negative pi_rw_cnt value dat.conf: add entries for True Scale qib device mpxyd: add support for devices without inline data support ucm: long disconnect times with many-to-one applications openib: add inline data support check during device open cleanup ib/cm attribute management across openib providers dapltest: fix -Werror=format-security issue with printf Release 2.1.3 (targeting OFED 3.18) dapl: mpxyd service changes to support multi-thread single-core option dapl: add rdma_write_imm and write only option to dtest ucm: add time wait override capability for CM services common: dapl_ep_free must serialize CM object destroy dtestx: allow scale up to 1000 EP's ucm: RTU not retransmitted in TIMEWAIT state mpxyd: increase max open files for service mpxyd: DTO completion ERR: status 12, op RDMA_WRITE running MPI alltoall test mcm: HST->MXS mode incorrectly signals multiple fragments per WR mcm: add segmentation to HST->MXS mode for improved performance mpxyd: set global seg_sz to 128KB for proxy data service openib: add port_num to provider named attributes mcm: provide CPU family/model attribute on both host and mic sides dtestx: update IB extension example test with new v2.0.9 features dtest: add dtestsrq for SRQ example and provider testing common: add srq support for openib verbs providers openib: add IB UD cm_free/ah_free extension support in UCM provider openib: add new TIMEWAIT state for CM extension: add IB UD extensions to reduce provider CM and AH memory footprint mpxyd/mcm: add provider specific attribute DAT_IB_PROXY_VERSION mpxyd: log warning if running in COMPAT mode add provider and proxy support for GUID across platform common: return appropriate handles with affiliated EP and EVD async events Release 2.1.2 (OFED 3.12-1) mpxyd: add global routing support for proxy connections mcm: only call mix_get_attr if running on MIC openib: modify check for link_layer to handle unspecified dapl: add support for the s390x platform dtest server exchange connection info with client mpxyd: 2 MICs in same numa_node will overlap CPU affinity, don't reset base mcm: implement proxy mix_prov_attr function, add fields CPU model and family mpxyd: tx thread may not be signaled on small segment writes Release 2.1.1 (OFED 3.12-1 RC1) common: add provider name to log messages mpxyd: log warning message if numa_node invalid include debuginfo with build build: include debuginfo with build mpxyd: tx thread doesn't sleep during no pending IO state mpxyd: change MIC cpu_mask to per numa node instead of adapter mpxyd: set to MXS mode if device numa_node is invalid (-1) mpxyd: MXS based alltoall benchmark hangs or returns post_send timeout mpxyd: add IO profile capabilities to help debug alltoall stall cases mpxyd: retry stalled inline post_send, init m_idx only when signaled Release 2.1.0 (OFED 3.12-1, MIC support added) build: add missing NEWS file update autogen.sh add MCM provider and MPXYD service to build mpxyd: service startup script and configuration file add readme for MCM provider and MPXYD service update Copyright dates add new MIC RDMA proxy service daemon (MPXYD) add new dapl MIC provider (MCM) to support MIC RDMA proxy services MCM: new MIC provider and proxy service definitions cleanup build warnings common: add CQ,QP,MR abstractions for new MIC provider and data proxy service openib: cleanup, use inet_ntop for GIDs, remove some logs, destroy pipes on release common: new dapls_evd_cqe_to_event call, cqe to event common: init ring_buffer, assign hd/tl pos in range allow log level changes during device open ucm: fix cm rbuf setup, include grh pad on initialization ucm: remove duplicate async_event code, use common async event call new lightweight open_query/close_query IB extension for fast attribute query dtestcm: add more detailed debug during disconnect phase cma: long delays when opening cma provider with no IPoIB configured common: new debug levels for low system memory, IA stats, and package info build: remove library check for mverbs with --enable-fca IB extension: segfault in create collective group with non-vector type IA handle" build: change configure help to correctly state collective default=none dapl-2.1.5/aclocal.m4000066400000000000000000001241061255317474200143150ustar00rootroot00000000000000# generated automatically by aclocal 1.14 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],, [m4_warning([this file was generated for autoconf 2.67. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # -*- Autoconf -*- # Obsolete and "removed" macros, that must however still report explicit # error messages when used, to smooth transition. # # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) dapl-2.1.5/config.h.in000066400000000000000000000066721255317474200145070ustar00rootroot00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* set to 1 to use IB ACM services */ #undef DAPL_USE_IBACM /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `fca' library (-lfca). */ #undef HAVE_LIBFCA /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION dapl-2.1.5/config/000077500000000000000000000000001255317474200137165ustar00rootroot00000000000000dapl-2.1.5/config/compile000077500000000000000000000162451255317474200153040ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dapl-2.1.5/config/config.guess000077500000000000000000001303611255317474200162420ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dapl-2.1.5/config/config.sub000077500000000000000000001053011255317474200157010ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dapl-2.1.5/config/depcomp000077500000000000000000000560161255317474200153030ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dapl-2.1.5/config/install-sh000077500000000000000000000332551255317474200157320ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dapl-2.1.5/config/ltmain.sh000066400000000000000000010515221255317474200155440ustar00rootroot00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 dapl-2.1.5/config/missing000077500000000000000000000153311255317474200153200ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: dapl-2.1.5/configure000077500000000000000000015643141255317474200143760ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.67 for dapl 2.1.5. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: linux-rdma@vger.kernel.org about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dapl' PACKAGE_TARNAME='dapl' PACKAGE_VERSION='2.1.5' PACKAGE_STRING='dapl 2.1.5' PACKAGE_BUGREPORT='linux-rdma@vger.kernel.org' PACKAGE_URL='' ac_unique_file="dat/udat/udat.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS OS_SUSE11_FALSE OS_SUSE11_TRUE COLL_TYPE_FCA_FALSE COLL_TYPE_FCA_TRUE EXT_TYPE_IB_FALSE EXT_TYPE_IB_TRUE DEFINE_COUNTERS_FALSE DEFINE_COUNTERS_TRUE DEFINE_MCM_FALSE DEFINE_MCM_TRUE DEFINE_UCM_FALSE DEFINE_UCM_TRUE DEFINE_SCM_FALSE DEFINE_SCM_TRUE DEFINE_CMA_FALSE DEFINE_CMA_TRUE DAPL_USE_IBACM_FALSE DAPL_USE_IBACM_TRUE DEBUG_FALSE DEBUG_TRUE HAVE_LD_VERSION_SCRIPT_FALSE HAVE_LD_VERSION_SCRIPT_TRUE DEFINE_ATTR_LINK_LAYER_FALSE DEFINE_ATTR_LINK_LAYER_TRUE CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_libcheck enable_debug enable_acm enable_cma enable_scm enable_ucm enable_mcm enable_counters enable_ext_type enable_coll_type ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures dapl 2.1.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/dapl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of dapl 2.1.5:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-libcheck do not test for presence of ib libraries --enable-debug enable debug build, default=disabled --enable-acm enable IB ACM services, default=disabled --disable-cma disable CMA (rdma_cm) provider build, default=enabled --disable-scm disable SCM (socket cm) provider build, default=enabled --disable-ucm disable UCM (IB UD cm) provider build, default=enabled --enable-mcm enable MCM (proxy CM) SCIF provider build, default=auto --enable-counters enable counters provider build, default=disabled --enable-ext-type enable extensions support for library: ib, none, default=ib --enable-coll-type enable IB collective support: fca, none, default=none Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF dapl configure 2.1.5 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------------- ## ## Report this to linux-rdma@vger.kernel.org ## ## ----------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval "test \"\${$4+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by dapl $as_me 2.1.5, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if test "${am_cv_make_support_nested_variables+set}" = set; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=dapl VERSION=2.1.5 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if test "${am_cv_make_support_nested_variables+set}" = set; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if test "${am_cv_prog_cc_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if test "${lt_cv_nm_interface+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if test "${lt_cv_to_host_file_cmd+set}" = set; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if test "${lt_cv_to_tool_file_cmd+set}" = set; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if test "${lt_cv_sharedlib_from_linklib_cmd+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if test "${lt_cv_ar_at_file+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_MANIFEST_TOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_MANIFEST_TOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test "${lt_cv_path_mainfest_tool+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if test "${lt_cv_ld_force_load+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "${lt_cv_prog_compiler_pic+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if test "${lt_cv_aix_libpath_+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if test "${lt_cv_aix_libpath_+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if test "${lt_cv_prog_compiler__b+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test "${lt_cv_irix_exported_symbol+set}" = set; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if test "${lt_cv_archive_cmds_need_lc+set}" = set; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: # Check whether --enable-libcheck was given. if test "${enable_libcheck+set}" = set; then : enableval=$enable_libcheck; if test x$enableval = xno ; then disable_libcheck=yes fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if test "${am_cv_prog_cc_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "$disable_libcheck" != "yes"; then ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_verbs_h" = x""yes; then : else as_fn_error $? " not found. Is libibverbs installed?" "$LINENO" 5 fi for ac_header in arpa/inet.h fcntl.h inttypes.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h syslog.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_member "$LINENO" "struct ibv_port_attr" "link_layer" "ac_cv_member_struct_ibv_port_attr_link_layer" "#include " if test "x$ac_cv_member_struct_ibv_port_attr_link_layer" = x""yes; then : if test "yes" = "yes"; then DEFINE_ATTR_LINK_LAYER_TRUE= DEFINE_ATTR_LINK_LAYER_FALSE='#' else DEFINE_ATTR_LINK_LAYER_TRUE='#' DEFINE_ATTR_LINK_LAYER_FALSE= fi else if test "yes" = "no"; then DEFINE_ATTR_LINK_LAYER_TRUE= DEFINE_ATTR_LINK_LAYER_FALSE='#' else DEFINE_ATTR_LINK_LAYER_TRUE='#' DEFINE_ATTR_LINK_LAYER_FALSE= fi fi for ac_func in gethostname gettimeofday inet_ntoa memset select socket strcasecmp strdup strerror strtol sysinfo do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done else if test "yes" = "no"; then DEFINE_ATTR_LINK_LAYER_TRUE= DEFINE_ATTR_LINK_LAYER_FALSE='#' else DEFINE_ATTR_LINK_LAYER_TRUE='#' DEFINE_ATTR_LINK_LAYER_FALSE= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ld accepts --version-script" >&5 $as_echo_n "checking whether ld accepts --version-script... " >&6; } if test "${ac_cv_version_script+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then ac_cv_version_script=yes else ac_cv_version_script=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_version_script" >&5 $as_echo "$ac_cv_version_script" >&6; } if test "$ac_cv_version_script" = "yes"; then HAVE_LD_VERSION_SCRIPT_TRUE= HAVE_LD_VERSION_SCRIPT_FALSE='#' else HAVE_LD_VERSION_SCRIPT_TRUE='#' HAVE_LD_VERSION_SCRIPT_FALSE= fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;; esac else debug=false fi if test x$debug = xtrue; then DEBUG_TRUE= DEBUG_FALSE='#' else DEBUG_TRUE='#' DEBUG_FALSE= fi # Check whether --enable-acm was given. if test "${enable_acm+set}" = set; then : enableval=$enable_acm; case "$enableval" in yes) $as_echo "#define DAPL_USE_IBACM 1" >>confdefs.h ac_fn_c_check_member "$LINENO" "struct ibv_path_record" "service_id" "ac_cv_member_struct_ibv_path_record_service_id" "#include " if test "x$ac_cv_member_struct_ibv_path_record_service_id" = x""yes; then : else as_fn_error $? "IB ACM support requires libibverbs 1.1.4 or greater." "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "infiniband/acm.h" "ac_cv_header_infiniband_acm_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_acm_h" = x""yes; then : else as_fn_error $? "IB ACM requested but not found." "$LINENO" 5 fi $as_echo "#define DAPL_USE_IBACM 1" >>confdefs.h acm=true ;; no) acm=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-acm" "$LINENO" 5 ;; esac else acm=false fi if test x$acm = true; then DAPL_USE_IBACM_TRUE= DAPL_USE_IBACM_FALSE='#' else DAPL_USE_IBACM_TRUE='#' DAPL_USE_IBACM_FALSE= fi # Check whether --enable-cma was given. if test "${enable_cma+set}" = set; then : enableval=$enable_cma; case "${enableval}" in yes) cma=true ;; no) cma=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-cma" "$LINENO" 5 ;; esac else cma=true fi if test x$cma = xtrue; then DEFINE_CMA_TRUE= DEFINE_CMA_FALSE='#' else DEFINE_CMA_TRUE='#' DEFINE_CMA_FALSE= fi # Check whether --enable-scm was given. if test "${enable_scm+set}" = set; then : enableval=$enable_scm; case "${enableval}" in yes) scm=true ;; no) scm=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-scm" "$LINENO" 5 ;; esac else scm=true fi if test x$scm = xtrue; then DEFINE_SCM_TRUE= DEFINE_SCM_FALSE='#' else DEFINE_SCM_TRUE='#' DEFINE_SCM_FALSE= fi # Check whether --enable-ucm was given. if test "${enable_ucm+set}" = set; then : enableval=$enable_ucm; case "${enableval}" in yes) ucm=true ;; no) ucm=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-ucm" "$LINENO" 5 ;; esac else ucm=true fi if test x$ucm = xtrue; then DEFINE_UCM_TRUE= DEFINE_UCM_FALSE='#' else DEFINE_UCM_TRUE='#' DEFINE_UCM_FALSE= fi ac_fn_c_check_header_mongrel "$LINENO" "scif.h" "ac_cv_header_scif_h" "$ac_includes_default" if test "x$ac_cv_header_scif_h" = x""yes; then : sciffound=true else sciffound=false fi # Check whether --enable-mcm was given. if test "${enable_mcm+set}" = set; then : enableval=$enable_mcm; case "${enableval}" in yes) if test x$sciffound = xtrue; then : mcm=true else as_fn_error $? " not found. Is libscif installed?" "$LINENO" 5 fi ;; no) mcm=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-mcm" "$LINENO" 5 ;; esac else mcm=$sciffound fi if test x$mcm = xtrue; then DEFINE_MCM_TRUE= DEFINE_MCM_FALSE='#' else DEFINE_MCM_TRUE='#' DEFINE_MCM_FALSE= fi # Check whether --enable-counters was given. if test "${enable_counters+set}" = set; then : enableval=$enable_counters; case "${enableval}" in yes) counters=true ;; no) counters=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-counters" "$LINENO" 5 ;; esac else counters=false fi if test x$counters = xtrue; then DEFINE_COUNTERS_TRUE= DEFINE_COUNTERS_FALSE='#' else DEFINE_COUNTERS_TRUE='#' DEFINE_COUNTERS_FALSE= fi # Check whether --enable-ext-type was given. if test "${enable_ext_type+set}" = set; then : enableval=$enable_ext_type; if test "x$enableval" = "xib" ; then ext_type=ib elif test "x$enableval" = "xnone" ; then ext_type=none else echo echo "Error!" echo "Unknown extension type' type" exit -1 fi else ext_type=ib fi if test "$ext_type" = "ib"; then EXT_TYPE_IB_TRUE= EXT_TYPE_IB_FALSE='#' else EXT_TYPE_IB_TRUE='#' EXT_TYPE_IB_FALSE= fi # Check whether --enable-coll-type was given. if test "${enable_coll_type+set}" = set; then : enableval=$enable_coll_type; if test "x$enableval" = "xfca" ; then coll_type=fca ac_fn_c_check_header_mongrel "$LINENO" "fca/fca_api.h" "ac_cv_header_fca_fca_api_h" "$ac_includes_default" if test "x$ac_cv_header_fca_fca_api_h" = x""yes; then : else as_fn_error $? " not found. Is libfca devel package installed?" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fca_init in -lfca" >&5 $as_echo_n "checking for fca_init in -lfca... " >&6; } if test "${ac_cv_lib_fca_fca_init+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfca $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fca_init (); int main () { return fca_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_fca_fca_init=yes else ac_cv_lib_fca_fca_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fca_fca_init" >&5 $as_echo "$ac_cv_lib_fca_fca_init" >&6; } if test "x$ac_cv_lib_fca_fca_init" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBFCA 1 _ACEOF LIBS="-lfca $LIBS" else as_fn_error $? "fca_init() not found. Is libfca library installed?" "$LINENO" 5 fi elif test "x$enableval" = "xnone" ; then coll_type=none else echo echo "Error!" echo "Unknown IB collective type' type" exit -1 fi else coll_type=none fi if test "$coll_type" = "fca"; then COLL_TYPE_FCA_TRUE= COLL_TYPE_FCA_FALSE='#' else COLL_TYPE_FCA_TRUE='#' COLL_TYPE_FCA_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking Check for SUSE_11 system" >&5 $as_echo_n "checking Check for SUSE_11 system... " >&6; } if test "${ac_cv_suse11+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -f /etc/SuSE-release && test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then ac_cv_suse11=yes else ac_cv_suse11=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_suse11" >&5 $as_echo "$ac_cv_suse11" >&6; } if test "$ac_cv_suse11" = "yes"; then OS_SUSE11_TRUE= OS_SUSE11_FALSE='#' else OS_SUSE11_TRUE='#' OS_SUSE11_FALSE= fi ac_config_files="$ac_config_files Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec mpxyd.init" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_ATTR_LINK_LAYER_TRUE}" && test -z "${DEFINE_ATTR_LINK_LAYER_FALSE}"; then as_fn_error $? "conditional \"DEFINE_ATTR_LINK_LAYER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_ATTR_LINK_LAYER_TRUE}" && test -z "${DEFINE_ATTR_LINK_LAYER_FALSE}"; then as_fn_error $? "conditional \"DEFINE_ATTR_LINK_LAYER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_ATTR_LINK_LAYER_TRUE}" && test -z "${DEFINE_ATTR_LINK_LAYER_FALSE}"; then as_fn_error $? "conditional \"DEFINE_ATTR_LINK_LAYER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEBUG_TRUE}" && test -z "${DEBUG_FALSE}"; then as_fn_error $? "conditional \"DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DAPL_USE_IBACM_TRUE}" && test -z "${DAPL_USE_IBACM_FALSE}"; then as_fn_error $? "conditional \"DAPL_USE_IBACM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_CMA_TRUE}" && test -z "${DEFINE_CMA_FALSE}"; then as_fn_error $? "conditional \"DEFINE_CMA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_SCM_TRUE}" && test -z "${DEFINE_SCM_FALSE}"; then as_fn_error $? "conditional \"DEFINE_SCM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_UCM_TRUE}" && test -z "${DEFINE_UCM_FALSE}"; then as_fn_error $? "conditional \"DEFINE_UCM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_MCM_TRUE}" && test -z "${DEFINE_MCM_FALSE}"; then as_fn_error $? "conditional \"DEFINE_MCM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DEFINE_COUNTERS_TRUE}" && test -z "${DEFINE_COUNTERS_FALSE}"; then as_fn_error $? "conditional \"DEFINE_COUNTERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXT_TYPE_IB_TRUE}" && test -z "${EXT_TYPE_IB_FALSE}"; then as_fn_error $? "conditional \"EXT_TYPE_IB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COLL_TYPE_FCA_TRUE}" && test -z "${COLL_TYPE_FCA_FALSE}"; then as_fn_error $? "conditional \"COLL_TYPE_FCA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_SUSE11_TRUE}" && test -z "${OS_SUSE11_FALSE}"; then as_fn_error $? "conditional \"OS_SUSE11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by dapl $as_me 2.1.5, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ dapl config.status 2.1.5 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "test/dtest/Makefile") CONFIG_FILES="$CONFIG_FILES test/dtest/Makefile" ;; "test/dapltest/Makefile") CONFIG_FILES="$CONFIG_FILES test/dapltest/Makefile" ;; "dapl.spec") CONFIG_FILES="$CONFIG_FILES dapl.spec" ;; "mpxyd.init") CONFIG_FILES="$CONFIG_FILES mpxyd.init" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi dapl-2.1.5/configure.in000066400000000000000000000150661255317474200147720ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) AC_INIT(dapl, 2.1.5, linux-rdma@vger.kernel.org) AC_CONFIG_SRCDIR([dat/udat/udat.c]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_MACRO_DIR([m4]) AM_CONFIG_HEADER(config.h) AM_INIT_AUTOMAKE(dapl, 2.1.5) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AM_PROG_LIBTOOL AC_ARG_ENABLE([libcheck], AS_HELP_STRING([--disable-libcheck], [do not test for presence of ib libraries]), [ if test x$enableval = xno ; then disable_libcheck=yes fi ] ) dnl Checks for programs AC_PROG_CC dnl Checks for header files and libraries if test "$disable_libcheck" != "yes"; then AC_CHECK_HEADER(infiniband/verbs.h, [], AC_MSG_ERROR([ not found. Is libibverbs installed?])) AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h syslog.h unistd.h]) AC_CHECK_MEMBER(struct ibv_port_attr.link_layer, AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "yes"), AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no"), [#include ]) AC_CHECK_FUNCS([gethostname gettimeofday inet_ntoa memset select socket strcasecmp strdup strerror strtol sysinfo]) else AM_CONDITIONAL(DEFINE_ATTR_LINK_LAYER, test "yes" = "no") fi dnl End check for header files and libraries AC_CACHE_CHECK(whether ld accepts --version-script, ac_cv_version_script, if test -n "`$LD --help < /dev/null 2>/dev/null | grep version-script`"; then ac_cv_version_script=yes else ac_cv_version_script=no fi) AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$ac_cv_version_script" = "yes") dnl Support debug mode build - if enable-debug provided the DEBUG variable is set AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug],[enable debug build, default=disabled]), [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac], [debug=false]) AM_CONDITIONAL(DEBUG, test x$debug = xtrue) dnl Support for IB acm sevices AC_ARG_ENABLE([acm], AS_HELP_STRING([--enable-acm],[enable IB ACM services, default=disabled]), [case "$enableval" in yes) AC_DEFINE(DAPL_USE_IBACM, 1, [set to 1 to use IB ACM services]) AC_CHECK_MEMBER(struct ibv_path_record.service_id, [], AC_MSG_ERROR([IB ACM support requires libibverbs 1.1.4 or greater.]), [#include ]) AC_CHECK_HEADER(infiniband/acm.h, [], AC_MSG_ERROR([IB ACM requested but not found.])) AC_DEFINE(DAPL_USE_IBACM, 1, [set to 1 to use IB ACM services]) acm=true ;; no) acm=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-acm) ;; esac], [acm=false]) AM_CONDITIONAL(DAPL_USE_IBACM, test x$acm = true) dnl Support to enable/disable CMA (rdma_cm) provider library build AC_ARG_ENABLE([cma], AS_HELP_STRING([--disable-cma],[disable CMA (rdma_cm) provider build, default=enabled]), [case "${enableval}" in yes) cma=true ;; no) cma=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-cma) ;; esac], [cma=true]) AM_CONDITIONAL(DEFINE_CMA, test x$cma = xtrue) dnl Support to enable/disable SCM (socket CM) provider library build AC_ARG_ENABLE([scm], AS_HELP_STRING([--disable-scm],[disable SCM (socket cm) provider build, default=enabled]), [case "${enableval}" in yes) scm=true ;; no) scm=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-scm) ;; esac], [scm=true]) AM_CONDITIONAL(DEFINE_SCM, test x$scm = xtrue) dnl Support to enable/disable UCM (IB UD cm) provider library build AC_ARG_ENABLE([ucm], AS_HELP_STRING([--disable-ucm],[disable UCM (IB UD cm) provider build, default=enabled]), [case "${enableval}" in yes) ucm=true ;; no) ucm=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-ucm) ;; esac], [ucm=true]) AM_CONDITIONAL(DEFINE_UCM, test x$ucm = xtrue) dnl Support to enable/disable MCM (proxy) MIC SCIF provider library build AC_CHECK_HEADER(scif.h, [sciffound=true], [sciffound=false]) AC_ARG_ENABLE([mcm], AS_HELP_STRING([--enable-mcm],[enable MCM (proxy CM) SCIF provider build, default=auto]), [case "${enableval}" in yes) AS_IF([test x$sciffound = xtrue], [mcm=true], AC_MSG_ERROR([ not found. Is libscif installed?])) ;; no) mcm=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-mcm) ;; esac], [mcm=$sciffound]) AM_CONDITIONAL(DEFINE_MCM, test x$mcm = xtrue) dnl Support to enable/disable IB extended counters (CM,LINK,DIAG) AC_ARG_ENABLE([counters], AS_HELP_STRING([--enable-counters],[enable counters provider build, default=disabled]), [case "${enableval}" in yes) counters=true ;; no) counters=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-counters) ;; esac], [counters=false]) AM_CONDITIONAL(DEFINE_COUNTERS, test x$counters = xtrue) dnl Support ib_extension build - if enable-ext-type == ib AC_ARG_ENABLE([ext-type], AS_HELP_STRING([--enable-ext-type],[enable extensions support for library: ib, none, default=ib]), [ if test "x$enableval" = "xib" ; then ext_type=ib elif test "x$enableval" = "xnone" ; then ext_type=none else echo echo "Error!" echo "Unknown extension type' type" exit -1 fi ],[ext_type=ib]) AM_CONDITIONAL(EXT_TYPE_IB, test "$ext_type" = "ib") dnl Support IB MPI collective extension build - if enable-coll-type == vendor_name AC_ARG_ENABLE([coll-type], AS_HELP_STRING([--enable-coll-type],[enable IB collective support: fca, none, default=none]), [ if test "x$enableval" = "xfca" ; then coll_type=fca AC_CHECK_HEADER(fca/fca_api.h, [], AC_MSG_ERROR([ not found. Is libfca devel package installed?])) AC_CHECK_LIB(fca, fca_init, [], AC_MSG_ERROR([fca_init() not found. Is libfca library installed?])) elif test "x$enableval" = "xnone" ; then coll_type=none else echo echo "Error!" echo "Unknown IB collective type' type" exit -1 fi ],[coll_type=none]) AM_CONDITIONAL(COLL_TYPE_FCA, test "$coll_type" = "fca") dnl Check for SuSE release 11 AC_CACHE_CHECK(Check for SUSE_11 system, ac_cv_suse11, if test -f /etc/SuSE-release && test -n "`grep -e "VERSION = 11" /etc/SuSE-release`"; then ac_cv_suse11=yes else ac_cv_suse11=no fi) AM_CONDITIONAL(OS_SUSE11, test "$ac_cv_suse11" = "yes") AC_CONFIG_FILES([Makefile test/dtest/Makefile test/dapltest/Makefile dapl.spec mpxyd.init]) AC_OUTPUT dapl-2.1.5/dapl.spec000066400000000000000000000240641255317474200142530ustar00rootroot00000000000000# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # Copyright (c) 2007-2015, Intel Corporation. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. The license is also # available from the Open Source Initiative, see # http://www.opensource.org/licenses/cpl.php. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. The license is also available from # the Open Source Initiative, see # http://www.opensource.org/licenses/bsd-license.php. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. The # license is also available from the Open Source Initiative, see # http://www.opensource.org/licenses/gpl-license.php. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # # # uDAT and uDAPL 2.0 Registry RPM SPEC file # # $Id: $ # don't fail when not given extra FLAGS: %{!?_CPPFLAGS: %define _CPPFLAGS ""} %{!?_LDFLAGS: %define _LDFLAGS ""} %{!?_CONF: %define _CONF ""} Name: dapl Version: 2.1.5 Release: 1%{?dist} Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs, proxy daemon for offloading RDMA Group: System Environment/Libraries License: Dual GPL/BSD/CPL Url: http://openfabrics.org/ Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz BuildRoot: %{_topdir}/BUILDROOT Obsoletes: intel-mic-ofed-dapl Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig %description Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace RDMA API that supports DAT 2.0 specification and IB transport extensions for atomic operations and rdma write with immediate data. %package devel Summary: Development files for the libdat and libdapl libraries Group: System Environment/Libraries Requires: %{name} = %{version}-%{release} Obsoletes: intel-mic-ofed-dapl-devel %description devel Header files for libdat and libdapl library. %package devel-static Summary: Static development files for libdat and libdapl library Group: System Environment/Libraries Obsoletes: intel-mic-ofed-dapl-devel-static %description devel-static Static libraries for libdat and libdapl library. %package utils Summary: Test suites for uDAPL library Group: System Environment/Libraries Requires: %{name} = %{version}-%{release} Obsoletes: intel-mic-ofed-dapl-utils %description utils Useful test suites to validate uDAPL library API's. %prep %setup -q %build %configure CPPFLAGS=%{_CPPFLAGS} LDFLAGS=%{_LDFLAGS} %{_CONF} make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT # remove unpackaged files from the buildroot rm -f %{buildroot}%{_libdir}/*.la # make init.d so we can exclude it later: mkdir -p %{buildroot}%{_sysconfdir}/init.d touch mcm-files %clean rm -rf %{buildroot} %post # fix problem with older dapl packages that clobber dat.conf when updating cp %{_sysconfdir}/dat.conf /tmp/%{version}-dat.conf /sbin/ldconfig if [ $1 -gt 1 ]; then /sbin/chkconfig --add mpxyd &> /dev/null || true service mpxyd start elif [ $1 -gt 2 ]; then service mpxyd restart fi %preun if [ -f /etc/init.d/mpxyd ]; then /sbin/chkconfig --del mpxyd &> /dev/null service mpxyd stop fi %postun /sbin/ldconfig %files -f mcm-files %defattr(-,root,root,-) %{_libdir}/libda*.so.* %config %{_sysconfdir}/dat.conf %doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt README.mcm %files devel %defattr(-,root,root,-) %{_libdir}/*.so %dir %{_includedir}/dat2 %{_includedir}/dat2/* %files devel-static %defattr(-,root,root,-) %{_libdir}/*.a %files utils %defattr(-,root,root,-) %{_bindir}/* %{_mandir}/man1/*.1* %{_mandir}/man5/*.5* %triggerpostun -- dapl < 2.0.35-1 # fix problem with older dapl packages that clobber dat.conf during update mv /tmp/%{version}-dat.conf %{_sysconfdir}/dat.conf %changelog * Mon May 26 2015 Arlin Davis - 2.1.5 - DAT/DAPL Version 2.1.5 Release 1, OFED 3.18 * Thu Mar 19 2015 Arlin Davis - 2.1.4 - DAT/DAPL Version 2.1.4 Release 1, OFED 3.18 * Mon Dec 15 2014 Arlin Davis - 2.1.3 - DAT/DAPL Version 2.1.3 Release 1, OFED 3.18 RC * Tue Sep 2 2014 Arlin Davis - 2.1.2 - DAT/DAPL Version 2.1.2 Release 1, OFED 3.12-1 * Wed Aug 13 2014 Arlin Davis - 2.1.1 - DAT/DAPL Version 2.1.1 Release 1, OFED 3.12-1 * Fri Jul 18 2014 Arlin Davis - 2.1.0 - DAT/DAPL Version 2.1.0 Release 1, add MIC support, OFED 3.12-1 * Sun May 4 2014 Arlin Davis - 2.0.42 - DAT/DAPL Version 2.0.42 Release 1, OFED 3.12 GA * Fri Mar 14 2014 Arlin Davis - 2.0.41 - DAT/DAPL Version 2.0.41 Release 1, OFED 3.12 GA * Mon Feb 10 2014 Arlin Davis - 2.0.40 - DAT/DAPL Version 2.0.40 Release 1, OFED 3.12 * Thu Oct 3 2013 Arlin Davis - 2.0.39 - DAT/DAPL Version 2.0.39 Release 1, OFED 3.5-2 * Mon Jul 22 2013 Arlin Davis - 2.0.38 - DAT/DAPL Version 2.0.38 Release 1, OFED 3.5.2 * Thu Jun 6 2013 Arlin Davis - 2.0.37 - DAT/DAPL Version 2.0.37 Release 1, OFED 3.5.2 * Sun Aug 5 2012 Arlin Davis - 2.0.36 - DAT/DAPL Version 2.0.36 Release 1, OFED 3.x * Mon Apr 23 2012 Arlin Davis - 2.0.35 - DAT/DAPL Version 2.0.35 Release 1, OFED 3.2 * Wed Nov 2 2011 Arlin Davis - 2.0.34 - DAT/DAPL Version 2.0.34 Release 1, OFED 1.5.4 GA * Mon Aug 29 2011 Arlin Davis - 2.0.33 - DAT/DAPL Version 2.0.33 Release 1, OFED 1.5.4 RC1 * Sun Feb 13 2011 Arlin Davis - 2.0.32 - DAT/DAPL Version 2.0.32 Release 1, OFED 1.5.3 GA * Fri Dec 10 2010 Arlin Davis - 2.0.31 - DAT/DAPL Version 2.0.31 Release 1, OFED 1.5.3 * Mon Aug 9 2010 Arlin Davis - 2.0.30 - DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 * Thu Jun 17 2010 Arlin Davis - 2.0.29 - DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 * Mon May 24 2010 Arlin Davis - 2.0.28 - DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 * Tue Feb 23 2010 Arlin Davis - 2.0.27 - DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1 * Mon Jan 11 2010 Arlin Davis - 2.0.26 - DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE * Tue Nov 24 2009 Arlin Davis - 2.0.25 - DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 * Fri Oct 30 2009 Arlin Davis - 2.0.24 - DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 * Fri Oct 2 2009 Arlin Davis - 2.0.23 - DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 * Wed Aug 19 2009 Arlin Davis - 2.0.22 - DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider * Wed Aug 5 2009 Arlin Davis - 2.0.21 - DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+ * Fri Jun 19 2009 Arlin Davis - 2.0.20 - DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes * Thu Apr 30 2009 Arlin Davis - 2.0.19 - DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final * Fri Apr 17 2009 Arlin Davis - 2.0.18 - DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA * Tue Mar 31 2009 Arlin Davis - 2.0.17 - DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA * Mon Mar 16 2009 Arlin Davis - 2.0.16 - DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 * Fri Nov 07 2008 Arlin Davis - 2.0.15 - DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA * Fri Oct 03 2008 Arlin Davis - 2.0.14 - DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3 * Mon Sep 01 2008 Arlin Davis - 2.0.13 - DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1 * Thu Aug 21 2008 Arlin Davis - 2.0.12 - DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta * Sun Jul 20 2008 Arlin Davis - 2.0.11 - DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider * Mon Jun 23 2008 Arlin Davis - 2.0.10 - DAT/DAPL Version 2.0.10 Release 1, socket CM provider * Tue May 20 2008 Arlin Davis - 2.0.9 - DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA * Thu May 1 2008 Arlin Davis - 2.0.8 - DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1 * Thu Feb 14 2008 Arlin Davis - 2.0.7 - DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA * Mon Feb 04 2008 Arlin Davis - 2.0.6 - DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4 * Tue Jan 29 2008 Arlin Davis - 2.0.5 - DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3 * Thu Jan 17 2008 Arlin Davis - 2.0.4 - DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2 * Tue Nov 20 2007 Arlin Davis - 2.0.3 - DAT/DAPL Version 2.0.3 Release 1 * Tue Oct 30 2007 Arlin Davis - 2.0.2 - DAT/DAPL Version 2.0.2 Release 1 * Tue Sep 18 2007 Arlin Davis - 2.0.1-1 - OFED 1.3-alpha, co-exist with DAT 1.2 library package. * Wed Mar 7 2007 Arlin Davis - 2.0.0.pre - Initial release of DAT 2.0 APIs, includes IB extensions dapl-2.1.5/dapl.spec.in000066400000000000000000000240701255317474200146550ustar00rootroot00000000000000# Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # Copyright (c) 2007-2015, Intel Corporation. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. The license is also # available from the Open Source Initiative, see # http://www.opensource.org/licenses/cpl.php. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. The license is also available from # the Open Source Initiative, see # http://www.opensource.org/licenses/bsd-license.php. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. The # license is also available from the Open Source Initiative, see # http://www.opensource.org/licenses/gpl-license.php. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # # # uDAT and uDAPL 2.0 Registry RPM SPEC file # # $Id: $ # don't fail when not given extra FLAGS: %{!?_CPPFLAGS: %define _CPPFLAGS ""} %{!?_LDFLAGS: %define _LDFLAGS ""} %{!?_CONF: %define _CONF ""} Name: dapl Version: @VERSION@ Release: 1%{?dist} Summary: A Library for userspace access to RDMA devices using OS Agnostic DAT APIs, proxy daemon for offloading RDMA Group: System Environment/Libraries License: Dual GPL/BSD/CPL Url: http://openfabrics.org/ Source: http://www.openfabrics.org/downloads/%{name}/%{name}-%{version}.tar.gz BuildRoot: %{_topdir}/BUILDROOT Obsoletes: intel-mic-ofed-dapl Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig %description Along with the OpenFabrics kernel drivers, libdat and libdapl provides a userspace RDMA API that supports DAT 2.0 specification and IB transport extensions for atomic operations and rdma write with immediate data. %package devel Summary: Development files for the libdat and libdapl libraries Group: System Environment/Libraries Requires: %{name} = %{version}-%{release} Obsoletes: intel-mic-ofed-dapl-devel %description devel Header files for libdat and libdapl library. %package devel-static Summary: Static development files for libdat and libdapl library Group: System Environment/Libraries Obsoletes: intel-mic-ofed-dapl-devel-static %description devel-static Static libraries for libdat and libdapl library. %package utils Summary: Test suites for uDAPL library Group: System Environment/Libraries Requires: %{name} = %{version}-%{release} Obsoletes: intel-mic-ofed-dapl-utils %description utils Useful test suites to validate uDAPL library API's. %prep %setup -q %build %configure CPPFLAGS=%{_CPPFLAGS} LDFLAGS=%{_LDFLAGS} %{_CONF} make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT # remove unpackaged files from the buildroot rm -f %{buildroot}%{_libdir}/*.la # make init.d so we can exclude it later: mkdir -p %{buildroot}%{_sysconfdir}/init.d touch mcm-files %clean rm -rf %{buildroot} %post # fix problem with older dapl packages that clobber dat.conf when updating cp %{_sysconfdir}/dat.conf /tmp/%{version}-dat.conf /sbin/ldconfig if [ $1 -gt 1 ]; then /sbin/chkconfig --add mpxyd &> /dev/null || true service mpxyd start elif [ $1 -gt 2 ]; then service mpxyd restart fi %preun if [ -f /etc/init.d/mpxyd ]; then /sbin/chkconfig --del mpxyd &> /dev/null service mpxyd stop fi %postun /sbin/ldconfig %files -f mcm-files %defattr(-,root,root,-) %{_libdir}/libda*.so.* %config %{_sysconfdir}/dat.conf %doc AUTHORS README COPYING ChangeLog LICENSE.txt LICENSE2.txt LICENSE3.txt README.mcm %files devel %defattr(-,root,root,-) %{_libdir}/*.so %dir %{_includedir}/dat2 %{_includedir}/dat2/* %files devel-static %defattr(-,root,root,-) %{_libdir}/*.a %files utils %defattr(-,root,root,-) %{_bindir}/* %{_mandir}/man1/*.1* %{_mandir}/man5/*.5* %triggerpostun -- dapl < 2.0.35-1 # fix problem with older dapl packages that clobber dat.conf during update mv /tmp/%{version}-dat.conf %{_sysconfdir}/dat.conf %changelog * Mon May 26 2015 Arlin Davis - 2.1.5 - DAT/DAPL Version 2.1.5 Release 1, OFED 3.18 * Thu Mar 19 2015 Arlin Davis - 2.1.4 - DAT/DAPL Version 2.1.4 Release 1, OFED 3.18 * Mon Dec 15 2014 Arlin Davis - 2.1.3 - DAT/DAPL Version 2.1.3 Release 1, OFED 3.18 RC * Tue Sep 2 2014 Arlin Davis - 2.1.2 - DAT/DAPL Version 2.1.2 Release 1, OFED 3.12-1 * Wed Aug 13 2014 Arlin Davis - 2.1.1 - DAT/DAPL Version 2.1.1 Release 1, OFED 3.12-1 * Fri Jul 18 2014 Arlin Davis - 2.1.0 - DAT/DAPL Version 2.1.0 Release 1, add MIC support, OFED 3.12-1 * Sun May 4 2014 Arlin Davis - 2.0.42 - DAT/DAPL Version 2.0.42 Release 1, OFED 3.12 GA * Fri Mar 14 2014 Arlin Davis - 2.0.41 - DAT/DAPL Version 2.0.41 Release 1, OFED 3.12 GA * Mon Feb 10 2014 Arlin Davis - 2.0.40 - DAT/DAPL Version 2.0.40 Release 1, OFED 3.12 * Thu Oct 3 2013 Arlin Davis - 2.0.39 - DAT/DAPL Version 2.0.39 Release 1, OFED 3.5-2 * Mon Jul 22 2013 Arlin Davis - 2.0.38 - DAT/DAPL Version 2.0.38 Release 1, OFED 3.5.2 * Thu Jun 6 2013 Arlin Davis - 2.0.37 - DAT/DAPL Version 2.0.37 Release 1, OFED 3.5.2 * Sun Aug 5 2012 Arlin Davis - 2.0.36 - DAT/DAPL Version 2.0.36 Release 1, OFED 3.x * Mon Apr 23 2012 Arlin Davis - 2.0.35 - DAT/DAPL Version 2.0.35 Release 1, OFED 3.2 * Wed Nov 2 2011 Arlin Davis - 2.0.34 - DAT/DAPL Version 2.0.34 Release 1, OFED 1.5.4 GA * Mon Aug 29 2011 Arlin Davis - 2.0.33 - DAT/DAPL Version 2.0.33 Release 1, OFED 1.5.4 RC1 * Sun Feb 13 2011 Arlin Davis - 2.0.32 - DAT/DAPL Version 2.0.32 Release 1, OFED 1.5.3 GA * Fri Dec 10 2010 Arlin Davis - 2.0.31 - DAT/DAPL Version 2.0.31 Release 1, OFED 1.5.3 * Mon Aug 9 2010 Arlin Davis - 2.0.30 - DAT/DAPL Version 2.0.30 Release 1, OFED 1.5.2 RC4 * Thu Jun 17 2010 Arlin Davis - 2.0.29 - DAT/DAPL Version 2.0.29 Release 1, OFED 1.5.2 RC2 * Mon May 24 2010 Arlin Davis - 2.0.28 - DAT/DAPL Version 2.0.28 Release 1, OFED 1.5.2 RC1 * Tue Feb 23 2010 Arlin Davis - 2.0.27 - DAT/DAPL Version 2.0.27 Release 1, OFED 1.5.1 * Mon Jan 11 2010 Arlin Davis - 2.0.26 - DAT/DAPL Version 2.0.26 Release 1, OFED 1.5, OFED 1.5-RDMAoE * Tue Nov 24 2009 Arlin Davis - 2.0.25 - DAT/DAPL Version 2.0.25 Release 1, OFED 1.5 RC3 * Fri Oct 30 2009 Arlin Davis - 2.0.24 - DAT/DAPL Version 2.0.24 Release 1, OFED 1.5 RC2 * Fri Oct 2 2009 Arlin Davis - 2.0.23 - DAT/DAPL Version 2.0.23 Release 1, OFED 1.5 RC1 * Wed Aug 19 2009 Arlin Davis - 2.0.22 - DAT/DAPL Version 2.0.22 Release 1, OFED 1.5 ALPHA new UCM provider * Wed Aug 5 2009 Arlin Davis - 2.0.21 - DAT/DAPL Version 2.0.21 Release 1, WinOF 2.1, OFED 1.4.1+ * Fri Jun 19 2009 Arlin Davis - 2.0.20 - DAT/DAPL Version 2.0.20 Release 1, OFED 1.4.1 + UD reject/scaling fixes * Thu Apr 30 2009 Arlin Davis - 2.0.19 - DAT/DAPL Version 2.0.19 Release 1, OFED 1.4.1 GA Final * Fri Apr 17 2009 Arlin Davis - 2.0.18 - DAT/DAPL Version 2.0.18 Release 1, OFED 1.4.1 GA * Tue Mar 31 2009 Arlin Davis - 2.0.17 - DAT/DAPL Version 2.0.17 Release 1, OFED 1.4.1 GA * Mon Mar 16 2009 Arlin Davis - 2.0.16 - DAT/DAPL Version 2.0.16 Release 1, OFED 1.4.1 * Fri Nov 07 2008 Arlin Davis - 2.0.15 - DAT/DAPL Version 2.0.15 Release 1, OFED 1.4 GA * Fri Oct 03 2008 Arlin Davis - 2.0.14 - DAT/DAPL Version 2.0.14 Release 1, OFED 1.4 rc3 * Mon Sep 01 2008 Arlin Davis - 2.0.13 - DAT/DAPL Version 2.0.13 Release 1, OFED 1.4 rc1 * Thu Aug 21 2008 Arlin Davis - 2.0.12 - DAT/DAPL Version 2.0.12 Release 1, OFED 1.4 beta * Sun Jul 20 2008 Arlin Davis - 2.0.11 - DAT/DAPL Version 2.0.11 Release 1, IB UD extensions in SCM provider * Mon Jun 23 2008 Arlin Davis - 2.0.10 - DAT/DAPL Version 2.0.10 Release 1, socket CM provider * Tue May 20 2008 Arlin Davis - 2.0.9 - DAT/DAPL Version 2.0.9 Release 1, OFED 1.3.1 GA * Thu May 1 2008 Arlin Davis - 2.0.8 - DAT/DAPL Version 2.0.8 Release 1, OFED 1.3.1 * Thu Feb 14 2008 Arlin Davis - 2.0.7 - DAT/DAPL Version 2.0.7 Release 1, OFED 1.3 GA * Mon Feb 04 2008 Arlin Davis - 2.0.6 - DAT/DAPL Version 2.0.6 Release 1, OFED 1.3 RC4 * Tue Jan 29 2008 Arlin Davis - 2.0.5 - DAT/DAPL Version 2.0.5 Release 1, OFED 1.3 RC3 * Thu Jan 17 2008 Arlin Davis - 2.0.4 - DAT/DAPL Version 2.0.4 Release 1, OFED 1.3 RC2 * Tue Nov 20 2007 Arlin Davis - 2.0.3 - DAT/DAPL Version 2.0.3 Release 1 * Tue Oct 30 2007 Arlin Davis - 2.0.2 - DAT/DAPL Version 2.0.2 Release 1 * Tue Sep 18 2007 Arlin Davis - 2.0.1-1 - OFED 1.3-alpha, co-exist with DAT 1.2 library package. * Wed Mar 7 2007 Arlin Davis - 2.0.0.pre - Initial release of DAT 2.0 APIs, includes IB extensions dapl-2.1.5/dapl/000077500000000000000000000000001255317474200133715ustar00rootroot00000000000000dapl-2.1.5/dapl/common/000077500000000000000000000000001255317474200146615ustar00rootroot00000000000000dapl-2.1.5/dapl/common/dapl_adapter_util.h000077500000000000000000000170771255317474200205260ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_adapter_util.h * * PURPOSE: Utility defs & routines for the adapter data structure * * $Id: dapl_adapter_util.h 1317 2005-04-25 17:29:42Z jlentini $ * **********************************************************************/ #ifndef _DAPL_ADAPTER_UTIL_H_ #define _DAPL_ADAPTER_UTIL_H_ typedef enum async_handler_type { DAPL_ASYNC_UNAFILIATED, DAPL_ASYNC_CQ_ERROR, DAPL_ASYNC_CQ_COMPLETION, DAPL_ASYNC_QP_ERROR } DAPL_ASYNC_HANDLER_TYPE; typedef enum dapl_open_flags { DAPL_OPEN_NORMAL, DAPL_OPEN_QUERY } DAPL_OPEN_FLAGS; int dapls_ib_init (void); int dapls_ib_release (void); DAT_RETURN dapls_ib_enum_hcas ( IN const char *vendor, OUT DAPL_HCA_NAME **hca_names, OUT DAT_COUNT *total_hca_count); DAT_RETURN dapls_ib_get_instance_data( IN DAPL_HCA_NAME hca_name, OUT char *instance); DAT_RETURN dapls_ib_open_hca ( IN char *namestr, IN DAPL_HCA *hca_ptr, IN DAPL_OPEN_FLAGS flags); DAT_RETURN dapls_ib_close_hca ( IN DAPL_HCA *hca_ptr); DAT_RETURN dapls_ib_qp_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAPL_EP *ep_ctx_ptr); DAT_RETURN dapls_ib_qp_free ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr); DAT_RETURN dapls_ib_qp_modify ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_ptr, IN DAT_EP_ATTR *ep_attr); DAT_RETURN dapls_ib_connect ( IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR remote_ia_address, IN DAT_CONN_QUAL remote_conn_qual, IN DAT_COUNT private_data_size, IN DAT_PVOID private_data); DAT_RETURN dapls_ib_disconnect ( IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags); DAT_RETURN dapls_ib_setup_conn_listener ( IN DAPL_IA *ia_ptr, IN DAT_UINT64 ServiceID, IN DAPL_SP *sp_ptr); DAT_RETURN dapls_ib_remove_conn_listener ( IN DAPL_IA *ia_ptr, IN DAPL_SP *sp_ptr); DAT_RETURN dapls_ib_accept_connection ( IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data); DAT_RETURN dapls_ib_reject_connection ( IN dp_ib_cm_handle_t cm_handle, IN int reject_reason, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data); DAT_RETURN dapls_ib_setup_async_callback ( IN DAPL_IA *ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE handler_type, IN DAPL_EVD *evd_ptr, IN ib_async_handler_t callback, IN void *context); DAT_RETURN dapls_ib_cq_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen); DAT_RETURN dapls_ib_cq_free ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr); DAT_RETURN dapls_set_cq_notify ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr); DAT_RETURN dapls_ib_cq_resize ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_ptr, IN DAT_COUNT *cqlen); DAT_RETURN dapls_ib_pd_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_PZ *pz); DAT_RETURN dapls_ib_pd_free ( IN DAPL_PZ *pz); DAT_RETURN dapls_ib_mr_register ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type); #if defined(__KDAPL__) DAT_RETURN dapls_ib_mr_register_physical ( IN DAPL_IA *ia_ptr, INOUT DAPL_LMR *lmr, IN DAT_PADDR phys_addr, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS privileges); #endif /* __KDAPL__ */ DAT_RETURN dapls_ib_mr_deregister ( IN DAPL_LMR *lmr); DAT_RETURN dapls_ib_mr_register_shared ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type); DAT_RETURN dapls_ib_mw_alloc ( IN DAPL_RMR *rmr); DAT_RETURN dapls_ib_mw_free ( IN DAPL_RMR *rmr); DAT_RETURN dapls_ib_mw_bind ( IN DAPL_RMR *rmr, IN DAPL_LMR *lmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_VADDR virtual_address, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled); DAT_RETURN dapls_ib_mw_unbind ( IN DAPL_RMR *rmr, IN DAPL_EP *ep, IN DAPL_COOKIE *cookie, IN DAT_BOOLEAN is_signaled); DAT_RETURN dapls_ib_query_hca ( IN DAPL_HCA *hca_ptr, OUT DAT_IA_ATTR *ia_attr, OUT DAT_EP_ATTR *ep_attr, OUT DAT_SOCK_ADDR6 *ip_addr); DAT_RETURN dapls_ib_completion_poll ( IN DAPL_HCA *hca_ptr, IN DAPL_EVD *evd_ptr, IN ib_work_completion_t *cqe_ptr); DAT_RETURN dapls_ib_completion_notify ( IN ib_hca_handle_t hca_handle, IN DAPL_EVD *evd_ptr, IN ib_notification_type_t type); DAT_DTO_COMPLETION_STATUS dapls_ib_get_dto_status ( IN ib_work_completion_t *cqe_ptr); void dapls_ib_reinit_ep ( IN DAPL_EP *ep_ptr); void dapls_ib_disconnect_clean ( IN DAPL_EP *ep_ptr, IN DAT_BOOLEAN passive, IN const ib_cm_events_t ib_cm_event); DAT_RETURN dapls_ib_get_async_event ( IN ib_error_record_t *cause_ptr, OUT DAT_EVENT_NUMBER *async_event); DAT_EVENT_NUMBER dapls_ib_get_dat_event ( IN const ib_cm_events_t ib_cm_event, IN DAT_BOOLEAN active); ib_cm_events_t dapls_ib_get_cm_event ( IN DAT_EVENT_NUMBER dat_event_num); DAT_RETURN dapls_ib_cm_remote_addr ( IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 *remote_ia_address); int dapls_ib_private_data_size( IN DAPL_HCA *hca_ptr); void dapls_query_provider_specific_attr( IN DAPL_IA *ia_ptr, IN DAT_PROVIDER_ATTR *attr_ptr ); DAT_RETURN dapls_evd_dto_wakeup ( IN DAPL_EVD *evd_ptr); DAT_RETURN dapls_evd_dto_wait ( IN DAPL_EVD *evd_ptr, IN uint32_t timeout); DAT_RETURN dapls_ib_srq_alloc ( IN DAPL_SRQ *srq_ptr); DAT_RETURN dapls_ib_srq_free ( IN DAPL_SRQ *srq_ptr); DAT_RETURN dapls_ib_srq_resize( IN DAPL_SRQ *srq_ptr, IN uint32_t new_max_wr); #ifdef DAT_EXTENSIONS void dapls_cqe_to_event_extension( IN DAPL_EP *ep_ptr, IN DAPL_COOKIE *cookie, IN ib_work_completion_t *cqe_ptr, IN DAT_EVENT *event_ptr); #endif /* * Values for provider DAT_NAMED_ATTR */ #define IB_QP_STATE 1 /* QP state change request */ #ifdef IBAPI #include "dapl_ibapi_dto.h" #elif VAPI #include "dapl_vapi_dto.h" #elif __OPENIB__ #include "dapl_openib_dto.h" #elif DUMMY #include "dapl_dummy_dto.h" #elif OPENIB #include "dapl_ib_dto.h" #else #include "dapl_ibal_dto.h" #endif #endif /* _DAPL_ADAPTER_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_cno_util.c000077500000000000000000000151531255317474200176510ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_util.c * * PURPOSE: Manage CNO Info structure * * $Id:$ **********************************************************************/ #include "dapl_ia_util.h" #include "dapl_cno_util.h" #include "dapl_adapter_util.h" /* * dapl_cno_alloc * * alloc and initialize an EVD struct * * Input: * ia * * Returns: * cno_ptr, or null on failure. */ #if defined(__KDAPL__) DAPL_CNO *dapl_cno_alloc(IN DAPL_IA * ia_ptr, IN const DAT_UPCALL_OBJECT * upcall) #else DAPL_CNO *dapl_cno_alloc(IN DAPL_IA * ia_ptr, IN DAT_OS_WAIT_PROXY_AGENT wait_agent) #endif /* defined(__KDAPL__) */ { DAPL_CNO *cno_ptr; cno_ptr = (DAPL_CNO *) dapl_os_alloc(sizeof(DAPL_CNO)); if (!cno_ptr) { return NULL; } /* zero the structure */ dapl_os_memzero(cno_ptr, sizeof(DAPL_CNO)); /* * Initialize the header. */ cno_ptr->header.provider = ia_ptr->header.provider; cno_ptr->header.magic = DAPL_MAGIC_CNO; #if !defined(__KDAPL__) cno_ptr->header.handle_type = DAT_HANDLE_TYPE_CNO; #endif /* defined(__KDAPL__) */ cno_ptr->header.owner_ia = ia_ptr; cno_ptr->header.user_context.as_64 = 0; cno_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&cno_ptr->header.ia_list_entry); dapl_os_lock_init(&cno_ptr->header.lock); /* * Initialize the body */ cno_ptr->cno_waiters = 0; dapl_os_atomic_set(&cno_ptr->cno_ref_count, 0); cno_ptr->cno_state = DAPL_CNO_STATE_UNTRIGGERED; cno_ptr->cno_evd_triggered = NULL; #if defined(__KDAPL__) cno_ptr->cno_upcall = *upcall; #else cno_ptr->cno_wait_agent = wait_agent; #endif /* defined(__KDAPL__) */ dapl_os_wait_object_init(&cno_ptr->cno_wait_object); return cno_ptr; } /* * dapl_cno_dealloc * * Free the passed in CNO structure. * * Input: * cno_ptr * * Output: * none * * Returns: * none * */ void dapl_cno_dealloc(IN DAPL_CNO * cno_ptr) { dapl_os_assert(cno_ptr->header.magic == DAPL_MAGIC_CNO); dapl_os_assert(dapl_os_atomic_read(&cno_ptr->cno_ref_count) == 0); /* * deinitialize the header */ cno_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_os_wait_object_destroy(&cno_ptr->cno_wait_object); dapl_os_free(cno_ptr, sizeof(DAPL_CNO)); } /* * dapl_internal_cno_trigger * * DAPL Internal routine to trigger the specified CNO. * Called by the callback of some EVD associated with the CNO. * * * * Input: * cno_ptr * evd_ptr EVD triggering * * Output: * None * * Returns: * None */ void dapl_internal_cno_trigger(IN DAPL_CNO * cno_ptr, IN DAPL_EVD * evd_ptr) { DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_os_assert(cno_ptr->header.magic == DAPL_MAGIC_CNO); /* The spec allows NULL EVDs. kDAPL doesn't have CNOs, they * are strictly used behind the scenes */ dapl_os_assert(evd_ptr == NULL || evd_ptr->header.magic == DAPL_MAGIC_EVD); dapl_os_lock(&cno_ptr->header.lock); /* Maybe I should just return, but this really shouldn't happen. */ dapl_os_assert(cno_ptr->cno_state != DAPL_CNO_STATE_DEAD); if (cno_ptr->cno_state == DAPL_CNO_STATE_UNTRIGGERED) { DAT_OS_WAIT_PROXY_AGENT agent; /* Squirrel away wait agent, and delete link. */ agent = cno_ptr->cno_wait_agent; /* Separate assignments for windows compiler. */ #ifndef _WIN32 cno_ptr->cno_wait_agent = DAT_OS_WAIT_PROXY_AGENT_NULL; #else cno_ptr->cno_wait_agent.instance_data = NULL; cno_ptr->cno_wait_agent.proxy_agent_func = NULL; #endif cno_ptr->cno_evd_triggered = evd_ptr; /* * Must set to triggerred and let waiter untrigger to handle * timeout of waiter. */ cno_ptr->cno_state = DAPL_CNO_STATE_TRIGGERED; if (cno_ptr->cno_waiters > 0) { dapl_os_wait_object_wakeup(&cno_ptr->cno_wait_object); } dapl_os_unlock(&cno_ptr->header.lock); /* Trigger the OS proxy wait agent, if one exists. */ if (agent.proxy_agent_func != (DAT_AGENT_FUNC) NULL) { agent.proxy_agent_func(agent.instance_data, (DAT_EVD_HANDLE) evd_ptr); } } else { dapl_os_unlock(&cno_ptr->header.lock); } return; } /* * dapl_cno_fd_create * * DAPL Requirements Version 2.0, 6.3.2.x * * creates a CNO instance. Upon creation, there are no * Event Dispatchers feeding it. os_fd is a File Descriptor in Unix, * i.e. struct pollfd or an equivalent object in other OSes that is * always associates with the created CNO. Consumer can multiplex event * waiting using UNIX poll or select functions. Upon creation, the CNO * is not associated with any EVDs, has no waiters and has the os_fd * associated with it. * * Input: * ia_handle * * Output: * file descripter * cno_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_LENGTH_ERROR * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_cno_fd_create(IN DAT_IA_HANDLE ia_handle, /* ia_handle */ OUT DAT_FD * fd, /* file_descriptor */ OUT DAT_CNO_HANDLE * cno_handle) { /* cno_handle */ return DAT_MODEL_NOT_SUPPORTED; } /* * dapl_cno_fd_create * * DAPL Requirements Version 2.0, 6.3.2.x * * Returns the latest EVD that triggered the CNO. * * Input: * cno_handle * * Output: * evd_handle * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_cno_trigger(IN DAT_CNO_HANDLE cno_handle, OUT DAT_EVD_HANDLE * evd_handle) { return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_cno_util.h000077500000000000000000000034471255317474200176610ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_cno_util.h * * PURPOSE: Utility defs & routines for the cno data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_CNO_UTIL_H_ #define _DAPL_CNO_UTIL_H_ #include "dapl.h" #if defined(__KDAPL__) DAPL_CNO * dapl_cno_alloc ( IN DAPL_IA *ia_ptr, IN const DAT_UPCALL_OBJECT *upcall) ; #else DAPL_CNO * dapl_cno_alloc ( IN DAPL_IA *ia_ptr, IN DAT_OS_WAIT_PROXY_AGENT wait_agent) ; #endif /* defined(__KDAPL__) */ void dapl_cno_dealloc ( IN DAPL_CNO *cno_ptr) ; void dapl_internal_cno_trigger( IN DAPL_CNO *cno_ptr, IN DAPL_EVD *evd_ptr); #endif dapl-2.1.5/dapl/common/dapl_cookie.c000066400000000000000000000220671255317474200173050ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cookie.c * * PURPOSE: Manage CQE cookie structures * * The DAPL spec requires that all a cookies passed to a posting operation * be returned in the operation's corresponding completion. * * Implementing this feature is complicated by the user's ability to * suppress event generation for specific operations. When these operations * complete successfully, the provider does not have an easy way to * deallocate resources devoted to storing context data for these operations. * * To support this feature, a pool of memory is allocated up front large * enough to hold cookie data for the maximum number of operations possible * on an endpoint. * * Two pieces of information are maintained to manage cookie allocation: * * head index : index of next unallocated cookie * tail index : index of last unallocated cookie * * Each cookie store its index in this memory pool. * * When an event is received, the index stored in the event's cookie will be * used to update the tail. This will implicitly deallocate all of the cookies * "between" the old tail and the new tail. * * The implementation relies on the following assumptions: * * - there can be only 1 thread in dat_ep_post_send(), dat_ep_post_rdma_write(), * dat_ep_post_rdma_read(), or dat_rmr_bind() at a time, therefore * dapls_cb_get() does not need to be thread safe when manipulating * request data structures. * * - there can be only 1 thread in dat_ep_post_recv(), therefore * dapls_cb_get() does not need to be thread safe when manipulating * receive data structures. * * - there can be only 1 thread generating completions for a given EP's request * opeartions, therefore dapls_cb_put() does not need to be thread safe when * manipulating request data structures. * * - there can be only 1 thread generating completions for a given EP's receive * opeartions therefore dapls_cb_put() does not need to be thread safe when * manipulating receive data structures. * * - completions are delivered in order * * $Id:$ **********************************************************************/ #include "dapl_cookie.h" #include "dapl_ring_buffer_util.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ DAT_RETURN dapls_cb_get(DAPL_COOKIE_BUFFER * buffer, DAPL_COOKIE ** cookie_ptr); DAT_RETURN dapls_cb_put(DAPL_COOKIE_BUFFER * buffer, DAPL_COOKIE * cookie); /********************************************************************* * * * Function Definitions * * * *********************************************************************/ /* * dapls_cb_create * * Given a DAPL_COOKIE_BUFFER, allocate and initialize memory for * the data structure. * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * ep endpoint to associate with cookies * size number of elements to allocate & manage * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_cb_create(IN DAPL_COOKIE_BUFFER * buffer, IN DAPL_EP * ep, IN DAT_COUNT size) { DAT_COUNT i; /* * allocate one additional entry so that the tail * can always point at an empty location */ size++; buffer->pool = dapl_os_alloc(size * sizeof(DAPL_COOKIE)); if (NULL != buffer->pool) { buffer->pool_size = size; dapl_os_atomic_set(&buffer->head, 0); dapl_os_atomic_set(&buffer->tail, 0); for (i = 0; i < size; i++) { buffer->pool[i].index = i; buffer->pool[i].ep = ep; } return (DAT_SUCCESS); } else { return (DAT_INSUFFICIENT_RESOURCES); } } /* * dapls_cb_free * * Free the data structure * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * * Output: * none * * Returns: * none * */ void dapls_cb_free(IN DAPL_COOKIE_BUFFER * buffer) { if (NULL != buffer->pool) { dapl_os_free(buffer->pool, buffer->pool_size * sizeof(DAPL_COOKIE)); buffer->pool = NULL; } } /* * dapls_cb_get * * Remove an entry from the buffer * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * * Output: * cookie_ptr pointer to pointer to cookie * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_cb_get(IN DAPL_COOKIE_BUFFER * buffer, OUT DAPL_COOKIE ** cookie_ptr) { DAT_RETURN dat_status; DAT_COUNT new_head; dapl_os_assert(NULL != cookie_ptr); new_head = (dapl_os_atomic_read(&buffer->head) + 1) % buffer->pool_size; if (new_head == dapl_os_atomic_read(&buffer->tail)) { dat_status = DAT_INSUFFICIENT_RESOURCES; goto bail; } else { dapl_os_atomic_set(&buffer->head, new_head); *cookie_ptr = &buffer->pool[dapl_os_atomic_read(&buffer->head)]; dat_status = DAT_SUCCESS; } bail: return dat_status; } /* * dapls_cb_put * * Add entry(s) to the buffer * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * cookie pointer to cookie * * Output: * entry entry removed from the ring buffer * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_EMPTY * */ DAT_RETURN dapls_cb_put(IN DAPL_COOKIE_BUFFER * buffer, IN DAPL_COOKIE * cookie) { dapl_os_atomic_set(&buffer->tail, cookie->index); return DAT_SUCCESS; } /* * dapls_cb_pending * * snapshot of active entries on cookie ring buffer * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * * Returns: * DAT_COUNT number of active/pending cookies * */ extern DAT_COUNT dapls_cb_pending(DAPL_COOKIE_BUFFER * buffer) { DAT_COUNT head, tail; head = dapl_os_atomic_read(&buffer->head); tail = dapl_os_atomic_read(&buffer->tail); if (head == tail) return 0; else if (head > tail) return (head - tail); else return ((buffer->pool_size - tail) + head); } /* * dapls_rmr_cookie_alloc * * Allocate an RMR Bind cookie * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * rmr rmr to associate with the cookie * user_cookie user's cookie data * * Output: * cookie_ptr pointer to pointer to allocated cookie * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_EMPTY * */ DAT_RETURN dapls_rmr_cookie_alloc(IN DAPL_COOKIE_BUFFER * buffer, IN DAPL_RMR * rmr, IN DAT_RMR_COOKIE user_cookie, OUT DAPL_COOKIE ** cookie_ptr) { DAPL_COOKIE *cookie; DAT_RETURN dat_status; if (DAT_SUCCESS != dapls_cb_get(buffer, &cookie)) { *cookie_ptr = NULL; dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_status = DAT_SUCCESS; cookie->type = DAPL_COOKIE_TYPE_RMR; cookie->val.rmr.rmr = rmr; cookie->val.rmr.cookie = user_cookie; *cookie_ptr = cookie; bail: return dat_status; } /* * dapls_dto_cookie_alloc * * Allocate a DTO cookie * * Input: * buffer pointer to DAPL_COOKIE_BUFFER * type DTO type * user_cookie user's cookie data * * Output: * cookie_ptr pointer to pointer to allocated cookie * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_EMPTY * */ DAT_RETURN dapls_dto_cookie_alloc(IN DAPL_COOKIE_BUFFER * buffer, IN DAPL_DTO_TYPE type, IN DAT_DTO_COOKIE user_cookie, OUT DAPL_COOKIE ** cookie_ptr) { DAPL_COOKIE *cookie; if (DAT_SUCCESS != dapls_cb_get(buffer, &cookie)) { *cookie_ptr = NULL; return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); } cookie->type = DAPL_COOKIE_TYPE_DTO; cookie->val.dto.type = type; cookie->val.dto.cookie = user_cookie; cookie->val.dto.size = 0; *cookie_ptr = cookie; return DAT_SUCCESS; } void dapls_cookie_dealloc(IN DAPL_COOKIE_BUFFER * buffer, IN DAPL_COOKIE * cookie) { dapls_cb_put(buffer, cookie); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_cookie.h000066400000000000000000000041771255317474200173140ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_cookie.h * * PURPOSE: Utility defs & routines for the cookie data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_COOKIE_H #define _DAPL_COOKIE_H_ #include "dapl.h" extern DAT_RETURN dapls_cb_create ( DAPL_COOKIE_BUFFER *buffer, DAPL_EP *ep, DAT_COUNT size ); extern void dapls_cb_free ( DAPL_COOKIE_BUFFER *buffer ); extern DAT_COUNT dapls_cb_pending ( DAPL_COOKIE_BUFFER *buffer ); extern DAT_RETURN dapls_rmr_cookie_alloc ( IN DAPL_COOKIE_BUFFER *buffer, IN DAPL_RMR *rmr, IN DAT_RMR_COOKIE user_cookie, OUT DAPL_COOKIE **cookie_ptr ); extern DAT_RETURN dapls_dto_cookie_alloc ( IN DAPL_COOKIE_BUFFER *buffer, IN DAPL_DTO_TYPE type, IN DAT_DTO_COOKIE user_cookie, OUT DAPL_COOKIE **cookie_ptr ); extern void dapls_cookie_dealloc ( IN DAPL_COOKIE_BUFFER *buffer, IN DAPL_COOKIE *cookie ); #endif /* _DAPL_COOKIE_H_ */ dapl-2.1.5/dapl/common/dapl_cr_accept.c000066400000000000000000000165721255317474200177630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cr_accept.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" /* * dapl_cr_accept * * DAPL Requirements Version xxx, 6.4.2.1 * * Establish a connection between active remote side requesting Endpoint * and passic side local Endpoint. * * Input: * cr_handle * ep_handle * private_data_size * private_data * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_ATTRIBUTE */ DAT_RETURN DAT_API dapl_cr_accept(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; DAPL_CR *cr_ptr; DAT_EP_STATE entry_ep_state; DAT_EP_HANDLE entry_ep_handle; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_cr_accept (CR %p EP %p, PDsz %d PD %p)\n", cr_handle, ep_handle, private_data_size, private_data); if (DAPL_BAD_HANDLE(cr_handle, DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); goto bail; } cr_ptr = (DAPL_CR *) cr_handle; /* * Return an error if we have an ep_handle and the CR already has an * EP, indicating this is an RSP connection or PSP_PROVIDER_FLAG was * specified. */ if (ep_handle != NULL && (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP) || cr_ptr->param.local_ep_handle != NULL)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } /* Make sure we have an EP handle in one place or another */ if (ep_handle == NULL && cr_ptr->param.local_ep_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if ((0 != private_data_size) && (NULL == private_data)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } /* * ep_handle is NULL if the user specified DAT_PSP_PROVIDER_FLAG * OR this is an RSP connection; retrieve it from the cr. */ if (ep_handle == NULL) { ep_handle = cr_ptr->param.local_ep_handle; if (((((DAPL_EP *) ep_handle)->param.ep_state != DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING) && (((DAPL_EP *) ep_handle)->param.ep_state != DAT_EP_STATE_PASSIVE_CONNECTION_PENDING)) && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC)) { return DAT_INVALID_STATE; } } else { /* ensure this EP isn't connected or in use */ if ((((DAPL_EP *) ep_handle)->param.ep_state != DAT_EP_STATE_UNCONNECTED) && (((DAPL_EP *) ep_handle)->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC)) { return DAT_INVALID_STATE; } } ep_ptr = (DAPL_EP *) ep_handle; /* * Verify the attributes of the EP handle before we connect it. Test * all of the handles to make sure they are currently valid. * Specifically: * pz_handle required * recv_evd_handle optional, but must be valid * request_evd_handle optional, but must be valid * connect_evd_handle required * We do all verification and state change under lock, at which * point the EP state should protect us from most races. */ dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.pz_handle == NULL || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ) /* test connect handle */ || ep_ptr->param.connect_evd_handle == NULL || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)-> evd_flags & DAT_EVD_CONNECTION_FLAG) /* test optional completion handles */ || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD))) || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } /* The qp must be attached by this point! */ if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } entry_ep_state = ep_ptr->param.ep_state; entry_ep_handle = cr_ptr->param.local_ep_handle; ep_ptr->param.ep_state = DAT_EP_STATE_COMPLETION_PENDING; /* UD supports multiple CR's per EP, provider will manage CR's */ if (ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) { ep_ptr->cr_ptr = cr_ptr; ep_ptr->param.remote_ia_address_ptr = cr_ptr->param.remote_ia_address_ptr; } cr_ptr->param.local_ep_handle = ep_handle; dapl_os_unlock(&ep_ptr->header.lock); dat_status = dapls_ib_accept_connection(cr_handle, ep_handle, private_data_size, private_data); /* * If the provider failed, unwind the damage so we are back at * the initial state. */ if (dat_status != DAT_SUCCESS) { if (DAT_GET_TYPE(dat_status) == DAT_INVALID_ADDRESS) { /* The remote connection request has disappeared; timeout, * system error, app termination, perhaps other reasons. */ dat_status = dapls_evd_post_connection_event(ep_ptr->param. connect_evd_handle, DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR, (DAT_HANDLE) ep_ptr, 0, 0); cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED; } else { ep_ptr->param.ep_state = entry_ep_state; cr_ptr->param.local_ep_handle = entry_ep_handle; ep_ptr->cr_ptr = NULL; ep_ptr->param.remote_ia_address_ptr = NULL; } /* * After restoring values above, we now check if we need * to translate the error */ if (DAT_GET_TYPE(dat_status) == DAT_LENGTH_ERROR) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); } } else { /* Make this CR invalid. We need to hang on to it until * the connection terminates, but it's destroyed from * the app point of view. */ cr_ptr->header.magic = DAPL_MAGIC_CR_DESTROYED; } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_cr_callback.c000066400000000000000000000353261255317474200202560ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapls_cr_callback.c * * PURPOSE: implements passive side connection callbacks * * Description: Accepts asynchronous callbacks from the Communications Manager * for EVDs that have been specified as the connection_evd. * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" #include "dapl_ia_util.h" #include "dapl_sp_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" /* * Prototypes */ DAT_RETURN dapli_connection_request(IN dp_ib_cm_handle_t ib_cm_handle, IN DAPL_SP * sp_ptr, IN DAPL_PRIVATE * prd_ptr, IN int private_data_size, IN DAPL_EVD * evd_ptr); DAPL_EP *dapli_get_sp_ep(IN dp_ib_cm_handle_t ib_cm_handle, IN DAPL_SP * sp_ptr, IN DAT_EVENT_NUMBER dat_event_num); /* * dapls_cr_callback * * The callback function registered with verbs for passive side of * connection requests. The interface is specified by cm_api.h * * * Input: * ib_cm_handle, Handle to CM * ib_cm_event Specific CM event * instant_data Private data with DAT ADDRESS header * context SP pointer * * Output: * None * */ void dapls_cr_callback(IN dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_t ib_cm_event, IN const void *private_data_ptr, IN const int private_data_size, IN const void *context) { DAPL_EP *ep_ptr; DAPL_EVD *evd_ptr; DAPL_SP *sp_ptr; DAPL_PRIVATE *prd_ptr; DAT_EVENT_NUMBER dat_event_num; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK, "--> dapl_cr_callback! context: %p event: %x cm_handle %p\n", context, ib_cm_event, (void *)ib_cm_handle); /* * Passive side of the connection, context is a SP and * we need to look up the EP. */ sp_ptr = (DAPL_SP *) context; /* * The context pointer could have been cleaned up in a racing * CM callback, check to see if we should just exit here */ if (sp_ptr->header.magic == DAPL_MAGIC_INVALID) { return; } dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP || sp_ptr->header.magic == DAPL_MAGIC_RSP); /* Obtain the event number from the provider layer */ dat_event_num = dapls_ib_get_dat_event(ib_cm_event, DAT_FALSE); /* * CONNECT_REQUEST events create an event on the PSP * EVD, which will trigger connection processing. The * sequence is: * CONNECT_REQUEST Event to SP * CONNECTED Event to EP * DISCONNECT Event to EP * * Obtain the EP if required and set an event up on the correct * EVD. */ if (dat_event_num == DAT_CONNECTION_REQUEST_EVENT) { ep_ptr = NULL; evd_ptr = sp_ptr->evd_handle; } else { /* see if there is an EP connected with this CM handle */ ep_ptr = dapli_get_sp_ep(ib_cm_handle, sp_ptr, dat_event_num); /* if we lost a race with the CM just exit. */ if (ep_ptr == NULL) { return; } evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle; /* if something has happened to our EVD, bail. */ if (evd_ptr == NULL) { return; } } prd_ptr = (DAPL_PRIVATE *) private_data_ptr; dat_status = DAT_INTERNAL_ERROR; /* init to ERR */ switch (dat_event_num) { case DAT_CONNECTION_REQUEST_EVENT: { /* * Requests arriving on a disabled SP are immediatly rejected */ dapl_os_lock(&sp_ptr->header.lock); if (sp_ptr->listening == DAT_FALSE) { dapl_os_unlock(&sp_ptr->header.lock); dapl_log(DAPL_DBG_TYPE_CM_WARN, " cr_callback: CR event on non-listening SP\n"); (void)dapls_ib_reject_connection(ib_cm_handle, DAT_CONNECTION_EVENT_UNREACHABLE, 0, NULL); return; } if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP) { /* * RSP connections only allow a single connection. Close * it down NOW so we reject any further connections. */ sp_ptr->listening = DAT_FALSE; } dapl_os_unlock(&sp_ptr->header.lock); /* * Only occurs on the passive side of a connection * dapli_connection_request will post the connection * event if appropriate. */ dat_status = dapli_connection_request(ib_cm_handle, sp_ptr, prd_ptr, private_data_size, evd_ptr); /* Set evd_ptr = NULL so we don't generate an event below */ evd_ptr = NULL; break; } case DAT_CONNECTION_EVENT_ESTABLISHED: { /* This is just a notification the connection is now * established, there isn't any private data to deal with. * * Update the EP state and cache a copy of the cm handle, * then let the user know we are ready to go. */ dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->header.magic != DAPL_MAGIC_EP || ep_ptr->param.ep_state != DAT_EP_STATE_COMPLETION_PENDING) { /* If someone pulled the plug on the EP or connection, * just exit */ dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_SUCCESS; /* Set evd_ptr = NULL so we don't generate an event below */ evd_ptr = NULL; break; } ep_ptr->param.ep_state = DAT_EP_STATE_CONNECTED; dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_EVENT_DISCONNECTED: { /* * EP is now fully disconnected; initiate any post processing * to reset the underlying QP and get the EP ready for * another connection */ dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED) { /* The disconnect has already occurred, we are now * cleaned up and ready to exit */ dapl_os_unlock(&ep_ptr->header.lock); return; } ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapls_ib_disconnect_clean(ep_ptr, DAT_FALSE, ib_cm_event); dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_EVENT_NON_PEER_REJECTED: case DAT_CONNECTION_EVENT_PEER_REJECTED: case DAT_CONNECTION_EVENT_UNREACHABLE: { /* * After posting an accept the requesting node has * stopped talking. */ dapl_os_lock(&ep_ptr->header.lock); ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapls_ib_disconnect_clean(ep_ptr, DAT_FALSE, ib_cm_event); dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_EVENT_BROKEN: { dapl_os_lock(&ep_ptr->header.lock); ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapls_ib_disconnect_clean(ep_ptr, DAT_FALSE, ib_cm_event); dapl_os_unlock(&ep_ptr->header.lock); break; } default: { evd_ptr = NULL; dapl_os_assert(0); /* shouldn't happen */ break; } } if (evd_ptr != NULL) { dat_status = dapls_evd_post_connection_event(evd_ptr, dat_event_num, (DAT_HANDLE) ep_ptr, 0, NULL); } if (dat_status != DAT_SUCCESS) { /* The event post failed; take appropriate action. */ (void)dapls_ib_reject_connection(ib_cm_handle, DAT_CONNECTION_EVENT_BROKEN, 0, NULL); return; } } /* * dapli_connection_request * * Process a connection request on the Passive side of a connection. * Create a CR record and link it on to the SP so we can update it * and free it later. Create an EP if specified by the PSP flags. * * Input: * ib_cm_handle, * sp_ptr * event_ptr * prd_ptr * * Output: * None * * Returns * DAT_INSUFFICIENT_RESOURCES * DAT_SUCCESS * */ DAT_RETURN dapli_connection_request(IN dp_ib_cm_handle_t ib_cm_handle, IN DAPL_SP * sp_ptr, IN DAPL_PRIVATE * prd_ptr, IN int private_data_size, IN DAPL_EVD * evd_ptr) { DAT_RETURN dat_status; DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; DAPL_IA *ia_ptr; DAT_SP_HANDLE sp_handle; cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia); if (cr_ptr == NULL) { /* Invoking function will call dapls_ib_cm_reject() */ return DAT_INSUFFICIENT_RESOURCES; } /* * Set up the CR */ cr_ptr->sp_ptr = sp_ptr; /* maintain sp_ptr in case of reject */ cr_ptr->param.remote_port_qual = 0; cr_ptr->ib_cm_handle = ib_cm_handle; #ifdef IBHOSTS_NAMING /* * Special case: pull the remote HCA address from the private data * prefix. This is a spec violation as it introduces a protocol, but * some implementations may find it necessary for a time. */ cr_ptr->remote_ia_address = prd_ptr->hca_address; #endif /* IBHOSTS_NAMING */ cr_ptr->param.remote_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address; /* * Copy the remote address and private data out of the private_data * payload and put them in a local structure */ /* Private data size will be determined by the provider layer */ cr_ptr->param.private_data = cr_ptr->private_data; cr_ptr->param.private_data_size = private_data_size; if (cr_ptr->param.private_data_size > 0) { dapl_os_memcpy(cr_ptr->private_data, prd_ptr->private_data, DAPL_MIN(cr_ptr->param.private_data_size, DAPL_MAX_PRIVATE_DATA_SIZE)); } /* EP will be NULL unless RSP service point */ ep_ptr = (DAPL_EP *) sp_ptr->ep_handle; if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) { /* * Never true for RSP connections * * Create an EP for the user. If we can't allocate an * EP we are out of resources and need to tell the * requestor that we cant help them. */ ia_ptr = sp_ptr->header.owner_ia; ep_ptr = dapl_ep_alloc(ia_ptr, NULL, DAT_FALSE); if (ep_ptr == NULL) { dapls_cr_free(cr_ptr); /* Invoking function will call dapls_ib_cm_reject() */ return DAT_INSUFFICIENT_RESOURCES; } ep_ptr->param.ia_handle = ia_ptr; ep_ptr->param.local_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address; /* Link the EP onto the IA */ dapl_ia_link_ep(ia_ptr, ep_ptr); } cr_ptr->param.local_ep_handle = ep_ptr; if (ep_ptr != NULL) { /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */ if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) { ep_ptr->param.ep_state = DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING; } else { /* RSP */ dapl_os_assert(sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP); ep_ptr->param.ep_state = DAT_EP_STATE_PASSIVE_CONNECTION_PENDING; } dapl_ep_link_cm(ep_ptr, ib_cm_handle); } /* link the CR onto the SP so we can pick it up later */ dapl_sp_link_cr(sp_ptr, cr_ptr); /* Post the event. */ /* assign sp_ptr to union to avoid typecast errors from some compilers */ sp_handle.psp_handle = (DAT_PSP_HANDLE) sp_ptr; dat_status = dapls_evd_post_cr_arrival_event(evd_ptr, DAT_CONNECTION_REQUEST_EVENT, sp_handle, (DAT_IA_ADDRESS_PTR) & sp_ptr->header.owner_ia-> hca_ptr->hca_address, sp_ptr->conn_qual, (DAT_CR_HANDLE) cr_ptr); if (dat_status != DAT_SUCCESS) { (void)dapls_ib_reject_connection(ib_cm_handle, DAT_CONNECTION_EVENT_BROKEN, 0, NULL); /* Take the CR off the list, we can't use it */ dapl_os_lock(&sp_ptr->header.lock); dapl_sp_remove_cr(sp_ptr, cr_ptr); dapl_os_unlock(&sp_ptr->header.lock); dapls_cr_free(cr_ptr); return DAT_INSUFFICIENT_RESOURCES; } return DAT_SUCCESS; } /* * dapli_get_sp_ep * * Passive side of a connection is now fully established. Clean * up resources and obtain the EP pointer associated with a CR in * the SP * * Input: * ib_cm_handle, * sp_ptr * connection_event * * Output: * none * * Returns * ep_ptr * */ DAPL_EP *dapli_get_sp_ep(IN dp_ib_cm_handle_t ib_cm_handle, IN DAPL_SP * sp_ptr, IN DAT_EVENT_NUMBER dat_event_num) { DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; /* * acquire the lock, we may be racing with other threads here */ dapl_os_lock(&sp_ptr->header.lock); /* Verify under lock that the SP is still valid */ if (sp_ptr->header.magic == DAPL_MAGIC_INVALID) { dapl_os_unlock(&sp_ptr->header.lock); return NULL; } /* * There are potentially multiple connections in progress. Need to * go through the list and find the one we are interested * in. There is no guarantee of order. dapl_sp_search_cr * leaves the CR on the SP queue. */ cr_ptr = dapl_sp_search_cr(sp_ptr, ib_cm_handle); if (cr_ptr == NULL) { dapl_os_unlock(&sp_ptr->header.lock); return NULL; } ep_ptr = (DAPL_EP *) cr_ptr->param.local_ep_handle; /* Quick check to ensure our EP is still valid */ if ((DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP))) { ep_ptr = NULL; } /* The CR record is discarded in all except for the CONNECTED case, * as it will have no further relevance. */ if (dat_event_num != DAT_CONNECTION_EVENT_ESTABLISHED) { /* Remove the CR from the queue */ dapl_sp_remove_cr(sp_ptr, cr_ptr); if (ep_ptr != NULL) { ep_ptr->cr_ptr = NULL; } /* * If this SP has been removed from service, free it * up after the last CR is removed */ if (sp_ptr->listening != DAT_TRUE && sp_ptr->cr_list_count == 0 && sp_ptr->state != DAPL_SP_STATE_FREE && sp_ptr->state != DAPL_SP_STATE_RSP_LISTENING) { dapl_dbg_log(DAPL_DBG_TYPE_CM, "--> dapli_get_sp_ep! disconnect dump sp: %p \n", sp_ptr); /* Decrement the ref count on the EVD */ if (sp_ptr->evd_handle) { dapl_os_atomic_dec(& ((DAPL_EVD *) sp_ptr-> evd_handle)->evd_ref_count); sp_ptr->evd_handle = NULL; } sp_ptr->state = DAPL_SP_STATE_FREE; dapl_os_unlock(&sp_ptr->header.lock); (void)dapls_ib_remove_conn_listener(sp_ptr->header. owner_ia, sp_ptr); dapls_ia_unlink_sp((DAPL_IA *) sp_ptr->header.owner_ia, sp_ptr); dapls_sp_free_sp(sp_ptr); dapls_cr_free(cr_ptr); goto skip_unlock; } dapl_os_unlock(&sp_ptr->header.lock); /* free memory outside of the lock */ dapls_cr_free(cr_ptr); } else { dapl_os_unlock(&sp_ptr->header.lock); } skip_unlock: return ep_ptr; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_cr_handoff.c000066400000000000000000000035701255317474200201230ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cr_handoff.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_cr_handoff * * DAPL Requirements Version xxx, 6.4.2.4 * * Hand the connection request to another Sevice pont specified by the * Connectin Qualifier. * * Input: * cr_handle * cr_handoff * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cr_handoff(IN DAT_CR_HANDLE cr_handle, IN DAT_CONN_QUAL cr_handoff) { /* handoff */ return DAT_ERROR(DAT_NOT_IMPLEMENTED, 0); } dapl-2.1.5/dapl/common/dapl_cr_query.c000066400000000000000000000052341255317474200176620ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cr_query.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_cr_query * * DAPL Requirements Version xxx, 6.4.2.1 * * Return Connection Request args * * Input: * cr_handle * cr_param_mask * * Output: * cr_param * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_cr_query(IN DAT_CR_HANDLE cr_handle, IN DAT_CR_PARAM_MASK cr_param_mask, OUT DAT_CR_PARAM * cr_param) { DAPL_CR *cr_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_cr_query (%p, %x, %p)\n", cr_handle, cr_param_mask, cr_param); dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(cr_handle, DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); goto bail; } if (NULL == cr_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } cr_ptr = (DAPL_CR *) cr_handle; /* obtain the remote IP address */ if (cr_param_mask & DAT_CR_FIELD_REMOTE_IA_ADDRESS_PTR) { dat_status = dapls_ib_cm_remote_addr((DAT_HANDLE) cr_handle, &cr_ptr-> remote_ia_address); } /* since the arguments are easily accessible, ignore the mask */ dapl_os_memcpy(cr_param, &cr_ptr->param, sizeof(DAT_CR_PARAM)); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_cr_reject.c000077500000000000000000000074231255317474200177760ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cr_reject.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cr_util.h" #include "dapl_sp_util.h" #include "dapl_adapter_util.h" /* * dapl_cr_reject * * DAPL Requirements Version xxx, 6.4.2.2 * * Reject a connection request from the active remote side requesting * an Endpoint. * * Input: * cr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cr_reject(IN DAT_CR_HANDLE cr_handle, /* cr_handle */ IN DAT_COUNT pdata_size, /* private_data_size */ IN const DAT_PVOID pdata) { /* private_data */ DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; DAT_EP_STATE entry_ep_state; DAT_EP_HANDLE entry_ep_handle; DAPL_SP *sp_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_cr_reject (%p)\n", cr_handle); if (DAPL_BAD_HANDLE(cr_handle, DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); goto bail; } cr_ptr = (DAPL_CR *) cr_handle; /* * Clean up provider created EP if there is one: only if * DAT_PSP_PROVIDER_FLAG was set on the PSP */ ep_ptr = (DAPL_EP *) cr_ptr->param.local_ep_handle; entry_ep_handle = cr_ptr->param.local_ep_handle; entry_ep_state = 0; if (ep_ptr != NULL) { entry_ep_state = ep_ptr->param.ep_state; ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; cr_ptr->param.local_ep_handle = NULL; } dat_status = dapls_ib_reject_connection(cr_ptr->ib_cm_handle, IB_CM_REJ_REASON_CONSUMER_REJ, pdata_size, pdata); if (dat_status != DAT_SUCCESS) { if (ep_ptr != NULL) { /* Revert our state to the beginning */ ep_ptr->param.ep_state = entry_ep_state; cr_ptr->param.local_ep_handle = entry_ep_handle; cr_ptr->param.local_ep_handle = (DAT_EP_HANDLE) ep_ptr; } } else { /* * If this EP has been allocated by the provider, clean it up; * see DAT 1.1 spec, page 100, lines 3-4 (section 6.4.3.1.1.1). * RSP and user-provided EPs are in the control of the user. */ sp_ptr = cr_ptr->sp_ptr; if (ep_ptr != NULL && sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) { (void)dapl_ep_free(ep_ptr); } /* Remove the CR from the queue, then free it */ dapl_os_lock(&sp_ptr->header.lock); dapl_sp_remove_cr(sp_ptr, cr_ptr); dapl_os_unlock(&sp_ptr->header.lock); dapls_cr_free(cr_ptr); } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_cr_util.c000066400000000000000000000050661255317474200174750ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cr_util.c * * PURPOSE: Manage CR (Connection Request) structure * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cr_util.h" /* * dapls_cr_create * * Create a CR. Part of the passive side of a connection * * Input: * ia_ptr * * Returns: * DAPL_CR * */ DAPL_CR *dapls_cr_alloc(DAPL_IA * ia_ptr) { DAPL_CR *cr_ptr; /* Allocate EP */ cr_ptr = (DAPL_CR *) dapl_os_alloc(sizeof(DAPL_CR)); if (cr_ptr == NULL) { return (NULL); } /* zero the structure */ dapl_os_memzero(cr_ptr, sizeof(DAPL_CR)); /* * initialize the header */ cr_ptr->header.provider = ia_ptr->header.provider; cr_ptr->header.magic = DAPL_MAGIC_CR; cr_ptr->header.handle_type = DAT_HANDLE_TYPE_CR; cr_ptr->header.owner_ia = ia_ptr; cr_ptr->header.user_context.as_64 = 0; cr_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&cr_ptr->header.ia_list_entry); dapl_os_lock_init(&cr_ptr->header.lock); return (cr_ptr); } /* * dapls_cr_free * * Free the passed in CR structure. * * Input: * entry point pointer * * Output: * none * * Returns: * none * */ void dapls_cr_free(IN DAPL_CR * cr_ptr) { dapl_os_assert(cr_ptr->header.magic == DAPL_MAGIC_CR || cr_ptr->header.magic == DAPL_MAGIC_CR_DESTROYED); cr_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_os_free(cr_ptr, sizeof(DAPL_CR)); } dapl-2.1.5/dapl/common/dapl_cr_util.h000066400000000000000000000033651255317474200175020ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_cr_util.h * * PURPOSE: Utility defs & routines for the CR data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_CR_UTIL_H_ #define _DAPL_CR_UTIL_H_ #include "dapl.h" DAPL_CR * dapls_cr_alloc ( DAPL_IA *ia_ptr ); void dapls_cr_free ( IN DAPL_CR *cr_ptr ); void dapls_cr_callback ( IN dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_t ib_cm_event, IN const void *private_data_ptr, IN const int private_data_size, IN const void *context); #endif /* _DAPL_CR_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_csp.c000077500000000000000000000062341255317474200166220ustar00rootroot00000000000000/* * Copyright (c) 2007 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_csp.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 2.0 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_psp_create, dapl_csp_query, dapl_csp_free * * uDAPL: User Direct Access Program Library Version 2.0, 6.4.4.2 * * The Common Service Point is transport-independent analog of the Public * Service Point. It allows the Consumer to listen on socket-equivalent for * requests for connections arriving on a specified IP port instead of * transport-dependent Connection Qualifier. An IA Address follows the * platform conventions and provides among others the IP port to listen on. * An IP port of the Common Service Point advertisement is supported by * existing Ethernet infrastructure or DAT Name Service. * * Input: * ia_handle * comm_id * address * evd_handle * csp_handle * * Output: * csp_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_CONN_QUAL_IN_USE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_csp_create(IN DAT_IA_HANDLE ia_handle, /* ia_handle */ IN DAT_COMM * comm, /* communicator */ IN DAT_IA_ADDRESS_PTR addr, /* address */ IN DAT_EVD_HANDLE evd_handle, /* evd_handle */ OUT DAT_CSP_HANDLE * csp_handle) { /* csp_handle */ return DAT_MODEL_NOT_SUPPORTED; } DAT_RETURN DAT_API dapl_csp_query(IN DAT_CSP_HANDLE csp_handle, /* csp_handle */ IN DAT_CSP_PARAM_MASK param_mask, /* csp_param_mask */ OUT DAT_CSP_PARAM * param) { /* csp_param */ return DAT_MODEL_NOT_SUPPORTED; } DAT_RETURN DAT_API dapl_csp_free(IN DAT_CSP_HANDLE csp_handle) { /* csp_handle */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_debug.c000066400000000000000000000543761255317474200171320ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #if !defined(__KDAPL__) #include #include #endif /* __KDAPL__ */ DAPL_DBG_TYPE g_dapl_dbg_level; /* debug type override */ DAPL_DBG_TYPE g_dapl_dbg_type; /* initialized in dapl_init.c */ DAPL_DBG_DEST g_dapl_dbg_dest; /* initialized in dapl_init.c */ int g_dapl_dbg_mem; /* initialized in dapl_init.c */ static char *_ptr_host_ = NULL; static char _hostname_[128]; static DAPL_OS_TIMEVAL start_t, current_t, last_t; /* microsecond timeStamp STDOUT */ static int delta_t, total_t; void dapl_internal_dbg_log(DAPL_DBG_TYPE type, const char *fmt, ...) { va_list args; if (_ptr_host_ == NULL) { gethostname(_hostname_, sizeof(_hostname_)); _ptr_host_ = _hostname_; dapl_os_get_time(&start_t); last_t = start_t; } if ((type & g_dapl_dbg_type) || (type & g_dapl_dbg_level)) { if (DAPL_DBG_DEST_STDOUT & g_dapl_dbg_dest) { dapl_os_get_time(¤t_t); delta_t = current_t - last_t; total_t = current_t - start_t; last_t = current_t; va_start(args, fmt); fprintf(stdout, "%s:%s:%x:%x: %d us(%d us%s): ", _ptr_host_, PROVIDER_NAME, dapl_os_getpid(), dapl_os_gettid(), total_t, delta_t, delta_t > 500000 ? "!!!":""); dapl_os_vprintf(fmt, args); va_end(args); } if (DAPL_DBG_DEST_SYSLOG & g_dapl_dbg_dest) { va_start(args, fmt); dapl_os_syslog(fmt, args); va_end(args); } } } #ifdef DAPL_COUNTERS static int rd_ctr(const char *dev, const char *file, int port, DAT_IA_COUNTER_TYPE type, DAT_UINT64 *value) { char *f_path; int len, fd; char vstr[21]; char pstr[2]; sprintf(pstr, "%d", port); *value = 0; switch (type) { case DCNT_IA_CM: if (asprintf(&f_path, "/sys/class/infiniband_cm/%s/%s/%s", dev, pstr, file) < 0) return -1; break; case DCNT_IA_LNK: if (asprintf(&f_path, "%s/ports/%s/counters/%s", dev, pstr, file) < 0) return -1; break; case DCNT_IA_DIAG: if (asprintf(&f_path, "%s/diag_counters/%s", dev, file) < 0) return -1; break; default: return -1; } fd = open(f_path, O_RDONLY); if (fd < 0) { free(f_path); return -1; } len = read(fd, vstr, 21); if (len > 0 && vstr[--len] == '\n') vstr[len] = '\0'; *value = (DAT_UINT64)atoi(vstr); close(fd); free(f_path); return 0; } #ifdef _OPENIB_CMA_ static void dapl_start_cm_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; const char *dev = ibv_get_device_name(ia->hca_ptr->ib_trans.ib_dev); int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; rd_ctr(dev,"cm_tx_msgs/req", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_REQ_TX]); rd_ctr(dev,"cm_tx_msgs/rep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_REP_TX]); rd_ctr(dev,"cm_tx_msgs/rtu", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_RTU_TX]); rd_ctr(dev,"cm_tx_msgs/rej", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_USER_REJ_TX]); rd_ctr(dev,"cm_tx_msgs/mra", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_MRA_TX]); rd_ctr(dev,"cm_tx_msgs/dreq", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_DREQ_TX]); rd_ctr(dev,"cm_tx_msgs/drep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_DREP_TX]); rd_ctr(dev,"cm_rx_msgs/req", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_REQ_RX]); rd_ctr(dev,"cm_rx_msgs/rep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_REP_RX]); rd_ctr(dev,"cm_rx_msgs/rtu", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_RTU_RX]); rd_ctr(dev,"cm_rx_msgs/rej", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_USER_REJ_RX]); rd_ctr(dev,"cm_rx_msgs/mra", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_MRA_RX]); rd_ctr(dev,"cm_rx_msgs/dreq", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_DREQ_RX]); rd_ctr(dev,"cm_rx_msgs/drep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_DREP_RX]); rd_ctr(dev,"cm_tx_retries/req", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_REQ_RETRY]); rd_ctr(dev,"cm_tx_retries/rep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_REP_RETRY]); rd_ctr(dev,"cm_tx_retries/rtu", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_RTU_RETRY]); rd_ctr(dev,"cm_tx_retries/mra", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_MRA_RETRY]); rd_ctr(dev,"cm_tx_retries/dreq", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_DREQ_RETRY]); rd_ctr(dev,"cm_tx_retries/drep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_DREP_RETRY]); rd_ctr(dev,"cm_tx_duplicates/req", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_REQ_DUP]); rd_ctr(dev,"cm_tx_duplicates/rep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_REP_DUP]); rd_ctr(dev,"cm_tx_duplicates/rtu", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_RTU_DUP]); rd_ctr(dev,"cm_tx_duplicates/mra", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_MRA_DUP]); rd_ctr(dev,"cm_tx_duplicates/dreq", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_DREQ_DUP]); rd_ctr(dev,"cm_tx_duplicates/drep", port, DCNT_IA_CM, &cntrs[DCNT_IA_CM_ERR_DREP_DUP]); } static void dapl_stop_cm_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; const char *dev = ibv_get_device_name(ia->hca_ptr->ib_trans.ib_dev); int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; DAT_UINT64 val = 0; rd_ctr(dev,"cm_tx_msgs/req", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_REQ_TX] = val - cntrs[DCNT_IA_CM_REQ_TX]; rd_ctr(dev,"cm_tx_msgs/rep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_REP_TX] = val - cntrs[DCNT_IA_CM_REP_TX]; rd_ctr(dev,"cm_tx_msgs/rtu", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_RTU_TX] = val - cntrs[DCNT_IA_CM_RTU_TX]; rd_ctr(dev,"cm_tx_msgs/rej", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_USER_REJ_TX] = val - cntrs[DCNT_IA_CM_USER_REJ_TX]; rd_ctr(dev,"cm_tx_msgs/mra", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_MRA_TX] = val - cntrs[DCNT_IA_CM_MRA_TX]; rd_ctr(dev,"cm_tx_msgs/dreq", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_DREQ_TX] = val - cntrs[DCNT_IA_CM_DREQ_TX]; rd_ctr(dev,"cm_tx_msgs/drep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_DREP_TX] = val - cntrs[DCNT_IA_CM_DREP_TX]; rd_ctr(dev,"cm_rx_msgs/req", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_REQ_RX] = val - cntrs[DCNT_IA_CM_REQ_RX]; rd_ctr(dev,"cm_rx_msgs/rep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_REP_RX] = val - cntrs[DCNT_IA_CM_REP_RX]; rd_ctr(dev,"cm_rx_msgs/rtu", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_RTU_RX] = val - cntrs[DCNT_IA_CM_RTU_RX]; rd_ctr(dev,"cm_rx_msgs/rej", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_USER_REJ_RX] = val - cntrs[DCNT_IA_CM_USER_REJ_RX]; rd_ctr(dev,"cm_rx_msgs/mra", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_MRA_RX] = val - cntrs[DCNT_IA_CM_MRA_RX]; rd_ctr(dev,"cm_rx_msgs/dreq", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_DREQ_RX] = val - cntrs[DCNT_IA_CM_DREQ_RX]; rd_ctr(dev,"cm_rx_msgs/drep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_DREP_RX] = val - cntrs[DCNT_IA_CM_DREP_RX]; rd_ctr(dev,"cm_tx_retries/req", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_REQ_RETRY] = val - cntrs[DCNT_IA_CM_ERR_REQ_RETRY]; rd_ctr(dev,"cm_tx_retries/rep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_REP_RETRY] = val - cntrs[DCNT_IA_CM_ERR_REP_RETRY]; rd_ctr(dev,"cm_tx_retries/rtu", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_RTU_RETRY] = val - cntrs[DCNT_IA_CM_ERR_RTU_RETRY]; rd_ctr(dev,"cm_tx_retries/mra", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_MRA_RETRY] = val - cntrs[DCNT_IA_CM_ERR_MRA_RETRY]; rd_ctr(dev,"cm_tx_retries/dreq", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_DREQ_RETRY] = val - cntrs[DCNT_IA_CM_ERR_DREQ_RETRY]; rd_ctr(dev,"cm_tx_retries/drep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_DREP_RETRY] = val - cntrs[DCNT_IA_CM_ERR_DREP_RETRY]; rd_ctr(dev,"cm_tx_duplicates/req", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_REQ_DUP] = val - cntrs[DCNT_IA_CM_ERR_REQ_DUP]; rd_ctr(dev,"cm_tx_duplicates/rep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_REP_DUP] = val - cntrs[DCNT_IA_CM_ERR_REP_DUP]; rd_ctr(dev,"cm_tx_duplicates/rtu", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_RTU_DUP] = val - cntrs[DCNT_IA_CM_ERR_RTU_DUP]; rd_ctr(dev,"cm_tx_duplicates/mra", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_MRA_DUP] = val - cntrs[DCNT_IA_CM_ERR_MRA_DUP]; rd_ctr(dev,"cm_tx_duplicates/dreq", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_DREQ_DUP] = val - cntrs[DCNT_IA_CM_ERR_DREQ_DUP]; rd_ctr(dev,"cm_tx_duplicates/drep", port, DCNT_IA_CM, &val); cntrs[DCNT_IA_CM_ERR_DREP_DUP] = val - cntrs[DCNT_IA_CM_ERR_DREP_DUP]; } #endif /* map selective IB port counters to dapl counters */ static void dapl_start_lnk_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; char *dev = ia->hca_ptr->ib_hca_handle->device->ibdev_path; int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; rd_ctr(dev,"port_rcv_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_RCV]); rd_ctr(dev,"port_rcv_remote_physical_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_RCV_REM_PHYS]); rd_ctr(dev,"port_rcv_contraint_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_RCV_CONSTRAINT]); rd_ctr(dev,"port_xmit_discards", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_XMT_DISCARDS]); rd_ctr(dev,"port_xmit_contraint", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_XMT_CONTRAINT]); rd_ctr(dev,"local_link_integrity_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_INTEGRITY]); rd_ctr(dev,"excessive_buffer_overrun_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_ERR_EXC_BUF_OVERRUN]); rd_ctr(dev,"port_xmit_wait", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_WARN_XMT_WAIT]); rd_ctr(dev,"port_rcv_switch_relay_errors", port, DCNT_IA_LNK, &cntrs[DCNT_IA_LNK_WARN_RCV_SW_RELAY]); } static void dapl_stop_lnk_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; char *dev = ia->hca_ptr->ib_hca_handle->device->ibdev_path; int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; DAT_UINT64 val = 0; rd_ctr(dev,"port_rcv_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_RCV] = val - cntrs[DCNT_IA_LNK_ERR_RCV]; rd_ctr(dev,"port_rcv_remote_physical_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_RCV_REM_PHYS] = val - cntrs[DCNT_IA_LNK_ERR_RCV_REM_PHYS]; rd_ctr(dev,"port_rcv_contraint_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_RCV_CONSTRAINT] = val - cntrs[DCNT_IA_LNK_ERR_RCV_CONSTRAINT]; rd_ctr(dev,"port_xmit_discards", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_XMT_DISCARDS] = val - cntrs[DCNT_IA_LNK_ERR_XMT_DISCARDS]; rd_ctr(dev,"port_xmit_contraint", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_XMT_CONTRAINT] = val - cntrs[DCNT_IA_LNK_ERR_XMT_CONTRAINT]; rd_ctr(dev,"local_link_integrity_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_INTEGRITY] = val - cntrs[DCNT_IA_LNK_ERR_INTEGRITY] ; rd_ctr(dev,"excessive_buffer_overrun_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_ERR_EXC_BUF_OVERRUN] = val - cntrs[DCNT_IA_LNK_ERR_EXC_BUF_OVERRUN]; rd_ctr(dev,"port_rcv_switch_relay_errors", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_WARN_RCV_SW_RELAY] = val - cntrs[DCNT_IA_LNK_WARN_RCV_SW_RELAY]; rd_ctr(dev,"port_xmit_wait", port, DCNT_IA_LNK, &val); cntrs[DCNT_IA_LNK_WARN_XMT_WAIT] = val - cntrs[DCNT_IA_LNK_WARN_XMT_WAIT]; } /* map selective IB diag_counters to dapl counters */ static void dapl_start_diag_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; char *dev = ia->hca_ptr->ib_hca_handle->device->ibdev_path; int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; rd_ctr(dev,"rq_num_rae", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_RQ_RAE]); rd_ctr(dev,"rq_num_oos", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_RQ_OOS]); rd_ctr(dev,"rq_num_rire", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_RQ_RIRE]); rd_ctr(dev,"rq_num_udsdprd", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_RQ_UDSDPRD]); rd_ctr(dev,"sq_num_rae", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_SQ_RAE]); rd_ctr(dev,"sq_num_oos", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_SQ_OOS]); rd_ctr(dev,"sq_num_rire", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_SQ_RIRE]); rd_ctr(dev,"sq_num_rree", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_SQ_RREE]); rd_ctr(dev,"sq_num_tree", port, DCNT_IA_DIAG, &cntrs[DCNT_IA_DIAG_ERR_SQ_TREE]); } static void dapl_stop_diag_cntrs(DAT_HANDLE dh) { DAPL_IA *ia = (DAPL_IA *)dh; char *dev = ia->hca_ptr->ib_hca_handle->device->ibdev_path; int port = ia->hca_ptr->port_num; DAT_UINT64 *cntrs = (DAT_UINT64 *)ia->cntrs; DAT_UINT64 val = 0; rd_ctr(dev,"rq_num_rae", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_RQ_RAE] = val - cntrs[DCNT_IA_DIAG_ERR_RQ_RAE]; rd_ctr(dev,"rq_num_oos", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_RQ_OOS] = val - cntrs[DCNT_IA_DIAG_ERR_RQ_OOS]; rd_ctr(dev,"rq_num_rire", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_RQ_RIRE] = val - cntrs[DCNT_IA_DIAG_ERR_RQ_RIRE]; rd_ctr(dev,"rq_num_udsdprd", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_RQ_UDSDPRD] = val - cntrs[DCNT_IA_DIAG_ERR_RQ_UDSDPRD]; rd_ctr(dev,"sq_num_rae", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_SQ_RAE] = val - cntrs[DCNT_IA_DIAG_ERR_SQ_RAE]; rd_ctr(dev,"sq_num_oos", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_SQ_OOS] = val - cntrs[DCNT_IA_DIAG_ERR_SQ_OOS]; rd_ctr(dev,"sq_num_rire", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_SQ_RIRE] = val - cntrs[DCNT_IA_DIAG_ERR_SQ_RIRE]; rd_ctr(dev,"sq_num_rree", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_SQ_RREE] = val - cntrs[DCNT_IA_DIAG_ERR_SQ_RREE]; rd_ctr(dev,"sq_num_tree", port, DCNT_IA_DIAG, &val); cntrs[DCNT_IA_DIAG_ERR_SQ_TREE] = val - cntrs[DCNT_IA_DIAG_ERR_SQ_TREE]; } void dapl_start_counters(DAT_HANDLE dh, DAT_IA_COUNTER_TYPE type) { switch (type) { case DCNT_IA_CM: #ifdef _OPENIB_CMA_ dapl_start_cm_cntrs(dh); /* ib cm timers, cma only */ #endif break; case DCNT_IA_LNK: dapl_start_lnk_cntrs(dh); break; case DCNT_IA_DIAG: dapl_start_diag_cntrs(dh); break; default: break; } } void dapl_stop_counters(DAT_HANDLE dh, DAT_IA_COUNTER_TYPE type) { switch (type) { case DCNT_IA_CM: #ifdef _OPENIB_CMA_ dapl_stop_cm_cntrs(dh); #endif break; case DCNT_IA_LNK: dapl_stop_lnk_cntrs(dh); break; case DCNT_IA_DIAG: dapl_stop_diag_cntrs(dh); break; default: break; } } void dapli_start_counters(DAT_HANDLE dh) { #ifdef _OPENIB_CMA_ if (g_dapl_dbg_type & (DAPL_DBG_TYPE_CM_ERRS | DAPL_DBG_TYPE_CM_STATS)) dapl_start_cm_cntrs(dh); #endif if (g_dapl_dbg_type & DAPL_DBG_TYPE_LINK_ERRS) dapl_start_lnk_cntrs(dh); if (g_dapl_dbg_type & DAPL_DBG_TYPE_DIAG_ERRS) dapl_start_diag_cntrs(dh); } void dapli_stop_counters(DAT_HANDLE dh) { #ifdef _OPENIB_CMA_ if (g_dapl_dbg_type & (DAPL_DBG_TYPE_CM_ERRS | DAPL_DBG_TYPE_CM_STATS)) dapl_stop_cm_cntrs(dh); #endif if (g_dapl_dbg_type & DAPL_DBG_TYPE_LINK_ERRS) dapl_stop_lnk_cntrs(dh); if (g_dapl_dbg_type & DAPL_DBG_TYPE_DIAG_ERRS) dapl_stop_diag_cntrs(dh); if (g_dapl_dbg_type & DAPL_DBG_TYPE_IA_STATS) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_IA"); if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_STATS) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_CM"); else if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_ERRS) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_CM_ERR"); if (g_dapl_dbg_type & DAPL_DBG_TYPE_LINK_ERRS) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_LNK_ERR"); if (g_dapl_dbg_type & DAPL_DBG_TYPE_LINK_WARN) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_LNK_WARN"); if (g_dapl_dbg_type & DAPL_DBG_TYPE_DIAG_ERRS) dapl_print_counter_str(dh, DCNT_IA_ALL_COUNTERS, 1, "_DIAG_ERR"); } /* * The order of this list must match the DAT counter definitions */ static char *ia_cntr_names[] = { "DCNT_IA_PZ_CREATE", "DCNT_IA_PZ_FREE", "DCNT_IA_LMR_CREATE", "DCNT_IA_LMR_FREE", "DCNT_IA_RMR_CREATE", "DCNT_IA_RMR_FREE", "DCNT_IA_PSP_CREATE", "DCNT_IA_PSP_CREATE_ANY", "DCNT_IA_PSP_FREE", "DCNT_IA_RSP_CREATE", "DCNT_IA_RSP_FREE", "DCNT_IA_EVD_CREATE", "DCNT_IA_EVD_FREE", "DCNT_IA_EP_CREATE", "DCNT_IA_EP_FREE", "DCNT_IA_SRQ_CREATE", "DCNT_IA_SRQ_FREE", "DCNT_IA_SP_CR", "DCNT_IA_SP_CR_ACCEPTED", "DCNT_IA_SP_CR_REJECTED", "DCNT_IA_MEM_ALLOC", "DCNT_IA_MEM_ALLOC_DATA", "DCNT_IA_MEM_FREE", "DCNT_IA_ASYNC_ERROR", "DCNT_IA_ASYNC_QP_ERROR", "DCNT_IA_ASYNC_CQ_ERROR", "DCNT_IA_CM_LISTEN", "DCNT_IA_CM_REQ_TX", "DCNT_IA_CM_REQ_RX", "DCNT_IA_CM_REP_TX", "DCNT_IA_CM_REP_RX", "DCNT_IA_CM_RTU_TX", "DCNT_IA_CM_RTU_RX", "DCNT_IA_CM_USER_REJ_TX", "DCNT_IA_CM_USER_REJ_RX", "DCNT_IA_CM_ACTIVE_EST", "DCNT_IA_CM_PASSIVE_EST", "DCNT_IA_CM_AH_REQ_TX", "DCNT_IA_CM_AH_REQ_RX", "DCNT_IA_CM_AH_RESOLVED", "DCNT_IA_CM_DREQ_TX", "DCNT_IA_CM_DREQ_RX", "DCNT_IA_CM_DREP_TX", "DCNT_IA_CM_DREP_RX", "DCNT_IA_CM_MRA_TX", "DCNT_IA_CM_MRA_RX", "DCNT_IA_CM_REQ_FULLQ_POLL", "DCNT_IA_CM_ERR", "DCNT_IA_CM_ERR_REQ_FULLQ", "DCNT_IA_CM_ERR_REQ_DUP", "DCNT_IA_CM_ERR_REQ_RETRY", "DCNT_IA_CM_ERR_REP_DUP", "DCNT_IA_CM_ERR_REP_RETRY", "DCNT_IA_CM_ERR_RTU_DUP", "DCNT_IA_CM_ERR_RTU_RETRY", "DCNT_IA_CM_ERR_REFUSED", "DCNT_IA_CM_ERR_RESET", "DCNT_IA_CM_ERR_TIMEOUT", "DCNT_IA_CM_ERR_REJ_TX", "DCNT_IA_CM_ERR_REJ_RX", "DCNT_IA_CM_ERR_DREQ_DUP", "DCNT_IA_CM_ERR_DREQ_RETRY", "DCNT_IA_CM_ERR_DREP_DUP", "DCNT_IA_CM_ERR_DREP_RETRY", "DCNT_IA_CM_ERR_MRA_DUP", "DCNT_IA_CM_ERR_MRA_RETRY", "DCNT_IA_CM_ERR_UNEXPECTED", "DCNT_IA_LNK_ERR_RCV", "DCNT_IA_LNK_ERR_RCV_REM_PHYS", "DCNT_IA_LNK_ERR_RCV_CONSTRAINT", "DCNT_IA_LNK_ERR_XMT_DISCARDS", "DCNT_IA_LNK_ERR_XMT_CONTRAINT", "DCNT_IA_LNK_ERR_INTEGRITY", "DCNT_IA_LNK_ERR_EXC_BUF_OVERRUN", "DCNT_IA_LNK_WARN_RCV_SW_RELAY", "DCNT_IA_LNK_WARN_XMT_WAIT", "DCNT_IA_DIAG_ERR_RQ_RAE", "DCNT_IA_DIAG_ERR_RQ_OOS", "DCNT_IA_DIAG_ERR_RQ_RIRE", "DCNT_IA_DIAG_ERR_RQ_UDSDPRD", "DCNT_IA_DIAG_ERR_SQ_RAE", "DCNT_IA_DIAG_ERR_SQ_OOS", "DCNT_IA_DIAG_ERR_SQ_RIRE", "DCNT_IA_DIAG_ERR_SQ_RREE", "DCNT_IA_DIAG_ERR_SQ_TREE", }; static char *ep_cntr_names[] = { "DCNT_EP_CONNECT", "DCNT_EP_DISCONNECT", "DCNT_EP_POST_SEND", "DCNT_EP_POST_SEND_DATA", "DCNT_EP_POST_SEND_UD", "DCNT_EP_POST_SEND_UD_DATA", "DCNT_EP_POST_RECV", "DCNT_EP_POST_RECV_DATA", "DCNT_EP_POST_WRITE", "DCNT_EP_POST_WRITE_DATA", "DCNT_EP_POST_WRITE_IMM", "DCNT_EP_POST_WRITE_IMM_DATA", "DCNT_EP_POST_READ", "DCNT_EP_POST_READ_DATA", "DCNT_EP_POST_CMP_SWAP", "DCNT_EP_POST_FETCH_ADD", "DCNT_EP_RECV", "DCNT_EP_RECV_DATA", "DCNT_EP_RECV_UD", "DCNT_EP_RECV_UD_DATA", "DCNT_EP_RECV_IMM", "DCNT_EP_RECV_IMM_DATA", "DCNT_EP_RECV_RDMA_IMM", "DCNT_EP_RECV_RDMA_IMM_DATA", }; static char *evd_cntr_names[] = { "DCNT_EVD_WAIT", "DCNT_EVD_WAIT_BLOCKED", "DCNT_EVD_WAIT_NOTIFY", "DCNT_EVD_DEQUEUE", "DCNT_EVD_DEQUEUE_FOUND", "DCNT_EVD_DEQUEUE_NOT_FOUND", "DCNT_EVD_DEQUEUE_POLL", "DCNT_EVD_DEQUEUE_POLL_FOUND", "DCNT_EVD_CONN_CALLBACK", "DCNT_EVD_DTO_CALLBACK", }; DAT_RETURN dapl_query_counter(DAT_HANDLE dh, int counter, void *p_cntrs_out, int reset) { int i, max; DAT_UINT64 *p_cntrs; DAT_HANDLE_TYPE type = 0; dat_get_handle_type(dh, &type); switch (type) { case DAT_HANDLE_TYPE_IA: max = DCNT_IA_ALL_COUNTERS; p_cntrs = ((DAPL_IA *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EP: max = DCNT_EP_ALL_COUNTERS; p_cntrs = ((DAPL_EP *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EVD: max = DCNT_EVD_ALL_COUNTERS; p_cntrs = ((DAPL_EVD *) dh)->cntrs; break; default: return DAT_INVALID_HANDLE; } for (i = 0; i < max; i++) { if ((counter == i) || (counter == max)) { ((DAT_UINT64 *) p_cntrs_out)[i] = p_cntrs[i]; if (reset) p_cntrs[i] = 0; } } return DAT_SUCCESS; } char *dapl_query_counter_name(DAT_HANDLE dh, int counter) { DAT_HANDLE_TYPE type = 0; dat_get_handle_type(dh, &type); switch (type) { case DAT_HANDLE_TYPE_IA: if (counter < DCNT_IA_ALL_COUNTERS) return ia_cntr_names[counter]; break; case DAT_HANDLE_TYPE_EP: if (counter < DCNT_EP_ALL_COUNTERS) return ep_cntr_names[counter]; break; case DAT_HANDLE_TYPE_EVD: if (counter < DCNT_EVD_ALL_COUNTERS) return evd_cntr_names[counter]; break; default: return NULL; } return NULL; } void dapl_print_counter(DAT_HANDLE dh, int counter, int reset) { int i, max; DAT_UINT64 *p_cntrs; DAT_HANDLE_TYPE type = 0; dat_get_handle_type(dh, &type); switch (type) { case DAT_HANDLE_TYPE_IA: max = DCNT_IA_ALL_COUNTERS; p_cntrs = ((DAPL_IA *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EP: max = DCNT_EP_ALL_COUNTERS; p_cntrs = ((DAPL_EP *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EVD: max = DCNT_EVD_ALL_COUNTERS; p_cntrs = ((DAPL_EVD *) dh)->cntrs; break; default: return; } for (i = 0; i < max; i++) { if ((counter == i) || (counter == max)) { printf(" %s:0x%x: %s = " F64u " \n", _hostname_, dapl_os_getpid(), dapl_query_counter_name(dh, i), p_cntrs[i]); if (reset) p_cntrs[i] = 0; } } /* Print in process CR's for this IA, if debug type set */ if ((type == DAT_HANDLE_TYPE_IA) && (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST)) { dapls_print_cm_list((DAPL_IA*)dh); } } void dapl_print_counter_str(DAT_HANDLE dh, int counter, int reset, const char *pattern) { int i, max; DAT_UINT64 *p_cntrs; DAT_HANDLE_TYPE type = 0; dat_get_handle_type(dh, &type); switch (type) { case DAT_HANDLE_TYPE_IA: max = DCNT_IA_ALL_COUNTERS; p_cntrs = ((DAPL_IA *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EP: max = DCNT_EP_ALL_COUNTERS; p_cntrs = ((DAPL_EP *) dh)->cntrs; break; case DAT_HANDLE_TYPE_EVD: max = DCNT_EVD_ALL_COUNTERS; p_cntrs = ((DAPL_EVD *) dh)->cntrs; break; default: return; } /* print only counters with pattern string match and non-zero values */ for (i = 0; i < max; i++) { if ((counter == i) || (counter == max)) { if (p_cntrs[i] && !dapl_os_pstrcmp(pattern, dapl_query_counter_name(dh, i))) { printf(" %s:0x%x: %s = " F64u " \n", _hostname_, dapl_os_getpid(), dapl_query_counter_name(dh, i), p_cntrs[i]); if (reset) p_cntrs[i] = 0; } } } } #endif /* DAPL_COUNTERS */ dapl-2.1.5/dapl/common/dapl_ep_connect.c000077500000000000000000000304741255317474200201550ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_connect.c * * PURPOSE: Endpoint management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_timer_util.h" /* * dapl_ep_connect * * Request a connection be established between the local Endpoint * and a remote Endpoint. This operation is used by the active/client * side of a connection * * Input: * ep_handle * remote_ia_address * remote_conn_qual * timeout * private_data_size * privaet_data * qos * connect_flags * * Output: * None * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOUCRES * DAT_INVALID_PARAMETER * DAT_MODLE_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR remote_ia_address, IN DAT_CONN_QUAL remote_conn_qual, IN DAT_TIMEOUT timeout, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data, IN DAT_QOS qos, IN DAT_CONNECT_FLAGS connect_flags) { DAPL_EP *ep_ptr; DAPL_EP alloc_ep; DAT_RETURN dat_status; DAT_COUNT req_hdr_size; void *private_data_ptr; if (remote_ia_address == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM, "dapl_ep_connect (%p, {%u.%u.%u.%u}, %X, %d, %d, %p, %x, %x)\n", ep_handle, remote_ia_address->sa_data[2], remote_ia_address->sa_data[3], remote_ia_address->sa_data[4], remote_ia_address->sa_data[5], remote_conn_qual, timeout, private_data_size, private_data, qos, connect_flags); dat_status = DAT_SUCCESS; ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state. The connection handle must be good * at this point. */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if (DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN); goto bail; } /* Can't do a connection in 0 time, reject outright */ if (timeout == 0) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } DAPL_CNTR(ep_ptr, DCNT_EP_CONNECT); /* * If the endpoint needs a QP, associated the QP with it. * This needs to be done carefully, in order to: * * Avoid allocating under a lock. * * Not step on data structures being altered by * routines with which we are racing. * So we: * * Confirm that a new QP is needed and is not forbidden by the * current state. * * Allocate it into a separate EP. * * Take the EP lock. * * Reconfirm that the EP is in a state where it needs a QP. * * Assign the QP and release the lock. */ if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) { if (ep_ptr->param.pz_handle == NULL || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY); goto bail; } alloc_ep = *ep_ptr; dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia, &alloc_ep, ep_ptr); if (dat_status != DAT_SUCCESS) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dapl_os_lock(&ep_ptr->header.lock); /* * PZ shouldn't have changed since we're only racing with * dapl_cr_accept() */ if (ep_ptr->qp_state != DAPL_QP_STATE_UNATTACHED) { /* Bail, cleaning up. */ dapl_os_unlock(&ep_ptr->header.lock); dat_status = dapls_ib_qp_free(ep_ptr->header.owner_ia, &alloc_ep); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ep_connect: ib_qp_free failed with %x\n", dat_status); } dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } ep_ptr->qp_handle = alloc_ep.qp_handle; ep_ptr->qpn = alloc_ep.qpn; ep_ptr->qp_state = alloc_ep.qp_state; dapl_os_unlock(&ep_ptr->header.lock); } /* * We do state checks and transitions under lock. * The only code we're racing against is dapl_cr_accept. */ dapl_os_lock(&ep_ptr->header.lock); /* * Verify the attributes of the EP handle before we connect it. Test * all of the handles to make sure they are currently valid. * Specifically: * pz_handle required * recv_evd_handle optional, but must be valid * request_evd_handle optional, but must be valid * connect_evd_handle required */ if (ep_ptr->param.pz_handle == NULL || DAPL_BAD_HANDLE(ep_ptr->param.pz_handle, DAPL_MAGIC_PZ) /* test connect handle */ || ep_ptr->param.connect_evd_handle == NULL || DAPL_BAD_HANDLE(ep_ptr->param.connect_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) ep_ptr->param.connect_evd_handle)-> evd_flags & DAT_EVD_CONNECTION_FLAG) /* test optional completion handles */ || (ep_ptr->param.recv_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE (ep_ptr->param.recv_evd_handle, DAPL_MAGIC_EVD))) || (ep_ptr->param.request_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE (ep_ptr->param.request_evd_handle, DAPL_MAGIC_EVD)))) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_NOTREADY); goto bail; } /* Check both the EP state and the QP state: if we don't have a QP * we need to attach one now. */ if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) { dat_status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr); if (dat_status != DAT_SUCCESS) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_TEP); goto bail; } } if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED && ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } if (qos != DAT_QOS_BEST_EFFORT || connect_flags != DAT_CONNECT_DEFAULT_FLAG) { /* * At this point we only support one QOS level */ dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_MODEL_NOT_SUPPORTED, 0); goto bail; } /* * Verify the private data size doesn't exceed the max * req_hdr_size will evaluate to 0 unless IBHOSTS_NAMING is enabled. */ req_hdr_size = (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE); /* transition the state before requesting a connection to avoid * race conditions */ ep_ptr->param.ep_state = DAT_EP_STATE_ACTIVE_CONNECTION_PENDING; /* * At this point we're committed, and done with the endpoint * except for the connect, so we can drop the lock. */ dapl_os_unlock(&ep_ptr->header.lock); #ifdef IBHOSTS_NAMING /* * Special case: put the remote HCA address into the private data * prefix. This is a spec violation as it introduces a protocol, but * some implementations may find it necessary for a time. * Copy the private data into the EP area so the data is contiguous. * If the provider needs to pad the buffer with NULLs, it happens at * the provider layer. */ dapl_os_memcpy(&ep_ptr->hca_address, &ep_ptr->header.owner_ia->hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR)); dapl_os_memcpy(ep_ptr->private.private_data, private_data, private_data_size); private_data_ptr = (void *)&ep_ptr->private.private_data; #else private_data_ptr = private_data; #endif /* IBHOSTS_NAMING */ /* Copy the connection qualifiers */ dapl_os_memcpy(ep_ptr->param.remote_ia_address_ptr, remote_ia_address, sizeof(DAT_SOCK_ADDR)); ep_ptr->param.remote_port_qual = remote_conn_qual; dat_status = dapls_ib_connect(ep_handle, remote_ia_address, remote_conn_qual, private_data_size + req_hdr_size, private_data_ptr); if (dat_status != DAT_SUCCESS) { ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; /* * Some implementations provide us with an error code that the * remote destination is unreachable, but DAT doesn't have a * synchronous error code to communicate this. So the provider * layer generates an INTERNAL_ERROR with a subtype; when * this happens, return SUCCESS and generate the event */ if (dat_status == DAT_ERROR(DAT_INTERNAL_ERROR, 1)) { dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr-> param. connect_evd_handle, DAT_CONNECTION_EVENT_UNREACHABLE, (DAT_HANDLE) ep_ptr, 0, 0); dat_status = DAT_SUCCESS; } } else { /* * Acquire the lock and recheck the state of the EP; this * thread could have been descheduled after issuing the connect * request and the EP is now connected. Set up a timer if * necessary. */ dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_ACTIVE_CONNECTION_PENDING && timeout != DAT_TIMEOUT_INFINITE && ep_ptr->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) { ep_ptr->cxn_timer = (DAPL_OS_TIMER *) dapl_os_alloc(sizeof(DAPL_OS_TIMER)); dapls_timer_set(ep_ptr->cxn_timer, dapls_ep_timeout, ep_ptr, timeout); dapl_log(DAPL_DBG_TYPE_EP, " dapl_ep_connect timeout = %d us\n", timeout); } dapl_os_unlock(&ep_ptr->header.lock); } bail: dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM, "dapl_ep_connect () returns 0x%x\n", dat_status); return dat_status; } /* * dapl_ep_common_connect * * DAPL Requirements Version 2.0, 6.6.x * * Requests that a connection be established * between the local Endpoint and a remote Endpoint specified by the * remote_ia_address. This operation is used by the active/client side * Consumer of the Connection establishment model. * * EP must be properly configured for this operation. The EP Communicator * must be specified. As part of the successful completion of this operation, * the local Endpoint is bound to a local IA Address if it had these assigned * before. * * The local IP Address, port and protocol are passed to the remote side of * the requested connection and is available to the remote Consumer in the * Connection Request of the DAT_CONNECTION_REQUEST_EVENT. * * The Consumer-provided private_data is passed to the remote side and is * provided to the remote Consumer in the Connection Request. Consumers * can encapsulate any local Endpoint attributes that remote Consumers * need to know as part of an upper-level protocol. * * Input: * ep_handle * remote_ia_address * timeout * private_data_size * private_date pointer * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_common_connect(IN DAT_EP_HANDLE ep, /* ep_handle */ IN DAT_IA_ADDRESS_PTR remote_addr, /* remote_ia_address */ IN DAT_TIMEOUT timeout, /* timeout */ IN DAT_COUNT pdata_size, /* private_data_size */ IN const DAT_PVOID pdata) { /* private_data */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_create.c000066400000000000000000000236151255317474200177630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_create.c * * PURPOSE: Endpoint management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" /* * dapl_ep_create * * Create an instance of an Endpoint that is provided to the * consumer at ep_handle. * * Input: * ia_handle * pz_handle * recv_evd_handle (recv DTOs) * request_evd_handle (xmit DTOs) * connect_evd_handle * ep_attrs * * Output: * ep_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_ATTRIBUTE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_create(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_EVD_HANDLE recv_evd_handle, IN DAT_EVD_HANDLE request_evd_handle, IN DAT_EVD_HANDLE connect_evd_handle, IN const DAT_EP_ATTR * ep_attr, OUT DAT_EP_HANDLE * ep_handle) { DAPL_IA *ia_ptr; DAPL_EP *ep_ptr; DAT_EP_ATTR ep_attr_limit; DAPL_EVD *evd_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_create (%p, %p, %p, %p, %p, %p, %p)\n", ia_handle, pz_handle, recv_evd_handle, request_evd_handle, connect_evd_handle, ep_attr, ep_handle); ia_ptr = (DAPL_IA *) ia_handle; dat_status = DAT_SUCCESS; /* * Verify parameters */ if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_EP_CREATE); /* * Verify non-required parameters. * N.B. Assumption: any parameter that can be * modified by dat_ep_modify() is not strictly * required when the EP is created */ if (pz_handle != DAT_HANDLE_NULL && DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } /* If connect handle is !NULL verify handle is good */ if (connect_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(connect_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) connect_evd_handle)-> evd_flags & DAT_EVD_CONNECTION_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN); goto bail; } /* If recv_evd is !NULL, verify handle is good and flags are valid */ if (recv_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(recv_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) recv_evd_handle)->evd_flags & DAT_EVD_DTO_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_RECV); goto bail; } /* If req_evd is !NULL, verify handle is good and flags are valid */ if (request_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(request_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) request_evd_handle)-> evd_flags & DAT_EVD_DTO_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); goto bail; } if (ep_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG7); goto bail; } if (DAPL_BAD_PTR(ep_attr)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG6); goto bail; } /* * Qualify EP Attributes are legal and make sense. Note that if one * or both of the DTO handles are NULL, then the corresponding * max_*_dtos must 0 as the user will not be able to post dto ops on * the respective queue. */ if (ep_attr != NULL && ( #ifndef DAT_EXTENSIONS ep_attr->service_type != DAT_SERVICE_TYPE_RC || #endif (recv_evd_handle == DAT_HANDLE_NULL && ep_attr->max_recv_dtos != 0) || (recv_evd_handle != DAT_HANDLE_NULL && ep_attr->max_recv_dtos == 0) || (request_evd_handle == DAT_HANDLE_NULL && ep_attr->max_request_dtos != 0) || (request_evd_handle != DAT_HANDLE_NULL && ep_attr->max_request_dtos == 0) || (recv_evd_handle != DAT_HANDLE_NULL && ep_attr->max_recv_iov == 0) || (request_evd_handle == DAT_HANDLE_NULL && ep_attr->max_request_iov != 0) || (DAT_SUCCESS != dapl_ep_check_recv_completion_flags (ep_attr->recv_completion_flags)))) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG6); dapl_log(DAPL_DBG_TYPE_ERR, "dapl_ep_create: failed EP attributes\n"); goto bail; } /* Verify the attributes against the transport */ if (ep_attr != NULL) { dapl_os_memzero(&ep_attr_limit, sizeof(DAT_EP_ATTR)); dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, NULL, &ep_attr_limit, NULL); if (dat_status != DAT_SUCCESS) { goto bail; } if (ep_attr->max_mtu_size > ep_attr_limit.max_mtu_size || ep_attr->max_rdma_size > ep_attr_limit.max_rdma_size || ep_attr->max_recv_dtos > ep_attr_limit.max_recv_dtos || ep_attr->max_request_dtos > ep_attr_limit.max_request_dtos || ep_attr->max_recv_iov > ep_attr_limit.max_recv_iov || ep_attr->max_request_iov > ep_attr_limit.max_request_iov || ep_attr->max_rdma_read_in > ep_attr_limit.max_rdma_read_in || ep_attr->max_rdma_read_out > ep_attr_limit.max_rdma_read_out) { dat_status = DAT_INVALID_PARAMETER | DAT_INVALID_ARG6; dapl_log(DAPL_DBG_TYPE_ERR, "dapl_ep_create: failed Transport attributes\n"); goto bail; } } /* * Verify the completion flags for the EVD and the EP */ /* * XXX FIXME * XXX Need to make assign the EVD to the right completion type * XXX depending on the EP attributes. Fail if the types don't * XXX match, they are mutually exclusive. */ evd_ptr = (DAPL_EVD *) recv_evd_handle; if (evd_ptr != NULL && evd_ptr->completion_type == DAPL_EVD_STATE_INIT) { if (ep_attr != NULL && ep_attr->recv_completion_flags == DAT_COMPLETION_DEFAULT_FLAG) { evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD; } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } evd_ptr = (DAPL_EVD *) request_evd_handle; if (evd_ptr != NULL && evd_ptr->completion_type == DAPL_EVD_STATE_INIT) { if (ep_attr != NULL && ep_attr->recv_completion_flags == DAT_COMPLETION_DEFAULT_FLAG) { evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD; } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } /* Allocate EP */ ep_ptr = dapl_ep_alloc(ia_ptr, ep_attr, DAT_FALSE); if (ep_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* * Fill in the EP */ ep_ptr->param.ia_handle = ia_handle; ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; ep_ptr->param.local_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address; /* Set the remote address pointer to the end of the EP struct */ ep_ptr->param.remote_ia_address_ptr = (DAT_IA_ADDRESS_PTR) (ep_ptr + 1); ep_ptr->param.pz_handle = pz_handle; ep_ptr->param.recv_evd_handle = recv_evd_handle; ep_ptr->param.request_evd_handle = request_evd_handle; ep_ptr->param.connect_evd_handle = connect_evd_handle; /* * Make sure we handle the NULL DTO EVDs */ if (recv_evd_handle == DAT_HANDLE_NULL && ep_attr == NULL) { ep_ptr->param.ep_attr.max_recv_dtos = 0; } if (request_evd_handle == DAT_HANDLE_NULL && ep_attr == NULL) { ep_ptr->param.ep_attr.max_request_dtos = 0; } /* * If the user has specified a PZ handle we allocate a QP for * this EP; else we defer until it is assigned via ep_modify(). * As much as possible we try to keep QP creation out of the * connect path to avoid resource errors in strange places. */ if (pz_handle != DAT_HANDLE_NULL) { /* Take a reference on the PZ handle */ dapl_os_atomic_inc(&((DAPL_PZ *) pz_handle)->pz_ref_count); /* * Get a QP from the IB provider */ dat_status = dapls_ib_qp_alloc(ia_ptr, ep_ptr, ep_ptr); if (dat_status != DAT_SUCCESS) { dapl_os_atomic_dec(&((DAPL_PZ *) pz_handle)-> pz_ref_count); dapl_ep_dealloc(ep_ptr); goto bail; } } else { ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED; } /* * Update ref counts. See the spec where the endpoint marks * a data object as 'in use' * pz_handle: dat_pz_free, uDAPL Document, 6.6.1.2 * evd_handles: * * N.B. This should really be done by a util routine. */ if (connect_evd_handle != DAT_HANDLE_NULL) { dapl_os_atomic_inc(&((DAPL_EVD *) connect_evd_handle)-> evd_ref_count); } /* Optional handles */ if (recv_evd_handle != DAT_HANDLE_NULL) { dapl_os_atomic_inc(&((DAPL_EVD *) recv_evd_handle)-> evd_ref_count); } if (request_evd_handle != DAT_HANDLE_NULL) { dapl_os_atomic_inc(&((DAPL_EVD *) request_evd_handle)-> evd_ref_count); } /* Link it onto the IA */ dapl_ia_link_ep(ia_ptr, ep_ptr); *ep_handle = ep_ptr; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_create_with_srq.c000066400000000000000000000252171255317474200217030ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_create_with_srq.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the kDAPL 1.2 API, Chapter 6, section 6.5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" /* * dapl_ep_create_with_srq * * uDAPL Version 1.2, 6.6.5 * * Create an instance of an Endpoint that is provided to the * consumer at ep_handle. * * Input: * ia_handle * pz_handle * recv_evd_handle (recv DTOs) * request_evd_handle (xmit DTOs) * connect_evd_handle * srq_handle * ep_attrs * * Output: * ep_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_INVALID_ATTRIBUTE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_create_with_srq(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_EVD_HANDLE recv_evd_handle, IN DAT_EVD_HANDLE request_evd_handle, IN DAT_EVD_HANDLE connect_evd_handle, IN DAT_SRQ_HANDLE srq_handle, IN const DAT_EP_ATTR * ep_attr, OUT DAT_EP_HANDLE * ep_handle) { DAPL_IA *ia_ptr; DAPL_EP *ep_ptr; DAT_EP_ATTR ep_attr_limit; DAPL_EVD *evd_ptr; DAT_RETURN dat_status; *ep_handle = NULL; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_create_with_srq (%p, %p, %p, %p, %p, %p, %p %p)\n", ia_handle, pz_handle, recv_evd_handle, request_evd_handle, connect_evd_handle, srq_handle, ep_attr, ep_handle); ia_ptr = (DAPL_IA *) ia_handle; /* * Verify parameters */ if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } /* * Verify non-required parameters. * N.B. Assumption: any parameter that can be * modified by dat_ep_modify() is not strictly * required when the EP is created */ if (pz_handle != NULL && DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } /* If connect handle is !NULL verify handle is good */ if (connect_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(connect_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) connect_evd_handle)-> evd_flags & DAT_EVD_CONNECTION_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CONN); goto bail; } /* If recv_evd is !NULL, verify handle is good and flags are valid */ if (recv_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(recv_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) recv_evd_handle)->evd_flags & DAT_EVD_DTO_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_RECV); goto bail; } /* If req_evd is !NULL, verify handle is good and flags are valid */ if (request_evd_handle != DAT_HANDLE_NULL && (DAPL_BAD_HANDLE(request_evd_handle, DAPL_MAGIC_EVD) || !(((DAPL_EVD *) request_evd_handle)-> evd_flags & DAT_EVD_DTO_FLAG))) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); goto bail; } if (ep_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG7); goto bail; } if (DAPL_BAD_PTR(ep_attr)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG6); goto bail; } /* * Verify the SRQ handle. It is an error to invoke this call with * a NULL handle */ dapl_os_lock(&ia_ptr->header.lock); if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); dapl_os_unlock(&ia_ptr->header.lock); goto bail; } if (((DAPL_SRQ *) srq_handle)->param.srq_state == DAT_SRQ_STATE_SHUTDOWN) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_SRQ_SHUTDOWN); dapl_os_unlock(&ia_ptr->header.lock); goto bail; } dapl_os_atomic_inc(&((DAPL_SRQ *) srq_handle)->srq_ref_count); dapl_os_unlock(&ia_ptr->header.lock); /* * Qualify EP Attributes are legal and make sense. Note that if one * or both of the DTO handles are NULL, then the corresponding * max_*_dtos must 0 as the user will not be able to post dto ops on * the respective queue. */ if (ep_attr != NULL && ((recv_evd_handle == DAT_HANDLE_NULL && ep_attr->max_recv_dtos != 0) || (recv_evd_handle != DAT_HANDLE_NULL && ep_attr->max_recv_dtos == 0) || (request_evd_handle == DAT_HANDLE_NULL && ep_attr->max_request_dtos != 0) || (request_evd_handle != DAT_HANDLE_NULL && ep_attr->max_request_dtos == 0) || ep_attr->max_recv_iov == 0 || ep_attr->max_request_iov == 0 || (DAT_SUCCESS != dapl_ep_check_recv_completion_flags(ep_attr-> recv_completion_flags)))) { dat_status = DAT_INVALID_PARAMETER | DAT_INVALID_ARG6; dapl_os_atomic_dec(&((DAPL_SRQ *) srq_handle)->srq_ref_count); goto bail; } /* Verify the attributes against the transport */ if (ep_attr != NULL) { dapl_os_memzero(&ep_attr_limit, sizeof(DAT_EP_ATTR)); dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, NULL, &ep_attr_limit, NULL); if (dat_status != DAT_SUCCESS) { dapl_os_atomic_dec(&((DAPL_SRQ *) srq_handle)->srq_ref_count); goto bail; } if (ep_attr->max_mtu_size > ep_attr_limit.max_mtu_size || ep_attr->max_rdma_size > ep_attr_limit.max_rdma_size || ep_attr->max_recv_dtos > ep_attr_limit.max_recv_dtos || ep_attr->max_request_dtos > ep_attr_limit.max_request_dtos || ep_attr->max_recv_iov > ep_attr_limit.max_recv_iov || ep_attr->max_request_iov > ep_attr_limit.max_request_iov || ep_attr->max_rdma_read_in > ep_attr_limit.max_rdma_read_in || ep_attr->max_rdma_read_out > ep_attr_limit.max_rdma_read_out) { dat_status = DAT_INVALID_PARAMETER | DAT_INVALID_ARG6; dapl_os_atomic_dec(&((DAPL_SRQ *) srq_handle)-> srq_ref_count); goto bail; } } /* * Verify the completion flags for the EVD and the EP */ /* * XXX FIXME * XXX Need to make assign the EVD to the right completion type * XXX depending on the EP attributes. Fail if the types don't * XXX match, they are mutually exclusive. */ evd_ptr = (DAPL_EVD *) recv_evd_handle; if (evd_ptr != NULL && evd_ptr->completion_type == DAPL_EVD_STATE_INIT) { if (ep_attr != NULL && ep_attr->recv_completion_flags == DAT_COMPLETION_DEFAULT_FLAG) { evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD; } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } evd_ptr = (DAPL_EVD *) request_evd_handle; if (evd_ptr != NULL && evd_ptr->completion_type == DAPL_EVD_STATE_INIT) { if (ep_attr != NULL && ep_attr->recv_completion_flags == DAT_COMPLETION_DEFAULT_FLAG) { evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD; } else { evd_ptr->completion_type = ep_attr->recv_completion_flags; } } /* Allocate EP */ ep_ptr = dapl_ep_alloc(ia_ptr, ep_attr, DAT_TRUE); if (ep_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); dapl_os_atomic_dec(&((DAPL_SRQ *) srq_handle)->srq_ref_count); goto bail; } /* * Fill in the EP */ ep_ptr->param.ia_handle = ia_handle; ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; ep_ptr->param.local_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address; /* Set the remote address pointer to the end of the EP struct */ ep_ptr->param.remote_ia_address_ptr = (DAT_IA_ADDRESS_PTR) (ep_ptr + 1); ep_ptr->param.pz_handle = pz_handle; ep_ptr->param.recv_evd_handle = recv_evd_handle; ep_ptr->param.request_evd_handle = request_evd_handle; ep_ptr->param.connect_evd_handle = connect_evd_handle; ep_ptr->param.srq_handle = srq_handle; /* * Make sure we handle the NULL DTO EVDs */ if (recv_evd_handle == DAT_HANDLE_NULL && ep_attr == NULL) { ep_ptr->param.ep_attr.max_recv_dtos = 0; } if (request_evd_handle == DAT_HANDLE_NULL && ep_attr == NULL) { ep_ptr->param.ep_attr.max_request_dtos = 0; } /* * If the user has specified a PZ handle we allocate a QP for * this EP; else we defer until it is assigned via ep_modify(). * As much as possible we try to keep QP creation out of the * connect path to avoid resource errors in strange places. */ if (pz_handle != DAT_HANDLE_NULL) { /* Take a reference on the PZ handle */ dapl_os_atomic_inc(&((DAPL_PZ *) pz_handle)->pz_ref_count); /* * Get a QP from the IB provider */ dat_status = dapls_ib_qp_alloc(ia_ptr, ep_ptr, ep_ptr); if (dat_status != DAT_SUCCESS) { dapl_os_atomic_dec(&((DAPL_PZ *) pz_handle)-> pz_ref_count); dapl_os_atomic_dec(&((DAPL_SRQ *) srq_handle)-> srq_ref_count); dapl_ep_dealloc(ep_ptr); goto bail; } } else { ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED; } /* * Update ref counts. See the spec where the endpoint marks * a data object as 'in use' * pz_handle: dat_pz_free, uDAPL Document, 6.6.1.2 * evd_handles: * * N.B. This should really be done by a util routine. */ dapl_os_atomic_inc(&((DAPL_EVD *) connect_evd_handle)->evd_ref_count); /* Optional handles */ if (recv_evd_handle != DAT_HANDLE_NULL) { dapl_os_atomic_inc(&((DAPL_EVD *) recv_evd_handle)-> evd_ref_count); } if (request_evd_handle != DAT_HANDLE_NULL) { dapl_os_atomic_inc(&((DAPL_EVD *) request_evd_handle)-> evd_ref_count); } /* Link it onto the IA */ dapl_ia_link_ep(ia_ptr, ep_ptr); *ep_handle = ep_ptr; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_disconnect.c000066400000000000000000000124421255317474200206450ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_disconnect.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_sp_util.h" #include "dapl_evd_util.h" #include "dapl_adapter_util.h" /* * dapl_ep_disconnect * * DAPL Requirements Version xxx, 6.5.9 * * Terminate a connection. * * Input: * ep_handle * disconnect_flags * * Output: * None * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_ep_disconnect(IN DAT_EP_HANDLE ep_handle, IN DAT_CLOSE_FLAGS disconnect_flags) { DAPL_EP *ep_ptr; DAPL_EVD *evd_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM, "dapl_ep_disconnect (%p, %x)\n", ep_handle, disconnect_flags); ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } DAPL_CNTR(ep_ptr, DCNT_EP_DISCONNECT); /* * Do the verification of parameters and the state change * atomically. */ dapl_os_lock(&ep_ptr->header.lock); /* Disconnecting a disconnected EP is a no-op. */ if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED || ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_SUCCESS; goto bail; } /* Check the EP state to ensure we are queiscent. Note that * we may get called in UNCONNECTED state in order to remove * RECV requests from the queue prior to destroying an EP. * See the states in the spec at 6.5.1 Endpont Lifecycle */ if (ep_ptr->param.ep_state != DAT_EP_STATE_CONNECTED && ep_ptr->param.ep_state != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING && ep_ptr->param.ep_state != DAT_EP_STATE_COMPLETION_PENDING && ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECT_PENDING) { dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECT_PENDING && disconnect_flags != DAT_CLOSE_ABRUPT_FLAG) { /* * If in state DISCONNECT_PENDING then this must be an * ABRUPT disconnect */ dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } if (ep_ptr->param.ep_state == DAT_EP_STATE_ACTIVE_CONNECTION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_COMPLETION_PENDING) { /* * Beginning or waiting on a connection: abort and reset the * state */ ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapl_os_unlock(&ep_ptr->header.lock); /* disconnect and make sure we get no callbacks */ (void)dapls_ib_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); /* clean up connection state */ dapl_sp_remove_ep(ep_ptr); evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle; dapls_evd_post_connection_event(evd_ptr, DAT_CONNECTION_EVENT_DISCONNECTED, (DAT_HANDLE) ep_ptr, 0, 0); dat_status = DAT_SUCCESS; goto bail; } /* * Transition the EP state to DISCONNECT_PENDING if we are * CONNECTED. Otherwise we do not get a disconnect event and will be * stuck in DISCONNECT_PENDING. * * If the user specifies a graceful disconnect, the underlying * provider should complete all DTOs before disconnecting; in IB * terms, this means setting the QP state to SQD before completing * the disconnect state transitions. */ if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED) { ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECT_PENDING; } dapl_os_unlock(&ep_ptr->header.lock); dat_status = dapls_ib_disconnect(ep_ptr, disconnect_flags); dapls_ep_flush_cqs(ep_ptr); bail: dapl_dbg_log(DAPL_DBG_TYPE_RTN | DAPL_DBG_TYPE_CM, "dapl_ep_disconnect (EP %p) returns 0x%x\n", ep_ptr, dat_status); return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_dup_connect.c000066400000000000000000000071611255317474200210170ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_dup_connect.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" #include "dapl_timer_util.h" /* * dapl_ep_dup_connect * * DAPL Requirements Version xxx, 6.5.8 * * Requst that a connection be established between the local Endpoint * and a remote Endpoint. The remote Endpoint is identified by the * dup_ep. * * Input: * ep_handle * ep_dup_handle * conn_qual * timeout * private_data_size * private_data * qos * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_dup_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_HANDLE ep_dup_handle, IN DAT_TIMEOUT timeout, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data, IN DAT_QOS qos) { DAPL_EP *ep_dup_ptr; DAT_RETURN dat_status; DAT_IA_ADDRESS_PTR remote_ia_address_ptr; DAT_CONN_QUAL remote_conn_qual; ep_dup_ptr = (DAPL_EP *) ep_dup_handle; /* * Verify the dup handle, which must be connected. All other * parameters will be verified by dapl_ep_connect */ if (DAPL_BAD_HANDLE(ep_dup_handle, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } /* Can't do a connection in 0 time, reject outright */ if (timeout == 0) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } /* Check both the EP state and the QP state: if we don't have a QP * there is a problem. Do this under a lock and pull out * the connection parameters for atomicity. */ dapl_os_lock(&ep_dup_ptr->header.lock); if (ep_dup_ptr->param.ep_state != DAT_EP_STATE_CONNECTED) { dapl_os_unlock(&ep_dup_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_dup_ptr)); goto bail; } remote_ia_address_ptr = ep_dup_ptr->param.remote_ia_address_ptr; remote_conn_qual = ep_dup_ptr->param.remote_port_qual; dapl_os_unlock(&ep_dup_ptr->header.lock); dat_status = dapl_ep_connect(ep_handle, remote_ia_address_ptr, remote_conn_qual, timeout, private_data_size, private_data, qos, DAT_CONNECT_DEFAULT_FLAG); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_ep_free.c000066400000000000000000000146711255317474200174430ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_free.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5.4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" #include "dapl_ring_buffer_util.h" #include "dapl_timer_util.h" /* * dapl_ep_free * * DAPL Requirements Version xxx, 6.5.3 * * Destroy an instance of the Endpoint * * Input: * ep_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_ep_free(IN DAT_EP_HANDLE ep_handle) { DAPL_EP *ep_ptr; DAPL_IA *ia_ptr; DAT_EP_PARAM *param; dp_ib_cm_handle_t cm_ptr; ib_qp_state_t save_qp_state; DAT_RETURN dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM, "dapl_ep_free (%p)\n", ep_handle); ep_ptr = (DAPL_EP *) ep_handle; param = &ep_ptr->param; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } DAPL_CNTR(ep_ptr->header.owner_ia, DCNT_IA_EP_FREE); if (ep_ptr->param.ep_state == DAT_EP_STATE_RESERVED || ep_ptr->param.ep_state == DAT_EP_STATE_PASSIVE_CONNECTION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "--> dapl_ep_free: invalid state: %x, ep %p\n", ep_ptr->param.ep_state, ep_ptr); dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } ia_ptr = ep_ptr->header.owner_ia; /* If we are connected, issue a disconnect. If we are in the * disconnect_pending state, disconnect with the ABRUPT flag * set. */ /* * Invoke ep_disconnect to clean up outstanding connections */ (void)dapl_ep_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); /* * Do verification of parameters and the state change atomically. */ dapl_os_lock(&ep_ptr->header.lock); /* Free all CM objects */ cm_ptr = (dapl_llist_is_empty(&ep_ptr->cm_list_head) ? NULL : dapl_llist_peek_head(&ep_ptr->cm_list_head)); while (cm_ptr != NULL) { dapl_log(DAPL_DBG_TYPE_EP, "dapl_ep_free: Free CM: EP=%p CM=%p\n", ep_ptr, cm_ptr); dapl_os_unlock(&ep_ptr->header.lock); dapls_cm_free(cm_ptr); /* blocking call */ dapl_os_lock(&ep_ptr->header.lock); cm_ptr = (dapl_llist_is_empty(&ep_ptr->cm_list_head) ? NULL : dapl_llist_peek_head(&ep_ptr->cm_list_head)); } #ifdef DAPL_DBG /* check if event pending and warn, don't assert, state is valid */ if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECT_PENDING) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " dat_ep_free WARNING: " "EVENT PENDING on ep %p, disconnect " "and wait before calling dat_ep_free\n", ep_ptr); } #endif if (ep_ptr->cxn_timer != NULL) { dapls_timer_cancel(ep_ptr->cxn_timer); dapl_os_free(ep_ptr->cxn_timer, sizeof(DAPL_OS_TIMER)); ep_ptr->cxn_timer = NULL; } /* Remove the EP from the IA */ dapl_ia_unlink_ep(ia_ptr, ep_ptr); /* * Update ref counts. Note the user may have used ep_modify * to set handles to NULL. Set handles to NULL so this routine * is idempotent. */ if (param->pz_handle != NULL) { dapl_os_atomic_dec(&((DAPL_PZ *) param->pz_handle)-> pz_ref_count); param->pz_handle = NULL; } if (param->connect_evd_handle != NULL) { dapl_os_atomic_dec(&((DAPL_EVD *) param->connect_evd_handle)-> evd_ref_count); param->connect_evd_handle = NULL; } if (param->srq_handle != NULL) { dapl_os_atomic_dec(&((DAPL_SRQ *) param->srq_handle)-> srq_ref_count); param->srq_handle = NULL; } /* * Finish tearing everything down. */ dapl_dbg_log(DAPL_DBG_TYPE_EP | DAPL_DBG_TYPE_CM, "dapl_ep_free: Free EP: %x, ep %p qp_state %x qp_handle %x\n", ep_ptr->param.ep_state, ep_ptr, ep_ptr->qp_state, ep_ptr->qp_handle); /* * Take care of the transport resource. Make a copy of the qp_state * to prevent race conditions when we exit the lock. */ save_qp_state = ep_ptr->qp_state; ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED; dapl_os_unlock(&ep_ptr->header.lock); /* Free the QP. If the EP has never been used, the QP is invalid */ if (save_qp_state != DAPL_QP_STATE_UNATTACHED) { dat_status = dapls_ib_qp_free(ia_ptr, ep_ptr); /* This should always succeed, but report to the user if * there is a problem. The qp_state must be restored so * they can try it again in the face of EINTR or similar * where the QP is OK but the call couldn't complete. */ if (dat_status != DAT_SUCCESS) { ep_ptr->qp_state = save_qp_state; goto bail; } } /* * Release the EVD handles after we destroy the QP, so we can flush all * QP entries. */ if (param->recv_evd_handle != NULL) { dapl_os_atomic_dec(&((DAPL_EVD *) param->recv_evd_handle)-> evd_ref_count); param->recv_evd_handle = NULL; } if (param->request_evd_handle != NULL) { dapl_os_atomic_dec(&((DAPL_EVD *) param->request_evd_handle)-> evd_ref_count); param->request_evd_handle = NULL; } /* Free the resource */ dapl_ep_dealloc(ep_ptr); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_get_status.c000066400000000000000000000054541255317474200207030ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_get_status.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ring_buffer_util.h" #include "dapl_cookie.h" /* * dapl_ep_get_status * * DAPL Requirements Version xxx, 6.5.4 * * Provide the consumer with a quick snapshot of the Endpoint. * The snapshot consists of Endpoint state and DTO information. * * Input: * ep_handle * * Output: * ep_state * in_dto_idle * out_dto_idle * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_ep_get_status(IN DAT_EP_HANDLE ep_handle, OUT DAT_EP_STATE * ep_state, OUT DAT_BOOLEAN * in_dto_idle, OUT DAT_BOOLEAN * out_dto_idle) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_get_status (%p, %p, %p, %p)\n", ep_handle, ep_state, in_dto_idle, out_dto_idle); ep_ptr = (DAPL_EP *) ep_handle; dat_status = DAT_SUCCESS; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } /* * Gather state info for user */ if (ep_state != NULL) { *ep_state = ep_ptr->param.ep_state; } if (in_dto_idle != NULL) { *in_dto_idle = dapls_cb_pending(&ep_ptr->recv_buffer); } if (out_dto_idle != NULL) { *out_dto_idle = dapls_cb_pending(&ep_ptr->req_buffer); } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_modify.c000066400000000000000000000445051255317474200200100ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_modify.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.0 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cookie.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" /* * Internal prototypes */ static _INLINE_ DAT_RETURN dapli_ep_modify_validate_parameters(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, IN const DAT_EP_PARAM * ep_param, OUT DAPL_IA ** ia_ptr, OUT DAPL_EP ** ep_ptr, OUT DAT_EP_ATTR * ep_attr_ptr); /* * dapl_ep_modify * * DAPL Requirements Version xxx, 6.5.6 * * Provide the consumer parameters, including attributes and status of * the Endpoint. * * Input: * ep_handle * ep_args_mask * * Output: * ep_args * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_ATTRIBUTE * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_ep_modify(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, IN const DAT_EP_PARAM * ep_param) { DAPL_IA *ia; DAPL_EP *ep1, *ep2; DAT_EP_ATTR ep_attr1 = { 0 }, ep_attr2 = { 0}; DAPL_EP new_ep, copy_of_old_ep; DAPL_EP alloc_ep; /* Holder for resources. */ DAPL_PZ *tmp_pz; DAPL_EVD *tmp_evd; DAT_RETURN dat_status; /* Flag indicating we've allocated a new one of these. */ DAT_BOOLEAN qp_allocated = DAT_FALSE; DAT_BOOLEAN rqst_cb_allocated = DAT_FALSE; DAT_BOOLEAN recv_cb_allocated = DAT_FALSE; /* Flag indicating we've used (assigned to QP) a new one of these. */ DAT_BOOLEAN qp_used = DAT_FALSE; DAT_BOOLEAN rqst_cb_used = DAT_FALSE; DAT_BOOLEAN recv_cb_used = DAT_FALSE; dat_status = dapli_ep_modify_validate_parameters(ep_handle, ep_param_mask, ep_param, &ia, &ep1, &ep_attr1); if (DAT_SUCCESS != dat_status) { goto bail; } /* * Setup the alloc_ep with the appropriate parameters (primarily * for allocating the QP. */ alloc_ep = *ep1; alloc_ep.param.ep_attr = ep_attr1; if (ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) { alloc_ep.param.pz_handle = ep_param->pz_handle; } if (ep_param_mask & DAT_EP_FIELD_RECV_EVD_HANDLE) { alloc_ep.param.recv_evd_handle = ep_param->recv_evd_handle; } if (ep_param_mask & DAT_EP_FIELD_REQUEST_EVD_HANDLE) { alloc_ep.param.request_evd_handle = ep_param->request_evd_handle; } if (ep_param_mask & DAT_EP_FIELD_CONNECT_EVD_HANDLE) { alloc_ep.param.connect_evd_handle = ep_param->connect_evd_handle; } /* * Allocate everything that might be needed. * We allocate separately, and into a different "holding" * ep, since we a) want the copy of the old ep into the new ep to * be atomic with the assignment back (under lock), b) want the * assignment of the allocated materials to be after the copy of the * old ep into the new ep, and c) don't want the allocation done * under lock. */ dat_status = dapls_cb_create(&alloc_ep.req_buffer, ep1, /* For pointer in buffer bool. */ ep_attr1.max_request_dtos); if (DAT_SUCCESS != dat_status) { goto bail; } rqst_cb_allocated = DAT_TRUE; dat_status = dapls_cb_create(&alloc_ep.recv_buffer, ep1, /* For pointer in buffer bool. */ ep_attr1.max_recv_dtos); if (DAT_SUCCESS != dat_status) { goto bail; } recv_cb_allocated = DAT_TRUE; dat_status = dapls_ib_qp_alloc(ia, &alloc_ep, ep1); if (dat_status != DAT_SUCCESS) { goto bail; } qp_allocated = DAT_TRUE; /* * Now we atomically modify the EP, under lock * There's a lot of work done here, but there should be no * allocation or blocking. */ dapl_os_lock(&ep1->header.lock); /* * Revalidate parameters; make sure that races haven't * changed anything important. */ dat_status = dapli_ep_modify_validate_parameters(ep_handle, ep_param_mask, ep_param, &ia, &ep2, &ep_attr2); if (DAT_SUCCESS != dat_status) { dapl_os_unlock(&ep2->header.lock); goto bail; } /* * All of the following should be impossible, if validation * occurred. But they're important to the logic of this routine, * so we check. */ dapl_os_assert(ep1 == ep2); dapl_os_assert(ep_attr2.max_recv_dtos == ep_attr1.max_recv_dtos); dapl_os_assert(ep_attr2.max_request_dtos == ep_attr1.max_request_dtos); dapl_os_assert(ep_attr2.max_recv_iov == ep_attr1.max_recv_iov); dapl_os_assert(ep_attr2.max_request_iov == ep_attr1.max_request_iov); copy_of_old_ep = *ep2; /* * Setup new ep. */ new_ep = *ep2; new_ep.param.ep_attr = ep_attr2; /* * We can initialize the PZ and EVD handles from the alloc_ep because * the only thing that could have changed since we setup the alloc_ep * is stuff changed by dapl_cr_accept, and neither PZ nor EVD is in that * list. */ new_ep.param.pz_handle = alloc_ep.param.pz_handle; new_ep.param.recv_evd_handle = alloc_ep.param.recv_evd_handle; new_ep.param.request_evd_handle = alloc_ep.param.request_evd_handle; new_ep.param.connect_evd_handle = alloc_ep.param.connect_evd_handle; /* Deal with each of the allocation fields. */ if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS && (ep_param->ep_attr.max_recv_dtos != ep2->param.ep_attr.max_recv_dtos)) { new_ep.recv_buffer = alloc_ep.recv_buffer; recv_cb_used = DAT_TRUE; } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS && (ep_param->ep_attr.max_request_dtos != ep2->param.ep_attr.max_request_dtos)) { new_ep.req_buffer = alloc_ep.req_buffer; rqst_cb_used = DAT_TRUE; } /* * We need to change the QP only if there already was a QP * (leave things the way you found them!) and one of the * following has changed: send/recv EVD, send/recv reqs/IOV max. */ if (DAPL_QP_STATE_UNATTACHED != new_ep.qp_state && (ep_param_mask & (DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV | DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV | DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS | DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS | DAT_EP_FIELD_RECV_EVD_HANDLE | DAT_EP_FIELD_REQUEST_EVD_HANDLE))) { /* * We shouldn't be racing with connection establishment * because the parameter validate routine should protect us, * but it's an important enough point that we assert it. */ dapl_os_assert((ep2->param.ep_state != DAT_EP_STATE_PASSIVE_CONNECTION_PENDING) && (ep2->param.ep_state != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING)); new_ep.qp_handle = alloc_ep.qp_handle; new_ep.qpn = alloc_ep.qpn; } /* * The actual assignment, including modifying QP parameters. * Modifying QP parameters needs to come first, as if it fails * we need to exit. */ if (DAPL_QP_STATE_UNATTACHED != new_ep.qp_state) { dat_status = dapls_ib_qp_modify(ia, ep2, &ep_attr2); if (dat_status != DAT_SUCCESS) { dapl_os_unlock(&ep2->header.lock); goto bail; } } *ep2 = new_ep; dapl_os_unlock(&ep2->header.lock); /* * Modify reference counts, incrementing new ones * and then decrementing old ones (so if they're the same * the refcount never drops to zero). */ tmp_pz = (DAPL_PZ *) new_ep.param.pz_handle; if (NULL != tmp_pz) { dapl_os_atomic_inc(&tmp_pz->pz_ref_count); } tmp_evd = (DAPL_EVD *) new_ep.param.recv_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_inc(&tmp_evd->evd_ref_count); } tmp_evd = (DAPL_EVD *) new_ep.param.request_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_inc(&tmp_evd->evd_ref_count); } tmp_evd = (DAPL_EVD *) new_ep.param.connect_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_inc(&tmp_evd->evd_ref_count); } /* decreament the old reference counts */ tmp_pz = (DAPL_PZ *) copy_of_old_ep.param.pz_handle; if (NULL != tmp_pz) { dapl_os_atomic_dec(&tmp_pz->pz_ref_count); } tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.recv_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_dec(&tmp_evd->evd_ref_count); } tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.request_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_dec(&tmp_evd->evd_ref_count); } tmp_evd = (DAPL_EVD *) copy_of_old_ep.param.connect_evd_handle; if (NULL != tmp_evd) { dapl_os_atomic_dec(&tmp_evd->evd_ref_count); } bail: if (qp_allocated) { DAT_RETURN local_dat_status; if (dat_status != DAT_SUCCESS || !qp_used) { local_dat_status = dapls_ib_qp_free(ia, &alloc_ep); } else { local_dat_status = dapls_ib_qp_free(ia, ©_of_old_ep); } if (local_dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ep_modify: Failed to free QP; status %x\n", local_dat_status); } } if (rqst_cb_allocated) { if (dat_status != DAT_SUCCESS || !rqst_cb_used) { dapls_cb_free(&alloc_ep.req_buffer); } else { dapls_cb_free(©_of_old_ep.req_buffer); } } if (recv_cb_allocated) { if (dat_status != DAT_SUCCESS || !recv_cb_used) { dapls_cb_free(&alloc_ep.recv_buffer); } else { dapls_cb_free(©_of_old_ep.recv_buffer); } } return dat_status; } /* * dapli_ep_modify_validate_parameters * * Validate parameters * * The space for the ep_attr_ptr parameter should be allocated by the * consumer. Upon success, this parameter will contain the current ep * attribute values with the requested modifications made. * */ static DAT_RETURN dapli_ep_modify_validate_parameters(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, IN const DAT_EP_PARAM * ep_param, OUT DAPL_IA ** ia_ptr, OUT DAPL_EP ** ep_ptr, OUT DAT_EP_ATTR * ep_attr_ptr) { DAPL_IA *ia; DAPL_EP *ep; DAT_EP_ATTR ep_attr; DAT_EP_ATTR ep_attr_limit; DAT_EP_ATTR ep_attr_request; DAT_RETURN dat_status; *ia_ptr = NULL; *ep_ptr = NULL; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if (ep_param == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } ep = (DAPL_EP *) ep_handle; ia = ep->header.owner_ia; /* * Verify parameters valid in current EP state */ if (ep_param_mask & (DAT_EP_FIELD_IA_HANDLE | DAT_EP_FIELD_EP_STATE | DAT_EP_FIELD_LOCAL_IA_ADDRESS_PTR | DAT_EP_FIELD_LOCAL_PORT_QUAL | DAT_EP_FIELD_REMOTE_IA_ADDRESS_PTR | DAT_EP_FIELD_REMOTE_PORT_QUAL)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } /* * Can only change the PZ handle if we are UNCONNECTED or * TENTATIVE_CONNECTION_PENDING (psp PROVIDER allocated EP) */ if ((ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) && (ep->param.ep_state != DAT_EP_STATE_UNCONNECTED && ep->param.ep_state != DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep)); goto bail; } if ((ep_param_mask & (DAT_EP_FIELD_RECV_EVD_HANDLE | DAT_EP_FIELD_REQUEST_EVD_HANDLE | DAT_EP_FIELD_CONNECT_EVD_HANDLE | DAT_EP_FIELD_EP_ATTR_SERVICE_TYPE | DAT_EP_FIELD_EP_ATTR_MAX_MESSAGE_SIZE | DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE | DAT_EP_FIELD_EP_ATTR_QOS | DAT_EP_FIELD_EP_ATTR_REQUEST_COMPLETION_FLAGS | DAT_EP_FIELD_EP_ATTR_RECV_COMPLETION_FLAGS | DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS | DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS | DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV | DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV)) && (ep->param.ep_state != DAT_EP_STATE_UNCONNECTED && ep->param.ep_state != DAT_EP_STATE_RESERVED && ep->param.ep_state != DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep)); goto bail; } /* * Validate handles being modified */ if (ep_param_mask & DAT_EP_FIELD_PZ_HANDLE) { if (ep_param->pz_handle != NULL && DAPL_BAD_HANDLE(ep_param->pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } } if (ep_param_mask & DAT_EP_FIELD_RECV_EVD_HANDLE) { if (ep_param->recv_evd_handle != NULL && ((DAPL_BAD_HANDLE(ep_param->recv_evd_handle, DAPL_MAGIC_EVD) || (((DAPL_EVD *)ep_param->recv_evd_handle)->evd_flags & DAT_EVD_DTO_FLAG)) == 0)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } } if (ep_param_mask & DAT_EP_FIELD_REQUEST_EVD_HANDLE) { if (ep_param->request_evd_handle != NULL && DAPL_BAD_HANDLE(ep_param->request_evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } } if (ep_param_mask & DAT_EP_FIELD_CONNECT_EVD_HANDLE) { if (ep_param->connect_evd_handle != NULL && DAPL_BAD_HANDLE(ep_param->connect_evd_handle, DAPL_MAGIC_EVD) && !(((DAPL_EVD *) ep_param->connect_evd_handle)-> evd_flags & DAT_EVD_CONNECTION_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } } /* * Validate the attributes against the HCA limits */ ep_attr = ep->param.ep_attr; dapl_os_memzero(&ep_attr_limit, sizeof(DAT_EP_ATTR)); dat_status = dapls_ib_query_hca(ia->hca_ptr, NULL, &ep_attr_limit, NULL); if (dat_status != DAT_SUCCESS) { goto bail; } ep_attr_request = ep_param->ep_attr; if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_SERVICE_TYPE) { if (ep_attr_request.service_type != DAT_SERVICE_TYPE_RC) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_MESSAGE_SIZE) { if (ep_attr_request.max_mtu_size > ep_attr_limit.max_mtu_size) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_mtu_size = ep_attr_request.max_mtu_size; } } /* Do nothing if the DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE flag is */ /* set. Each RDMA transport/provider may or may not have a limit */ /* on the size of an RDMA DTO. For InfiniBand, this parameter is */ /* validated in the implementation of the dapls_ib_qp_modify() */ /* function. */ /* */ /* if ( ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE ) */ /* { */ /* */ /* } */ if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_QOS) { /* Do nothing, not defined in the spec yet */ } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_RECV_COMPLETION_FLAGS) { dat_status = dapl_ep_check_recv_completion_flags(ep_attr_request. recv_completion_flags); if (dat_status != DAT_SUCCESS) { goto bail; } else { ep_attr.recv_completion_flags = ep_attr_request.recv_completion_flags; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_REQUEST_COMPLETION_FLAGS) { dat_status = dapl_ep_check_request_completion_flags(ep_attr_request. request_completion_flags); if (dat_status != DAT_SUCCESS) { goto bail; } else { ep_attr.request_completion_flags = ep_attr_request.request_completion_flags; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS) { if (ep_attr_request.max_recv_dtos > ep_attr_limit.max_recv_dtos || (ep_param->recv_evd_handle == DAT_HANDLE_NULL && (ep_attr_request.max_recv_dtos > 0))) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_recv_dtos = ep_attr_request.max_recv_dtos; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS) { if (ep_attr_request.max_request_dtos > ep_attr_limit.max_request_dtos || (ep_param->request_evd_handle == DAT_HANDLE_NULL && (ep_attr_request.max_request_dtos > 0))) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_request_dtos = ep_attr_request.max_request_dtos; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV) { if (ep_attr_request.max_recv_iov > ep_attr_limit.max_recv_iov) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_recv_iov = ep_attr_request.max_recv_iov; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV) { if (ep_attr_request.max_request_iov > ep_attr_limit.max_request_iov) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_request_iov = ep_attr_request.max_request_iov; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RDMA_READ_IOV) { if (ep_attr_request.max_rdma_read_iov > ep_attr_limit.max_rdma_read_iov) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_rdma_read_iov = ep_attr_request.max_rdma_read_iov; } } if (ep_param_mask & DAT_EP_FIELD_EP_ATTR_MAX_RDMA_WRITE_IOV) { if (ep_attr_request.max_rdma_write_iov > ep_attr_limit.max_rdma_write_iov) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } else { ep_attr.max_rdma_write_iov = ep_attr_request.max_rdma_write_iov; } } *ia_ptr = ia; *ep_ptr = ep; *ep_attr_ptr = ep_attr; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_post_rdma_read.c000066400000000000000000000054311255317474200214770ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_rdma_read.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl_ep_util.h" /* * dapl_ep_post_rdma_read * * DAPL Requirements Version xxx, 6.5.12 * * Request the xfer of all data specified by the remote_iov over the * connection of ep handle Endpint into the local_iov * * Input: * ep_handle * num_segments * local_iov * user_cookie * remote_iov * completion_flags * * Output: * None. * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_LENGTH_ERROR * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION */ DAT_RETURN DAT_API dapl_ep_post_rdma_read(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_post_rdma_read (%p, %d, %p, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, remote_iov, completion_flags); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, local_iov, user_cookie, remote_iov, completion_flags, DAPL_DTO_TYPE_RDMA_READ, OP_RDMA_READ); dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ep_post_rdma_read () returns 0x%x\n", dat_status); return dat_status; } dapl-2.1.5/dapl/common/dapl_ep_post_rdma_read_to_rmr.c000077500000000000000000000054041255317474200230640ustar00rootroot00000000000000/* * Copyright (c) 2007 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_rdma_read_rmr.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 2.0 API, Chapter 6, section 6 * * $Id:$ **********************************************************************/ #include "dapl_ep_util.h" /* * dapl_ep_post_rdma_read_to_rmr * * DAPL Requirements Version xxx, 6.6.24 * * Requests the transfer of all the data specified by the remote_buffer * over the connection of the ep_handle Endpoint into the local_iov * specified by the RMR segments. * * Input: * ep_handle * num_segments * local_iov * user_cookie * completion_flags * invalidate flag * RMR context * * Output: * None * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_LENGTH_ERROR * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_post_rdma_read_to_rmr(IN DAT_EP_HANDLE ep_handle, /* ep_handle */ IN const DAT_RMR_TRIPLET * local, /* local_iov */ IN DAT_DTO_COOKIE cookie, /* user_cookie */ IN const DAT_RMR_TRIPLET * remote, /* remote_iov */ IN DAT_COMPLETION_FLAGS flags) { /* completion_flags */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_post_rdma_write.c000066400000000000000000000053711255317474200217210ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_rdma_write.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl_ep_util.h" /* * dapl_ep_post_rdma_write * * DAPL Requirements Version xxx, 6.5.13 * * Request the xfer of all data specified by the local_iov over the * connection of ep handle Endpint into the remote_iov * * Input: * ep_handle * num_segments * local_iov * user_cookie * remote_iov * compltion_flags * * Output: * None. * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_LENGTH_ERROR * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION */ DAT_RETURN DAT_API dapl_ep_post_rdma_write(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_post_rdma_write (%p, %d, %p, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, remote_iov, completion_flags); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, local_iov, user_cookie, remote_iov, completion_flags, DAPL_DTO_TYPE_RDMA_WRITE, OP_RDMA_WRITE); dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ep_post_rdma_write () returns 0x%x\n", dat_status); return dat_status; } dapl-2.1.5/dapl/common/dapl_ep_post_recv.c000066400000000000000000000064551255317474200205270ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_recv.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cookie.h" #include "dapl_adapter_util.h" /* * dapl_ep_post_recv * * DAPL Requirements Version xxx, 6.5.11 * * Request to receive data over the connection of ep handle into * local_iov * * Input: * ep_handle * num_segments * local_iov * user_cookie * completion_flags * * Output: * None. * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_PROTECTION_VIOLATION * DAT_PROVILEGES_VIOLATION */ DAT_RETURN DAT_API dapl_ep_post_recv(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_post_recv (%p, %d, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } ep_ptr = (DAPL_EP *) ep_handle; if (ep_ptr->param.srq_handle) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_SRQ_IN_USE); goto bail; } /* * Synchronization ok since this buffer is only used for receive * requests, which aren't allowed to race with each other. */ dat_status = dapls_dto_cookie_alloc(&ep_ptr->recv_buffer, DAPL_DTO_TYPE_RECV, user_cookie, &cookie); if (DAT_SUCCESS != dat_status) { goto bail; } /* * Invoke provider specific routine to post DTO */ dat_status = dapls_ib_post_recv(ep_ptr, cookie, num_segments, local_iov); if (dat_status != DAT_SUCCESS) { dapls_cookie_dealloc(&ep_ptr->recv_buffer, cookie); } bail: dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ep_post_recv () returns 0x%x\n", dat_status); return dat_status; } dapl-2.1.5/dapl/common/dapl_ep_post_send.c000066400000000000000000000056441255317474200205200ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_send.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id: dapl_ep_post_send.c 1364 2005-10-31 18:30:14Z jlentini $ **********************************************************************/ #include "dapl_ep_util.h" /* * dapl_ep_post_send * * DAPL Requirements Version xxx, 6.5.10 * * Request a transfer of all the data from the local_iov over * the connection of the ep handle Endpoint to the remote side. * * Input: * ep_handle * num_segments * local_iov * user_cookie * completion_flags * * Output: * None * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION */ DAT_RETURN DAT_API dapl_ep_post_send(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags) { DAT_RMR_TRIPLET remote_iov = { 0, 0, 0 }; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_post_send (%p, %d, %p, %p, %x)\n", ep_handle, num_segments, local_iov, user_cookie.as_64, completion_flags); dat_status = dapl_ep_post_send_req(ep_handle, num_segments, local_iov, user_cookie, &remote_iov, completion_flags, DAPL_DTO_TYPE_SEND, OP_SEND); dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ep_post_send () returns 0x%x\n", dat_status); return dat_status; } dapl-2.1.5/dapl/common/dapl_ep_post_send_invalidate.c000077500000000000000000000056331255317474200227210ustar00rootroot00000000000000/* * Copyright (c) 2007 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_post_send_invalidate.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 2.0 API, Chapter 6, section 6 * * $Id:$ **********************************************************************/ #include "dapl_ep_util.h" /* * dapl_ep_post_send_invalidate * * DAPL Requirements Version xxx, 6.6.21 * * Requests a transfer of all the data from the local_iov over the connection * of the ep_handle Endpoint to the remote side and invalidates the Remote * Memory Region context. * * Input: * ep_handle * num_segments * local_iov * user_cookie * completion_flags * invalidate flag * RMR context * * Output: * None * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_PROTECTION_VIOLATION * DAT_PRIVILEGES_VIOLATION * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_post_send_with_invalidate(IN DAT_EP_HANDLE ep_handle, /* ep_handle */ IN DAT_COUNT num_segments, /* num_segments */ IN DAT_LMR_TRIPLET * local_iov, /* local_iov */ IN DAT_DTO_COOKIE user_cookie, /* user_cookie */ IN DAT_COMPLETION_FLAGS flags, /* completion_flags */ IN DAT_BOOLEAN invalidate_flag, /* invalidate_flag */ IN DAT_RMR_CONTEXT rmr_context) { /* RMR context */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_query.c000066400000000000000000000063641255317474200176670ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_query.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_ep_query * * DAPL Requirements Version xxx, 6.5.5 * * Provide the consumer parameters, including attributes and status of * the Endpoint. * * Input: * ep_handle * ep_param_mask * * Output: * ep_param * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_ep_query(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, OUT DAT_EP_PARAM * ep_param) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_query (%p, %x, %p)\n", ep_handle, ep_param_mask, ep_param); dat_status = DAT_SUCCESS; ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if (ep_param == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } /* * Fill in according to user request * * N.B. Just slam all values into the user structure, there * is nothing to be gained by checking for each bit. */ if (ep_param_mask & DAT_EP_FIELD_ALL) { /* only attempt to get remote IA address if consumer requested it */ if (ep_param_mask & DAT_EP_FIELD_REMOTE_IA_ADDRESS_PTR) { if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED) { /* obtain the remote IP address */ dat_status = dapls_ib_cm_remote_addr((DAT_HANDLE) ep_handle, &ep_ptr-> remote_ia_address); } ep_ptr->param.remote_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & ep_ptr->remote_ia_address; } *ep_param = ep_ptr->param; dats_get_ia_handle(ep_ptr->param.ia_handle, &ep_param->ia_handle); } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_recv_query.c000066400000000000000000000046531255317474200207050ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_recv_query.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.2 API, Chapter 6, section 6.11 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ep_util.h" /* * dapl_ep_recv_query * * uDAPL Version 1.2, 6.6.11 * * Destroy an instance of the Endpoint * * Input: * ep_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_recv_query(IN DAT_EP_HANDLE ep_handle, OUT DAT_COUNT * nbufs_allocate, OUT DAT_COUNT * bufs_alloc_span) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_recv_query (%p, %p, %p)\n", ep_handle, nbufs_allocate, bufs_alloc_span); ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_reset.c000066400000000000000000000052061255317474200176360ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_reset.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5.13 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" #include "dapl_ring_buffer_util.h" /* * dapl_ep_reset * * DAPL Requirements Version 1.1, 6.5.13 * * Reset the QP attached to this Endpoint, transitioning back to the * INIT state * * Input: * ep_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_ep_reset(IN DAT_EP_HANDLE ep_handle) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED && ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED) { dapls_ib_reinit_ep(ep_ptr); ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_set_watermark.c000066400000000000000000000047411255317474200213670ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_set_watermark.c * * PURPOSE: Endpoint management * Description: Interfaces in this file are completely described in * the DAPL 1.2 API, Chapter 6, section 6.13 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ep_util.h" /* * dapl_ep_set_watermark * * DAPL Requirements Version 1.2, 6.6.13 * * Sets the watermark values for an EP for generating asynchronous * events. * * Input: * ep_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ep_set_watermark(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT soft_high_watermark, IN DAT_COUNT hard_high_watermark) { DAPL_EP *ep_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ep_set_watermark (%p, %d, %d)\n", ep_handle, soft_high_watermark, hard_high_watermark); ep_ptr = (DAPL_EP *) ep_handle; /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(ep_ptr, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } dat_status = DAT_NOT_IMPLEMENTED; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_util.c000066400000000000000000000407721255317474200175000ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_util.c * * PURPOSE: Manage EP Info structure * * $Id:$ **********************************************************************/ #include "dapl_ep_util.h" #include "dapl_ring_buffer_util.h" #include "dapl_cookie.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" /* for callback routine */ /* * Local definitions */ /* * Default number of I/O operations on an end point */ #define IB_IO_DEFAULT 16 /* * Default number of scatter/gather entries available to a single * post send/recv */ #define IB_IOV_DEFAULT 4 /* * Default number of RDMA operations in progress at a time */ #define IB_RDMA_DEFAULT 4 extern void dapli_ep_default_attrs(IN DAPL_EP * ep_ptr); char *dapl_get_ep_state_str(DAT_EP_STATE state) { #ifdef DAPL_DBG static char *state_str[DAT_EP_STATE_CONNECTED_MULTI_PATH + 1] = { "DAT_EP_STATE_UNCONNECTED", /* quiescent state */ "DAT_EP_STATE_UNCONFIGURED_UNCONNECTED", "DAT_EP_STATE_RESERVED", "DAT_EP_STATE_UNCONFIGURED_RESERVED", "DAT_EP_STATE_PASSIVE_CONNECTION_PENDING", "DAT_EP_STATE_UNCONFIGURED_PASSIVE", "DAT_EP_STATE_ACTIVE_CONNECTION_PENDING", "DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING", "DAT_EP_STATE_UNCONFIGURED_TENTATIVE", "DAT_EP_STATE_CONNECTED", "DAT_EP_STATE_DISCONNECT_PENDING", "DAT_EP_STATE_DISCONNECTED", "DAT_EP_STATE_COMPLETION_PENDING", "DAT_EP_STATE_CONNECTED_SINGLE_PATH", "DAT_EP_STATE_CONNECTED_MULTI_PATH" }; return state_str[state]; #else static char buf[12]; sprintf(buf, "%d", state); return buf; #endif } /* * dapl_ep_alloc * * alloc and initialize an EP INFO struct * * Input: * IA INFO struct ptr * * Output: * ep_ptr * * Returns: * none * */ DAPL_EP *dapl_ep_alloc(IN DAPL_IA * ia_ptr, IN const DAT_EP_ATTR * ep_attr, IN DAT_BOOLEAN using_srq) { DAPL_EP *ep_ptr; /* Allocate EP */ ep_ptr = (DAPL_EP *) dapl_os_alloc(sizeof(DAPL_EP) + sizeof(DAT_SOCK_ADDR)); if (ep_ptr == NULL) { goto bail; } /* zero the structure */ dapl_os_memzero(ep_ptr, sizeof(DAPL_EP) + sizeof(DAT_SOCK_ADDR)); #ifdef DAPL_COUNTERS /* Allocate counters */ ep_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS); if (ep_ptr->cntrs == NULL) { dapl_os_free(ep_ptr, sizeof(DAPL_EP) + sizeof(DAT_SOCK_ADDR)); return (NULL); } dapl_os_memzero(ep_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS); #endif /* DAPL_COUNTERS */ /* * initialize the header */ ep_ptr->header.provider = ia_ptr->header.provider; ep_ptr->header.magic = DAPL_MAGIC_EP; ep_ptr->header.handle_type = DAT_HANDLE_TYPE_EP; ep_ptr->header.owner_ia = ia_ptr; ep_ptr->header.user_context.as_64 = 0; ep_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&ep_ptr->header.ia_list_entry); dapl_llist_init_head(&ep_ptr->cm_list_head); dapl_os_lock_init(&ep_ptr->header.lock); /* * Initialize the body */ /* * Set up default parameters if the user passed in a NULL */ if (ep_attr == NULL) { dapli_ep_default_attrs(ep_ptr); } else { ep_ptr->param.ep_attr = *ep_attr; } /* * IBM OS API specific fields */ ep_ptr->qp_handle = IB_INVALID_HANDLE; ep_ptr->qpn = 0; ep_ptr->qp_state = DAPL_QP_STATE_UNATTACHED; if (DAT_SUCCESS != dapls_cb_create(&ep_ptr->req_buffer, ep_ptr, ep_ptr->param.ep_attr. max_request_dtos)) { dapl_ep_dealloc(ep_ptr); ep_ptr = NULL; goto bail; } /* SRQ case - don't allocate as we use the SRQ recv buffer */ if (using_srq == DAT_FALSE) { if (DAT_SUCCESS != dapls_cb_create(&ep_ptr->recv_buffer, ep_ptr, ep_ptr->param.ep_attr.max_recv_dtos)) { dapl_ep_dealloc(ep_ptr); ep_ptr = NULL; goto bail; } } dapls_io_trc_alloc(ep_ptr); bail: return ep_ptr; } /* * dapl_ep_dealloc * * Free the passed in EP structure. * * Input: * entry point pointer * * Output: * none * * Returns: * none * */ void dapl_ep_dealloc(IN DAPL_EP * ep_ptr) { dapl_os_assert(ep_ptr->header.magic == DAPL_MAGIC_EP); ep_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapls_cb_free(&ep_ptr->req_buffer); if (ep_ptr->recv_buffer.pool) dapls_cb_free(&ep_ptr->recv_buffer); if (NULL != ep_ptr->cxn_timer) { dapl_os_free(ep_ptr->cxn_timer, sizeof(DAPL_OS_TIMER)); } #ifdef DAPL_COUNTERS dapl_os_free(ep_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EP_ALL_COUNTERS); #endif /* DAPL_COUNTERS */ dapl_os_free(ep_ptr, sizeof(DAPL_EP) + sizeof(DAT_SOCK_ADDR)); } /* * dapl_ep_default_attrs * * Set default values in the parameter fields * * Input: * entry point pointer * * Output: * none * * Returns: * none * */ void dapli_ep_default_attrs(IN DAPL_EP * ep_ptr) { DAT_EP_ATTR ep_attr_limit; DAT_EP_ATTR *ep_attr; DAT_RETURN dat_status; ep_attr = &ep_ptr->param.ep_attr; /* Set up defaults */ dapl_os_memzero(ep_attr, sizeof(DAT_EP_ATTR)); /* mtu and rdma sizes fixed in IB as per IBTA 1.1, 9.4.3, 9.4.4, 9.7.7. */ ep_attr->max_mtu_size = 0x80000000; ep_attr->max_rdma_size = 0x80000000; ep_attr->qos = DAT_QOS_BEST_EFFORT; ep_attr->service_type = DAT_SERVICE_TYPE_RC; ep_attr->max_recv_dtos = IB_IO_DEFAULT; ep_attr->max_request_dtos = IB_IO_DEFAULT; ep_attr->max_recv_iov = IB_IOV_DEFAULT; ep_attr->max_request_iov = IB_IOV_DEFAULT; ep_attr->max_rdma_read_in = IB_RDMA_DEFAULT; ep_attr->max_rdma_read_out = IB_RDMA_DEFAULT; /* * Configure the EP as a standard completion type, which will be * used by the EVDs. A threshold of 1 is the default state of an * EVD. */ ep_attr->request_completion_flags = DAT_COMPLETION_EVD_THRESHOLD_FLAG; ep_attr->recv_completion_flags = DAT_COMPLETION_EVD_THRESHOLD_FLAG; /* * Unspecified defaults: * - ep_privileges: No RDMA capabilities * - num_transport_specific_params: none * - transport_specific_params: none * - num_provider_specific_params: 0 * - provider_specific_params: 0 */ dat_status = dapls_ib_query_hca(ep_ptr->header.owner_ia->hca_ptr, NULL, &ep_attr_limit, NULL); /* check against HCA maximums */ if (dat_status == DAT_SUCCESS) { ep_ptr->param.ep_attr.max_mtu_size = DAPL_MIN(ep_ptr->param.ep_attr.max_mtu_size, ep_attr_limit.max_mtu_size); ep_ptr->param.ep_attr.max_rdma_size = DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_size, ep_attr_limit.max_rdma_size); ep_ptr->param.ep_attr.max_recv_dtos = DAPL_MIN(ep_ptr->param.ep_attr.max_recv_dtos, ep_attr_limit.max_recv_dtos); ep_ptr->param.ep_attr.max_request_dtos = DAPL_MIN(ep_ptr->param.ep_attr.max_request_dtos, ep_attr_limit.max_request_dtos); ep_ptr->param.ep_attr.max_recv_iov = DAPL_MIN(ep_ptr->param.ep_attr.max_recv_iov, ep_attr_limit.max_recv_iov); ep_ptr->param.ep_attr.max_request_iov = DAPL_MIN(ep_ptr->param.ep_attr.max_request_iov, ep_attr_limit.max_request_iov); ep_ptr->param.ep_attr.max_rdma_read_in = DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_in, ep_attr_limit.max_rdma_read_in); ep_ptr->param.ep_attr.max_rdma_read_out = DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, ep_attr_limit.max_rdma_read_out); } } DAT_RETURN dapl_ep_check_recv_completion_flags(DAT_COMPLETION_FLAGS flags) { /* * InfiniBand will not allow signal suppression for RECV completions, * see the 1.0.1 spec section 10.7.3.1, 10.8.6. * N.B. SIGNALLED has a different meaning in dapl than it does * in IB; IB SIGNALLED is the same as DAPL SUPPRESS. DAPL * SIGNALLED simply means the user will not get awakened when * an EVD completes, even though the dapl handler is invoked. */ if (flags & DAT_COMPLETION_SUPPRESS_FLAG) { return DAT_INVALID_PARAMETER; } return DAT_SUCCESS; } DAT_RETURN dapl_ep_check_request_completion_flags(DAT_COMPLETION_FLAGS flags) { return DAT_SUCCESS; } DAT_RETURN dapl_ep_post_send_req(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags, IN DAPL_DTO_TYPE dto_type, IN int op_type) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } ep_ptr = (DAPL_EP *) ep_handle; if ((ep_ptr->param.ep_state != DAT_EP_STATE_CONNECTED) && (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED)) return(DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EP_UNCONNECTED)); /* * Synchronization ok since this buffer is only used for send * requests, which aren't allowed to race with each other. */ dat_status = dapls_dto_cookie_alloc(&ep_ptr->req_buffer, dto_type, user_cookie, &cookie); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_post_req resource ERR:" " dtos pending = %d, max_dtos %d, max_cb %d hd %d tl %d\n", dapls_cb_pending(&ep_ptr->req_buffer), ep_ptr->param.ep_attr.max_request_dtos, ep_ptr->req_buffer.pool_size, ep_ptr->req_buffer.head, ep_ptr->req_buffer.tail); goto bail; } /* * Invoke provider specific routine to post DTO */ dat_status = dapls_ib_post_send(ep_ptr, op_type, cookie, num_segments, local_iov, remote_iov, completion_flags); if (dat_status != DAT_SUCCESS) { dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); } bail: return dat_status; } /* * dapli_ep_timeout * * If this routine is invoked before a connection occurs, generate an * event */ void dapls_ep_timeout(uintptr_t arg) { DAPL_EP *ep_ptr; ib_cm_events_t ib_cm_event; dapl_dbg_log(DAPL_DBG_TYPE_CM, "--> dapls_ep_timeout! ep %lx\n", arg); ep_ptr = (DAPL_EP *) arg; /* reset the EP state */ ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; /* Clean up the EP and put the underlying QP into the ERROR state. * The disconnect_clean interface requires the provided dependent *cm event number. */ ib_cm_event = dapls_ib_get_cm_event(DAT_CONNECTION_EVENT_TIMED_OUT); dapls_ib_disconnect_clean(ep_ptr, DAT_TRUE, ib_cm_event); (void)dapls_evd_post_connection_event((DAPL_EVD *) ep_ptr->param. connect_evd_handle, DAT_CONNECTION_EVENT_TIMED_OUT, (DAT_HANDLE) ep_ptr, 0, 0); } /* * dapls_ep_state_subtype * * Return the INVALID_STATE connection subtype associated with an * INVALID_STATE on an EP. Strictly for error reporting. */ DAT_RETURN_SUBTYPE dapls_ep_state_subtype(IN DAPL_EP * ep_ptr) { DAT_RETURN_SUBTYPE dat_status; switch (ep_ptr->param.ep_state) { case DAT_EP_STATE_UNCONNECTED: { dat_status = DAT_INVALID_STATE_EP_UNCONNECTED; break; } case DAT_EP_STATE_RESERVED: { dat_status = DAT_INVALID_STATE_EP_RESERVED; break; } case DAT_EP_STATE_PASSIVE_CONNECTION_PENDING: { dat_status = DAT_INVALID_STATE_EP_PASSCONNPENDING; break; } case DAT_EP_STATE_ACTIVE_CONNECTION_PENDING: { dat_status = DAT_INVALID_STATE_EP_ACTCONNPENDING; break; } case DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING: { dat_status = DAT_INVALID_STATE_EP_TENTCONNPENDING; break; } case DAT_EP_STATE_CONNECTED: { dat_status = DAT_INVALID_STATE_EP_CONNECTED; break; } case DAT_EP_STATE_DISCONNECT_PENDING: { dat_status = DAT_INVALID_STATE_EP_DISCPENDING; break; } case DAT_EP_STATE_DISCONNECTED: { dat_status = DAT_INVALID_STATE_EP_DISCONNECTED; break; } case DAT_EP_STATE_COMPLETION_PENDING: { dat_status = DAT_INVALID_STATE_EP_COMPLPENDING; break; } default: { dat_status = 0; break; } } return dat_status; } #ifdef DAPL_DBG_IO_TRC /* allocate trace buffer */ void dapls_io_trc_alloc(DAPL_EP * ep_ptr) { DAT_RETURN dat_status; int i; struct io_buf_track *ibt; ep_ptr->ibt_dumped = 0; /* bool to control how often we print */ dat_status = dapls_rbuf_alloc(&ep_ptr->ibt_queue, DBG_IO_TRC_QLEN); if (dat_status != DAT_SUCCESS) { goto bail; } ibt = (struct io_buf_track *)dapl_os_alloc(sizeof(struct io_buf_track) * DBG_IO_TRC_QLEN); if (dat_status != DAT_SUCCESS) { dapls_rbuf_destroy(&ep_ptr->ibt_queue); goto bail; } ep_ptr->ibt_base = ibt; dapl_os_memzero(ibt, sizeof(struct io_buf_track) * DBG_IO_TRC_QLEN); /* add events to free event queue */ for (i = 0; i < DBG_IO_TRC_QLEN; i++) { dapls_rbuf_add(&ep_ptr->ibt_queue, ibt++); } bail: return; } #endif /* DAPL_DBG_IO_TRC */ /* * Generate a disconnect event on abruct close for older verbs providers * that do not do it automatically. */ void dapl_ep_legacy_post_disconnect(DAPL_EP * ep_ptr, DAT_CLOSE_FLAGS disconnect_flags) { ib_cm_events_t ib_cm_event; DAPL_CR *cr_ptr; dp_ib_cm_handle_t cm_ptr; /* * Acquire the lock and make sure we didn't get a callback * that cleaned up. */ dapl_os_lock(&ep_ptr->header.lock); if (disconnect_flags == DAT_CLOSE_ABRUPT_FLAG && ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECT_PENDING) { /* * If this is an ABRUPT close, the provider will not generate * a disconnect message so we do it manually here. Just invoke * the CM callback as it will clean up the appropriate * data structures, reset the state, and generate the event * on the way out. Obtain the provider dependent cm_event to * pass into the callback for a disconnect. */ ib_cm_event = dapls_ib_get_cm_event(DAT_CONNECTION_EVENT_DISCONNECTED); cr_ptr = ep_ptr->cr_ptr; cm_ptr = (dapl_llist_is_empty(&ep_ptr->cm_list_head) ? NULL : dapl_llist_peek_head(&ep_ptr->cm_list_head)); dapl_os_unlock(&ep_ptr->header.lock); if (cr_ptr != NULL) { dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM, " dapl_ep_disconnect force callback on EP %p CM handle %x\n", ep_ptr, cr_ptr->ib_cm_handle); dapls_cr_callback(cr_ptr->ib_cm_handle, ib_cm_event, NULL, 0, cr_ptr->sp_ptr); } else { dapl_evd_connection_callback(cm_ptr, ib_cm_event, NULL, 0, (void *)ep_ptr); } } else { dapl_os_unlock(&ep_ptr->header.lock); } } /* * dapl_ep_link_cm * * Add linking of provider's CM object to a EP structure * This enables multiple CM's per EP, and syncronization * * Input: * DAPL_EP *ep_ptr * dp_ib_cm_handle_t *cm_ptr defined in provider's dapl_util.h * * CM objects linked with EP using ->list_entry * Output: * none * * Returns: * none * */ void dapl_ep_link_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr) { dapl_os_lock(&ep_ptr->header.lock); dapls_cm_acquire(cm_ptr); dapl_llist_add_tail(&ep_ptr->cm_list_head, &cm_ptr->list_entry, cm_ptr); dapl_os_unlock(&ep_ptr->header.lock); } void dapl_ep_unlink_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr) { dapl_os_lock(&ep_ptr->header.lock); dapl_llist_remove_entry(&ep_ptr->cm_list_head, &cm_ptr->list_entry); dapls_cm_release(cm_ptr); dapl_os_unlock(&ep_ptr->header.lock); } static void dapli_ep_flush_evd(DAPL_EVD *evd_ptr) { DAT_RETURN dat_status; dapl_os_lock(&evd_ptr->header.lock); dat_status = dapls_evd_copy_cq(evd_ptr); dapl_os_unlock(&evd_ptr->header.lock); if (dat_status == DAT_QUEUE_FULL) dapls_evd_post_overflow_event(evd_ptr); } void dapls_ep_flush_cqs(DAPL_EP * ep_ptr) { if (ep_ptr->param.request_evd_handle) dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param.request_evd_handle); if (ep_ptr->param.recv_evd_handle) if (ep_ptr->recv_buffer.pool) while (dapls_cb_pending(&ep_ptr->recv_buffer)) dapli_ep_flush_evd((DAPL_EVD *) ep_ptr->param. recv_evd_handle); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ep_util.h000066400000000000000000000057341255317474200175040ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_ep_util.h * * PURPOSE: Utility defs & routines for the EP data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_EP_UTIL_H_ #define _DAPL_EP_UTIL_H_ #include "dapl.h" #include "dapl_adapter_util.h" /* function prototypes */ extern DAPL_EP * dapl_ep_alloc ( IN DAPL_IA *ia, IN const DAT_EP_ATTR *ep_attr, IN DAT_BOOLEAN using_srq ); extern void dapl_ep_dealloc ( IN DAPL_EP *ep_ptr ); extern DAT_RETURN dapl_ep_check_recv_completion_flags ( DAT_COMPLETION_FLAGS flags ); extern DAT_RETURN dapl_ep_check_request_completion_flags ( DAT_COMPLETION_FLAGS flags ); extern DAT_RETURN dapl_ep_post_send_req ( IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET *local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags, IN DAPL_DTO_TYPE dto_type, IN int op_type ); void dapls_ep_timeout (uintptr_t arg ); DAT_RETURN_SUBTYPE dapls_ep_state_subtype( IN DAPL_EP *ep_ptr ); extern void dapl_ep_legacy_post_disconnect( DAPL_EP *ep_ptr, DAT_CLOSE_FLAGS disconnect_flags); extern char *dapl_get_ep_state_str(DAT_EP_STATE state); extern void dapl_ep_link_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr); extern void dapl_ep_unlink_cm(IN DAPL_EP *ep_ptr, IN dp_ib_cm_handle_t cm_ptr); STATIC _INLINE_ dp_ib_cm_handle_t dapl_get_cm_from_ep(IN DAPL_EP *ep_ptr) { dp_ib_cm_handle_t cm_ptr; dapl_os_lock(&ep_ptr->header.lock); cm_ptr = (dapl_llist_is_empty(&ep_ptr->cm_list_head) ? NULL : dapl_llist_peek_head(&ep_ptr->cm_list_head)); dapl_os_unlock(&ep_ptr->header.lock); return cm_ptr; } extern void dapls_ep_flush_cqs(DAPL_EP * ep_ptr); #endif /* _DAPL_EP_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_evd_connection_callb.c000066400000000000000000000144401255317474200221620ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_connection_callback.c * * PURPOSE: implements connection callbacks * * Description: Accepts asynchronous callbacks from the Communications Manager * for EVDs that have been specified as the connection_evd. * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_ep_util.h" #include "dapl_timer_util.h" /* * dapl_evd_connection_callback * * Connection callback function for ACTIVE connection requests; callbacks * generated by the Connection Manager in response to issuing a * connect call. * * Input: * ib_cm_handle, * ib_cm_event * private_data_ptr * context (evd) * cr_pp * * Output: * None * */ void dapl_evd_connection_callback(IN dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_t ib_cm_event, IN const void *private_data_ptr, IN const int private_data_size, IN const void *context) { DAPL_EP *ep_ptr; DAPL_EVD *evd_ptr; DAPL_PRIVATE *prd_ptr; DAT_EVENT_NUMBER dat_event_num; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK, "--> dapl_evd_connection_callback: ctxt: %p event: %x cm_handle %p\n", context, ib_cm_event, (void *)ib_cm_handle); /* * Determine the type of handle passed back to us in the context * and sort out key parameters. */ if (context == NULL || ((DAPL_HEADER *) context)->magic != DAPL_MAGIC_EP) { return; } /* * Active side of the connection, context is an EP and * PSP is irrelevant. */ ep_ptr = (DAPL_EP *) context; evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle; DAPL_CNTR(evd_ptr, DCNT_EVD_CONN_CALLBACK); prd_ptr = (DAPL_PRIVATE *) private_data_ptr; /* * All operations effect the EP, so lock it once and unlock * when necessary */ dapl_os_lock(&ep_ptr->header.lock); /* * If a connection timer has been set up on this EP, cancel it now */ if (ep_ptr->cxn_timer != NULL) { dapls_timer_cancel(ep_ptr->cxn_timer); dapl_os_free(ep_ptr->cxn_timer, sizeof(DAPL_OS_TIMER)); ep_ptr->cxn_timer = NULL; } /* Obtain the event number from the provider layer */ dat_event_num = dapls_ib_get_dat_event(ib_cm_event, DAT_FALSE); switch (dat_event_num) { case DAT_CONNECTION_EVENT_ESTABLISHED: { /* If we don't have an EP at this point we are very screwed * up */ if (ep_ptr->param.ep_state != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING) { /* If someone pulled the plug on the connection, just * exit */ dapl_os_unlock(&ep_ptr->header.lock); dat_status = DAT_SUCCESS; break; } ep_ptr->param.ep_state = DAT_EP_STATE_CONNECTED; if (private_data_size > 0) { /* copy in the private data */ dapl_os_memcpy(ep_ptr->private.private_data, prd_ptr->private_data, DAPL_MIN(private_data_size, DAPL_MAX_PRIVATE_DATA_SIZE)); } dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_EVENT_PEER_REJECTED: { /* peer reject may include private data */ if (private_data_size > 0) dapl_os_memcpy(ep_ptr->private.private_data, prd_ptr->private_data, DAPL_MIN(private_data_size, DAPL_MAX_PRIVATE_DATA_SIZE)); dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK, "dapl_evd_connection_callback PEER REJ ep=%p pd=%p sz=%d\n", ep_ptr, prd_ptr, private_data_size); } case DAT_CONNECTION_EVENT_DISCONNECTED: case DAT_CONNECTION_EVENT_UNREACHABLE: case DAT_CONNECTION_EVENT_NON_PEER_REJECTED: { ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapls_ib_disconnect_clean(ep_ptr, DAT_TRUE, ib_cm_event); dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_EVENT_BROKEN: case DAT_CONNECTION_EVENT_TIMED_OUT: { ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapls_ib_disconnect_clean(ep_ptr, DAT_FALSE, ib_cm_event); dapl_os_unlock(&ep_ptr->header.lock); break; } case DAT_CONNECTION_REQUEST_EVENT: default: { dapl_os_unlock(&ep_ptr->header.lock); dapl_log(DAPL_DBG_TYPE_WARN, "dapl_evd_conn_cb() unknown event 0x%x\n", dat_event_num); evd_ptr = NULL; break; } } /* * Post the event * If the EP has been freed, the evd_ptr will be NULL */ if (evd_ptr != NULL) { dat_status = dapls_evd_post_connection_event(evd_ptr, dat_event_num, (DAT_HANDLE) ep_ptr, private_data_size, /* CONNECTED or REJECT */ ep_ptr->private. private_data); if (dat_status != DAT_SUCCESS && dat_event_num == DAT_CONNECTION_EVENT_ESTABLISHED) { /* We can't tell the user we are connected, something * is wrong locally. Just kill the connection and * reset the state to DISCONNECTED as we don't * expect a callback on an ABRUPT disconnect. */ dapls_ib_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); dapl_os_lock(&ep_ptr->header.lock); ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapl_os_unlock(&ep_ptr->header.lock); } } dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK, "dapl_evd_connection_callback () returns\n"); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_cq_async_error_callb.c000066400000000000000000000047351255317474200230420ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_cq_async_error_callback.c * * PURPOSE: implements CQ async_callbacks from verbs * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" /* * dapl_evd_cq_async_error_callback * * The callback function registered with verbs for cq async errors * * Input: * ib_cm_handle, * ib_cm_event * cause_ptr * context (evd) * * Output: * None * */ void dapl_evd_cq_async_error_callback(IN ib_hca_handle_t ib_hca_handle, IN ib_cq_handle_t ib_cq_handle, IN ib_error_record_t * cause_ptr, IN void *context) { DAPL_EVD *async_evd; DAPL_EVD *evd; DAT_RETURN dat_status; dapl_log(DAPL_DBG_TYPE_WARN, " -- %s (%p, %p, %p, %p)\n", __FUNCTION__, ib_hca_handle, ib_cq_handle, cause_ptr, context); if (NULL == context) { dapl_os_panic("NULL == context\n"); } evd = (DAPL_EVD *) context; async_evd = evd->header.owner_ia->async_error_evd; DAPL_CNTR(evd->header.owner_ia, DCNT_IA_ASYNC_CQ_ERROR); dat_status = dapls_evd_post_async_error_event(async_evd, DAT_ASYNC_ERROR_EVD_OVERFLOW, (DAT_HANDLE) evd); if (dat_status != DAT_SUCCESS) { dapl_os_panic("async EVD overflow\n"); } dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION, "dapl_evd_cq_async_error_callback () returns\n"); } dapl-2.1.5/dapl/common/dapl_evd_dequeue.c000066400000000000000000000074111255317474200203230ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_dequeue.c * * PURPOSE: Event Management * * Description: Interfaces in this file are completely described in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ring_buffer_util.h" #include "dapl_evd_util.h" /* * dapl_evd_dequeue * * DAPL Requirements Version xxx, 6.3.2.7 * * Remove first element from an event dispatcher * * Input: * evd_handle * * Output: * event * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_QUEUE_EMPTY */ DAT_RETURN DAT_API dapl_evd_dequeue(IN DAT_EVD_HANDLE evd_handle, OUT DAT_EVENT * event) { DAPL_EVD *evd_ptr; DAT_EVENT *local_event; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } if (event == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE); /* * We need to dequeue under lock, as the IB OS Access API * restricts us from having multiple threads in CQ poll, and the * DAPL 1.1 API allows multiple threads in dat_evd_dequeue() */ dapl_os_lock(&evd_ptr->header.lock); /* * Make sure there are no other waiters and the evd is active. * Currently this means only the OPEN state is allowed. */ if (evd_ptr->evd_state != DAPL_EVD_STATE_OPEN || evd_ptr->catastrophic_overflow) { dapl_os_unlock(&evd_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); goto bail; } /* * Try the EVD rbuf first; poll from the CQ only if that's empty. * This keeps events in order if dat_evd_wait() has copied events * from CQ to EVD. */ local_event = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->pending_event_queue); if (local_event != NULL) { *event = *local_event; dat_status = dapls_rbuf_add(&evd_ptr->free_event_queue, local_event); DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_FOUND); } else if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { dat_status = dapls_evd_cq_poll_to_event(evd_ptr, event); DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_POLL); } else { dat_status = DAT_ERROR(DAT_QUEUE_EMPTY, 0); DAPL_CNTR(evd_ptr, DCNT_EVD_DEQUEUE_NOT_FOUND); } #ifdef DAPL_DBG if (dat_status == DAT_SUCCESS) dapl_dbg_log(DAPL_DBG_TYPE_EVD, "dapl_evd_dequeue() Event(%p) = 0x%x\n", event->evd_handle, event->event_number); #endif dapl_os_unlock(&evd_ptr->header.lock); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_evd_dto_callb.c000077500000000000000000000121041255317474200206070ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_dto_callback.c * * PURPOSE: implements DTO callbacks from verbs * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_cno_util.h" #include "dapl_cookie.h" #include "dapl_adapter_util.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ /********************************************************************* * * * Function Definitions * * * *********************************************************************/ /* * dapl_evd_dto_callback * * Input: * hca_handle_in, * cq_handle_in, * user_context_cq_p * * Output: * none * * This is invoked for both DTO and MW bind completions. Strictly * speaking it is an event callback rather than just a DTO callback. * */ void dapl_evd_dto_callback(IN ib_hca_handle_t hca_handle, IN ib_cq_handle_t cq_handle, IN void *user_context) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; DAPL_EVD_STATE state; dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK, "dapl_evd_dto_callback(%p, %p, %p)\n", hca_handle, cq_handle, user_context); evd_ptr = (DAPL_EVD *) user_context; DAPL_CNTR(evd_ptr, DCNT_EVD_DTO_CALLBACK); dapl_os_assert(hca_handle == evd_ptr->header.owner_ia->hca_ptr->ib_hca_handle); dapl_os_assert(evd_ptr->ib_cq_handle == cq_handle); dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD); /* Read once. */ state = *(volatile DAPL_EVD_STATE *)&evd_ptr->evd_state; dapl_dbg_log(DAPL_DBG_TYPE_EVD, "-- dapl_evd_dto_callback: CQ %p, state %x\n", (void *)evd_ptr->ib_cq_handle, state); /* * This function does not dequeue from the CQ; only the consumer * can do that. Instead, it wakes up waiters if any exist. * It rearms the completion only if completions should always occur * (specifically if a CNO is associated with the EVD and the * EVD is enabled. */ if (state == DAPL_EVD_STATE_WAITED) { /* * If we could, it would be best to avoid this wakeup * (and the context switch) unless the number of events/CQs * waiting for the waiter was its threshold. We don't * currently have the ability to determine that without * dequeueing the events, and we can't do that for * synchronization reasons (racing with the waiter waking * up and dequeuing, sparked by other callbacks). */ /* * We don't need to worry about taking the lock for the * wakeup because wakeups are sticky. */ dapls_evd_dto_wakeup(evd_ptr); } else if (state == DAPL_EVD_STATE_OPEN) { DAPL_CNO *cno = evd_ptr->cno_ptr; if (evd_ptr->evd_enabled && (evd_ptr->cno_ptr != NULL)) { /* * Re-enable callback, *then* trigger. * This guarantees we won't miss any events. */ dat_status = dapls_ib_completion_notify(hca_handle, evd_ptr, IB_NOTIFY_ON_NEXT_COMP); if (DAT_SUCCESS != dat_status) { dapl_log(DAPL_DBG_TYPE_WARN, " -- %s notify ERR, CQ %p, st %x\n", __FUNCTION__, (void *)evd_ptr->ib_cq_handle, state); (void)dapls_evd_post_async_error_event(evd_ptr-> header. owner_ia-> async_error_evd, DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR, (DAT_IA_HANDLE) evd_ptr-> header. owner_ia); } dapl_internal_cno_trigger(cno, evd_ptr); } } dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_evd_dto_callback () returns\n"); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_free.c000077500000000000000000000070471255317474200176170ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_free.c * * PURPOSE: Event management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_ia_util.h" #include "dapl_cno_util.h" /* for __KDAPL__ */ /* * dapl_evd_free * * DAPL Requirements Version xxx, 6.3.2.2 * * Destroy a specific instance of the Event Dispatcher * * Input: * evd_handle * * Output: * None * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_evd_free(IN DAT_EVD_HANDLE evd_handle) { DAPL_EVD *evd_ptr; DAPL_CNO *cno_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_evd_free (%p)\n", evd_handle); dat_status = DAT_SUCCESS; evd_ptr = (DAPL_EVD *) evd_handle; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } DAPL_CNTR(evd_ptr->header.owner_ia, DCNT_IA_EVD_FREE); if (dapl_os_atomic_read(&evd_ptr->evd_ref_count) != 0) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE); goto bail; } /* obtain the cno_ptr before the evd is released, which must occur * before deallocating the CNO */ cno_ptr = evd_ptr->cno_ptr; dapl_ia_unlink_evd(evd_ptr->header.owner_ia, evd_ptr); dat_status = dapls_evd_dealloc(evd_ptr); if (dat_status != DAT_SUCCESS) { dapl_ia_link_evd(evd_ptr->header.owner_ia, evd_ptr); } #if defined(__KDAPL__) if (cno_ptr != NULL) { if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) > 0 || cno_ptr->cno_waiters > 0) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_IN_USE); goto bail; } dapl_ia_unlink_cno(cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc(cno_ptr); } #else if (cno_ptr != NULL) { if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) == 0 && cno_ptr->cno_waiters > 0) { /* * Last reference on the CNO, trigger a notice. See * uDAPL 1.1 spec 6.3.2.3 */ dapl_internal_cno_trigger(cno_ptr, NULL); } } #endif /* defined(__KDAPL__) */ bail: if (dat_status) dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_evd_free () returns 0x%x\n", dat_status); return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_post_se.c000066400000000000000000000052211255317474200203370ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_post_se.c * * PURPOSE: Event Management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_ia_util.h" /* * dapl_evd_post_se * * DAPL Requirements Version xxx, 6.3.2.7 * * Post a software event to the Event Dispatcher event queue. * * Input: * evd_handle * event * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_evd_post_se(DAT_EVD_HANDLE evd_handle, const DAT_EVENT * event) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } /* Only post to EVDs that are specific to software events */ if (!(evd_ptr->evd_flags & DAT_EVD_SOFTWARE_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); goto bail; } if (!event) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } if (event->event_number != DAT_SOFTWARE_EVENT) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } dat_status = dapls_evd_post_software_event(evd_ptr, DAT_SOFTWARE_EVENT, event->event_data. software_event_data.pointer); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_evd_qp_async_error_callb.c000066400000000000000000000072111255317474200230470ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_qp_async_error_callback.c * * PURPOSE: implements QP callbacks from verbs * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_adapter_util.h" /* * dapl_evd_qp_async_error_callback * * The callback function registered with verbs for qp async erros * * Input: * ib_cm_handle, * ib_cm_event * cause_ptr * context (evd) * * Output: * None * */ void dapl_evd_qp_async_error_callback(IN ib_hca_handle_t ib_hca_handle, IN ib_qp_handle_t ib_qp_handle, IN ib_error_record_t * cause_ptr, IN void *context) { DAPL_IA *ia_ptr; DAPL_EP *ep_ptr; DAPL_EVD *async_evd; DAT_EVENT_NUMBER async_event; DAT_RETURN dat_status; #ifdef _VENDOR_IBAL_ dapl_dbg_log(DAPL_DBG_TYPE_EXCEPTION, "%s() IB err %s\n", __FUNCTION__, ib_get_async_event_str(cause_ptr->code)); #else dapl_dbg_log(DAPL_DBG_TYPE_EXCEPTION, "%s() IB async QP err - ctx=%p\n", __FUNCTION__, context); #endif ep_ptr = (DAPL_EP *) context; if (!ep_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "%s() NULL context?\n", __FUNCTION__); return; } ia_ptr = ep_ptr->header.owner_ia; async_evd = (DAPL_EVD *) ia_ptr->async_error_evd; DAPL_CNTR(ia_ptr, DCNT_IA_ASYNC_QP_ERROR); dapl_log(DAPL_DBG_TYPE_EXCEPTION, " -- %s: ep %p qp %p (%x) state %d\n", __FUNCTION__, ep_ptr, ep_ptr->qp_handle, ep_ptr->qpn, ep_ptr->param.ep_state); /* * Transition to ERROR if we are connected; other states need to * complete first (e.g. pending states) unless it's SRQ LAST_WQE_REACHED * which is a regular async event in case of disconnect. */ if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED) { if (!ep_ptr->param.srq_handle || cause_ptr->event_type != IBV_EVENT_QP_LAST_WQE_REACHED) { dapl_os_lock(&ep_ptr->header.lock); ep_ptr->param.ep_state = DAT_EP_STATE_ERROR; dapl_os_unlock(&ep_ptr->header.lock); } } dapl_os_assert(async_evd != NULL); dat_status = dapls_ib_get_async_event(cause_ptr, &async_event); if (dat_status == DAT_SUCCESS) { /* * If dapls_ib_get_async_event is not successful, * an event has been generated by the provide that * we are not interested in. */ (void)dapls_evd_post_async_error_event(async_evd, async_event, (DAT_HANDLE) ep_ptr); } dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION, "%s() returns\n", __FUNCTION__); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_resize.c000066400000000000000000000067361255317474200202000ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_resize.c * * PURPOSE: EVENT management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_ring_buffer_util.h" #include "dapl_adapter_util.h" /* * dapl_evd_resize * * DAPL Requirements Version xxx, 6.3.2.5 * * Modify the size of the event queue of an Event Dispatcher * * Input: * evd_handle * evd_qlen * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_evd_resize(IN DAT_EVD_HANDLE evd_handle, IN DAT_COUNT evd_qlen) { DAPL_IA *ia_ptr; DAPL_EVD *evd_ptr; DAT_COUNT pend_cnt; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_evd_resize (%p, %d)\n", evd_handle, evd_qlen); if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); goto bail; } evd_ptr = (DAPL_EVD *) evd_handle; ia_ptr = evd_ptr->header.owner_ia; if (evd_qlen == evd_ptr->qlen) { dat_status = DAT_SUCCESS; goto bail; } if (evd_qlen > ia_ptr->hca_ptr->ia_attr.max_evd_qlen) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } dapl_os_lock(&evd_ptr->header.lock); /* Don't try to resize if we are actively waiting */ if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED) { dapl_os_unlock(&evd_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); goto bail; } pend_cnt = dapls_rbuf_count(&evd_ptr->pending_event_queue); if (pend_cnt > evd_qlen) { dapl_os_unlock(&evd_ptr->header.lock); dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); goto bail; } if (evd_ptr->ib_cq_handle) { dat_status = dapls_ib_cq_resize(evd_ptr->header.owner_ia, evd_ptr, &evd_qlen); if (dat_status != DAT_SUCCESS) { dapl_os_unlock(&evd_ptr->header.lock); goto bail; } } dat_status = dapls_evd_event_realloc(evd_ptr, evd_qlen); if (dat_status != DAT_SUCCESS) { dapl_os_unlock(&evd_ptr->header.lock); goto bail; } dapl_os_unlock(&evd_ptr->header.lock); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_un_async_error_callb.c000066400000000000000000000045641255317474200230610ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_un_async_error_callback.c * * PURPOSE: implements Unaffiliated callbacks from verbs * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_adapter_util.h" /* * dapl_evd_un_async_error_callback * * The callback function registered with verbs for unaffiliated async errors * * Input: * ib_cm_handle, * ib_cm_event * cause_ptr * context (evd) * * Output: * None * */ void dapl_evd_un_async_error_callback(IN ib_hca_handle_t ib_hca_handle, IN ib_error_record_t * cause_ptr, IN void *context) { DAPL_EVD *async_evd; DAT_EVENT_NUMBER async_event; DAT_RETURN dat_status; if (NULL == context) { dapl_os_panic("NULL == context\n"); return; } async_evd = (DAPL_EVD *) context; DAPL_CNTR(async_evd->header.owner_ia, DCNT_IA_ASYNC_ERROR); dat_status = dapls_ib_get_async_event(cause_ptr, &async_event); if (dat_status == DAT_SUCCESS) { /* * If dapls_ib_get_async_event is not successful, * an event has been generated by the provider that * we are not interested in. E.g. LINK_UP. */ dapls_evd_post_async_error_event(async_evd, async_event, async_evd->header.owner_ia); } } dapl-2.1.5/dapl/common/dapl_evd_util.c000066400000000000000000001123221255317474200176410ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_util.c * * PURPOSE: Manage EVD Info structure * * $Id: dapl_evd_util.c 1410 2006-07-19 17:12:02Z ardavis $ **********************************************************************/ #include "dapl_evd_util.h" #include "dapl_ia_util.h" #include "dapl_cno_util.h" #include "dapl_ring_buffer_util.h" #include "dapl_adapter_util.h" #include "dapl_cookie.h" #include "dapl.h" #include "dapl_cr_util.h" #include "dapl_sp_util.h" #include "dapl_ep_util.h" STATIC _INLINE_ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe); DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen); char *dapl_event_str(IN DAT_EVENT_NUMBER event_num) { #if defined(DAPL_DBG) struct dat_event_str { char *str; DAT_EVENT_NUMBER num; }; static struct dat_event_str events[] = { {"DAT_DTO_COMPLETION_EVENT", DAT_DTO_COMPLETION_EVENT}, {"DAT_RMR_BIND_COMPLETION_EVENT", DAT_RMR_BIND_COMPLETION_EVENT}, {"DAT_CONNECTION_REQUEST_EVENT", DAT_CONNECTION_REQUEST_EVENT}, {"DAT_CONNECTION_EVENT_ESTABLISHED", DAT_CONNECTION_EVENT_ESTABLISHED}, {"DAT_CONNECTION_EVENT_PEER_REJECTED", DAT_CONNECTION_EVENT_PEER_REJECTED}, {"DAT_CONNECTION_EVENT_NON_PEER_REJECTED", DAT_CONNECTION_EVENT_NON_PEER_REJECTED}, {"DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR", DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR}, {"DAT_CONNECTION_EVENT_DISCONNECTED", DAT_CONNECTION_EVENT_DISCONNECTED}, {"DAT_CONNECTION_EVENT_BROKEN", DAT_CONNECTION_EVENT_BROKEN}, {"DAT_CONNECTION_EVENT_TIMED_OUT", DAT_CONNECTION_EVENT_TIMED_OUT}, {"DAT_CONNECTION_EVENT_UNREACHABLE", DAT_CONNECTION_EVENT_UNREACHABLE}, {"DAT_ASYNC_ERROR_EVD_OVERFLOW", DAT_ASYNC_ERROR_EVD_OVERFLOW}, {"DAT_ASYNC_ERROR_IA_CATASTROPHIC", DAT_ASYNC_ERROR_IA_CATASTROPHIC}, {"DAT_ASYNC_ERROR_EP_BROKEN", DAT_ASYNC_ERROR_EP_BROKEN}, {"DAT_ASYNC_ERROR_TIMED_OUT", DAT_ASYNC_ERROR_TIMED_OUT}, {"DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR", DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR}, {"DAT_HA_DOWN_TO_1", DAT_HA_DOWN_TO_1}, {"DAT_HA_UP_TO_MULTI_PATH", DAT_HA_UP_TO_MULTI_PATH}, {"DAT_SOFTWARE_EVENT", DAT_SOFTWARE_EVENT}, #ifdef DAT_EXTENSIONS {"DAT_EXTENSION_EVENT", DAT_EXTENSION_EVENT}, {"DAT_IB_DTO_EVENT", DAT_IB_EXTENSION_RANGE_BASE}, {"DAT_IB_UD_CONNECTION_REQUEST_EVENT", DAT_IB_EXTENSION_RANGE_BASE + 1}, {"DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED", DAT_IB_EXTENSION_RANGE_BASE + 2}, {"DAT_IB_UD_CONNECTION_REJECT_EVENT", DAT_IB_EXTENSION_RANGE_BASE + 3}, {"DAT_IB_UD_CONNECTION_ERROR_EVENT", DAT_IB_EXTENSION_RANGE_BASE + 4}, {"DAT_IB_COLLECTIVE_EVENT", DAT_IB_EXTENSION_RANGE_BASE + 5}, {"DAT_IW_EXTENSION_RANGE_BASE", DAT_IW_EXTENSION_RANGE_BASE}, #endif /* DAT_EXTENSIONS */ {NULL, 0}, }; int i; for (i = 0; events[i].str; i++) { if (events[i].num == event_num) return events[i].str; } return "Unknown DAT event?"; #else static char str[16]; sprintf(str, "%x", event_num); return str; #endif } /* * dapls_evd_internal_create * * actually create the evd. this is called after all parameter checking * has been performed in dapl_ep_create. it is also called from dapl_ia_open * to create the default async evd. * * Input: * ia_ptr * cno_ptr * qlen * evd_flags * * Output: * evd_ptr_ptr * * Returns: * none * */ DAT_RETURN dapls_evd_internal_create(DAPL_IA * ia_ptr, DAPL_CNO * cno_ptr, DAT_COUNT min_qlen, DAT_EVD_FLAGS evd_flags, DAPL_EVD ** evd_ptr_ptr) { DAPL_EVD *evd_ptr; DAT_COUNT cq_len; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; *evd_ptr_ptr = NULL; cq_len = min_qlen; evd_ptr = dapls_evd_alloc(ia_ptr, cno_ptr, evd_flags, min_qlen); if (!evd_ptr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* Before we setup any callbacks, transition state to OPEN. */ evd_ptr->evd_state = DAPL_EVD_STATE_OPEN; if (evd_flags & DAT_EVD_ASYNC_FLAG) { /* * There is no cq associate with async evd. Set it to invalid */ evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; } else if (0 != (evd_flags & ~(DAT_EVD_SOFTWARE_FLAG | DAT_EVD_CONNECTION_FLAG | DAT_EVD_CR_FLAG))) { #if defined(_VENDOR_IBAL_) /* * The creation of CQ required a PD (PZ) associated with it and * we do not have a PD here; therefore, the work-around is that we * will postpone the creation of the cq till the creation of QP which * this cq will associate with. */ evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; #else dat_status = dapls_ib_cq_alloc(ia_ptr, evd_ptr, &cq_len); if (dat_status != DAT_SUCCESS) { goto bail; } /* Now reset the cq_len in the attributes, it may have changed */ evd_ptr->qlen = cq_len; dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_CQ_COMPLETION, evd_ptr, (ib_async_handler_t) dapl_evd_dto_callback, evd_ptr); if (dat_status != DAT_SUCCESS) { goto bail; } dat_status = dapls_set_cq_notify(ia_ptr, evd_ptr); if (dat_status != DAT_SUCCESS) { goto bail; } #endif /* _VENDOR_IBAL_ */ } /* We now have an accurate count of events, so allocate them into * the EVD */ dat_status = dapli_evd_event_alloc(evd_ptr, cq_len); if (dat_status != DAT_SUCCESS) { goto bail; } dapl_ia_link_evd(ia_ptr, evd_ptr); *evd_ptr_ptr = evd_ptr; bail: if (dat_status != DAT_SUCCESS) { if (evd_ptr) { dapls_evd_dealloc(evd_ptr); } } return dat_status; } /* * dapls_evd_alloc * * alloc and initialize an EVD struct * * Input: * ia * * Output: * evd_ptr * * Returns: * none * */ DAPL_EVD *dapls_evd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_CNO * cno_ptr, IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen) { DAPL_EVD *evd_ptr; /* Allocate EVD */ evd_ptr = (DAPL_EVD *) dapl_os_alloc(sizeof(DAPL_EVD)); if (!evd_ptr) { goto bail; } /* zero the structure */ dapl_os_memzero(evd_ptr, sizeof(DAPL_EVD)); #ifdef DAPL_COUNTERS /* Allocate counters */ evd_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS); if (evd_ptr->cntrs == NULL) { dapl_os_free(evd_ptr, sizeof(DAPL_EVD)); return (NULL); } dapl_os_memzero(evd_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS); #endif /* DAPL_COUNTERS */ /* * initialize the header */ evd_ptr->header.provider = ia_ptr->header.provider; evd_ptr->header.magic = DAPL_MAGIC_EVD; evd_ptr->header.handle_type = DAT_HANDLE_TYPE_EVD; evd_ptr->header.owner_ia = ia_ptr; evd_ptr->header.user_context.as_64 = 0; evd_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&evd_ptr->header.ia_list_entry); dapl_os_lock_init(&evd_ptr->header.lock); /* * Initialize the body */ evd_ptr->evd_state = DAPL_EVD_STATE_INITIAL; evd_ptr->evd_flags = evd_flags; evd_ptr->evd_enabled = DAT_TRUE; evd_ptr->evd_waitable = DAT_TRUE; evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; dapl_os_atomic_set(&evd_ptr->evd_ref_count, 0); evd_ptr->catastrophic_overflow = DAT_FALSE; evd_ptr->qlen = qlen; evd_ptr->completion_type = DAPL_EVD_STATE_THRESHOLD; /* FIXME: should be DAPL_EVD_STATE_INIT */ dapl_os_wait_object_init(&evd_ptr->wait_object); evd_ptr->cno_active_count = 0; if (cno_ptr != NULL) { /* Take a reference count on the CNO */ dapl_os_atomic_inc(&cno_ptr->cno_ref_count); } evd_ptr->cno_ptr = cno_ptr; bail: return evd_ptr; } /* * dapls_evd_event_alloc * * alloc events into an EVD. * * Input: * evd_ptr * qlen * * Output: * NONE * * Returns: * DAT_SUCCESS * ERROR * */ DAT_RETURN dapli_evd_event_alloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen) { DAT_EVENT *event_ptr; DAT_COUNT i; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; /* Allocate EVENTs */ event_ptr = (DAT_EVENT *) dapl_os_alloc(evd_ptr->qlen * sizeof(DAT_EVENT)); if (event_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } evd_ptr->events = event_ptr; /* allocate free event queue */ dat_status = dapls_rbuf_alloc(&evd_ptr->free_event_queue, qlen); if (dat_status != DAT_SUCCESS) { goto bail; } /* allocate pending event queue */ dat_status = dapls_rbuf_alloc(&evd_ptr->pending_event_queue, qlen); if (dat_status != DAT_SUCCESS) { goto bail; } /* add events to free event queue */ for (i = 0; i < evd_ptr->qlen; i++) { dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)event_ptr); event_ptr++; } evd_ptr->cq_notified = DAT_FALSE; evd_ptr->cq_notified_when = 0; evd_ptr->threshold = 0; bail: return dat_status; } /* * dapls_evd_event_realloc * * realloc events into an EVD. * * Input: * evd_ptr * qlen * * Output: * NONE * * Returns: * DAT_SUCCESS * ERROR * */ DAT_RETURN dapls_evd_event_realloc(IN DAPL_EVD * evd_ptr, IN DAT_COUNT qlen) { DAT_EVENT *events; DAT_COUNT old_qlen; DAT_COUNT i; intptr_t diff; DAT_RETURN dat_status; /* Allocate EVENTs */ events = (DAT_EVENT *) dapl_os_realloc(evd_ptr->events, qlen * sizeof(DAT_EVENT)); if (NULL == events) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } diff = events - evd_ptr->events; evd_ptr->events = events; old_qlen = evd_ptr->qlen; evd_ptr->qlen = qlen; /* reallocate free event queue */ dat_status = dapls_rbuf_realloc(&evd_ptr->free_event_queue, qlen); if (dat_status != DAT_SUCCESS) { goto bail; } dapls_rbuf_adjust(&evd_ptr->free_event_queue, diff); /* reallocate pending event queue */ dat_status = dapls_rbuf_realloc(&evd_ptr->pending_event_queue, qlen); if (dat_status != DAT_SUCCESS) { goto bail; } dapls_rbuf_adjust(&evd_ptr->pending_event_queue, diff); /* * add new events to free event queue. */ for (i = old_qlen; i < qlen; i++) { dapls_rbuf_add(&evd_ptr->free_event_queue, (void *)&events[i]); } bail: return dat_status; } /* * dapls_evd_dealloc * * Free the passed in EVD structure. If an error occurs, this function * will clean up all of the internal data structures and report the * error. * * Input: * evd_ptr * * Output: * none * * Returns: * status * */ DAT_RETURN dapls_evd_dealloc(IN DAPL_EVD * evd_ptr) { DAT_RETURN dat_status; DAPL_IA *ia_ptr; dat_status = DAT_SUCCESS; dapl_os_assert(evd_ptr->header.magic == DAPL_MAGIC_EVD); dapl_os_assert(dapl_os_atomic_read(&evd_ptr->evd_ref_count) == 0); /* * Destroy the CQ first, to keep any more callbacks from coming * up from it. */ evd_ptr->evd_enabled = DAT_FALSE; if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { ia_ptr = evd_ptr->header.owner_ia; dat_status = dapls_ib_cq_free(ia_ptr, evd_ptr); if (dat_status != DAT_SUCCESS) { goto bail; } } /* * We should now be safe to invalidate the EVD; reset the * magic to prevent reuse. */ evd_ptr->header.magic = DAPL_MAGIC_INVALID; /* Release reference on the CNO if it exists */ if (evd_ptr->cno_ptr != NULL) { dapl_os_atomic_dec(&evd_ptr->cno_ptr->cno_ref_count); evd_ptr->cno_ptr = NULL; } /* If the ring buffer allocation failed, then the dapls_rbuf_destroy */ /* function will detect that the ring buffer's internal data (ex. base */ /* pointer) are invalid and will handle the situation appropriately */ dapls_rbuf_destroy(&evd_ptr->free_event_queue); dapls_rbuf_destroy(&evd_ptr->pending_event_queue); if (evd_ptr->events) { dapl_os_free(evd_ptr->events, evd_ptr->qlen * sizeof(DAT_EVENT)); } dapl_os_wait_object_destroy(&evd_ptr->wait_object); #ifdef DAPL_COUNTERS dapl_os_free(evd_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_EVD_ALL_COUNTERS); #endif /* DAPL_COUNTERS */ dapl_os_free(evd_ptr, sizeof(DAPL_EVD)); bail: return dat_status; } STATIC _INLINE_ char *DAPL_GET_DTO_OP_STR(int op) { static char *dto_ops[] = { "OP_SEND", "OP_RECEIVE", "OP_RDMA_WRITE", "OP_RDMA_READ" }; return ((op < 0 || op > 3) ? "Invalid DTO OP?" : dto_ops[op]); } #if !defined(DAPL_GET_CQE_OP_STR) #define DAPL_GET_CQE_OP_STR(e) "Unknown CEQ OP String?" #endif #if !defined(DAPL_GET_CQE_VENDOR_ERR) #define DAPL_GET_CQE_VENDOR_ERR(e) 0 #endif /* * dapli_evd_eh_print_cqe * * Input: * cqe_ptr * * Output: * none * * Prints out a CQE for debug purposes * */ void dapli_evd_eh_print_cqe(IN ib_work_completion_t * cqe_ptr) { #ifdef DAPL_DBG dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK, "DTO CQE: WR 0x%llx op %s ln %d stat %d vn 0x%x\n", DAPL_GET_CQE_WRID(cqe_ptr), DAPL_GET_CQE_OP_STR(cqe_ptr), DAPL_GET_CQE_BYTESNUM(cqe_ptr), DAPL_GET_CQE_STATUS(cqe_ptr), DAPL_GET_CQE_VENDOR_ERR(cqe_ptr)); #endif return; } /* * Event posting code follows. */ /* dapli_evd_post_event * * Post the to the evd. If possible, invoke the evd's CNO. * Otherwise post the event on the pending queue. * * Input: * evd_ptr * event * * Output: * none * */ static void dapli_evd_post_event(IN DAPL_EVD * evd_ptr, IN const DAT_EVENT * event_ptr) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_EVD, "%s: %s evd %p state %d\n", __FUNCTION__, dapl_event_str(event_ptr->event_number), evd_ptr, evd_ptr->evd_state); dat_status = dapls_rbuf_add(&evd_ptr->pending_event_queue, (void *)event_ptr); dapl_os_assert(dat_status == DAT_SUCCESS); dapl_os_assert(evd_ptr->evd_state == DAPL_EVD_STATE_WAITED || evd_ptr->evd_state == DAPL_EVD_STATE_OPEN); if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) { /* No waiter. Arrange to trigger a CNO if it exists. */ if (evd_ptr->evd_enabled && evd_ptr->cno_ptr) dapl_internal_cno_trigger(evd_ptr->cno_ptr, evd_ptr); } else { if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED && (dapls_rbuf_count(&evd_ptr->pending_event_queue) >= evd_ptr->threshold)) { if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) { dapls_evd_dto_wakeup(evd_ptr); } else { dapl_os_wait_object_wakeup(&evd_ptr->wait_object); } } } } static DAT_EVENT *dapli_evd_get_and_init_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number) { DAT_EVENT *event_ptr; event_ptr = (DAT_EVENT *) dapls_rbuf_remove(&evd_ptr->free_event_queue); if (event_ptr) { event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr; event_ptr->event_number = event_number; } return event_ptr; } /* dapls_evd_post_overflow_event * * post an overflow event * * Input: * async_evd_ptr * evd_ptr * * Output: * none * */ void dapls_evd_post_overflow_event(IN DAPL_EVD * evd_ptr) { DAPL_EVD *async_evd_ptr = evd_ptr->header.owner_ia->async_error_evd; DAT_EVENT *event_ptr; dapl_log(DAPL_DBG_TYPE_WARN, " WARNING: overflow event on EVD %p\n", evd_ptr); dapl_os_lock(&async_evd_ptr->header.lock); /* The overflow evd_ptr mght be the same as the async evd. * In that case we've got a catastrophic overflow. */ if (async_evd_ptr == evd_ptr) goto err; event_ptr = dapli_evd_get_and_init_event(async_evd_ptr, DAT_ASYNC_ERROR_EVD_OVERFLOW); if (!event_ptr) goto err; event_ptr->event_data.asynch_error_event_data.dat_handle = (DAT_HANDLE) evd_ptr->header.owner_ia; dapli_evd_post_event(async_evd_ptr, event_ptr); dapl_os_unlock(&async_evd_ptr->header.lock); return; err: async_evd_ptr->catastrophic_overflow = DAT_TRUE; async_evd_ptr->evd_state = DAPL_EVD_STATE_DEAD; dapl_os_unlock(&async_evd_ptr->header.lock); } DAT_RETURN dapls_evd_post_cr_arrival_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_SP_HANDLE sp_handle, DAT_IA_ADDRESS_PTR ia_address_ptr, DAT_CONN_QUAL conn_qual, DAT_CR_HANDLE cr_handle) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.cr_arrival_event_data.sp_handle = sp_handle; event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr = ia_address_ptr; event_ptr->event_data.cr_arrival_event_data.conn_qual = conn_qual; event_ptr->event_data.cr_arrival_event_data.cr_handle = cr_handle; dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } DAT_RETURN dapls_evd_post_connection_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN DAT_PVOID private_data) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.connect_event_data.ep_handle = ep_handle; event_ptr->event_data.connect_event_data.private_data_size = private_data_size; event_ptr->event_data.connect_event_data.private_data = private_data; dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } DAT_RETURN dapls_evd_post_async_error_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_IA_HANDLE ia_handle) { DAT_EVENT *event_ptr; dapl_log(DAPL_DBG_TYPE_EXCEPTION, " async event - %s evd=%p\n", dapl_event_str(event_number), evd_ptr); dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.asynch_error_event_data.dat_handle = (DAT_HANDLE) ia_handle; dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } DAT_RETURN dapls_evd_post_software_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_PVOID pointer) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.software_event_data.pointer = pointer; dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } /* * dapls_evd_post_generic_event * * Post a generic event type. Not used by all providers * * Input: * evd_ptr * event_number * data * * Output: * none * * Returns: * DAT_SUCCESS * */ DAT_RETURN dapls_evd_post_generic_event(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EVENT_DATA * data) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data = *data; dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } #ifdef DAT_EXTENSIONS /* * dapls_evd_post_event_ext * * Post a extended event type. Not used by all providers * * Input: * evd_ptr * event_number * data * data_ext * * Output: * none * * Returns: * DAT_SUCCESS * */ DAT_RETURN dapls_evd_post_event_ext(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EVENT_DATA * data, IN DAT_UINT64 * data_ext) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); /* * Note event lock may be held on successful return * to be released by dapli_evd_post_event(), if provider side locking * is needed. */ if (event_ptr == NULL) { dapl_os_unlock(&evd_ptr->header.lock); return DAT_ERROR(DAT_QUEUE_FULL,0); } /* copy event and extended data */ if (data) event_ptr->event_data = *data; else dapl_os_memzero(&event_ptr->event_data, sizeof(event_ptr->event_data)); dapl_os_memcpy( (void*)event_ptr->event_extension_data, (void *)data_ext, sizeof(event_ptr->event_extension_data)); dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; } DAT_RETURN dapls_evd_do_post_cr_event_ext(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAPL_SP *sp_ptr, IN DAPL_CR *cr_ptr, IN DAT_PVOID ext_data) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.cr_arrival_event_data.sp_handle.psp_handle = (DAT_PSP_HANDLE) sp_ptr; event_ptr->event_data.cr_arrival_event_data.local_ia_address_ptr = (DAT_IA_ADDRESS_PTR) &sp_ptr->header.owner_ia->hca_ptr->hca_address; event_ptr->event_data.cr_arrival_event_data.conn_qual = sp_ptr->conn_qual; event_ptr->event_data.cr_arrival_event_data.cr_handle = (DAT_CR_HANDLE) cr_ptr; dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64); dapli_evd_post_event(sp_ptr->evd_handle, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } DAT_RETURN dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr, IN DAT_EVENT_NUMBER event_number, IN dp_ib_cm_handle_t ib_cm_handle, IN DAT_COUNT p_size, IN DAT_PVOID p_data, IN DAT_PVOID ext_data) { DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; int reason = DAT_CONNECTION_EVENT_BROKEN; dapl_os_lock(&sp_ptr->header.lock); if (sp_ptr->listening == DAT_FALSE) { dapl_os_unlock(&sp_ptr->header.lock); reason = DAT_CONNECTION_EVENT_UNREACHABLE; goto bail; } /* * RSP connections only allow a single connection. Close * it down NOW so we reject any further connections. */ if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP) sp_ptr->listening = DAT_FALSE; dapl_os_unlock(&sp_ptr->header.lock); /* allocate new connect request */ cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia); if (cr_ptr == NULL) goto bail; /* Set up the CR */ cr_ptr->sp_ptr = sp_ptr; /* maintain sp_ptr in case of reject */ cr_ptr->param.remote_port_qual = 0; cr_ptr->ib_cm_handle = ib_cm_handle; cr_ptr->param.remote_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & cr_ptr->remote_ia_address; /* * Copy the remote address and private data out of the private_data */ cr_ptr->param.private_data = cr_ptr->private_data; cr_ptr->param.private_data_size = p_size; if (p_size) dapl_os_memcpy(cr_ptr->private_data, p_data, p_size); /* EP will be NULL unless RSP service point */ ep_ptr = (DAPL_EP *) sp_ptr->ep_handle; if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) { DAPL_IA *ia_ptr; /* * Never true for RSP connections * * Create an EP for the user. If we can't allocate an * EP we are out of resources and need to tell the * requestor that we cant help them. */ ia_ptr = sp_ptr->header.owner_ia; ep_ptr = dapl_ep_alloc(ia_ptr, NULL, DAT_FALSE); if (ep_ptr == NULL) { dapls_cr_free(cr_ptr); goto bail; } ep_ptr->param.ia_handle = ia_ptr; ep_ptr->param.local_ia_address_ptr = (DAT_IA_ADDRESS_PTR) & ia_ptr->hca_ptr->hca_address; /* Link the EP onto the IA */ dapl_ia_link_ep(ia_ptr, ep_ptr); } cr_ptr->param.local_ep_handle = ep_ptr; if (ep_ptr != NULL) { /* Assign valid EP fields: RSP and PSP_PROVIDER_FLAG only */ if (sp_ptr->psp_flags == DAT_PSP_PROVIDER_FLAG) { ep_ptr->param.ep_state = DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING; } else { /* RSP */ dapl_os_assert(sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP); ep_ptr->param.ep_state = DAT_EP_STATE_PASSIVE_CONNECTION_PENDING; } dapl_ep_link_cm(ep_ptr, ib_cm_handle); } /* link the CR onto the SP so we can pick it up later */ dapl_sp_link_cr(sp_ptr, cr_ptr); if (dapls_evd_do_post_cr_event_ext(sp_ptr->evd_handle, event_number, sp_ptr, cr_ptr, ext_data) == DAT_SUCCESS) { return DAT_SUCCESS; } /* error: take CR off the list, we can't use it */ dapl_os_lock(&sp_ptr->header.lock); dapl_sp_remove_cr(sp_ptr, cr_ptr); dapl_os_unlock(&sp_ptr->header.lock); dapls_cr_free(cr_ptr); bail: dapl_log(DAPL_DBG_TYPE_WARN, " cr_event_ext: ERROR reason = 0x%x\n", reason); (void)dapls_ib_reject_connection(ib_cm_handle, reason, 0, NULL); return DAT_INTERNAL_ERROR; } DAT_RETURN dapls_evd_post_connection_event_ext(IN DAPL_EVD * evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN DAT_PVOID private_data, IN DAT_PVOID ext_data) { DAT_EVENT *event_ptr; dapl_os_lock(&evd_ptr->header.lock); event_ptr = dapli_evd_get_and_init_event(evd_ptr, event_number); if (event_ptr == NULL) goto err; event_ptr->event_data.connect_event_data.ep_handle = ep_handle; event_ptr->event_data.connect_event_data.private_data_size = private_data_size; event_ptr->event_data.connect_event_data.private_data = private_data; dapl_os_memcpy(&event_ptr->event_extension_data[0], ext_data, 64); dapli_evd_post_event(evd_ptr, event_ptr); dapl_os_unlock(&evd_ptr->header.lock); return DAT_SUCCESS; err: dapl_os_unlock(&evd_ptr->header.lock); dapls_evd_post_overflow_event(evd_ptr); return DAT_ERROR(DAT_QUEUE_FULL, 0); } #endif /* * dapli_evd_cqe_to_event * * Convert a CQE into an event structure. * * Input: * evd_ptr * cqe_ptr * * Output: * event_ptr * * Returns: * none * */ static void dapli_evd_cqe_to_event(IN DAPL_EVD * evd_ptr, IN void *cqe_ptr, OUT DAT_EVENT * event_ptr) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie; DAT_DTO_COMPLETION_STATUS dto_status; DAPL_COOKIE_BUFFER *buffer; DAPL_SRQ *srq_ptr = NULL; /* * All that can be relied on if the status is bad is the status * and WRID. */ dto_status = dapls_ib_get_dto_status(cqe_ptr); cookie = (DAPL_COOKIE *) (uintptr_t) DAPL_GET_CQE_WRID(cqe_ptr); dapl_os_assert((NULL != cookie)); /* In case of RECV SRQ DTO cookie->ep holds pointer to the SRQ */ ep_ptr = cookie->ep; dapl_os_assert((NULL != ep_ptr)); dapls_io_trc_update_completion(ep_ptr, cookie, dto_status); event_ptr->evd_handle = (DAT_EVD_HANDLE) evd_ptr; switch (cookie->type) { case DAPL_COOKIE_TYPE_DTO: { #ifdef DAT_EXTENSIONS /* Extended via request post or message receive */ if ((cookie->val.dto.type == DAPL_DTO_TYPE_EXTENSION) || (cookie->val.dto.type == DAPL_DTO_TYPE_RECV && DAPL_GET_CQE_OPTYPE(cqe_ptr) != OP_RECEIVE)) { dapls_cqe_to_event_extension(ep_ptr, cookie, cqe_ptr, event_ptr); if (cookie->val.dto.type == DAPL_DTO_TYPE_RECV) dapls_cookie_dealloc(&ep_ptr-> recv_buffer, cookie); else dapls_cookie_dealloc(&ep_ptr-> req_buffer, cookie); break; } #endif if (DAPL_DTO_TYPE_RECV_SRQ == cookie->val.dto.type) { /* in SRQ event we do NOT have ep pointer */ srq_ptr = (DAPL_SRQ *)ep_ptr; buffer = &srq_ptr->recv_buffer; ep_ptr = NULL; } else if (DAPL_DTO_TYPE_RECV == cookie->val.dto.type) buffer = &ep_ptr->recv_buffer; else buffer = &ep_ptr->req_buffer; event_ptr->event_number = DAT_DTO_COMPLETION_EVENT; event_ptr->event_data.dto_completion_event_data. ep_handle = cookie->ep; event_ptr->event_data.dto_completion_event_data. user_cookie = cookie->val.dto.cookie; event_ptr->event_data.dto_completion_event_data.status = dto_status; if (cookie->val.dto.type == DAPL_DTO_TYPE_SEND || cookie->val.dto.type == DAPL_DTO_TYPE_RDMA_WRITE) { /* Get size from DTO; CQE value may be off. */ event_ptr->event_data.dto_completion_event_data. transfered_length = cookie->val.dto.size; } else { event_ptr->event_data.dto_completion_event_data. transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); } dapls_cookie_dealloc(buffer, cookie); if (srq_ptr) dapl_os_atomic_dec(&srq_ptr->recv_count); break; } case DAPL_COOKIE_TYPE_RMR: { event_ptr->event_number = DAT_RMR_BIND_COMPLETION_EVENT; event_ptr->event_data.rmr_completion_event_data. rmr_handle = cookie->val.rmr.rmr; event_ptr->event_data.rmr_completion_event_data. user_cookie = cookie->val.rmr.cookie; if (dto_status == DAT_DTO_SUCCESS) { event_ptr->event_data.rmr_completion_event_data. status = DAT_RMR_BIND_SUCCESS; dapl_os_assert((DAPL_GET_CQE_OPTYPE(cqe_ptr)) == OP_BIND_MW); } else { dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR, " MW bind completion ERROR: %d: op %#x ep: %p\n", dto_status, DAPL_GET_CQE_OPTYPE(cqe_ptr), ep_ptr); event_ptr->event_data.rmr_completion_event_data. status = DAT_RMR_OPERATION_FAILED; dapl_os_atomic_dec(&cookie->val.rmr.rmr->lmr-> lmr_ref_count); } dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); break; } default: { dapl_os_assert(!"Invalid Operation type"); break; } } /* end switch */ /* * Most error DTO ops result in disconnecting the EP. See * IBTA Vol 1.1, Chapter 10,Table 68, for expected effect on * state. */ if ((dto_status != DAT_DTO_SUCCESS) && (dto_status != DAT_DTO_ERR_FLUSHED)) { DAPL_EVD *evd_ptr; /* In SRQ case we need to look up the EP */ if (ep_ptr == NULL) { DAT_UINT32 qp_num = DAPL_GET_CQE_QP_NUM(cqe_ptr); DAPL_IA *ia_ptr = (DAPL_IA *)srq_ptr->param.ia_handle; dapl_os_lock(&ia_ptr->header.lock); ep_ptr = (dapl_llist_is_empty(&ia_ptr->ep_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->ep_list_head)); while (ep_ptr != NULL) { if (ep_ptr->qp_handle->qp->qp_num == qp_num) break; ep_ptr = dapl_llist_next_entry(&ia_ptr->ep_list_head, &ep_ptr->header. ia_list_entry); } dapl_os_unlock(&ia_ptr->header.lock); if (ep_ptr == NULL ) { dapl_dbg_log(DAPL_DBG_TYPE_DTO_COMP_ERR, " SRQ %p at ia %p - " "EP with qpn %d was not found\n", srq_ptr, ia_ptr, qp_num); return; } } /* * If we are connected, generate disconnect and generate an * event. We may be racing with other disconnect ops, so we * need to check. We may also be racing CM connection events, * requiring us to check for connection pending states too. */ dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED || ep_ptr->param.ep_state == DAT_EP_STATE_ACTIVE_CONNECTION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_PASSIVE_CONNECTION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_COMPLETION_PENDING) { ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapl_os_unlock(&ep_ptr->header.lock); dapls_io_trc_dump(ep_ptr, cqe_ptr, dto_status); /* Let the other side know we have disconnected */ (void)dapls_ib_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); /* ... and clean up the local side */ evd_ptr = (DAPL_EVD *) ep_ptr->param.connect_evd_handle; dapl_sp_remove_ep (ep_ptr); if (evd_ptr != NULL) { dapls_evd_post_connection_event(evd_ptr, DAT_CONNECTION_EVENT_BROKEN, (DAT_HANDLE) ep_ptr, 0, 0); } } else { dapl_os_unlock(&ep_ptr->header.lock); } dapl_log(DAPL_DBG_TYPE_ERR, "DTO completion ERR: status %d, op %s, vendor_err 0x%x - %s\n", DAPL_GET_CQE_STATUS(cqe_ptr), DAPL_GET_DTO_OP_STR(cookie->val.dto.type), DAPL_GET_CQE_VENDOR_ERR(cqe_ptr), inet_ntoa(((struct sockaddr_in *)&ep_ptr-> remote_ia_address)->sin_addr)); } } /* * dapls_evd_copy_cq * * Copy all entries on a CQ associated with the EVD onto that EVD * Up to caller to handle races, if any. Note that no EVD waiters will * be awoken by this copy. */ DAT_RETURN dapls_evd_copy_cq(DAPL_EVD * evd_ptr) { ib_work_completion_t cur_cqe; DAT_RETURN dat_status; DAT_EVENT *event; if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) { /* Nothing to do if no CQ. */ return DAT_SUCCESS; } while (1) { dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr, evd_ptr, &cur_cqe); if (dat_status != DAT_SUCCESS) { break; } /* For debugging. */ dapli_evd_eh_print_cqe(&cur_cqe); /* * Can use DAT_DTO_COMPLETION_EVENT because dapli_evd_cqe_to_event * will overwrite. */ event = dapli_evd_get_and_init_event(evd_ptr, DAT_DTO_COMPLETION_EVENT); if (event == NULL) return DAT_QUEUE_FULL; dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event); dapli_evd_post_event(evd_ptr, event); } if (DAT_GET_TYPE(dat_status) != DAT_QUEUE_EMPTY) { dapl_dbg_log(DAPL_DBG_TYPE_EVD, "dapls_evd_copy_cq: dapls_ib_completion_poll returned 0x%x\n", dat_status); dapl_os_assert(!"Bad return from dapls_ib_completion_poll"); return dat_status; } return DAT_SUCCESS; } /* * dapls_evd_cq_poll_to_event * * Attempt to dequeue a single CQE from a CQ and turn it into * an event. * * Input: * evd_ptr * * Output: * event * * Returns: * Status of operation * */ DAT_RETURN dapls_evd_cq_poll_to_event(IN DAPL_EVD * evd_ptr, OUT DAT_EVENT * event) { DAT_RETURN dat_status; ib_work_completion_t cur_cqe; dat_status = dapls_ib_completion_poll(evd_ptr->header.owner_ia->hca_ptr, evd_ptr, &cur_cqe); if (dat_status == DAT_SUCCESS) { /* For debugging. */ dapli_evd_eh_print_cqe(&cur_cqe); dapli_evd_cqe_to_event(evd_ptr, &cur_cqe, event); } return dat_status; } /* * dapls_evd_cqe_to_event * * Convert a single CQE into an event * * Input: * evd ptr * cq entry ptr * * Output: * event * * Returns: * Status of operation * */ DAT_RETURN dapls_evd_cqe_to_event(DAPL_EVD * evd_ptr, ib_work_completion_t *cqe) { DAT_EVENT *event; if (evd_ptr->ib_cq_handle == IB_INVALID_HANDLE) /* nothing to do */ return DAT_SUCCESS; dapli_evd_eh_print_cqe(cqe); /* For debugging. */ event = dapli_evd_get_and_init_event(evd_ptr, DAT_DTO_COMPLETION_EVENT); if (event == NULL) return DAT_QUEUE_FULL; dapli_evd_cqe_to_event(evd_ptr, cqe, event); dapli_evd_post_event(evd_ptr, event); return DAT_SUCCESS; } #ifdef DAPL_DBG_IO_TRC /* * Update I/O completions in the I/O trace buffer. I/O is posted to * the buffer, then we find it here using the cookie and mark it * completed with the completion status */ void dapls_io_trc_update_completion(DAPL_EP * ep_ptr, DAPL_COOKIE * cookie, DAT_DTO_COMPLETION_STATUS dto_status) { int i; static unsigned int c_cnt = 1; for (i = 0; i < DBG_IO_TRC_QLEN; i++) { if (ep_ptr->ibt_base[i].cookie == cookie) { ep_ptr->ibt_base[i].status = dto_status; ep_ptr->ibt_base[i].done = c_cnt++; } } } /* * Dump the I/O trace buffers */ void dapls_io_trc_dump(DAPL_EP * ep_ptr, void *cqe_ptr, DAT_DTO_COMPLETION_STATUS dto_status) { struct io_buf_track *ibt; int i; int cnt; dapl_os_printf("DISCONNECTING: dto_status = %x\n", dto_status); dapl_os_printf(" OpType = %x\n", DAPL_GET_CQE_OPTYPE(cqe_ptr)); dapl_os_printf(" Bytes = %x\n", DAPL_GET_CQE_BYTESNUM(cqe_ptr)); dapl_os_printf(" WRID (cookie) = %llx\n", DAPL_GET_CQE_WRID(cqe_ptr)); if (ep_ptr->ibt_dumped == 0) { dapl_os_printf("EP %p (qpn %d) I/O trace buffer\n", ep_ptr, ep_ptr->qpn); ep_ptr->ibt_dumped = 1; ibt = (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr-> ibt_queue); cnt = DBG_IO_TRC_QLEN; while (ibt != NULL && cnt > 0) { dapl_os_printf ("%2d. %3s (%2d, %d) OP: %x cookie %p wqe %p rmv_target_addr %llx rmv_rmr_context %x\n", cnt, ibt->done == 0 ? "WRK" : "DON", ibt->status, ibt->done, ibt->op_type, ibt->cookie, ibt->wqe, ibt->remote_iov.target_address, ibt->remote_iov.rmr_context); for (i = 0; i < 3; i++) { if (ibt->iov[i].segment_length != 0) { dapl_os_printf (" (%4llx, %8x, %8llx)\n", ibt->iov[i].segment_length, ibt->iov[i].lmr_context, ibt->iov[i].virtual_address); } } ibt = (struct io_buf_track *)dapls_rbuf_remove(&ep_ptr-> ibt_queue); cnt--; } } } #endif /* DAPL_DBG_IO_TRC */ /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_evd_util.h000066400000000000000000000124531255317474200176520ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_evd_util.h * * PURPOSE: Utility defs & routines for the EVD data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_EVD_UTIL_H_ #define _DAPL_EVD_UTIL_H_ #include "dapl.h" DAT_RETURN dapls_evd_internal_create ( IN DAPL_IA *ia_ptr, IN DAPL_CNO *cno_ptr, IN DAT_COUNT min_qlen, IN DAT_EVD_FLAGS evd_flags, OUT DAPL_EVD **evd_ptr_ptr) ; DAPL_EVD * dapls_evd_alloc ( IN DAPL_IA *ia_ptr, IN DAPL_CNO *cno_ptr, IN DAT_EVD_FLAGS evd_flags, IN DAT_COUNT qlen) ; DAT_RETURN dapls_evd_dealloc ( IN DAPL_EVD *evd_ptr) ; DAT_RETURN dapls_evd_event_realloc ( IN DAPL_EVD *evd_ptr, IN DAT_COUNT qlen); /* * Each of these functions will retrieve a free event from * the specified EVD, fill in the elements of that event, and * post the event back to the EVD. If there is no EVD available, * an overflow event will be posted to the async EVD associated * with the EVD. * * DAT_INSUFFICIENT_RESOURCES will be returned on overflow, * DAT_SUCCESS otherwise. */ DAT_RETURN dapls_evd_post_cr_arrival_event ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_SP_HANDLE sp_handle, DAT_IA_ADDRESS_PTR ia_address_ptr, DAT_CONN_QUAL conn_qual, DAT_CR_HANDLE cr_handle); DAT_RETURN dapls_evd_post_connection_event ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN DAT_PVOID private_data); DAT_RETURN dapls_evd_post_async_error_event ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_IA_HANDLE ia_handle); DAT_RETURN dapls_evd_post_software_event ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_PVOID pointer); DAT_RETURN dapls_evd_post_generic_event ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EVENT_DATA *data); #ifdef DAT_EXTENSIONS DAT_RETURN dapls_evd_post_event_ext( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EVENT_DATA *data, IN DAT_UINT64 *data_ext); DAT_RETURN dapls_evd_post_cr_event_ext ( IN DAPL_SP *sp_ptr, IN DAT_EVENT_NUMBER event_number, IN dp_ib_cm_handle_t ib_cm_handle, IN DAT_COUNT p_size, IN DAT_PVOID p_data, IN DAT_PVOID ext_data); DAT_RETURN dapls_evd_post_connection_event_ext ( IN DAPL_EVD *evd_ptr, IN DAT_EVENT_NUMBER event_number, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN DAT_PVOID private_data, IN DAT_PVOID ext_data); #endif /************************************* * dapl internal callbacks functions * *************************************/ /* connection verb callback */ extern void dapl_evd_connection_callback ( IN dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_t ib_cm_events, IN const void *private_data_ptr, IN const int private_data_size, IN const void * context ); /* dto verb callback */ extern void dapl_evd_dto_callback ( IN ib_hca_handle_t ib_hca_handle, IN ib_cq_handle_t ib_cq_handle, IN void* context); /* async verb callbacks */ extern void dapl_evd_un_async_error_callback ( IN ib_hca_handle_t ib_hca_handle, IN ib_error_record_t * cause_ptr, IN void * context); extern void dapl_evd_cq_async_error_callback ( IN ib_hca_handle_t ib_hca_handle, IN ib_cq_handle_t ib_cq_handle, IN ib_error_record_t * cause_ptr, IN void * context); extern void dapl_evd_qp_async_error_callback ( IN ib_hca_handle_t ib_hca_handle, IN ib_qp_handle_t ib_qp_handle, IN ib_error_record_t * cause_ptr, IN void * context); extern DAT_RETURN dapls_evd_copy_cq ( DAPL_EVD *evd_ptr); extern DAT_RETURN dapls_evd_cq_poll_to_event ( IN DAPL_EVD *evd_ptr, OUT DAT_EVENT *event); extern void dapls_evd_post_overflow_event ( IN DAPL_EVD *evd_ptr); extern DAT_RETURN dapls_evd_cqe_to_event( IN DAPL_EVD *evd_ptr, ib_work_completion_t *cqe); #endif dapl-2.1.5/dapl/common/dapl_get_consumer_context.c000066400000000000000000000052331255317474200222660ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_get_consumer_context.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_get_consumer_context * * DAPL Requirements Version xxx, 6.2.2.2 * * Gets the consumer context from the specified dat_object * * Input: * dat_handle * * Output: * context * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_get_consumer_context(IN DAT_HANDLE dat_handle, OUT DAT_CONTEXT * context) { DAT_RETURN dat_status; DAPL_HEADER *header; dat_status = DAT_SUCCESS; header = (DAPL_HEADER *) dat_handle; if (((header) == NULL) || DAPL_BAD_PTR(header) || (header->magic != DAPL_MAGIC_IA && header->magic != DAPL_MAGIC_EVD && header->magic != DAPL_MAGIC_EP && header->magic != DAPL_MAGIC_LMR && header->magic != DAPL_MAGIC_RMR && header->magic != DAPL_MAGIC_PZ && header->magic != DAPL_MAGIC_PSP && header->magic != DAPL_MAGIC_RSP && header->magic != DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } if (context == NULL || DAPL_BAD_PTR(header)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } *context = header->user_context; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_get_handle_type.c000066400000000000000000000046661255317474200211740ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_get_handle_type.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_get_handle_type * * DAPL Requirements Version xxx, 6.2.2.6 * * Gets the handle type for the given dat_handle * * Input: * dat_handle * * Output: * handle_type * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_get_handle_type(IN DAT_HANDLE dat_handle, OUT DAT_HANDLE_TYPE * handle_type) { DAT_RETURN dat_status; DAPL_HEADER *header; dat_status = DAT_SUCCESS; header = (DAPL_HEADER *) dat_handle; if (((header) == NULL) || DAPL_BAD_PTR(header) || (header->magic != DAPL_MAGIC_IA && header->magic != DAPL_MAGIC_EVD && header->magic != DAPL_MAGIC_EP && header->magic != DAPL_MAGIC_LMR && header->magic != DAPL_MAGIC_RMR && header->magic != DAPL_MAGIC_PZ && header->magic != DAPL_MAGIC_PSP && header->magic != DAPL_MAGIC_RSP && header->magic != DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } *handle_type = header->handle_type; bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_hash.c000066400000000000000000000315661255317474200167630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_hash.c * * PURPOSE: Hash Table * Description: * * Provides a generic hash table with chaining. * * $Id:$ **********************************************************************/ #include "dapl_hash.h" /********************************************************************* * * * Structures * * * *********************************************************************/ /* * A hash table element */ typedef struct DAPL_HASH_ELEM { struct DAPL_HASH_ELEM *next_element; DAPL_HASH_KEY key; void *datum; } DAPL_HASH_ELEM; /* * The hash table */ struct dapl_hash_table { unsigned long num_entries; unsigned long tbl_size; DAPL_HASH_ELEM *table; DAPL_OS_LOCK lock; /* * statistics - we tally on insert operations, counting * the number of entries in the whole hash table, as * well as the length of chains we walk to insert. This * ignores empty buckets, giving us data on overall table * occupancy, as well as max/average chain length for * the buckets used. If our hash function results in * hot buckets, this will show it. */ uint64_t hash_tbl_inserts; /* total inserts ops */ uint64_t hash_tbl_max; /* max in entire table */ uint64_t hash_tbl_total; /* total in table */ uint64_t hash_chn_max; /* longest chain */ uint64_t hash_chn_total; /* total non-0 lenghts */ }; /********************************************************************* * * * Defines * * * *********************************************************************/ /* datum value in empty table slots (use 0UL or ~0UL as appropriate) */ #define NO_DATUM_VALUE ((void *) 0UL) #define NO_DATUM(value) ((value) == NO_DATUM_VALUE) /* Lookup macro (which falls back to function to rehash) */ #define DAPL_HASHLOOKUP( p_table, in_key, out_datum, bucket_head) \ do { \ DAPL_HASH_KEY save_key = in_key; \ DAPL_HASH_ELEM *element = \ &((p_table)->table)[DAPL_DOHASH(in_key,(p_table)->tbl_size)]; \ in_key = save_key; \ if (NO_DATUM(element->datum)) { \ (bucket_head) = (void *)0; \ } else if (element->key == (DAPL_HASH_KEY) (in_key)) { \ (out_datum) = element->datum; \ (bucket_head) = (void *)element; \ } else if (element->next_element) { \ dapli_hash_rehash(element, \ (in_key), \ (void **)&(out_datum), \ (DAPL_HASH_ELEM **)&(bucket_head)); \ } else { \ (bucket_head) = (void *)0; \ }\ } while (0) /********************************************************************* * * * Internal Functions * * * *********************************************************************/ /* * Rehash the key (used by add and lookup functions) * * Inputs: element element to rehash key * key, datum datum for key head * head head for list */ static void dapli_hash_rehash(DAPL_HASH_ELEM * element, DAPL_HASH_KEY key, void **datum, DAPL_HASH_ELEM ** head) { /* * assume we looked at the contents of element already, * and start with the next element. */ dapl_os_assert(element->next_element); dapl_os_assert(!NO_DATUM(element->datum)); *head = element; while (1) { element = element->next_element; if (!element) { break; } if (element->key == key) { *datum = element->datum; return; } } *head = 0; } /* * Add a new key to the hash table * * Inputs: * table, key and datum to be added * allow_dup - DAT_TRUE if dups are allowed * Outputs: * report_dup - should you care to know * Returns: * DAT_TRUE on success */ static DAT_BOOLEAN dapli_hash_add(DAPL_HASH_TABLEP p_table, DAPL_HASH_KEY key, void *datum, DAT_BOOLEAN allow_dup, DAT_BOOLEAN * report_dup) { void *olddatum; DAPL_HASH_KEY hashValue, save_key = key; DAPL_HASH_ELEM *found; DAT_BOOLEAN status = DAT_FALSE; unsigned int chain_len = 0; if (report_dup) { (*report_dup) = DAT_FALSE; } if (NO_DATUM(datum)) { /* * Reserved value used for datum */ dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapli_hash_add () called with magic NO_DATA value (%p) " "used as datum!\n", datum); return DAT_FALSE; } DAPL_HASHLOOKUP(p_table, key, olddatum, found); if (found) { /* * key exists already */ if (report_dup) { *report_dup = DAT_TRUE; } if (!allow_dup) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapli_hash_add () called with duplicate key (" F64x ")\n", key); return DAT_FALSE; } } hashValue = DAPL_DOHASH(key, p_table->tbl_size); key = save_key; if (NO_DATUM(p_table->table[hashValue].datum)) { /* * Empty head - just fill it in */ p_table->table[hashValue].key = key; p_table->table[hashValue].datum = datum; p_table->table[hashValue].next_element = 0; p_table->num_entries++; status = DAT_TRUE; } else { DAPL_HASH_ELEM *newelement = (DAPL_HASH_ELEM *) dapl_os_alloc(sizeof(DAPL_HASH_ELEM)); /* * Add an element to the end of the chain */ if (newelement) { DAPL_HASH_ELEM *lastelement; newelement->key = key; newelement->datum = datum; newelement->next_element = 0; for (lastelement = &p_table->table[hashValue]; lastelement->next_element; lastelement = lastelement->next_element) { /* Walk to the end of the chain */ chain_len++; } lastelement->next_element = newelement; p_table->num_entries++; status = DAT_TRUE; } else { /* allocation failed - should not happen */ status = DAT_FALSE; } } /* * Tally up our counters. chain_len is one less than current chain * length. */ chain_len++; p_table->hash_tbl_inserts++; p_table->hash_tbl_total += p_table->num_entries; p_table->hash_chn_total += chain_len; if (p_table->num_entries > p_table->hash_tbl_max) { p_table->hash_tbl_max = p_table->num_entries; } if (chain_len > p_table->hash_chn_max) { p_table->hash_chn_max = chain_len; } return status; } /* * Remove element from hash bucket * * Inputs: * element, key to be deleted * Returns: * DAT_TRUE on success */ static DAT_BOOLEAN dapl_hash_delete_element(DAPL_HASH_ELEM * element, DAPL_HASH_KEY key, DAPL_HASH_DATA * p_datum) { DAPL_HASH_ELEM *curelement; DAPL_HASH_ELEM *lastelement; lastelement = NULL; for (curelement = element; curelement; lastelement = curelement, curelement = curelement->next_element) { if (curelement->key == key) { if (p_datum) { *p_datum = curelement->datum; } if (lastelement) { /* * curelement was malloc'd; free it */ lastelement->next_element = curelement->next_element; dapl_os_free((void *)curelement, sizeof(DAPL_HASH_ELEM)); } else { /* * curelement is static list head */ DAPL_HASH_ELEM *n = curelement->next_element; if (n) { /* * If there is a next element, copy its contents into the * head and free the original next element. */ curelement->key = n->key; curelement->datum = n->datum; curelement->next_element = n->next_element; dapl_os_free((void *)n, sizeof(DAPL_HASH_ELEM)); } else { curelement->datum = NO_DATUM_VALUE; } } break; } } return (curelement != NULL ? DAT_TRUE : DAT_FALSE); } /********************************************************************* * * * External Functions * * * *********************************************************************/ /* * Create a new hash table with at least 'table_size' hash buckets. */ DAT_RETURN dapls_hash_create(IN DAT_COUNT table_size, OUT DAPL_HASH_TABLE ** pp_table) { DAPL_HASH_TABLE *p_table; DAT_COUNT table_length = table_size * sizeof(DAPL_HASH_ELEM); DAT_RETURN dat_status; DAT_COUNT i; dapl_os_assert(pp_table); dat_status = DAT_SUCCESS; /* Allocate hash table */ p_table = dapl_os_alloc(sizeof(DAPL_HASH_TABLE)); if (NULL == p_table) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* Init hash table, allocate and init and buckets */ dapl_os_memzero(p_table, sizeof(DAPL_HASH_TABLE)); p_table->tbl_size = table_size; p_table->table = (DAPL_HASH_ELEM *) dapl_os_alloc(table_length); if (NULL == p_table->table) { dapl_os_free(p_table, sizeof(DAPL_HASH_TABLE)); dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dapl_os_lock_init(&p_table->lock); for (i = 0; i < table_size; i++) { p_table->table[i].datum = NO_DATUM_VALUE; p_table->table[i].key = 0; p_table->table[i].next_element = 0; } *pp_table = p_table; bail: return DAT_SUCCESS; } /* * Destroy a hash table */ DAT_RETURN dapls_hash_free(IN DAPL_HASH_TABLE * p_table) { dapl_os_assert(p_table && p_table->table); dapl_os_lock_destroy(&p_table->lock); dapl_os_free(p_table->table, sizeof(DAPL_HASH_ELEM) * p_table->tbl_size); dapl_os_free(p_table, sizeof(DAPL_HASH_TABLE)); return DAT_SUCCESS; } /* * Returns the number of elements stored in the table */ DAT_RETURN dapls_hash_size(IN DAPL_HASH_TABLE * p_table, OUT DAT_COUNT * p_size) { dapl_os_assert(p_table && p_size); *p_size = p_table->num_entries; return DAT_SUCCESS; } /* * Inserts the specified data into the table with the given key. * Duplicates are not expected, and return in error, having done nothing. */ DAT_RETURN dapls_hash_insert(IN DAPL_HASH_TABLE * p_table, IN DAPL_HASH_KEY key, IN DAPL_HASH_DATA data) { DAT_RETURN dat_status; dapl_os_assert(p_table); dat_status = DAT_SUCCESS; dapl_os_lock(&p_table->lock); if (!dapli_hash_add(p_table, key, data, DAT_FALSE, NULL)) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); } dapl_os_unlock(&p_table->lock); return dat_status; } /* * Searches for the given key. If found, * DAT_SUCCESS is returned and the associated * data is returned in the DAPL_HASH_DATA * pointer if that pointer is not NULL. */ DAT_RETURN dapls_hash_search(IN DAPL_HASH_TABLE * p_table, IN DAPL_HASH_KEY key, OUT DAPL_HASH_DATA * p_data) { DAT_RETURN dat_status; void *olddatum; DAPL_HASH_ELEM *found; dapl_os_assert(p_table); dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, 0); dapl_os_lock(&p_table->lock); DAPL_HASHLOOKUP(p_table, key, olddatum, found); dapl_os_unlock(&p_table->lock); if (found) { if (p_data) { *p_data = olddatum; } dat_status = DAT_SUCCESS; } return dat_status; } DAT_RETURN dapls_hash_remove(IN DAPL_HASH_TABLE * p_table, IN DAPL_HASH_KEY key, OUT DAPL_HASH_DATA * p_data) { DAT_RETURN dat_status; DAPL_HASH_KEY hashValue, save_key = key; dapl_os_assert(p_table); dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, 0); if (p_table->num_entries == 0) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_hash_remove () called on empty hash table!\n"); return dat_status; } hashValue = DAPL_DOHASH(key, p_table->tbl_size); key = save_key; dapl_os_lock(&p_table->lock); if (dapl_hash_delete_element(&p_table->table[hashValue], key, p_data)) { p_table->num_entries--; dat_status = DAT_SUCCESS; } dapl_os_unlock(&p_table->lock); return dat_status; } dapl-2.1.5/dapl/common/dapl_hash.h000066400000000000000000000065331255317474200167640ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_hash.h * * PURPOSE: Utility defs & routines for the hash data structure * * $Id:$ **********************************************************************/ #ifndef _DAPL_HASH_H_ #define _DAPL_HASH_H_ #include "dapl.h" /********************************************************************* * * * Defines * * * *********************************************************************/ /* * Hash table size. * * Default is small; use the larger sample values for hash tables * known to be heavily used. The sample values chosen are the * largest primes below 2^8, 2^9, and 2^10. */ #define DAPL_DEF_HASHSIZE 251 #define DAPL_MED_HASHSIZE 509 #define DAPL_LRG_HASHSIZE 1021 #define DAPL_HASH_TABLE_DEFAULT_CAPACITY DAPL_DEF_HASHSIZE /* The hash function */ #if defined(__KDAPL__) #define DAPL_DOHASH(key,hashsize) dapl_os_mod64(key,hashsize) #else #define DAPL_DOHASH(key,hashsize) ((uint64_t)((key) % (hashsize))) #endif /* defined(__KDAPL__) */ /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAT_RETURN dapls_hash_create( IN DAT_COUNT capacity, OUT DAPL_HASH_TABLE **pp_table); extern DAT_RETURN dapls_hash_free( IN DAPL_HASH_TABLE *p_table); extern DAT_RETURN dapls_hash_size( IN DAPL_HASH_TABLE *p_table, OUT DAT_COUNT *p_size); extern DAT_RETURN dapls_hash_insert( IN DAPL_HASH_TABLE *p_table, IN DAPL_HASH_KEY key, IN DAPL_HASH_DATA data); extern DAT_RETURN dapls_hash_search( IN DAPL_HASH_TABLE *p_table, IN DAPL_HASH_KEY key, OUT DAPL_HASH_DATA *p_data); extern DAT_RETURN dapls_hash_remove( IN DAPL_HASH_TABLE *p_table, IN DAPL_HASH_KEY key, OUT DAPL_HASH_DATA *p_data); #endif /* _DAPL_HASH_H_ */ dapl-2.1.5/dapl/common/dapl_hca_util.c000066400000000000000000000064661255317474200176310ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_hca_util.c * * PURPOSE: Manage HCA structure * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_provider.h" #include "dapl_hca_util.h" /* * dapl_hca_alloc * * alloc and initialize an HCA struct * * Input: * name * port * * Output: * hca_ptr * * Returns: * none * */ DAPL_HCA *dapl_hca_alloc(char *name, char *port) { DAPL_HCA *hca_ptr; hca_ptr = dapl_os_alloc(sizeof(DAPL_HCA)); if (NULL == hca_ptr) { goto bail; } dapl_os_memzero(hca_ptr, sizeof(DAPL_HCA)); dapl_os_lock_init(&hca_ptr->lock); dapl_llist_init_head(&hca_ptr->ia_list_head); hca_ptr->name = dapl_os_strdup(name); if (NULL == hca_ptr->name) { goto bail; } hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->port_num = dapl_os_strtol(port, NULL, 0); return (hca_ptr); bail: if (NULL != hca_ptr) dapl_os_free(hca_ptr, sizeof(DAPL_HCA)); return NULL; } /* * dapl_hca_free * * free an IA INFO struct * * Input: * hca_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_free(DAPL_HCA * hca_ptr) { dapl_os_free(hca_ptr->name, dapl_os_strlen(hca_ptr->name) + 1); dapl_os_free(hca_ptr, sizeof(DAPL_HCA)); } /* * dapl_hca_link_ia * * Add an ia to the HCA structure * * Input: * hca_ptr * ia_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_link_ia(IN DAPL_HCA * hca_ptr, IN DAPL_IA * ia_ptr) { dapl_os_lock(&hca_ptr->lock); dapl_llist_add_head(&hca_ptr->ia_list_head, &ia_ptr->hca_ia_list_entry, ia_ptr); dapl_os_unlock(&hca_ptr->lock); } /* * dapl_hca_unlink_ia * * Remove an ia from the hca info structure * * Input: * hca_ptr * ia_ptr * * Output: * none * * Returns: * none * */ void dapl_hca_unlink_ia(IN DAPL_HCA * hca_ptr, IN DAPL_IA * ia_ptr) { dapl_os_lock(&hca_ptr->lock); /* * If an error occurred when we were opening the IA it * will not be linked on the list; don't unlink an unlinked * list! */ if (!dapl_llist_is_empty(&hca_ptr->ia_list_head)) { dapl_llist_remove_entry(&hca_ptr->ia_list_head, &ia_ptr->hca_ia_list_entry); } dapl_os_unlock(&hca_ptr->lock); } dapl-2.1.5/dapl/common/dapl_hca_util.h000066400000000000000000000032351255317474200176250ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_hca_util.h * * PURPOSE: Utility defs & routines for the HCA data structure * * $Id:$ **********************************************************************/ #ifndef _DAPL_HCA_UTIL_H_ #define _DAPL_HCA_UTIL_H_ #include "dapl.h" DAPL_HCA * dapl_hca_alloc ( char *name, char *port ) ; void dapl_hca_free ( DAPL_HCA *hca_ptr ) ; void dapl_hca_link_ia ( IN DAPL_HCA *hca_ptr, IN DAPL_IA *ia_info ) ; void dapl_hca_unlink_ia ( IN DAPL_HCA *hca_ptr, IN DAPL_IA *ia_info ) ; #endif dapl-2.1.5/dapl/common/dapl_ia_close.c000066400000000000000000000046061255317474200176110ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ia_close.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" /* * dapl_ia_close * * DAPL Requirements Version xxx, 6.2.1.2 * * Close a provider, clean up resources, etc. * * Input: * ia_handle * * Output: * none * * Return Values: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_ia_close(IN DAT_IA_HANDLE ia_handle, IN DAT_CLOSE_FLAGS ia_flags) { DAPL_IA *ia_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ia_close (%p, %d)\n", ia_handle, ia_flags); ia_ptr = (DAPL_IA *) ia_handle; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (DAT_CLOSE_ABRUPT_FLAG == ia_flags) { dat_status = dapl_ia_abrupt_close(ia_ptr); } else if (DAT_CLOSE_GRACEFUL_FLAG == ia_flags) { dat_status = dapl_ia_graceful_close(ia_ptr); } else { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); } bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_ia_ha.c000077500000000000000000000040641255317474200170750ustar00rootroot00000000000000/* * Copyright (c) 2007 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ia_ha.c * * PURPOSE: Interface Adapter High Availability - optional feature * Description: Described in DAPL 2.0 API, Chapter 5, section 9 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_provider.h" #include "dapl_evd_util.h" #include "dapl_hca_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_ia_ha * * DAPL Requirements Version xxx, 5.9 * * Queries for provider HA support * * Input: * ia_handle * provider name * * Output: * answer * * Returns: * DAT_SUCCESS * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_ia_ha(IN DAT_IA_HANDLE ia_handle, /* ia_handle */ IN const DAT_NAME_PTR provider, /* provider */ OUT DAT_BOOLEAN * answer) { /* answer */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ia_open.c000066400000000000000000000300431255317474200174370ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ia_open.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_provider.h" #include "dapl_evd_util.h" #include "dapl_hca_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * LOCAL PROTOTYPES */ #ifdef IBHOSTS_NAMING void dapli_assign_hca_ip_address(DAPL_HCA * hca_ptr, char *device_name); #endif /* IBHOSTS_NAMING */ void dapli_hca_cleanup(DAPL_HCA * hca_ptr, DAT_BOOLEAN dec_ref); /* * dapl_ia_open * * DAPL Requirements Version xxx, 6.2.1.1 * * Open a provider and return a handle. The handle enables the user * to invoke operations on this provider. * * The dat_ia_open call is actually part of the DAT registration module. * That function maps the DAT_NAME parameter of dat_ia_open to a DAT_PROVIDER, * and calls this function. * * Input: * provider * async_evd_qlen * async_evd_handle_ptr * * Output: * async_evd_handle * ia_handle * * Return Values: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_PROVIDER_NOT_FOUND (returned by dat registry if necessary) */ DAT_RETURN DAT_API dapl_ia_open(IN const DAT_NAME_PTR name, IN DAT_COUNT async_evd_qlen, INOUT DAT_EVD_HANDLE * async_evd_handle_ptr, OUT DAT_IA_HANDLE * ia_handle_ptr) { DAT_RETURN dat_status; DAT_PROVIDER *provider; DAPL_HCA *hca_ptr; DAPL_IA *ia_ptr; DAPL_EVD *evd_ptr; dat_status = DAT_SUCCESS; hca_ptr = NULL; ia_ptr = NULL; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ia_open (%s, %d, %p, %p)\n", name, async_evd_qlen, async_evd_handle_ptr, ia_handle_ptr); dat_status = dapl_provider_list_search(name, &provider); if (DAT_SUCCESS != dat_status) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); goto bail; } /* ia_handle_ptr and async_evd_handle_ptr cannot be NULL */ if (ia_handle_ptr == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } if (async_evd_handle_ptr == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } /* initialize the caller's OUT param */ *ia_handle_ptr = DAT_HANDLE_NULL; /* get the hca_ptr */ hca_ptr = (DAPL_HCA *) provider->extension; /* log levels could be reset and set between opens */ g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE", DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN); /* * Open the HCA if it has not been done before. */ dapl_os_lock(&hca_ptr->lock); if (hca_ptr->ib_hca_handle == IB_INVALID_HANDLE) { /* register with the HW */ dat_status = dapls_ib_open_hca(hca_ptr->name, hca_ptr, DAPL_OPEN_NORMAL); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_ib_open_hca failed %x\n", dat_status); dapl_os_unlock(&hca_ptr->lock); goto bail; } /* * Obtain the IP address associated with this name and HCA. */ #ifdef IBHOSTS_NAMING dapli_assign_hca_ip_address(hca_ptr, name); #endif /* IBHOSTS_NAMING */ /* * Obtain IA attributes from the HCA to limit certain * operations. * If using DAPL_ATS naming, ib_query_hca will also set the ip * address. */ dat_status = dapls_ib_query_hca(hca_ptr, &hca_ptr->ia_attr, NULL, &hca_ptr->hca_address); if (dat_status != DAT_SUCCESS) { dapli_hca_cleanup(hca_ptr, DAT_FALSE); dapl_os_unlock(&hca_ptr->lock); goto bail; } } /* Take a reference on the hca_handle */ dapl_os_atomic_inc(&hca_ptr->handle_ref_count); dapl_os_unlock(&hca_ptr->lock); /* Allocate and initialize ia structure */ ia_ptr = dapl_ia_alloc(provider, hca_ptr); if (!ia_ptr) { dapl_os_lock(&hca_ptr->lock); dapli_hca_cleanup(hca_ptr, DAT_TRUE); dapl_os_unlock(&hca_ptr->lock); dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* we need an async EVD for this IA * use the one passed in (if non-NULL) or create one */ evd_ptr = (DAPL_EVD *) * async_evd_handle_ptr; if (evd_ptr) { if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD) || !(evd_ptr->evd_flags & DAT_EVD_ASYNC_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_ASYNC); goto bail; } /* InfiniBand allows only 1 asychronous event handler per HCA */ /* (see InfiniBand Spec, release 1.1, vol I, section 11.5.2, */ /* page 559). */ /* */ /* We only need to make sure that this EVD's CQ belongs to */ /* the same HCA as is being opened. */ if (evd_ptr->header.owner_ia->hca_ptr->ib_hca_handle != hca_ptr->ib_hca_handle) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_ASYNC); goto bail; } ia_ptr->cleanup_async_error_evd = DAT_FALSE; ia_ptr->async_error_evd = evd_ptr; } else { /* Verify we have >0 length, and let the provider check the size */ if (async_evd_qlen <= 0) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } dat_status = dapls_evd_internal_create(ia_ptr, NULL, /* CNO ptr */ async_evd_qlen, DAT_EVD_ASYNC_FLAG, &evd_ptr); if (dat_status != DAT_SUCCESS) { goto bail; } dapl_os_atomic_inc(&evd_ptr->evd_ref_count); dapl_os_lock(&hca_ptr->lock); if (hca_ptr->async_evd != (DAPL_EVD *) 0) { dapl_os_unlock(&hca_ptr->lock); } else { hca_ptr->async_evd = evd_ptr; dapl_os_unlock(&hca_ptr->lock); /* Register the handlers associated with the async EVD. */ dat_status = dapls_ia_setup_callbacks(ia_ptr, evd_ptr); if (dat_status != DAT_SUCCESS) { /* Assign the EVD so it gets cleaned up */ ia_ptr->cleanup_async_error_evd = DAT_TRUE; ia_ptr->async_error_evd = evd_ptr; goto bail; } } ia_ptr->cleanup_async_error_evd = DAT_TRUE; ia_ptr->async_error_evd = evd_ptr; } dat_status = DAT_SUCCESS; *ia_handle_ptr = ia_ptr; *async_evd_handle_ptr = evd_ptr; #if DAPL_COUNTERS dapli_start_counters((DAT_HANDLE)ia_ptr); #endif bail: if (dat_status != DAT_SUCCESS) { if (ia_ptr) { /* This will release the async EVD if needed. */ dapl_ia_close(ia_ptr, DAT_CLOSE_ABRUPT_FLAG); } } dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ia_open () returns 0x%x\n", dat_status); return dat_status; } /* * dapli_hca_cleanup * * Clean up partially allocated HCA stuff. Strictly to make cleanup * simple. */ void dapli_hca_cleanup(DAPL_HCA * hca_ptr, DAT_BOOLEAN dec_ref) { dapls_ib_close_hca(hca_ptr); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; if (dec_ref == DAT_TRUE) { dapl_os_atomic_dec(&hca_ptr->handle_ref_count); } } #ifdef IBHOSTS_NAMING char *dapli_get_adapter_num(char *device_name); void dapli_setup_dummy_addr(IN DAPL_HCA * hca_ptr, IN char *hca_name); /* * dapli_assign_hca_ip_address * * Obtain the IP address of the passed in name, which represents a * port on the hca. There are three methods here to obtain the * appropriate IP address, each with their own shortcoming: * 1) IPOIB_NAMING. Requires the implementation of the IPoIB * interface defined in include/dapl/ipoib_names.h. This is * not the recommended interface as IPoIB is limited at * the point we need to obtain an IP address on the * passive side of a connection. The code supporting this * implementation has been removed. * * 2) IBHOSTS. An entry exists in DNS and in the /etc/dapl/ibhosts * file. The immediate drawback here is that we must dictate * how to name the interface, which is a stated DAPL non-goal. * In the broader perspective, this method requires us to xmit * the IP address in the private data of a connection, which has * other fun problems. This is the default method and is known to * work, but it has problems. * * 3) Obtain the IP address from the driver, which has registered * the address with the SA for retrieval. * * * Input: * hca_ptr Pointer to HCA structure * device_name Name of device as reported by the provider * * Output: * none * * Returns: * char * to string number */ void dapli_assign_hca_ip_address(DAPL_HCA * hca_ptr, char *device_name) { char *adapter_num; #define NAMELEN 128 struct addrinfo *addr; char hostname[NAMELEN]; char *str; int rc; /* * Obtain the IP address of the adapter. This is a simple * scheme that creates a name that must appear available to * DNS, e.g. it must be in the local site DNS or in the local * /etc/hosts file, etc. * * -ib * * This scheme obviously doesn't work with adapters from * multiple vendors, but will suffice in common installations. */ rc = gethostname(hostname, NAMELEN); /* guarantee NUL termination if hostname gets truncated */ hostname[NAMELEN - 1] = '\0'; /* * Strip off domain info if it exists (e.g. mynode.mydomain.com) */ for (str = hostname; *str && *str != '.';) { str++; } if (*str == '.') { *str = '\0'; } strcat(hostname, "-ib"); adapter_num = dapli_get_adapter_num(device_name); strcat(hostname, adapter_num); rc = dapls_osd_getaddrinfo(hostname, &addr); if (rc != 0) { /* Not registered in DNS, provide a dummy value */ dapli_setup_dummy_addr(hca_ptr, hostname); } else { hca_ptr->hca_address = *((DAT_SOCK_ADDR6 *) addr->ai_addr); dapls_osd_freeaddrinfo(addr); } } /* * dapli_stup_dummy_addr * * Set up a dummy local address for the HCA. Things are not going * to work too well if this happens. * We call this routine if: * - remote host adapter name is not in DNS * - IPoIB implementation is not correctly set up * - Similar nonsense. * * Input: * hca_ptr * rhost_name Name of remote adapter * * Output: * none * * Returns: * none */ void dapli_setup_dummy_addr(IN DAPL_HCA * hca_ptr, IN char *rhost_name) { struct sockaddr_in *si; /* Not registered in DNS, provide a dummy value */ dapl_dbg_log(DAPL_DBG_TYPE_WARN, "WARNING: <%s> not registered in DNS, using dummy IP value\n", rhost_name); si = (struct sockaddr_in *)&hca_ptr->hca_address; hca_ptr->hca_address.sin6_family = AF_INET; si->sin_addr.s_addr = 0x01020304; } /* * dapls_get_adapter_num * * Given a device name, return a string of the device number * * Input: * device_name Name of device as reported by the provider * * Output: * none * * Returns: * char * to string number */ char *dapli_get_adapter_num(char *device_name) { static char *zero = "0"; char *p; /* * Optimisticaly simple algorithm: the device number appears at * the end of the device name string. Device that do not end * in a number are by default "0". */ for (p = device_name; *p; p++) { if (isdigit(*p)) { return p; } } return zero; } #endif /* IBHOSTS_NAMING */ /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ia_query.c000077500000000000000000000154221255317474200176520ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ia_query.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_vendor.h" /* * dapl_ia_query * * DAPL Requirements Version xxx, 6.2.1.3 * * Provide the consumer with Interface Adapter and Provider parameters. * * Input: * ia_handle * ia_mask * provider_mask * * Output: * async_evd_handle * ia_parameters * provider_parameters * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_ia_query(IN DAT_IA_HANDLE ia_handle, OUT DAT_EVD_HANDLE * async_evd_handle, IN DAT_IA_ATTR_MASK ia_attr_mask, OUT DAT_IA_ATTR * ia_attr, IN DAT_PROVIDER_ATTR_MASK provider_attr_mask, OUT DAT_PROVIDER_ATTR * provider_attr) { DAPL_IA *ia_ptr; DAT_RETURN dat_status; struct evd_merge_type { DAT_BOOLEAN array[6][6]; } *evd_merge; DAT_BOOLEAN val; int i; int j; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_ia_query (%p, %p, 0x%llx, %p, 0x%x, %p)\n", ia_handle, async_evd_handle, ia_attr_mask, ia_attr, provider_attr_mask, provider_attr); ia_ptr = (DAPL_IA *) ia_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (NULL != async_evd_handle) { *async_evd_handle = ia_ptr->async_error_evd; } if (ia_attr_mask & DAT_IA_FIELD_ALL) { if (NULL == ia_attr) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } /* * Obtain parameters from the HCA. Protect against multiple * IAs beating on the HCA at the same time. */ dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, ia_attr, NULL, NULL); if (dat_status != DAT_SUCCESS) { goto bail; } } if (ia_attr_mask & ~DAT_IA_FIELD_ALL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } if (provider_attr_mask & DAT_PROVIDER_FIELD_ALL) { if (NULL == provider_attr) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG6); goto bail; } strncpy(provider_attr->provider_name, ia_ptr->header.provider->device_name, DAT_NAME_MAX_LENGTH); provider_attr->provider_version_major = VN_PROVIDER_MAJOR; provider_attr->provider_version_minor = VN_PROVIDER_MINOR; provider_attr->dapl_version_major = DAT_VERSION_MAJOR; provider_attr->dapl_version_minor = DAT_VERSION_MINOR; provider_attr->lmr_mem_types_supported = DAT_MEM_TYPE_VIRTUAL | DAT_MEM_TYPE_LMR; #if VN_MEM_SHARED_VIRTUAL_SUPPORT > 0 && !defined(__KDAPL__) provider_attr->lmr_mem_types_supported |= DAT_MEM_TYPE_SHARED_VIRTUAL; #endif provider_attr->iov_ownership_on_return = DAT_IOV_CONSUMER; provider_attr->dat_qos_supported = DAT_QOS_BEST_EFFORT; provider_attr->completion_flags_supported = DAT_COMPLETION_DEFAULT_FLAG; provider_attr->is_thread_safe = DAT_FALSE; /* * N.B. The second part of the following equation will evaluate * to 0 unless IBHOSTS_NAMING is enabled. */ provider_attr->max_private_data_size = dapls_ib_private_data_size(ia_ptr->hca_ptr) - (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE); provider_attr->supports_multipath = DAT_FALSE; provider_attr->ep_creator = DAT_PSP_CREATES_EP_NEVER; provider_attr->optimal_buffer_alignment = DAT_OPTIMAL_ALIGNMENT; /* The value of pz_support may vary by transport */ provider_attr->num_provider_specific_attr = 0; provider_attr->provider_specific_attr = NULL; #if !defined(__KDAPL__) provider_attr->pz_support = DAT_PZ_UNIQUE; #endif /* !KDAPL */ /* * Query for provider specific attributes */ dapls_query_provider_specific_attr(ia_ptr, provider_attr); /* * Set up evd_stream_merging_supported options. Note there is * one bit per allowable combination, using the ordinal * position of the DAT_EVD_FLAGS as positions in the * array. e.g. * [0][0] is DAT_EVD_SOFTWARE_FLAG | DAT_EVD_SOFTWARE_FLAG, * [0][1] is DAT_EVD_SOFTWARE_FLAG | DAT_EVD_CR_FLAG, and * [2][4] is DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG * * Most combinations are true, so initialize the array that way. * Then finish by resetting the bad combinations. * * DAT_EVD_ASYNC_FLAG is not supported. InfiniBand only allows * a single asynchronous event handle per HCA, and the first * dat_ia_open forces the creation of the only one that can be * used. We disallow the user from creating an ASYNC EVD here. */ evd_merge = (struct evd_merge_type *)&provider_attr-> evd_stream_merging_supported[0][0]; val = DAT_TRUE; for (i = 0; i < 6; i++) { if (i > 4) { /* ASYNC EVD is 5, so entire row will be 0 */ val = DAT_FALSE; } for (j = 0; j < 5; j++) { evd_merge->array[i][j] = val; } /* Set the ASYNC_EVD column to FALSE */ evd_merge->array[i][5] = DAT_FALSE; } #ifndef DAPL_MERGE_CM_DTO /* * If an implementation supports CM and DTO completions on * the same EVD then DAPL_MERGE_CM_DTO should be set to * skip the following code */ /* DAT_EVD_DTO_FLAG | DAT_EVD_CONNECTION_FLAG */ evd_merge->array[2][3] = DAT_FALSE; /* DAT_EVD_CONNECTION_FLAG | DAT_EVD_DTO_FLAG */ evd_merge->array[3][2] = DAT_FALSE; #endif /* DAPL_MERGE_CM_DTO */ } bail: if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_ia_query () returns 0x%x\n", dat_status); } return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ia_util.c000077500000000000000000000634721255317474200174720ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ia_util.c * * PURPOSE: Manage IA Info structure * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_hca_util.h" #include "dapl_ia_util.h" #include "dapl_sp_util.h" #include "dapl_evd_util.h" #include "dapl_cno_util.h" #include "dapl_cr_util.h" #include "dapl_adapter_util.h" /* Internal prototype */ void dapli_ia_release_hca(DAPL_HCA * hca_ptr); /* * dapl_ia_alloc * * alloc and initialize an IA INFO struct * * Input: * none * * Output: * ia_ptr * * Returns: * none * */ DAPL_IA *dapl_ia_alloc(DAT_PROVIDER * provider, DAPL_HCA * hca_ptr) { DAPL_IA *ia_ptr; /* Allocate IA */ ia_ptr = (DAPL_IA *) dapl_os_alloc(sizeof(DAPL_IA)); if (ia_ptr == NULL) { return (NULL); } /* zero the structure */ dapl_os_memzero(ia_ptr, sizeof(DAPL_IA)); #ifdef DAPL_COUNTERS /* Allocate counters */ ia_ptr->cntrs = dapl_os_alloc(sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS); if (ia_ptr->cntrs == NULL) { dapl_os_free(ia_ptr, sizeof(DAPL_IA)); return (NULL); } dapl_os_memzero(ia_ptr->cntrs, sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS); #endif /* DAPL_COUNTERS */ /* * initialize the header */ ia_ptr->header.provider = provider; ia_ptr->header.magic = DAPL_MAGIC_IA; ia_ptr->header.handle_type = DAT_HANDLE_TYPE_IA; ia_ptr->header.owner_ia = ia_ptr; ia_ptr->header.user_context.as_64 = 0; ia_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&ia_ptr->header.ia_list_entry); dapl_os_lock_init(&ia_ptr->header.lock); /* * initialize the body */ ia_ptr->hca_ptr = hca_ptr; ia_ptr->async_error_evd = NULL; ia_ptr->cleanup_async_error_evd = DAT_FALSE; dapl_llist_init_entry(&ia_ptr->hca_ia_list_entry); dapl_llist_init_head(&ia_ptr->ep_list_head); dapl_llist_init_head(&ia_ptr->lmr_list_head); dapl_llist_init_head(&ia_ptr->rmr_list_head); dapl_llist_init_head(&ia_ptr->pz_list_head); dapl_llist_init_head(&ia_ptr->evd_list_head); dapl_llist_init_head(&ia_ptr->cno_list_head); dapl_llist_init_head(&ia_ptr->rsp_list_head); dapl_llist_init_head(&ia_ptr->psp_list_head); dapl_hca_link_ia(hca_ptr, ia_ptr); return (ia_ptr); } /* * dapl_ia_abrupt_close * * Performs an abrupt close of the IA * * Input: * ia_ptr * * Output: * none * * Returns: * status * */ DAT_RETURN dapl_ia_abrupt_close(IN DAPL_IA * ia_ptr) { DAT_RETURN dat_status; DAPL_EP *ep_ptr, *next_ep_ptr; DAPL_LMR *lmr_ptr, *next_lmr_ptr; DAPL_RMR *rmr_ptr, *next_rmr_ptr; DAPL_PZ *pz_ptr, *next_pz_ptr; DAPL_EVD *evd_ptr, *next_evd_ptr; DAPL_CNO *cno_ptr, *next_cno_ptr; DAPL_SP *sp_ptr, *next_sp_ptr; /* for PSP and RSP queues */ DAPL_CR *cr_ptr, *next_cr_ptr; DAPL_HCA *hca_ptr; dat_status = DAT_SUCCESS; /* * clear all the data structures associated with the IA. * this must be done in order (rmr,rsp) before (ep lmr psp) before * (pz evd) * * Note that in all the following we can leave the loop either * when we run out of entries, or when we get back to the head * if we end up skipping an entry. */ rmr_ptr = (dapl_llist_is_empty(&ia_ptr->rmr_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->rmr_list_head)); while (rmr_ptr != NULL) { next_rmr_ptr = dapl_llist_next_entry(&ia_ptr->rmr_list_head, &rmr_ptr->header. ia_list_entry); dat_status = dapl_rmr_free(rmr_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): rmr_free(%p) returns %x\n", rmr_ptr, dat_status); } rmr_ptr = next_rmr_ptr; } sp_ptr = (dapl_llist_is_empty(&ia_ptr->rsp_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->rsp_list_head)); while (sp_ptr != NULL) { next_sp_ptr = dapl_llist_next_entry(&ia_ptr->rsp_list_head, &sp_ptr->header. ia_list_entry); dat_status = dapl_rsp_free(sp_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): rsp_free(%p) returns %x\n", sp_ptr, dat_status); } sp_ptr = next_sp_ptr; } ep_ptr = (dapl_llist_is_empty(&ia_ptr->ep_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->ep_list_head)); while (ep_ptr != NULL) { next_ep_ptr = dapl_llist_next_entry(&ia_ptr->ep_list_head, &ep_ptr->header. ia_list_entry); /* * Issue a disconnect if the EP needs it */ if (ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED || ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED || ep_ptr->param.ep_state == DAT_EP_STATE_ACTIVE_CONNECTION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_COMPLETION_PENDING || ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECT_PENDING) { dat_status = dapl_ep_disconnect(ep_ptr, DAT_CLOSE_ABRUPT_FLAG); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): ep_disconnect(%p) returns %x\n", ep_ptr, dat_status); } } /* force the EP into error state to force flush all posted DTOs. */ { DAT_EP_ATTR ep_attr; DAT_NAMED_ATTR ep_state; dapl_os_memzero(&ep_attr, sizeof(DAT_EP_ATTR)); ep_state.name = (char *)IB_QP_STATE; ep_state.value = (char *)DAPL_QP_STATE_ERROR; ep_attr.ep_provider_specific_count = 1; ep_attr.ep_provider_specific = &ep_state; (void)dapls_ib_qp_modify(ia_ptr, ep_ptr, &ep_attr); } dat_status = dapl_ep_free(ep_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): ep_free(%p) returns %x\n", ep_ptr, dat_status); } ep_ptr = next_ep_ptr; } lmr_ptr = (dapl_llist_is_empty(&ia_ptr->lmr_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->lmr_list_head)); while (lmr_ptr != NULL) { next_lmr_ptr = dapl_llist_next_entry(&ia_ptr->lmr_list_head, &lmr_ptr->header. ia_list_entry); dat_status = dapl_lmr_free(lmr_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): lmr_free(%p) returns %x\n", lmr_ptr, dat_status); } lmr_ptr = next_lmr_ptr; } sp_ptr = (dapl_llist_is_empty(&ia_ptr->psp_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->psp_list_head)); while (sp_ptr != NULL) { /* * Shut down the PSP so we get no further callbacks. There * should be no competing threads after this. */ dat_status = dapls_ib_remove_conn_listener(ia_ptr, sp_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): psp cannot remove listener, returns %x\n", dat_status); } next_sp_ptr = dapl_llist_next_entry(&ia_ptr->psp_list_head, &sp_ptr->header. ia_list_entry); /* Remove CR's from this PSP and clean them up */ cr_ptr = dapl_llist_is_empty(&sp_ptr->cr_list_head) ? NULL : dapl_llist_peek_head(&sp_ptr->cr_list_head); while (cr_ptr != NULL) { next_cr_ptr = dapl_llist_next_entry(&sp_ptr->cr_list_head, &cr_ptr->header. ia_list_entry); /* Remove the CR from the queue & cleanup */ dapl_os_lock(&sp_ptr->header.lock); dapl_sp_remove_cr(sp_ptr, cr_ptr); dapl_os_unlock(&sp_ptr->header.lock); dapls_cr_free(cr_ptr); cr_ptr = next_cr_ptr; } dat_status = dapl_psp_free(sp_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): psp_free(%p) returns %x\n", sp_ptr, dat_status); } sp_ptr = next_sp_ptr; } pz_ptr = (dapl_llist_is_empty(&ia_ptr->pz_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->pz_list_head)); while (pz_ptr != NULL) { next_pz_ptr = dapl_llist_next_entry(&ia_ptr->pz_list_head, &pz_ptr->header. ia_list_entry); dat_status = dapl_pz_free(pz_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): pz_free(%p) returns %x\n", pz_ptr, dat_status); } pz_ptr = next_pz_ptr; } /* * EVDs are tricky; we want to release all except for the async * EVD. That EVD needs to stick around until after we close the * HCA, to accept any async events that occur. So we cycle through * the list with dapl_llist_next_entry instead of dapl_llist_is_empty. */ evd_ptr = (dapl_llist_is_empty(&ia_ptr->evd_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->evd_list_head)); while (evd_ptr != NULL) { next_evd_ptr = dapl_llist_next_entry(&ia_ptr->evd_list_head, &evd_ptr->header. ia_list_entry); if (evd_ptr == ia_ptr->async_error_evd) { #if !defined(__KDAPL__) /* Don't delete the EVD, but break any CNO connections. */ dapl_evd_disable(evd_ptr); dapl_evd_modify_cno(evd_ptr, DAT_HANDLE_NULL); #endif /* __KDAPL__ */ } else { /* it isn't the async EVD; delete it. */ dat_status = dapl_evd_free(evd_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): evd_free(%p) returns %x\n", evd_ptr, dat_status); } } evd_ptr = next_evd_ptr; } cno_ptr = (dapl_llist_is_empty(&ia_ptr->cno_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->cno_list_head)); while (cno_ptr != NULL) { next_cno_ptr = dapl_llist_next_entry(&ia_ptr->cno_list_head, &cno_ptr->header. ia_list_entry); #if !defined(__KDAPL__) if (cno_ptr->cno_waiters > 0) { /* Notify the waiter the IA is going away: see uDAPL 1.1 spec, * 6.3.2.3 */ dapl_internal_cno_trigger(cno_ptr, NULL); } /* clean up the CNO */ dat_status = dapl_cno_free(cno_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): cno_free(%p) returns %x\n", cno_ptr, dat_status); } #endif /* __KDAPL__ */ cno_ptr = next_cno_ptr; } hca_ptr = ia_ptr->hca_ptr; /* * Free the async EVD, shutting down callbacks from the HCA. */ if (ia_ptr->async_error_evd && (DAT_TRUE == ia_ptr->cleanup_async_error_evd)) { dat_status = dapls_ia_teardown_callbacks(ia_ptr); dapl_os_atomic_dec(&ia_ptr->async_error_evd->evd_ref_count); dat_status = dapl_evd_free(ia_ptr->async_error_evd); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "ia_close(ABRUPT): evd_free(%p) returns %x\n", ia_ptr->async_error_evd, dat_status); } ia_ptr->async_error_evd = NULL; } /* * Release our reference on the hca_handle. If we are the last * one, close it */ dapli_ia_release_hca(hca_ptr); dapls_ia_free(ia_ptr); return DAT_SUCCESS; /* Abrupt close can't fail. */ } /* * dapl_ia_graceful_close * * Performs an graceful close of the IA * * Input: * ia_ptr * * Output: * none * * Returns: * status * */ DAT_RETURN dapl_ia_graceful_close(IN DAPL_IA * ia_ptr) { DAT_RETURN dat_status; DAT_RETURN cur_dat_status; DAPL_EVD *evd_ptr; DAPL_LLIST_ENTRY *entry; DAPL_HCA *hca_ptr; dat_status = DAT_SUCCESS; if (!dapl_llist_is_empty(&ia_ptr->rmr_list_head) || !dapl_llist_is_empty(&ia_ptr->rsp_list_head) || !dapl_llist_is_empty(&ia_ptr->ep_list_head) || !dapl_llist_is_empty(&ia_ptr->lmr_list_head) || !dapl_llist_is_empty(&ia_ptr->psp_list_head) || !dapl_llist_is_empty(&ia_ptr->pz_list_head)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_IA_IN_USE); goto bail; } /* if the async evd does not need to be cleaned up */ /* (ie. it was not created by dapl_ia_open) */ /* then the evd list should be empty */ if (DAT_FALSE == ia_ptr->cleanup_async_error_evd) { if (!dapl_llist_is_empty(&ia_ptr->evd_list_head)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_IA_IN_USE); goto bail; } } /* else the async evd should be the only evd in */ /* the list. */ else { evd_ptr = (dapl_llist_is_empty(&ia_ptr->evd_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr-> evd_list_head)); if (evd_ptr != NULL && !(evd_ptr->evd_flags & DAT_EVD_ASYNC_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_IA_IN_USE); goto bail; } entry = ia_ptr->evd_list_head; /* if the async evd is not the only element in the list */ if (entry->blink != entry->flink) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_IA_IN_USE); goto bail; } /* * If the async evd has a non-unary ref count (i.e. it's in * use by someone besides us. */ if (dapl_os_atomic_read(&evd_ptr->evd_ref_count) != 1) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_IA_IN_USE); goto bail; } } /* * We've validated the call; now we can start the teardown. * Because we're in the IA close routine, we're safe from races with DAPL * consumers on this IA (operate/destroy races are disallowed in * DAPL). */ hca_ptr = ia_ptr->hca_ptr; /* Tear down the async EVD if needed, first shutting down callbacks. */ if (ia_ptr->async_error_evd && (DAT_TRUE == ia_ptr->cleanup_async_error_evd)) { cur_dat_status = dapls_ia_teardown_callbacks(ia_ptr); if (DAT_SUCCESS != cur_dat_status) { dat_status = cur_dat_status; } dapl_os_atomic_dec(&ia_ptr->async_error_evd->evd_ref_count); cur_dat_status = dapl_evd_free(ia_ptr->async_error_evd); if (DAT_SUCCESS != cur_dat_status) { dat_status = cur_dat_status; } ia_ptr->async_error_evd = NULL; } dapli_ia_release_hca(hca_ptr); dapls_ia_free(ia_ptr); bail: return dat_status; } /* * Release a reference on the HCA handle. If it is 0, close the * handle. Manipulate under lock to prevent races with threads trying to * open the HCA. */ void dapli_ia_release_hca(DAPL_HCA * hca_ptr) { dapl_os_lock(&hca_ptr->lock); dapl_os_atomic_dec(&hca_ptr->handle_ref_count); if (dapl_os_atomic_read(&hca_ptr->handle_ref_count) == 0) { #ifdef DAPL_COUNTERS { DAPL_IA *ia = (DAPL_IA *)dapl_llist_peek_head(&hca_ptr->ia_list_head); if (hca_ptr->ib_hca_handle) dapli_stop_counters(ia); dapl_os_free(ia->cntrs, sizeof(DAT_UINT64) * DCNT_IA_ALL_COUNTERS); } #endif dapls_ib_close_hca(hca_ptr); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->async_evd = NULL; } dapl_os_unlock(&hca_ptr->lock); } /* * dapls_ia_free * * free an IA INFO struct * * Input: * ia_ptr * * Output: * one * * Returns: * none * */ void dapls_ia_free(DAPL_IA * ia_ptr) { dapl_os_assert(ia_ptr->header.magic == DAPL_MAGIC_IA); dapl_os_assert(ia_ptr->async_error_evd == NULL); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->lmr_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->rmr_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->ep_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->evd_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->cno_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->psp_list_head)); dapl_os_assert(dapl_llist_is_empty(&ia_ptr->rsp_list_head)); /* * deinitialize the header */ dapl_hca_unlink_ia(ia_ptr->hca_ptr, ia_ptr); ia_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_os_lock_destroy(&ia_ptr->header.lock); dapl_os_free(ia_ptr, sizeof(DAPL_IA)); } /* * dapl_ia_link_ep * * Add an ep to the IA structure * * Input: * ia_ptr * ep_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_ep(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->ep_list_head, &ep_ptr->header.ia_list_entry, ep_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_ep * * Remove an ep from the ia info structure * * Input: * ia_ptr * ep_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_ep(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->ep_list_head, &ep_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_srq * * Add an srq to the IA structure * * Input: * ia_ptr * srq_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_srq(IN DAPL_IA * ia_ptr, IN DAPL_SRQ * srq_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->srq_list_head, &srq_ptr->header.ia_list_entry, srq_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_srq * * Remove an srq from the ia info structure * * Input: * ia_ptr * srq_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_srq(IN DAPL_IA * ia_ptr, IN DAPL_SRQ * srq_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->srq_list_head, &srq_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_lmr * * Add an lmr to the IA structure * * Input: * ia_ptr * lmr_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_lmr(IN DAPL_IA * ia_ptr, IN DAPL_LMR * lmr_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->lmr_list_head, &lmr_ptr->header.ia_list_entry, lmr_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_lmr * * Remove an lmr from the ia info structure * * Input: * ia_ptr * lmr_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_lmr(IN DAPL_IA * ia_ptr, IN DAPL_LMR * lmr_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->lmr_list_head, &lmr_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_rmr * * Add an rmr to the IA structure * * Input: * ia_ptr * rmr_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_rmr(IN DAPL_IA * ia_ptr, IN DAPL_RMR * rmr_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->rmr_list_head, &rmr_ptr->header.ia_list_entry, rmr_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_rmr * * Remove an rmr from the ia info structure * * Input: * ia_ptr * rmr_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_rmr(IN DAPL_IA * ia_ptr, IN DAPL_RMR * rmr_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->rmr_list_head, &rmr_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_pz * * Add an pz to the IA structure * * Input: * ia_ptr * pz_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_pz(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->pz_list_head, &pz_ptr->header.ia_list_entry, pz_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_pz * * Remove an pz from the ia info structure * * Input: * ia_ptr * pz_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_pz(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->pz_list_head, &pz_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_evd * * Add an evd to the IA structure * * Input: * ia_ptr * evd_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_evd(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->evd_list_head, &evd_ptr->header.ia_list_entry, evd_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_evd * * Remove an evd from the ia info structure * * Input: * ia_ptr * evd_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_evd(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->evd_list_head, &evd_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_cno * * Add an cno to the IA structure * * Input: * ia_ptr * cno_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_cno(IN DAPL_IA * ia_ptr, IN DAPL_CNO * cno_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->cno_list_head, &cno_ptr->header.ia_list_entry, cno_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_unlink_cno * * Remove an cno from the ia info structure * * Input: * ia_ptr * cno_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_unlink_cno(IN DAPL_IA * ia_ptr, IN DAPL_CNO * cno_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(&ia_ptr->cno_list_head, &cno_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapl_ia_link_psp * * Add an psp to the IA structure * * Input: * ia_ptr * sp_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_psp(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->psp_list_head, &sp_ptr->header.ia_list_entry, sp_ptr); dapl_os_unlock(&ia_ptr->header.lock); } /* * daps_ia_unlink_sp * * Remove an sp from the appropriate ia rsp or psp queue * * Input: * ia_ptr * sp_ptr * * Output: * none * * Returns: * none * */ void dapls_ia_unlink_sp(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr) { DAPL_LLIST_HEAD *list_head; if (sp_ptr->header.handle_type == DAT_HANDLE_TYPE_PSP) { list_head = &ia_ptr->psp_list_head; } else { dapl_os_assert(sp_ptr->header.handle_type == DAT_HANDLE_TYPE_RSP); list_head = &ia_ptr->rsp_list_head; } dapl_os_lock(&ia_ptr->header.lock); dapl_llist_remove_entry(list_head, &sp_ptr->header.ia_list_entry); dapl_os_unlock(&ia_ptr->header.lock); } /* * dapls_ia_sp_search * * Find an RSP or PSP on the IA list with a matching conn_qual value * * Input: * ia_ptr * sp_ptr * * Output: * none * * Returns: * none * */ DAPL_SP *dapls_ia_sp_search(IN DAPL_IA * ia_ptr, IN DAT_CONN_QUAL conn_qual, IN DAT_BOOLEAN is_psp) { DAPL_SP *sp_ptr; DAPL_LLIST_HEAD *list_head; if (is_psp) { list_head = &ia_ptr->psp_list_head; } else { list_head = &ia_ptr->rsp_list_head; } dapl_os_lock(&ia_ptr->header.lock); sp_ptr = (dapl_llist_is_empty(list_head) ? NULL : dapl_llist_peek_head(list_head)); while (sp_ptr != NULL) { if (sp_ptr->conn_qual == conn_qual) { break; } sp_ptr = dapl_llist_next_entry(list_head, &sp_ptr->header.ia_list_entry); } dapl_os_unlock(&ia_ptr->header.lock); return sp_ptr; } /* * dapl_ia_link_rsp * * Add an rsp to the IA structure * * Input: * ia_ptr * sp_ptr * * Output: * none * * Returns: * none * */ void dapl_ia_link_rsp(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr) { dapl_os_lock(&ia_ptr->header.lock); dapl_llist_add_head(&ia_ptr->rsp_list_head, &sp_ptr->header.ia_list_entry, sp_ptr); dapl_os_unlock(&ia_ptr->header.lock); } DAT_RETURN dapls_ia_setup_callbacks(IN DAPL_IA * ia_ptr, IN DAPL_EVD * async_evd_ptr) { DAT_RETURN dat_status = DAT_SUCCESS; /* unaffiliated handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_UNAFILIATED, NULL, (ib_async_handler_t) dapl_evd_un_async_error_callback, async_evd_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_un_async_error_eh failed %d\n", dat_status); goto bail; } /* affiliated cq handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_CQ_ERROR, NULL, (ib_async_handler_t) dapl_evd_cq_async_error_callback, async_evd_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_cq_async_error_eh failed %d\n", dat_status); goto bail; } /* affiliated qp handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_QP_ERROR, NULL, (ib_async_handler_t) dapl_evd_qp_async_error_callback, ia_ptr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_qp_async_error_eh failed %d\n", dat_status); goto bail; } bail: return dat_status; } DAT_RETURN dapls_ia_teardown_callbacks(IN DAPL_IA * ia_ptr) { DAT_RETURN dat_status = DAT_SUCCESS; /* unaffiliated handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_UNAFILIATED, NULL, (ib_async_handler_t) 0, NULL); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_un_async_error_eh failed %d\n", dat_status); goto bail; } /* affiliated cq handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_CQ_ERROR, NULL, (ib_async_handler_t) 0, NULL); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_cq_async_error_eh failed %d\n", dat_status); goto bail; } /* affiliated qp handler */ dat_status = dapls_ib_setup_async_callback(ia_ptr, DAPL_ASYNC_QP_ERROR, NULL, (ib_async_handler_t) 0, NULL); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ib_set_qp_async_error_eh failed %d\n", dat_status); goto bail; } bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_ia_util.h000066400000000000000000000062041255317474200174620ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_ia_util.h * * PURPOSE: Utility defs & routines for the IA data structure * * $Id:$ **********************************************************************/ #ifndef _DAPL_IA_UTIL_H_ #define _DAPL_IA_UTIL_H_ #include "dapl.h" DAPL_IA * dapl_ia_alloc ( DAT_PROVIDER *provider, DAPL_HCA *hca_ptr) ; DAT_RETURN dapl_ia_abrupt_close ( IN DAPL_IA *ia_ptr ) ; DAT_RETURN dapl_ia_graceful_close ( IN DAPL_IA *ia_ptr ) ; void dapls_ia_free ( DAPL_IA *ia_ptr ) ; void dapl_ia_link_ep ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_info ) ; void dapl_ia_unlink_ep ( IN DAPL_IA *ia_ptr, IN DAPL_EP *ep_info ) ; void dapl_ia_link_srq ( IN DAPL_IA *ia_ptr, IN DAPL_SRQ *srq_ptr ) ; void dapl_ia_unlink_srq ( IN DAPL_IA *ia_ptr, IN DAPL_SRQ *srq_ptr ) ; void dapl_ia_link_lmr ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr_info ) ; void dapl_ia_unlink_lmr ( IN DAPL_IA *ia_ptr, IN DAPL_LMR *lmr_info ) ; void dapl_ia_link_rmr ( IN DAPL_IA *ia_ptr, IN DAPL_RMR *rmr_info ) ; void dapl_ia_unlink_rmr ( IN DAPL_IA *ia_ptr, IN DAPL_RMR *rmr_info ) ; void dapl_ia_link_pz ( IN DAPL_IA *ia_ptr, IN DAPL_PZ *pz_info ) ; void dapl_ia_unlink_pz ( IN DAPL_IA *ia_ptr, IN DAPL_PZ *pz_info ) ; void dapl_ia_link_evd ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_info ) ; void dapl_ia_unlink_evd ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *evd_info ) ; void dapl_ia_link_cno ( IN DAPL_IA *ia_ptr, IN DAPL_CNO *cno_info ) ; void dapl_ia_unlink_cno ( IN DAPL_IA *ia_ptr, IN DAPL_CNO *cno_info ) ; void dapl_ia_link_psp ( IN DAPL_IA *ia_ptr, IN DAPL_SP *sp_info ) ; void dapls_ia_unlink_sp ( IN DAPL_IA *ia_ptr, IN DAPL_SP *sp_info ) ; void dapl_ia_link_rsp ( IN DAPL_IA *ia_ptr, IN DAPL_SP *sp_info ) ; DAPL_SP * dapls_ia_sp_search ( IN DAPL_IA *ia_ptr, IN DAT_CONN_QUAL conn_qual, IN DAT_BOOLEAN is_psp ) ; DAT_RETURN dapls_ia_setup_callbacks ( IN DAPL_IA *ia_ptr, IN DAPL_EVD *async_evd_ptr ); DAT_RETURN dapls_ia_teardown_callbacks ( IN DAPL_IA *ia_ptr ); #endif dapl-2.1.5/dapl/common/dapl_init.h000066400000000000000000000032531255317474200170000ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_init.h * * PURPOSE: Prototypes for library-interface init and fini functions * * $Id:$ * **********************************************************************/ #ifndef _DAPL_INIT_H_ #define _DAPL_INIT_H_ extern void DAT_API DAT_PROVIDER_INIT_FUNC_NAME ( IN const DAT_PROVIDER_INFO *, IN const char * ); /* instance data */ extern void DAT_API DAT_PROVIDER_FINI_FUNC_NAME ( IN const DAT_PROVIDER_INFO * ); extern void dapl_init ( void ) ; extern void dapl_fini ( void ) ; #endif dapl-2.1.5/dapl/common/dapl_llist.c000066400000000000000000000171511255317474200171610ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_llist.c * * PURPOSE: Manage doubly linked lists within the DAPL Reference Implementation * * A link list head points to the first member of a linked list, but * is itself not a member of the list. * * +---------------------------------------------+ * | entry entry entry | * HEAD -> | +-------+ +-------+ +-------+ | * +--> | flink | --> | flink | --> | flink | >--+ * | data | | data | | data | * +--< | blink | <-- | blink | <-- | blink | <--| * | +-------+ +-------+ +-------+ | * | | * +---------------------------------------------+ * * Note: Each of the remove functions takes an assertion failure if * an element cannot be removed from the list. * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_llist_init_head() * * Purpose: initialize a linked list head */ void dapl_llist_init_head(DAPL_LLIST_HEAD * head) { *head = NULL; } /* * dapl_llist_init_entry() * * Purpose: initialize a linked list entry */ void dapl_llist_init_entry(DAPL_LLIST_ENTRY * entry) { entry->blink = NULL; entry->flink = NULL; entry->data = 0; entry->list_head = NULL; } /* * dapl_llist_is_empty() * * Purpose: returns TRUE if the linked list is empty */ DAT_BOOLEAN dapl_llist_is_empty(DAPL_LLIST_HEAD * head) { return (*head == NULL); } /* * dapl_llist_add_head() * * Purpose: Add an entry to the head of a linked list */ void dapl_llist_add_head(DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, void *data) { DAPL_LLIST_ENTRY *first; /* deal with empty list */ if (dapl_llist_is_empty(head)) { entry->flink = entry; entry->blink = entry; } else { first = *head; entry->flink = first; entry->blink = first->blink; first->blink->flink = entry; first->blink = entry; } *head = entry; entry->data = data; entry->list_head = head; } /* * dapl_llist_add_tail() * * Purpose: Add an entry to the tail of a linked list */ void dapl_llist_add_tail(DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, void *data) { DAPL_LLIST_ENTRY *last; /* deal with empty list */ if (dapl_llist_is_empty(head)) { *head = entry; entry->flink = entry; entry->blink = entry; } else { last = (*head)->blink; entry->flink = last->flink; entry->blink = last; last->flink->blink = entry; last->flink = entry; } entry->data = data; entry->list_head = head; } /* * dapl_llist_add_entry() * * Purpose: Add an entry before an element in the list. Does * not verify the list or the validity of the entries passed in. */ void dapl_llist_add_entry(DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, DAPL_LLIST_ENTRY * new_entry, void *data) { DAPL_LLIST_ENTRY *first; DAPL_LLIST_ENTRY *prev; /* get the head pointer */ first = *head; /* link the entry into the queue */ prev = entry->blink; entry->blink = new_entry; prev->flink = new_entry; new_entry->flink = entry; new_entry->blink = prev; new_entry->data = data; new_entry->list_head = head; /* If the old entry was the head of the list, adjust */ if (first == entry) { (*head) = new_entry; } } /* * dapl_llist_remove_head() * * Purpose: Remove the first entry of a linked list */ void *dapl_llist_remove_head(DAPL_LLIST_HEAD * head) { DAPL_LLIST_ENTRY *first; dapl_os_assert(!dapl_llist_is_empty(head)); first = *head; *head = first->flink; first->flink->blink = first->blink; first->blink->flink = first->flink; if (first->flink == first) { *head = NULL; } /* clean up the links for good measure */ first->flink = NULL; first->blink = NULL; first->list_head = NULL; return (first->data); } /* * dapl_llist_remove_tail() * * Purpose: Remove the last entry of a linked list */ void *dapl_llist_remove_tail(DAPL_LLIST_HEAD * head) { DAPL_LLIST_ENTRY *last; dapl_os_assert(!dapl_llist_is_empty(head)); last = (*head)->blink; last->blink->flink = last->flink; last->flink->blink = last->blink; if (last->flink == last) { *head = NULL; } /* clean up the links for good measure */ last->flink = NULL; last->blink = NULL; last->list_head = NULL; return (last->data); } /* * dapl_llist_remove_entry() * * Purpose: Remove the specified entry from a linked list */ void *dapl_llist_remove_entry(DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry) { DAPL_LLIST_ENTRY *first; dapl_os_assert(!dapl_llist_is_empty(head)); first = *head; /* if it's the first entry, pull it off */ if (first == entry) { (*head) = first->flink; /* if it was the only entry, kill the list */ if (first->flink == first) { (*head) = NULL; } } #ifdef VERIFY_LINKED_LIST else { DAPL_LLIST_ENTRY *try_entry; try_entry = first->flink; for (;;) { if (try_entry == first) { /* not finding the element on the list is a BAD thing */ dapl_os_assert(0); break; } if (try_entry == entry) { break; } try_entry = try_entry->flink; } } #endif /* VERIFY_LINKED_LIST */ dapl_os_assert(entry->list_head == head); entry->list_head = NULL; entry->flink->blink = entry->blink; entry->blink->flink = entry->flink; entry->flink = NULL; entry->blink = NULL; return (entry->data); } /* * dapl_llist_peek_head */ void *dapl_llist_peek_head(DAPL_LLIST_HEAD * head) { DAPL_LLIST_ENTRY *first; dapl_os_assert(!dapl_llist_is_empty(head)); first = *head; return (first->data); } /* * dapl_llist_next_entry * * Obtain the next entry in the list, return NULL when we get to the * head */ void *dapl_llist_next_entry(IN DAPL_LLIST_HEAD * head, IN DAPL_LLIST_ENTRY * cur_ent) { DAPL_LLIST_ENTRY *next; dapl_os_assert(!dapl_llist_is_empty(head)); if (cur_ent == NULL) { next = *head; } else { next = cur_ent->flink; if (next == *head) { return NULL; } } return (next->data); } #ifdef DAPL_DBG /* * dapl_llist_debug_print_list() * * Purpose: Prints the linked list for debugging */ void dapl_llist_debug_print_list(DAPL_LLIST_HEAD * head) { DAPL_LLIST_ENTRY *entry; DAPL_LLIST_ENTRY *first; first = *head; if (!first) { dapl_os_printf("EMPTY_LIST\n"); return; } dapl_os_printf("HEAD %p\n", *head); dapl_os_printf("Entry %p %p %p %p\n", first, first->flink, first->blink, first->data); entry = first->flink; while (entry != first) { dapl_os_printf("Entry %p %p %p %p\n", entry, entry->flink, entry->blink, entry->data); entry = entry->flink; } } #endif /* DAPL_DBG */ dapl-2.1.5/dapl/common/dapl_lmr_free.c000066400000000000000000000056211255317474200176240ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_free.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl_lmr_util.h" #include "dapl_adapter_util.h" #include "dapl_ia_util.h" /* * dapl_lmr_free * * DAPL Requirements Version xxx, 6.6.3.2 * * Destroy an instance of the Local Memory Region * * Input: * lmr_handle * * Output: * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_lmr_free(IN DAT_LMR_HANDLE lmr_handle) { DAPL_LMR *lmr; DAPL_PZ *pz; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle); if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR); goto bail; } lmr = (DAPL_LMR *) lmr_handle; pz = (DAPL_PZ *) lmr->param.pz_handle; DAPL_CNTR(pz->header.owner_ia, DCNT_IA_LMR_FREE); switch (lmr->param.mem_type) { #if defined(__KDAPL__) case DAT_MEM_TYPE_PHYSICAL: #else case DAT_MEM_TYPE_SHARED_VIRTUAL: #endif /* defined(__KDAPL__) */ /* fall through */ case DAT_MEM_TYPE_VIRTUAL: case DAT_MEM_TYPE_LMR: { if (0 != dapl_os_atomic_read(&lmr->lmr_ref_count)) { return DAT_INVALID_STATE; } dat_status = dapls_ib_mr_deregister(lmr); if (dat_status == DAT_SUCCESS) { dapl_os_atomic_dec(&pz->pz_ref_count); dapl_lmr_dealloc(lmr); } break; } #if defined(__KDAPL__) case DAT_MEM_TYPE_PLATFORM: case DAT_MEM_TYPE_IA: case DAT_MEM_TYPE_BYPASS: { return DAT_ERROR(DAT_NOT_IMPLEMENTED, 0); } #endif /* defined(__KDAPL__) */ default: { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); break; } } bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_lmr_query.c000066400000000000000000000044631255317474200200530ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_query.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_lmr_query * * Provide the LMR arguments. * * Input: * lmr_handle * lmr_param_mask * lmr_param * * Output: * lmr_param * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_lmr_query(IN DAT_LMR_HANDLE lmr_handle, IN DAT_LMR_PARAM_MASK lmr_param_mask, IN DAT_LMR_PARAM * lmr_param) { DAPL_LMR *lmr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_query (%p, 0x%x, %p)\n", lmr_handle, lmr_param_mask, lmr_param); if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR); goto bail; } if (NULL == lmr_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } dat_status = DAT_SUCCESS; lmr = (DAPL_LMR *) lmr_handle; dapl_os_memcpy(lmr_param, &lmr->param, sizeof(DAT_LMR_PARAM)); dats_get_ia_handle(lmr->param.ia_handle, &lmr_param->ia_handle); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_lmr_sync_rdma_read.c000066400000000000000000000044321255317474200216540ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_sync_rdma_read.c * * PURPOSE: Interface Adapter management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" /* * dat_lmr_sync_rdma_read * * Ensure a region of memory is consistent by locally flushing * non-coherent cache * * Input: * ia_handle * local_segments Array of buffer segments * num_segments Number of segments in local_segments * * Output: * none * * Return Values: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_lmr_sync_rdma_read(IN DAT_IA_HANDLE ia_handle, IN const DAT_LMR_TRIPLET * local_segments, IN DAT_VLEN num_segments) { DAPL_IA *ia_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dat_lmr_sync_rdma_read (%p, %p, %ld)\n", ia_handle, local_segments, num_segments); ia_ptr = (DAPL_IA *) ia_handle; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } dat_status = dapl_os_sync_rdma_read(local_segments, num_segments); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_lmr_sync_rdma_write.c000066400000000000000000000044411255317474200220730ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_sync_rdma_write.c * * PURPOSE: Interface Adapter management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" /* * dat_lmr_sync_rdma_write * * Ensure a region of memory is consistent by locally flushing * non-coherent cache * * Input: * ia_handle * local_segments Array of buffer segments * num_segments Number of segments in local_segments * * Output: * none * * Return Values: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_lmr_sync_rdma_write(IN DAT_IA_HANDLE ia_handle, IN const DAT_LMR_TRIPLET * local_segments, IN DAT_VLEN num_segments) { DAPL_IA *ia_ptr; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dat_lmr_sync_rdma_write (%p, %p, %ld)\n", ia_handle, local_segments, num_segments); ia_ptr = (DAPL_IA *) ia_handle; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } dat_status = dapl_os_sync_rdma_write(local_segments, num_segments); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_lmr_util.c000066400000000000000000000053631255317474200176630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_util.c * * PURPOSE: Memory management support routines * Description: Support routines for LMR functions * * $Id:$ **********************************************************************/ #include "dapl_lmr_util.h" #include "dapl_ia_util.h" DAPL_LMR *dapl_lmr_alloc(IN DAPL_IA * ia, IN DAT_MEM_TYPE mem_type, IN DAT_REGION_DESCRIPTION region_desc, IN DAT_VLEN length, IN DAT_PZ_HANDLE pz_handle, IN DAT_MEM_PRIV_FLAGS mem_priv) { DAPL_LMR *lmr; /* Allocate LMR */ lmr = (DAPL_LMR *) dapl_os_alloc(sizeof(DAPL_LMR)); if (NULL == lmr) { return (NULL); } /* zero the structure */ dapl_os_memzero(lmr, sizeof(DAPL_LMR)); /* * initialize the header */ lmr->header.provider = ia->header.provider; lmr->header.magic = DAPL_MAGIC_LMR; lmr->header.handle_type = DAT_HANDLE_TYPE_LMR; lmr->header.owner_ia = ia; lmr->header.user_context.as_64 = 0; lmr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&lmr->header.ia_list_entry); dapl_ia_link_lmr(ia, lmr); dapl_os_lock_init(&lmr->header.lock); /* * initialize the body */ lmr->param.ia_handle = (DAT_IA_HANDLE) ia; lmr->param.mem_type = mem_type; lmr->param.region_desc = region_desc; lmr->param.length = length; lmr->param.pz_handle = pz_handle; lmr->param.mem_priv = mem_priv; dapl_os_atomic_set(&lmr->lmr_ref_count, 0); return (lmr); } void dapl_lmr_dealloc(IN DAPL_LMR * lmr) { lmr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_ia_unlink_lmr(lmr->header.owner_ia, lmr); dapl_os_lock_destroy(&lmr->header.lock); dapl_os_free((void *)lmr, sizeof(DAPL_LMR)); } dapl-2.1.5/dapl/common/dapl_lmr_util.h000066400000000000000000000040711255317474200176630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_lmr_util.h * * PURPOSE: Utility defs & routines for the LMR data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_LMR_UTIL_H_ #define _DAPL_LMR_UTIL_H_ #include "dapl_mr_util.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAPL_LMR * dapl_lmr_alloc ( IN DAPL_IA *ia, IN DAT_MEM_TYPE mem_type, IN DAT_REGION_DESCRIPTION region_desc, IN DAT_VLEN length, IN DAT_PZ_HANDLE pz_handle, IN DAT_MEM_PRIV_FLAGS mem_priv); extern void dapl_lmr_dealloc ( IN DAPL_LMR *lmr); #endif /* _DAPL_LMR_UTIL_H_*/ dapl-2.1.5/dapl/common/dapl_mr_util.c000066400000000000000000000057731255317474200175140ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_mr_util.h" /********************************************************************** * * MODULE: dapl_mr_util.c * * PURPOSE: Common Memory Management functions and data structures * * $Id:$ **********************************************************************/ /********************************************************************* * * * Function Definitions * * * *********************************************************************/ /* * dapl_mr_get_address * * Returns the memory address associated with the given memory descriptor * * Input: * desc memory descriptor * type type of memory represented by desc * * Output: * None * */ DAT_VADDR dapl_mr_get_address(IN DAT_REGION_DESCRIPTION desc, IN DAT_MEM_TYPE type) { switch (type) { case DAT_MEM_TYPE_VIRTUAL: { return (DAT_VADDR) (uintptr_t) desc.for_va; } case DAT_MEM_TYPE_LMR: { DAPL_LMR *lmr; lmr = (DAPL_LMR *) desc.for_lmr_handle; /* Since this function is recoursive we cannot inline it */ return dapl_mr_get_address(lmr->param.region_desc, lmr->param.mem_type); } #if defined(__KDAPL__) case DAT_MEM_TYPE_PHYSICAL: { return desc.for_pa; } #else case DAT_MEM_TYPE_SHARED_VIRTUAL: { /* multi-cast necessary to convert a pvoid to a DAT_VADDR on * all architectures */ return (DAT_VADDR) (uintptr_t) desc.for_shared_memory. virtual_address; } #endif /* defined(__KDAPL__) */ default: { /* * The following kDAPL memory types have not been implemented: * DAT_MEM_TYPE_PLATFORM * DAT_MEM_TYPE_IA * DAT_MEM_TYPE_BYPASS */ dapl_os_assert(0); return 0; } } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_mr_util.h000066400000000000000000000055311255317474200175110ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_mr_util.h * * PURPOSE: Utility defs & routines for memory registration functions * * $Id:$ * **********************************************************************/ #ifndef _DAPL_MR_UTIL_H_ #define _DAPL_MR_UTIL_H_ #include "dapl.h" #include "dapl_hash.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAT_VADDR dapl_mr_get_address ( IN DAT_REGION_DESCRIPTION desc, IN DAT_MEM_TYPE type); STATIC _INLINE_ DAT_BOOLEAN dapl_mr_bounds_check ( IN DAT_VADDR addr_a, IN DAT_VLEN length_a, IN DAT_VADDR addr_b, IN DAT_VLEN length_b); /********************************************************************* * * * Inline Functions * * * *********************************************************************/ /* * dapl_mr_bounds_check * * Returns true if region B is contained within region A * and false otherwise * */ STATIC _INLINE_ DAT_BOOLEAN dapl_mr_bounds_check ( IN DAT_VADDR addr_a, IN DAT_VLEN length_a, IN DAT_VADDR addr_b, IN DAT_VLEN length_b) { if ( (addr_a <= addr_b) && (addr_b + length_b) <= (addr_a + length_a)) { return DAT_TRUE; } else { return DAT_FALSE; } } #endif /* _DAPL_MR_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_name_service.c000066400000000000000000000137201255317474200204700ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_name_service.c * * PURPOSE: Provide simple, file base name services in the absence * of DNS hooks for a particular transport type. If an * InfiniBand implementation supports IPoIB, this should * not be used. * * Description: Interfaces in this file are completely described in * dapl_name_service.h * * $Id:$ **********************************************************************/ /* * Include files for setting up a network name */ #include "dapl.h" #include "dapl_name_service.h" /* * Prototypes */ #ifdef IBHOSTS_NAMING DAT_RETURN dapli_ns_create_gid_map(void); DAT_RETURN dapli_ns_add_address(IN DAPL_GID_MAP * gme); #endif /* IBHOSTS_NAMING */ /* * dapls_ns_init * * Initialize naming services * * Input: * none * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN dapls_ns_init(void) { DAT_RETURN dat_status; dat_status = DAT_SUCCESS; #ifdef IBHOSTS_NAMING dat_status = dapli_ns_create_gid_map(); #endif /* IBHOSTS_NAMING */ return dat_status; } #ifdef IBHOSTS_NAMING #define MAX_GID_ENTRIES 32 DAPL_GID_MAP g_gid_map_table[MAX_GID_ENTRIES]; #ifdef _WIN32 #define MAP_FILE "c:/WINNT/system32/drivers/etc/ibhosts" #else #define MAP_FILE "/etc/dapl/ibhosts" #endif /* !defined WIN32 */ /* * dapli_ns_create_gid_map() * * Read the MAP_FILE to obtain host names and GIDs. * Create a table containing IP addresses and GIDs which can * be used for lookups. * * This implementation is a simple method providing name services * when more advanced mechanisms do not exist. The proper way * to obtain these mappings is to use a name service such as is * provided by IPoIB on InfiniBand. * * Input: * device_name Name of device as reported by the provider * * Output: * none * * Returns: * char * to string number */ DAT_RETURN dapli_ns_create_gid_map(void) { FILE *f; ib_gid_t gid; char hostname[128]; int rc; struct addrinfo *addr; struct sockaddr_in *si; DAPL_GID_MAP gmt; f = fopen(MAP_FILE, "r"); if (f == NULL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: Must have file <%s> for IP/GID mappings\n", MAP_FILE); return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } rc = fscanf(f, "%s " F64x " " F64x, hostname, &gid.gid_prefix, &gid.guid); while (rc != EOF) { rc = dapls_osd_getaddrinfo(hostname, &addr); if (rc != 0) { /* * hostname not registered in DNS, provide a dummy value */ dapl_dbg_log(DAPL_DBG_TYPE_WARN, "WARNING: <%s> not registered in DNS, using dummy IP value\n", hostname); /*dapl_os_memcpy(hca_ptr->hca_address.sa_data, "0x01020304", 4); */ gmt.ip_address = 0x01020304; } else { /* * Load into the ip/gid mapping table */ si = (struct sockaddr_in *)addr->ai_addr; if (AF_INET == addr->ai_addr->sa_family) { gmt.ip_address = si->sin_addr.s_addr; } else { dapl_dbg_log(DAPL_DBG_TYPE_WARN, "WARNING: <%s> Address family not supported, using dummy IP value\n", hostname); gmt.ip_address = 0x01020304; } dapls_osd_freeaddrinfo(addr); } gmt.gid.gid_prefix = gid.gid_prefix; gmt.gid.guid = gid.guid; dapli_ns_add_address(&gmt); rc = fscanf(f, "%s " F64x " " F64x, hostname, &gid.gid_prefix, &gid.guid); } fclose(f); return DAT_SUCCESS; } /* * dapli_ns_add_address * * Add a table entry to the gid_map_table. * * Input: * remote_ia_address remote IP address * gid pointer to output gid * * Output: * gid filled in GID * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ DAT_RETURN dapli_ns_add_address(IN DAPL_GID_MAP * gme) { DAPL_GID_MAP *gmt; int count; gmt = g_gid_map_table; for (count = 0, gmt = g_gid_map_table; gmt->ip_address; gmt++) { count++; } if (count > MAX_GID_ENTRIES) { return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0); } *gmt = *gme; return DAT_SUCCESS; } /* * dapls_ns_lookup_address * * Look up the provided IA_ADDRESS in the gid_map_table. Return * the gid if found. * * Input: * remote_ia_address remote IP address * gid pointer to output gid * * Output: * gid filled in GID * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ DAT_RETURN dapls_ns_lookup_address(IN DAPL_IA * ia_ptr, IN DAT_IA_ADDRESS_PTR remote_ia_address, OUT ib_gid_t * gid) { DAPL_GID_MAP *gmt; struct sockaddr_in *si; ia_ptr = ia_ptr; /* unused here */ si = (struct sockaddr_in *)remote_ia_address; for (gmt = g_gid_map_table; gmt->ip_address; gmt++) { if (gmt->ip_address == si->sin_addr.s_addr) { gid->guid = gmt->gid.guid; gid->gid_prefix = gmt->gid.gid_prefix; return DAT_SUCCESS; } } return DAT_ERROR(DAT_INVALID_PARAMETER, 0); } #endif /* IBHOSTS_NAMING */ /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_name_service.h000066400000000000000000000034651255317474200205020ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_name_service.h * * PURPOSE: Utility defs & routines supporting name services * * $Id:$ * **********************************************************************/ #ifndef _DAPL_NAME_SERVICE_H_ #define _DAPL_NAME_SERVICE_H_ #include "dapl.h" /* * Prototypes for name service routines */ DAT_RETURN dapls_ns_init (void); #ifdef IBHOSTS_NAMING DAT_RETURN dapls_ns_lookup_address ( IN DAPL_IA *ia_ptr, IN DAT_IA_ADDRESS_PTR remote_ia_address, OUT ib_gid_t *gid); #else /* routine is a no op if not using local name services */ #define dapls_ns_lookup_address(ia,ria,gid) DAT_SUCCESS #endif /* IBHOSTS_NAMING */ #endif /* _DAPL_NAME_SERVICE_H_ */ dapl-2.1.5/dapl/common/dapl_provider.c000077500000000000000000000244071255317474200176710ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_provider.c * * PURPOSE: Provider function table * Description: DAT Interfaces to this provider * * $Id:$ **********************************************************************/ #include "dapl_provider.h" extern DAT_RETURN dapl_not_implemented(void); /********************************************************************* * * * Global Data * * * *********************************************************************/ DAPL_PROVIDER_LIST g_dapl_provider_list; /* * the function table for this provider */ #if defined(__KDAPL__) DAT_PROVIDER g_dapl_provider_template = { NULL, 0, &dapl_ia_open, &dapl_ia_query, &dapl_ia_close, &dapl_ia_memtype_hint, /* unimplemented */ &dapl_set_consumer_context, /* untested */ &dapl_get_consumer_context, /* untested */ &dapl_get_handle_type, /* untested */ &dapl_cr_query, &dapl_cr_accept, &dapl_cr_reject, &dapl_cr_handoff, &dapl_evd_kcreate, &dapl_evd_kquery, /* untested */ &dapl_evd_modify_upcall, &dapl_evd_resize, /* unimplemented */ &dapl_evd_post_se, /* untested */ &dapl_evd_dequeue, &dapl_evd_free, &dapl_ep_create, &dapl_ep_query, &dapl_ep_modify, /* untested */ &dapl_ep_connect, &dapl_ep_dup_connect, /* untested */ &dapl_ep_disconnect, &dapl_ep_post_send, &dapl_ep_post_recv, &dapl_ep_post_rdma_read, &dapl_ep_post_rdma_write, &dapl_ep_get_status, &dapl_ep_free, &dapl_lmr_kcreate, &dapl_lmr_query, &dapl_lmr_free, &dapl_rmr_create, &dapl_rmr_query, /* untested */ &dapl_rmr_bind, &dapl_rmr_free, &dapl_psp_create, &dapl_psp_query, /* untested */ &dapl_psp_free, &dapl_rsp_create, &dapl_rsp_query, /* untested */ &dapl_rsp_free, &dapl_pz_create, &dapl_pz_query, /* untested */ &dapl_pz_free, /* dat-1.1 */ &dapl_psp_create_any, &dapl_ep_reset, /* dat-1.2 */ &dapl_lmr_sync_rdma_read, &dapl_lmr_sync_rdma_write, &dapl_ep_create_with_srq, &dapl_ep_recv_query, &dapl_ep_set_watermark, &dapl_srq_create, &dapl_srq_free, &dapl_srq_post_recv, &dapl_srq_query, &dapl_srq_resize, &dapl_srq_set_lw }; #else /* * uDAPL version of the provider jump table */ DAT_PROVIDER g_dapl_provider_template = { NULL, 0, &dapl_ia_open, &dapl_ia_query, &dapl_ia_close, &dapl_set_consumer_context, &dapl_get_consumer_context, &dapl_get_handle_type, &dapl_cno_create, &dapl_cno_modify_agent, &dapl_cno_query, &dapl_cno_free, &dapl_cno_wait, &dapl_cr_query, &dapl_cr_accept, &dapl_cr_reject, &dapl_cr_handoff, &dapl_evd_create, &dapl_evd_query, &dapl_evd_modify_cno, &dapl_evd_enable, &dapl_evd_disable, &dapl_evd_wait, &dapl_evd_resize, &dapl_evd_post_se, &dapl_evd_dequeue, &dapl_evd_free, &dapl_ep_create, &dapl_ep_query, &dapl_ep_modify, &dapl_ep_connect, &dapl_ep_dup_connect, &dapl_ep_disconnect, &dapl_ep_post_send, &dapl_ep_post_recv, &dapl_ep_post_rdma_read, &dapl_ep_post_rdma_write, &dapl_ep_get_status, &dapl_ep_free, &dapl_lmr_create, &dapl_lmr_query, &dapl_lmr_free, &dapl_rmr_create, &dapl_rmr_query, &dapl_rmr_bind, &dapl_rmr_free, &dapl_psp_create, &dapl_psp_query, &dapl_psp_free, &dapl_rsp_create, &dapl_rsp_query, &dapl_rsp_free, &dapl_pz_create, &dapl_pz_query, &dapl_pz_free, &dapl_psp_create_any, &dapl_ep_reset, &dapl_evd_set_unwaitable, &dapl_evd_clear_unwaitable, /* dat-1.2 */ &dapl_lmr_sync_rdma_read, &dapl_lmr_sync_rdma_write, &dapl_ep_create_with_srq, &dapl_ep_recv_query, &dapl_ep_set_watermark, &dapl_srq_create, &dapl_srq_free, &dapl_srq_post_recv, &dapl_srq_query, &dapl_srq_resize, &dapl_srq_set_lw, /* dat-2.0 */ &dapl_csp_create, &dapl_csp_query, &dapl_csp_free, &dapl_ep_common_connect, &dapl_rmr_create_for_ep, &dapl_ep_post_send_with_invalidate, &dapl_ep_post_rdma_read_to_rmr, &dapl_cno_fd_create, &dapl_cno_trigger, &dapl_ia_ha #ifdef DAT_EXTENSIONS , &dapl_extensions #endif }; #endif /* __KDAPL__ */ /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ static DAT_BOOLEAN dapl_provider_list_key_cmp(const char *name_a, const char *name_b); /********************************************************************* * * * Function Definitions * * * *********************************************************************/ DAT_RETURN dapl_provider_list_create(void) { DAT_RETURN status; status = DAT_SUCCESS; /* create the head node */ g_dapl_provider_list.head = dapl_os_alloc(sizeof(DAPL_PROVIDER_LIST_NODE)); if (NULL == g_dapl_provider_list.head) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dapl_os_memzero(g_dapl_provider_list.head, sizeof(DAPL_PROVIDER_LIST_NODE)); /* create the tail node */ g_dapl_provider_list.tail = dapl_os_alloc(sizeof(DAPL_PROVIDER_LIST_NODE)); if (NULL == g_dapl_provider_list.tail) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dapl_os_memzero(g_dapl_provider_list.tail, sizeof(DAPL_PROVIDER_LIST_NODE)); g_dapl_provider_list.head->next = g_dapl_provider_list.tail; g_dapl_provider_list.tail->prev = g_dapl_provider_list.head; g_dapl_provider_list.size = 0; bail: if (DAT_SUCCESS != status) { if (NULL != g_dapl_provider_list.head) { dapl_os_free(g_dapl_provider_list.head, sizeof(DAPL_PROVIDER_LIST_NODE)); } if (NULL != g_dapl_provider_list.tail) { dapl_os_free(g_dapl_provider_list.tail, sizeof(DAPL_PROVIDER_LIST_NODE)); } } return status; } DAT_RETURN dapl_provider_list_destroy(void) { DAPL_PROVIDER_LIST_NODE *cur_node; while (NULL != g_dapl_provider_list.head) { cur_node = g_dapl_provider_list.head; g_dapl_provider_list.head = cur_node->next; dapl_os_free(cur_node, sizeof(DAPL_PROVIDER_LIST_NODE)); } return DAT_SUCCESS; } DAT_COUNT dapl_provider_list_size(void) { return g_dapl_provider_list.size; } DAT_RETURN dapl_provider_list_insert(IN const char *name, IN DAT_PROVIDER ** p_data) { DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node; DAT_RETURN status; unsigned int len; status = DAT_SUCCESS; cur_node = dapl_os_alloc(sizeof(DAPL_PROVIDER_LIST_NODE)); if (NULL == cur_node) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } len = dapl_os_strlen(name); if (DAT_NAME_MAX_LENGTH <= len) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* insert node at end of list to preserve registration order */ prev_node = g_dapl_provider_list.tail->prev; next_node = g_dapl_provider_list.tail; dapl_os_memcpy(cur_node->name, name, len); cur_node->name[len] = '\0'; cur_node->data = g_dapl_provider_template; cur_node->data.device_name = cur_node->name; cur_node->next = next_node; cur_node->prev = prev_node; prev_node->next = cur_node; next_node->prev = cur_node; g_dapl_provider_list.size++; if (NULL != p_data) { *p_data = &cur_node->data; } bail: if (DAT_SUCCESS != status) { if (NULL != cur_node) { dapl_os_free(cur_node, sizeof(DAPL_PROVIDER_LIST_NODE)); } } return status; } DAT_RETURN dapl_provider_list_search(IN const char *name, OUT DAT_PROVIDER ** p_data) { DAPL_PROVIDER_LIST_NODE *cur_node; DAT_RETURN status; status = DAT_ERROR(DAT_PROVIDER_NOT_FOUND, DAT_NAME_NOT_REGISTERED); for (cur_node = g_dapl_provider_list.head->next; g_dapl_provider_list.tail != cur_node; cur_node = cur_node->next) { if (dapl_provider_list_key_cmp(cur_node->name, name)) { if (NULL != p_data) { *p_data = &cur_node->data; } status = DAT_SUCCESS; goto bail; } } bail: return status; } DAT_RETURN dapl_provider_list_remove(IN const char *name) { DAPL_PROVIDER_LIST_NODE *cur_node, *prev_node, *next_node; DAT_RETURN status; status = DAT_ERROR(DAT_PROVIDER_NOT_FOUND, DAT_NAME_NOT_REGISTERED); for (cur_node = g_dapl_provider_list.head->next; g_dapl_provider_list.tail != cur_node; cur_node = cur_node->next) { if (dapl_provider_list_key_cmp(cur_node->name, name)) { prev_node = cur_node->prev; next_node = cur_node->next; prev_node->next = next_node; next_node->prev = prev_node; dapl_os_free(cur_node, sizeof(DAPL_PROVIDER_LIST_NODE)); g_dapl_provider_list.size--; status = DAT_SUCCESS; goto bail; } } bail: return status; } DAT_BOOLEAN dapl_provider_list_key_cmp(const char *name_a, const char *name_b) { unsigned int len; len = dapl_os_strlen(name_a); if (dapl_os_strlen(name_b) != len) { return DAT_FALSE; } else if (dapl_os_memcmp(name_a, name_b, len)) { return DAT_FALSE; } else { return DAT_TRUE; } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_provider.h000066400000000000000000000067101255317474200176700ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_provider.h * * PURPOSE: Provider function table * Description: DAT Interfaces to this provider * * $Id:$ **********************************************************************/ #ifndef _DAPL_PROVIDER_H_ #define _DAPL_PROVIDER_H_ #include "dapl.h" /********************************************************************* * * * Structures * * * *********************************************************************/ typedef struct DAPL_PROVIDER_LIST_NODE { char name[DAT_NAME_MAX_LENGTH]; DAT_PROVIDER data; struct DAPL_PROVIDER_LIST_NODE *next; struct DAPL_PROVIDER_LIST_NODE *prev; } DAPL_PROVIDER_LIST_NODE; typedef struct DAPL_PROVIDER_LIST { DAPL_PROVIDER_LIST_NODE *head; DAPL_PROVIDER_LIST_NODE *tail; DAT_COUNT size; } DAPL_PROVIDER_LIST; /********************************************************************* * * * Global Data * * * *********************************************************************/ extern DAPL_PROVIDER_LIST g_dapl_provider_list; extern DAT_PROVIDER g_dapl_provider_template; extern int g_dapl_loopback_connection; /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAT_RETURN dapl_provider_list_create( void ); extern DAT_RETURN dapl_provider_list_destroy( void ); extern DAT_COUNT dapl_provider_list_size( void ); extern DAT_RETURN dapl_provider_list_insert( IN const char *name, OUT DAT_PROVIDER **p_data ); extern DAT_RETURN dapl_provider_list_search( IN const char *name, OUT DAT_PROVIDER **p_data ); extern DAT_RETURN dapl_provider_list_remove( IN const char *name ); #endif /* _DAPL_PROVIDER_H_ */ dapl-2.1.5/dapl/common/dapl_psp_create.c000066400000000000000000000122771255317474200201630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_psp_create.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_psp_create * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.1.1 * * Create a persistent Public Service Point that can receive multiple * requests for connections and generate multiple connection request * instances that will be delivered to the specified Event Dispatcher * in a notification event. * * Input: * ia_handle * conn_qual * evd_handle * psp_flags * * Output: * psp_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_CONN_QUAL_IN_USE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_psp_create(IN DAT_IA_HANDLE ia_handle, IN DAT_CONN_QUAL conn_qual, IN DAT_EVD_HANDLE evd_handle, IN DAT_PSP_FLAGS psp_flags, OUT DAT_PSP_HANDLE * psp_handle) { DAPL_IA *ia_ptr; DAPL_SP *sp_ptr; DAPL_EVD *evd_ptr; DAT_BOOLEAN sp_found; DAT_RETURN dat_status; ia_ptr = (DAPL_IA *) ia_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } if (psp_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); goto bail; } evd_ptr = (DAPL_EVD *) evd_handle; if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } if (psp_flags != DAT_PSP_CONSUMER_FLAG && psp_flags != DAT_PSP_PROVIDER_FLAG) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_PSP_CREATE); /* * See if we have a quiescent listener to use for this PSP, else * create one and set it listening */ sp_ptr = dapls_ia_sp_search(ia_ptr, conn_qual, DAT_TRUE); sp_found = DAT_TRUE; if (sp_ptr == NULL) { /* Allocate PSP */ sp_found = DAT_FALSE; sp_ptr = dapls_sp_alloc(ia_ptr, DAT_TRUE); if (sp_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } } else if (sp_ptr->listening == DAT_TRUE) { dat_status = DAT_ERROR(DAT_CONN_QUAL_IN_USE, 0); goto bail; } /* * Fill out the args for a PSP */ sp_ptr->conn_qual = conn_qual; sp_ptr->evd_handle = evd_handle; sp_ptr->psp_flags = psp_flags; sp_ptr->ep_handle = NULL; /* * Take a reference on the EVD handle */ dapl_os_atomic_inc(&((DAPL_EVD *) evd_handle)->evd_ref_count); /* * Set up a listener for a connection. Connections can arrive * even before this call returns! */ sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; sp_ptr->listening = DAT_TRUE; /* * If this is a new sp we need to add it to the IA queue, and set up * a conn_listener. */ if (sp_found == DAT_FALSE) { /* Link it onto the IA before enabling it to receive conn * requests */ dapl_ia_link_psp(ia_ptr, sp_ptr); dat_status = dapls_ib_setup_conn_listener(ia_ptr, conn_qual, sp_ptr); if (dat_status != DAT_SUCCESS) { /* * Have a problem setting up the connection, something * wrong! Decrements the EVD refcount & release it. */ dapl_os_atomic_dec(&((DAPL_EVD *) evd_handle)-> evd_ref_count); sp_ptr->evd_handle = NULL; dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); dapl_dbg_log(DAPL_DBG_TYPE_CM, "--> dapl_psp_create setup_conn_listener failed: %x\n", dat_status); goto bail; } } /* * Return handle to the user */ *psp_handle = (DAT_PSP_HANDLE) sp_ptr; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_psp_create_any.c000066400000000000000000000127211255317474200210240ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_psp_create.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_psp_create_any * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.3.3 * * Create a persistent Public Service Point that can receive multiple * requests for connections and generate multiple connection request * instances that will be delivered to the specified Event Dispatcher * in a notification event. Differs from dapl_psp_create() in that * the conn_qual is selected by the implementation and returned to * the user. * * Input: * ia_handle * evd_handle * psp_flags * * Output: * conn_qual * psp_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_CONN_QUAL_IN_USE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_psp_create_any(IN DAT_IA_HANDLE ia_handle, OUT DAT_CONN_QUAL * conn_qual, IN DAT_EVD_HANDLE evd_handle, IN DAT_PSP_FLAGS psp_flags, OUT DAT_PSP_HANDLE * psp_handle) { DAPL_IA *ia_ptr; DAPL_SP *sp_ptr; DAPL_EVD *evd_ptr; DAT_RETURN dat_status; static DAT_CONN_QUAL hint_conn_qual = 1024; /* seed value */ DAT_CONN_QUAL lcl_conn_qual; DAT_CONN_QUAL limit_conn_qual; ia_ptr = (DAPL_IA *) ia_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } if (psp_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); goto bail; } if (conn_qual == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } evd_ptr = (DAPL_EVD *) evd_handle; if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } if (psp_flags != DAT_PSP_CONSUMER_FLAG && psp_flags != DAT_PSP_PROVIDER_FLAG) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } /* Allocate PSP */ sp_ptr = dapls_sp_alloc(ia_ptr, DAT_TRUE); if (sp_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_PSP_CREATE_ANY); /* * Fill out the args for a PSP */ sp_ptr->evd_handle = evd_handle; sp_ptr->psp_flags = psp_flags; sp_ptr->ep_handle = NULL; /* * Take a reference on the EVD handle */ dapl_os_atomic_inc(&((DAPL_EVD *) evd_handle)->evd_ref_count); /* Link it onto the IA */ dapl_ia_link_psp(ia_ptr, sp_ptr); /* * Set up a listener for a connection. Connections can arrive * even before this call returns! */ sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; sp_ptr->listening = DAT_TRUE; limit_conn_qual = 0; lcl_conn_qual = hint_conn_qual; dat_status = ~DAT_SUCCESS; while (dat_status != DAT_SUCCESS) { dat_status = dapls_ib_setup_conn_listener(ia_ptr, lcl_conn_qual, sp_ptr); lcl_conn_qual++; if (dat_status == DAT_CONN_QUAL_IN_USE) { /* * If we have a big number of tries and we still haven't * found a service_ID we can use, bail out with an error, * something is wrong! */ if (limit_conn_qual++ > 100000) { dat_status = DAT_CONN_QUAL_UNAVAILABLE; break; } } } hint_conn_qual = lcl_conn_qual; if (dat_status != DAT_SUCCESS) { /* * Have a problem setting up the connection, something wrong! */ dapl_os_atomic_dec(&((DAPL_EVD *) evd_handle)->evd_ref_count); sp_ptr->evd_handle = NULL; dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); dapl_os_printf ("--> dapl_psp_create cannot set up conn listener: %x\n", dat_status); goto bail; } sp_ptr->conn_qual = lcl_conn_qual - 1; /* * Return handle to the user */ *conn_qual = sp_ptr->conn_qual; *psp_handle = (DAT_PSP_HANDLE) sp_ptr; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_psp_free.c000066400000000000000000000103761255317474200176370ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_psp_free.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_psp_free * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.1.2 * * Destroy a specific instance of a Service Point. * * Input: * psp_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_psp_free(IN DAT_PSP_HANDLE psp_handle) { DAPL_IA *ia_ptr; DAPL_SP *sp_ptr; DAT_RETURN dat_status; DAPL_SP_STATE save_state; sp_ptr = (DAPL_SP *) psp_handle; dat_status = DAT_SUCCESS; /* * Verify handle */ dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_psp_free %p\n", psp_handle); if (DAPL_BAD_HANDLE(sp_ptr, DAPL_MAGIC_PSP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); goto bail; } ia_ptr = sp_ptr->header.owner_ia; DAPL_CNTR(ia_ptr->header.owner_ia, DCNT_IA_PSP_FREE); /* * Remove the connection listener if it has been established * and there are no current connections in progress. * If we defer removing the sp it becomes something of a zombie * container until the last connection is disconnected, after * which it will be cleaned up. */ dapl_os_lock(&sp_ptr->header.lock); sp_ptr->listening = DAT_FALSE; /* Release reference on EVD. If an error was encountered in a previous * free the evd_handle will be NULL */ if (sp_ptr->evd_handle) { dapl_os_atomic_dec(&((DAPL_EVD *) sp_ptr->evd_handle)-> evd_ref_count); sp_ptr->evd_handle = NULL; } /* * Release the base resource if there are no outstanding * connections; else the last disconnect on this PSP will free it * up. The PSP is used to contain CR records for each connection, * which contain information necessary to disconnect. */ dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_psp_free: state %d cr_list_count %d\n", sp_ptr->state, sp_ptr->cr_list_count); if ((sp_ptr->state == DAPL_SP_STATE_PSP_LISTENING || sp_ptr->state == DAPL_SP_STATE_PSP_PENDING) && sp_ptr->cr_list_count == 0) { save_state = sp_ptr->state; sp_ptr->state = DAPL_SP_STATE_FREE; dapl_os_unlock(&sp_ptr->header.lock); dat_status = dapls_ib_remove_conn_listener(ia_ptr, sp_ptr); if (dat_status != DAT_SUCCESS) { /* revert to entry state on error */ sp_ptr->state = save_state; goto bail; } dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); } else { /* The PSP is now in the pending state, where it will sit until * the last connection terminates or the app uses the same * ServiceID again, which will reactivate it. */ sp_ptr->state = DAPL_SP_STATE_PSP_PENDING; dapl_os_unlock(&sp_ptr->header.lock); dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_psp_free: PSP PENDING\n"); } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_psp_query.c000066400000000000000000000051661255317474200200640ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_psp_query.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_psp_query * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.1.3 * * Provide arguments of the public service points * * Input: * psp_handle * psp_args_mask * * Output: * psp_args * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_psp_query(IN DAT_PSP_HANDLE psp_handle, IN DAT_PSP_PARAM_MASK psp_args_mask, OUT DAT_PSP_PARAM * psp_param) { DAPL_SP *sp_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(psp_handle, DAPL_MAGIC_PSP) || ((DAPL_SP *) psp_handle)->listening != DAT_TRUE) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); goto bail; } if (NULL == psp_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } sp_ptr = (DAPL_SP *) psp_handle; /* * Fill in the PSP params */ dats_get_ia_handle(sp_ptr->header.owner_ia, &psp_param->ia_handle); psp_param->conn_qual = sp_ptr->conn_qual; psp_param->evd_handle = sp_ptr->evd_handle; psp_param->psp_flags = sp_ptr->psp_flags; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_pz_create.c000066400000000000000000000047611255317474200200110ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_pz_create.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_pz_util.h" #include "dapl_adapter_util.h" /* * dapl_pz_create * * Create an instance of a protection zone * * Input: * ia_handle * * Output: * pz_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVLAID_HANDLE */ DAT_RETURN DAT_API dapl_pz_create(IN DAT_IA_HANDLE ia_handle, OUT DAT_PZ_HANDLE * pz_handle) { DAPL_IA *ia; DAPL_PZ *pz; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_pz_create (%p, %p)\n", ia_handle, pz_handle); dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (NULL == pz_handle) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } ia = (DAPL_IA *) ia_handle; pz = dapl_pz_alloc(ia); if (NULL == pz) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } DAPL_CNTR(ia, DCNT_IA_PZ_CREATE); dat_status = dapls_ib_pd_alloc(ia, pz); if (DAT_SUCCESS != dat_status) { dapl_pz_dealloc(pz); pz = NULL; } *pz_handle = pz; bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_pz_free.c000066400000000000000000000043531255317474200174640ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_pz_free.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_pz_util.h" #include "dapl_adapter_util.h" /* * dapl_pz_free * * Remove an instance of a protection zone * * Input: * pz_handle * * Output: * None. * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_pz_free(IN DAT_PZ_HANDLE pz_handle) { DAPL_PZ *pz; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_pz_free (%p)\n", pz_handle); dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } pz = (DAPL_PZ *) pz_handle; DAPL_CNTR(pz->header.owner_ia, DCNT_IA_PZ_FREE); if (0 != dapl_os_atomic_read(&pz->pz_ref_count)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_PZ_IN_USE); goto bail; } dat_status = dapls_ib_pd_free(pz); if (DAT_SUCCESS == dat_status) { dapl_pz_dealloc(pz); } bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_pz_query.c000066400000000000000000000045251255317474200177110ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_pz_query.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_pz_query * * Return the ia associated with the protection zone pz * * Input: * pz_handle * pz_param_mask * * Output: * pz_param * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_pz_query(IN DAT_PZ_HANDLE pz_handle, IN DAT_PZ_PARAM_MASK pz_param_mask, OUT DAT_PZ_PARAM * pz_param) { DAPL_PZ *pz; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_pz_query (%p, %x, %p)\n", pz_handle, pz_param_mask, pz_param); if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } if (NULL == pz_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } dat_status = DAT_SUCCESS; pz = (DAPL_PZ *) pz_handle; /* Since the DAT_PZ_ARGS values are easily accessible, */ /* don't bother checking the DAT_PZ_ARGS_MASK value */ dats_get_ia_handle(pz->header.owner_ia, &pz_param->ia_handle); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_pz_util.c000066400000000000000000000050141255317474200175130ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_pz_util.c * * PURPOSE: Manage PZ structure * * $Id:$ **********************************************************************/ #include "dapl_pz_util.h" #include "dapl_ia_util.h" /* * dapl_pz_alloc * * alloc and initialize an PZ struct * * Input: * none * * Output: * pz_ptr * * Returns: * none * */ DAPL_PZ *dapl_pz_alloc(IN DAPL_IA * ia) { DAPL_PZ *pz; /* Allocate PZ */ pz = (DAPL_PZ *) dapl_os_alloc(sizeof(DAPL_PZ)); if (NULL == pz) { return (NULL); } /* zero the structure */ dapl_os_memzero(pz, sizeof(DAPL_PZ)); /* * initialize the header */ pz->header.provider = ia->header.provider; pz->header.magic = DAPL_MAGIC_PZ; pz->header.handle_type = DAT_HANDLE_TYPE_PZ; pz->header.owner_ia = ia; pz->header.user_context.as_64 = 0; pz->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&pz->header.ia_list_entry); dapl_ia_link_pz(ia, pz); dapl_os_lock_init(&pz->header.lock); /* * initialize the body */ dapl_os_atomic_set(&pz->pz_ref_count, 0); return (pz); } /* * dapl_pz_free * * free an PZ struct * * Input: * pz_ptr * * Output: * none * * Returns: * none * */ void dapl_pz_dealloc(IN DAPL_PZ * pz) { pz->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_ia_unlink_pz(pz->header.owner_ia, pz); dapl_os_lock_destroy(&pz->header.lock); dapl_os_free(pz, sizeof(DAPL_PZ)); } dapl-2.1.5/dapl/common/dapl_pz_util.h000066400000000000000000000030231255317474200175160ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_pz_util.h * * PURPOSE: Utility defs & routines for the PZ data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_PZ_UTIL_H_ #define _DAPL_PZ_UTIL_H_ #include "dapl.h" extern DAPL_PZ * dapl_pz_alloc ( IN DAPL_IA *ia); extern void dapl_pz_dealloc ( IN DAPL_PZ *pz); #endif /* _DAPL_PZ_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_ring_buffer_util.c000066400000000000000000000161231255317474200213550ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ring_buffer_util.c * * PURPOSE: Ring buffer management * Description: Support and management functions for ring buffers * * $Id:$ **********************************************************************/ #include "dapl_ring_buffer_util.h" /* * dapls_rbuf_alloc * * Given a DAPL_RING_BUFFER, initialize it and provide memory for * the ringbuf itself. A passed in size will be adjusted to the next * largest power of two number to simplify management. * * Input: * rbuf pointer to DAPL_RING_BUFFER * size number of elements to allocate & manage * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_rbuf_alloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size) { unsigned int rsize; /* real size */ /* The circular buffer must be allocated one too large. * This eliminates any need for a distinct counter, as * having the two pointers equal always means "empty" -- never "full" */ size++; /* Put size on a power of 2 boundary */ rsize = 1; while ((DAT_COUNT) rsize < size) { rsize <<= 1; } rbuf->base = (void *)dapl_os_alloc(rsize * sizeof(void *)); dapl_os_memzero (rbuf->base, rsize * sizeof(void *)); if (rbuf->base != NULL) { rbuf->lim = rsize - 1; dapl_os_atomic_set(&rbuf->head, 0); dapl_os_atomic_set(&rbuf->tail, 0); } else { return DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY; } return DAT_SUCCESS; } /* * dapls_rbuf_realloc * * Resizes a DAPL_RING_BUFFER. This function is not thread safe; * adding or removing elements from a ring buffer while resizing * will have indeterminate results. * * Input: * rbuf pointer to DAPL_RING_BUFFER * size number of elements to allocate & manage * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_rbuf_realloc(INOUT DAPL_RING_BUFFER * rbuf, IN DAT_COUNT size) { DAPL_RING_BUFFER new_rbuf; void *entry; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; /* decreasing the size or retaining the old size is not allowed */ if (size <= rbuf->lim + 1) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } /* * !This is NOT ATOMIC! * Simple algorithm: Allocate a new ring buffer, take everything * out of the old one and put it in the new one, and release the * old base buffer. */ dat_status = dapls_rbuf_alloc(&new_rbuf, size); if (dat_status != DAT_SUCCESS) { goto bail; } while ((entry = dapls_rbuf_remove(rbuf)) != NULL) { /* We know entries will fit so ignore the return code */ (void)dapls_rbuf_add(&new_rbuf, entry); } /* release the old base buffer */ dapl_os_free(rbuf->base, (rbuf->lim + 1) * sizeof(void *)); *rbuf = new_rbuf; bail: return dat_status; } /* * dapls_rbuf_destroy * * Release the buffer and reset pointers to a DAPL_RING_BUFFER * * Input: * rbuf pointer to DAPL_RING_BUFFER * * Output: * none * * Returns: * none * */ void dapls_rbuf_destroy(IN DAPL_RING_BUFFER * rbuf) { if ((NULL == rbuf) || (NULL == rbuf->base)) { return; } dapl_os_free(rbuf->base, (rbuf->lim + 1) * sizeof(void *)); rbuf->base = NULL; rbuf->lim = 0; return; } /* * dapls_rbuf_add * * Add an entry to the ring buffer * * Input: * rbuf pointer to DAPL_RING_BUFFER * entry entry to add * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES (queue full) * */ DAT_RETURN dapls_rbuf_add(IN DAPL_RING_BUFFER * rbuf, IN void *entry) { int pos; int val; while ((dapl_os_atomic_read(&rbuf->head) + 1) != dapl_os_atomic_read(&rbuf->tail)) { pos = dapl_os_atomic_read(&rbuf->head); val = dapl_os_atomic_assign(&rbuf->head, pos, ((pos + 1) & rbuf->lim)); if (val == pos) { pos = (pos + 1) & rbuf->lim; /* verify in range */ rbuf->base[pos] = entry; return DAT_SUCCESS; } } return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); } /* * dapls_rbuf_remove * * Remove an entry from the ring buffer * * Input: * rbuf pointer to DAPL_RING_BUFFER * * Output: * entry entry removed from the ring buffer * * Returns: * DAT_SUCCESS * DAT_QUEUE_EMPTY */ void *dapls_rbuf_remove(IN DAPL_RING_BUFFER * rbuf) { int pos; int val; while (dapl_os_atomic_read(&rbuf->head) != dapl_os_atomic_read(&rbuf->tail)) { pos = dapl_os_atomic_read(&rbuf->tail); val = dapl_os_atomic_assign(&rbuf->tail, pos, ((pos + 1) & rbuf->lim)); if (val == pos) { pos = (pos + 1) & rbuf->lim; /* verify in range */ return (rbuf->base[pos]); } } return NULL; } /* * dapli_rbuf_count * * Return the number of entries in use in the ring buffer * * Input: * rbuf pointer to DAPL_RING_BUFFER * * * Output: * none * * Returns: * count of entries * */ DAT_COUNT dapls_rbuf_count(IN DAPL_RING_BUFFER * rbuf) { DAT_COUNT count; int head; int tail; head = dapl_os_atomic_read(&rbuf->head) & rbuf->lim; tail = dapl_os_atomic_read(&rbuf->tail) & rbuf->lim; if (head > tail) { count = head - tail; } else { /* add 1 to lim as it is a mask, number of entries - 1 */ count = (rbuf->lim + 1 - tail + head) & rbuf->lim; } return count; } /* * dapls_rbuf_adjust * * Adjusts the addresses of all elements stored in the * ring buffer by a constant. This is useful for situations * in which the memory area for the elements being stored * has been reallocated (see dapl_evd_realloc() and helper * functions). * * Input: * rbuf pointer to DAPL_RING_BUFFER * offset offset to adjust elemnt addresss by, * used for addresses of type void * * Output: * none * * Returns: * none */ void dapls_rbuf_adjust(IN DAPL_RING_BUFFER * rbuf, IN intptr_t offset) { int pos; pos = dapl_os_atomic_read(&rbuf->head); while (pos != dapl_os_atomic_read(&rbuf->tail)) { rbuf->base[pos] = (void *)((char *)rbuf->base[pos] + offset); pos = (pos + 1) & rbuf->lim; /* verify in range */ } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_ring_buffer_util.h000066400000000000000000000040401255317474200213550ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_ring_buffer_util.h * * PURPOSE: Utility defs & routines for the ring buffer data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_RING_BUFFER_H_ #define _DAPL_RING_BUFFER_H_ #include "dapl.h" /* * Prototypes */ DAT_RETURN dapls_rbuf_alloc ( DAPL_RING_BUFFER *rbuf, DAT_COUNT size ); DAT_RETURN dapls_rbuf_realloc ( DAPL_RING_BUFFER *rbuf, DAT_COUNT size ); void dapls_rbuf_destroy ( DAPL_RING_BUFFER *rbuf); DAT_RETURN dapls_rbuf_add ( DAPL_RING_BUFFER *rbuf, void *entry); void * dapls_rbuf_remove ( DAPL_RING_BUFFER *rbuf); DAT_COUNT dapls_rbuf_count ( DAPL_RING_BUFFER *rbuf ); void dapls_rbuf_adjust ( IN DAPL_RING_BUFFER *rbuf, IN intptr_t offset); /* * Simple functions */ #define dapls_rbuf_empty(rbuf) (rbuf->head == rbuf->tail) #endif /* _DAPL_RING_BUFFER_H_ */ dapl-2.1.5/dapl/common/dapl_rmr_bind.c000077500000000000000000000226431255317474200176330ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rmr_bind.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_rmr_util.h" #include "dapl_ep_util.h" #include "dapl_cookie.h" #include "dapl_adapter_util.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ STATIC _INLINE_ DAT_RETURN dapli_rmr_bind_fuse(IN DAPL_RMR * rmr, IN DAT_LMR_HANDLE lmr_handle, IN const DAT_LMR_TRIPLET * lmr_triplet, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAPL_EP * ep_ptr, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags, OUT DAT_RMR_CONTEXT * rmr_context); STATIC _INLINE_ DAT_RETURN dapli_rmr_bind_unfuse(IN DAPL_RMR * rmr, IN DAPL_EP * ep_ptr, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags); /********************************************************************* * * * Function Definitions * * * *********************************************************************/ DAT_RETURN dapli_rmr_bind_fuse(IN DAPL_RMR * rmr, IN DAT_LMR_HANDLE lmr_handle, IN const DAT_LMR_TRIPLET * lmr_triplet, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAPL_EP * ep_ptr, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags, OUT DAT_RMR_CONTEXT * rmr_context) { DAPL_LMR *lmr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; DAT_BOOLEAN is_signaled; lmr = (DAPL_LMR *) lmr_handle; /* if the ep in unconnected return an error. IB requires that the */ /* QP be connected to change a memory window binding since: */ /* */ /* - memory window bind operations are WQEs placed on a QP's */ /* send queue */ /* */ /* - QP's only process WQEs on the send queue when the QP is in */ /* the RTS state */ if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } if (DAT_FALSE == dapl_mr_bounds_check(dapl_mr_get_address (lmr->param.region_desc, lmr->param.mem_type), lmr->param.length, lmr_triplet->virtual_address, lmr_triplet->segment_length)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } /* If the LMR, RMR, and EP are not in the same PZ, there is an error */ if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) || (ep_ptr->param.pz_handle != rmr->param.pz_handle)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG, ep_ptr->param.ep_attr. request_completion_flags, completion_flags) || !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG, ep_ptr->param.ep_attr. request_completion_flags, completion_flags) || !dapl_rmr_validate_completion_flag (DAT_COMPLETION_BARRIER_FENCE_FLAG, ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie, &cookie); if (DAT_SUCCESS != dat_status) { goto bail; } is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ? DAT_FALSE : DAT_TRUE; dat_status = dapls_ib_mw_bind(rmr, lmr, ep_ptr, cookie, lmr_triplet->virtual_address, lmr_triplet->segment_length, mem_priv, is_signaled); if (DAT_SUCCESS != dat_status) { dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); goto bail; } dapl_os_atomic_inc(&lmr->lmr_ref_count); /* if the RMR was previously bound */ if (NULL != rmr->lmr) { dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count); } rmr->param.mem_priv = mem_priv; rmr->param.lmr_triplet = *lmr_triplet; rmr->ep = ep_ptr; rmr->lmr = lmr; if (NULL != rmr_context) { *rmr_context = rmr->param.rmr_context; } bail: return dat_status; } DAT_RETURN dapli_rmr_bind_unfuse(IN DAPL_RMR * rmr, IN DAPL_EP * ep_ptr, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags) { DAPL_COOKIE *cookie; DAT_RETURN dat_status; DAT_BOOLEAN is_signaled; dat_status = DAT_SUCCESS; /* * if the ep in unconnected return an error. IB requires that the * QP be connected to change a memory window binding since: * * - memory window bind operations are WQEs placed on a QP's * send queue * * - QP's only process WQEs on the send queue when the QP is in * the RTS state */ if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail1; } /* If the RMR and EP are not in the same PZ, there is an error */ if (ep_ptr->param.pz_handle != rmr->param.pz_handle) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail1; } if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG, ep_ptr->param.ep_attr. request_completion_flags, completion_flags) || !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG, ep_ptr->param.ep_attr. request_completion_flags, completion_flags) || !dapl_rmr_validate_completion_flag (DAT_COMPLETION_BARRIER_FENCE_FLAG, ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail1; } dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie, &cookie); if (DAT_SUCCESS != dat_status) { goto bail1; } is_signaled = (completion_flags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? DAT_FALSE : DAT_TRUE; dat_status = dapls_ib_mw_unbind(rmr, ep_ptr, cookie, is_signaled); if (DAT_SUCCESS != dat_status) { dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); goto bail1; } /* if the RMR was previously bound */ if (NULL != rmr->lmr) { dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count); } rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG; rmr->param.lmr_triplet.lmr_context = 0; rmr->param.lmr_triplet.virtual_address = 0; rmr->param.lmr_triplet.segment_length = 0; rmr->ep = ep_ptr; rmr->lmr = NULL; bail1: return dat_status; } /* * dapl_rmr_bind * * DAPL Requirements Version xxx, 6.6.4.4 * * Bind the RMR to the specified memory region within the LMR and * provide a new rmr_context value. * * Input: * Output: */ DAT_RETURN DAT_API dapl_rmr_bind(IN DAT_RMR_HANDLE rmr_handle, IN DAT_LMR_HANDLE lmr_handle, IN const DAT_LMR_TRIPLET * lmr_triplet, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_VA_TYPE va_type, IN DAT_EP_HANDLE ep_handle, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags, OUT DAT_RMR_CONTEXT * rmr_context) { DAPL_RMR *rmr; DAPL_EP *ep_ptr; if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); } if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } rmr = (DAPL_RMR *) rmr_handle; ep_ptr = (DAPL_EP *) ep_handle; /* if the rmr should be bound */ if (0 != lmr_triplet->segment_length) { return dapli_rmr_bind_fuse(rmr, lmr_handle, lmr_triplet, mem_priv, ep_ptr, user_cookie, completion_flags, rmr_context); } else { /* the rmr should be unbound */ return dapli_rmr_bind_unfuse(rmr, ep_ptr, user_cookie, completion_flags); } } dapl-2.1.5/dapl/common/dapl_rmr_create.c000077500000000000000000000067401255317474200201620ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rmr_create.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl_rmr_util.h" #include "dapl_adapter_util.h" /* * dapl_rmr_create * * Create a remote memory region for the specified protection zone * * Input: * pz_handle * * Output: * rmr_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_rmr_create(IN DAT_PZ_HANDLE pz_handle, OUT DAT_RMR_HANDLE * rmr_handle) { DAPL_PZ *pz; DAPL_RMR *rmr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } pz = (DAPL_PZ *) pz_handle; rmr = dapl_rmr_alloc(pz); if (rmr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } DAPL_CNTR(pz->header.owner_ia, DCNT_IA_RMR_CREATE); dat_status = dapls_ib_mw_alloc(rmr); if (dat_status != DAT_SUCCESS) { dapl_rmr_dealloc(rmr); dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY_REGION); goto bail; } dapl_os_atomic_inc(&pz->pz_ref_count); *rmr_handle = rmr; bail: return dat_status; } /* * dapl_rmr_create_for_ep * * DAPL Requirements Version 2.0, 6.7.3.x * * Creates an RMR that is specific to a single connection at a time. * * This operation is relatively heavy. The created RMR can be bound to a * memory region within the LMR through a lightweight dat_rmr_bind * operation for EPs that use the pz_handle that generates rmr_context. * * If the operation fails (does not return DAT_SUCCESS), the return values * of rmr_handle are undefined and Consumers should not use it. * pz_handle provide Consumers a way to restrict access to an RMR by * authorized connections only. * * * Input: * pz_handle * * Output: * rmr_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_HANDLE * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_rmr_create_for_ep(IN DAT_PZ_HANDLE pz_handle, /* pz_handle */ OUT DAT_RMR_HANDLE * rmr_handle) { /* rmr_handle */ return DAT_MODEL_NOT_SUPPORTED; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_rmr_free.c000066400000000000000000000045701255317474200176340ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rmr_free.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl_rmr_util.h" #include "dapl_adapter_util.h" #include "dapl_ia_util.h" /* * dapl_rmr_free * * Destroy an instance of the Remote Memory Region * * Input: * rmr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_rmr_free(IN DAT_RMR_HANDLE rmr_handle) { DAPL_RMR *rmr; DAPL_PZ *pz; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); goto bail; } rmr = (DAPL_RMR *) rmr_handle; pz = (DAPL_PZ *) rmr->param.pz_handle; DAPL_CNTR(pz->header.owner_ia, DCNT_IA_RMR_FREE); /* * If the user did not perform an unbind op, release * counts here. */ if (rmr->param.lmr_triplet.virtual_address != 0) { dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count); rmr->param.lmr_triplet.virtual_address = 0; } dat_status = dapls_ib_mw_free(rmr); if (dat_status != DAT_SUCCESS) { goto bail; } dapl_os_atomic_dec(&rmr->pz->pz_ref_count); dapl_rmr_dealloc(rmr); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_rmr_query.c000066400000000000000000000051651255317474200200610ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rmr_query.c * * PURPOSE: Memory management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 6 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_rmr_query * * DAPL Requirements Version xxx, 6.6.4.3 * * Provide the RMR arguments. * * Input: * rmr_handle * rmr_args_mask * * Output: * rmr_args * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_rmr_query(IN DAT_RMR_HANDLE rmr_handle, IN DAT_RMR_PARAM_MASK rmr_param_mask, IN DAT_RMR_PARAM * rmr_param) { DAPL_RMR *rmr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); goto bail; } if (NULL == rmr_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } rmr = (DAPL_RMR *) rmr_handle; /* If the RMR is unbound, there is no LMR triplet associated with */ /* this RMR. If the consumer requests this field, return an error. */ if ((rmr_param_mask & DAT_RMR_FIELD_LMR_TRIPLET) && (NULL == rmr->lmr)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } dapl_os_memcpy(rmr_param, &rmr->param, sizeof(DAT_RMR_PARAM)); dats_get_ia_handle(rmr->param.ia_handle, &rmr_param->ia_handle); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_rmr_util.c000066400000000000000000000051211255317474200176610ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_rmr_util.h" #include "dapl_ia_util.h" DAPL_RMR *dapl_rmr_alloc(IN DAPL_PZ * pz) { DAPL_RMR *rmr; /* Allocate LMR */ rmr = (DAPL_RMR *) dapl_os_alloc(sizeof(DAPL_RMR)); if (NULL == rmr) { return (NULL); } /* zero the structure */ dapl_os_memzero(rmr, sizeof(DAPL_RMR)); /* * initialize the header */ rmr->header.provider = pz->header.provider; rmr->header.magic = DAPL_MAGIC_RMR; rmr->header.handle_type = DAT_HANDLE_TYPE_RMR; rmr->header.owner_ia = pz->header.owner_ia; rmr->header.user_context.as_64 = 0; rmr->header.user_context.as_ptr = 0; dapl_llist_init_entry(&rmr->header.ia_list_entry); dapl_ia_link_rmr(rmr->header.owner_ia, rmr); dapl_os_lock_init(&rmr->header.lock); /* * initialize the body */ rmr->param.ia_handle = (DAT_IA_HANDLE) pz->header.owner_ia; rmr->param.pz_handle = (DAT_PZ_HANDLE) pz; rmr->param.lmr_triplet.lmr_context = 0; rmr->param.lmr_triplet.virtual_address = 0; rmr->param.lmr_triplet.segment_length = 0; rmr->param.mem_priv = 0; rmr->pz = pz; rmr->lmr = NULL; return (rmr); } void dapl_rmr_dealloc(IN DAPL_RMR * rmr) { rmr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_ia_unlink_rmr(rmr->header.owner_ia, rmr); dapl_os_lock_destroy(&rmr->header.lock); dapl_os_free((void *)rmr, sizeof(DAPL_RMR)); } dapl-2.1.5/dapl/common/dapl_rmr_util.h000066400000000000000000000053221255317474200176710ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_rmr_util.h * * PURPOSE: Utility defs & routines for the RMR data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_RMR_UTIL_H_ #define _DAPL_RMR_UTIL_H_ #include "dapl_mr_util.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAPL_RMR * dapl_rmr_alloc ( IN DAPL_PZ *pz); extern void dapl_rmr_dealloc ( IN DAPL_RMR *rmr); STATIC _INLINE_ DAT_BOOLEAN dapl_rmr_validate_completion_flag ( IN DAT_COMPLETION_FLAGS mask, IN DAT_COMPLETION_FLAGS allow, IN DAT_COMPLETION_FLAGS request); /********************************************************************* * * * Inline Functions * * * *********************************************************************/ STATIC _INLINE_ DAT_BOOLEAN dapl_rmr_validate_completion_flag ( IN DAT_COMPLETION_FLAGS mask, IN DAT_COMPLETION_FLAGS allow, IN DAT_COMPLETION_FLAGS request) { if ( (mask & request ) && !(mask & allow) ) { return DAT_FALSE; } else { return DAT_TRUE; } } #endif /* _DAPL_RMR_UTIL_H_*/ dapl-2.1.5/dapl/common/dapl_rsp_create.c000066400000000000000000000124501255317474200201560ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rsp_create.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_ep_util.h" #include "dapl_adapter_util.h" /* * dapl_rsp_create * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.3.4.1 * * Create a Resereved Service Point with the specified Endpoint * that generates at most one Connection Request that is * delivered to the specified Event Dispatcher in a notification * event * * Input: * ia_handle * conn_qual * ep_handle * evd_handle * * Output: * rsp_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_STATE * DAT_CONN_QUAL_IN_USE */ DAT_RETURN DAT_API dapl_rsp_create(IN DAT_IA_HANDLE ia_handle, IN DAT_CONN_QUAL conn_qual, IN DAT_EP_HANDLE ep_handle, IN DAT_EVD_HANDLE evd_handle, OUT DAT_RSP_HANDLE * rsp_handle) { DAPL_IA *ia_ptr; DAPL_SP *sp_ptr; DAPL_EVD *evd_ptr; DAPL_EP *ep_ptr; DAT_BOOLEAN sp_found; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; ia_ptr = (DAPL_IA *) ia_handle; dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_rsp_create conn_qual: %x EP: %p\n", conn_qual, ep_handle); if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); goto bail; } if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } if (rsp_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); goto bail; } ep_ptr = (DAPL_EP *) ep_handle; if (ep_ptr->param.ep_state != DAT_EP_STATE_UNCONNECTED) { dat_status = DAT_ERROR(DAT_INVALID_STATE, dapls_ep_state_subtype(ep_ptr)); goto bail; } evd_ptr = (DAPL_EVD *) evd_handle; if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_RSP_CREATE); sp_ptr = dapls_ia_sp_search(ia_ptr, conn_qual, DAT_FALSE); sp_found = DAT_TRUE; if (sp_ptr == NULL) { sp_found = DAT_FALSE; /* Allocate RSP */ sp_ptr = dapls_sp_alloc(ia_ptr, DAT_FALSE); if (sp_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } } /* * Fill out the RSP args */ sp_ptr->conn_qual = conn_qual; sp_ptr->evd_handle = evd_handle; sp_ptr->psp_flags = 0; sp_ptr->ep_handle = ep_handle; /* * Take a reference on the EVD handle */ dapl_os_atomic_inc(&((DAPL_EVD *) evd_handle)->evd_ref_count); /* * Set up a listener for a connection. Connections can arrive * even before this call returns! */ sp_ptr->state = DAPL_SP_STATE_RSP_LISTENING; sp_ptr->listening = DAT_TRUE; if (sp_found == DAT_FALSE) { /* Link it onto the IA */ dapl_ia_link_rsp(ia_ptr, sp_ptr); dat_status = dapls_ib_setup_conn_listener(ia_ptr, conn_qual, sp_ptr); if (dat_status != DAT_SUCCESS) { /* * Have a problem setting up the connection, something * wrong! Decrements the EVD refcount & release it. Set * the state to FREE, so we know the call failed. */ dapl_os_atomic_dec(&((DAPL_EVD *) evd_handle)->evd_ref_count); sp_ptr->evd_handle = NULL; sp_ptr->state = DAPL_SP_STATE_FREE; dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); dapl_dbg_log(DAPL_DBG_TYPE_CM, "--> dapl_rsp_create setup_conn_listener failed: %x\n", dat_status); goto bail; } } /* * Return handle to the user */ *rsp_handle = (DAT_RSP_HANDLE) sp_ptr; /* * Update the EP state indicating the provider now owns it */ ep_ptr->param.ep_state = DAT_EP_STATE_RESERVED; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_rsp_free.c000066400000000000000000000105261255317474200176360ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rsp_free.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_sp_util.h" #include "dapl_ia_util.h" #include "dapl_adapter_util.h" /* * dapl_rsp_free * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.3.5 * * Destroy a specific instance of a Reserved Service Point. * * Input: * rsp_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_rsp_free(IN DAT_RSP_HANDLE rsp_handle) { DAPL_IA *ia_ptr; DAPL_SP *sp_ptr; DAPL_EP *ep_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; sp_ptr = (DAPL_SP *) rsp_handle; /* * Verify handle */ dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_rsp_free %p\n", rsp_handle); if (DAPL_BAD_HANDLE(sp_ptr, DAPL_MAGIC_RSP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RSP); goto bail; } /* ia_ptr = (DAPL_IA *)sp_ptr->header.owner_ia; */ ia_ptr = sp_ptr->header.owner_ia; DAPL_CNTR(ia_ptr, DCNT_IA_RSP_FREE); /* * Remove the connection listener if there are no connections. If * we defer removing the sp it becomes something of a zombie * container until disconnection, after which it will be cleaned up. */ dapl_os_lock(&sp_ptr->header.lock); /* * Make sure we don't leave a dangling EP. If the state is still * RESERVED then the RSP still owns it. */ ep_ptr = (DAPL_EP *) sp_ptr->ep_handle; if (ep_ptr != NULL && ep_ptr->param.ep_state == DAT_EP_STATE_RESERVED) { ep_ptr->param.ep_state = DAT_EP_STATE_UNCONNECTED; } sp_ptr->ep_handle = NULL; /* Release reference on EVD. If an error was encountered in a previous * free the evd_handle will be NULL */ if (sp_ptr->evd_handle) { dapl_os_atomic_dec(&((DAPL_EVD *) sp_ptr->evd_handle)-> evd_ref_count); sp_ptr->evd_handle = NULL; } /* * Release the base resource if there are no outstanding connections; * else the last disconnect on this RSP will free it up. The RSP * is used to contain CR records for each connection, which * contain information necessary to disconnect. * sp_ptr->listening will be DAT_TRUE if there has never been a * connection event, and DAT_FALSE if a connection attempt resulted * in a reject. */ if (sp_ptr->cr_list_count == 0) { /* This RSP has never been used. Clean it up */ sp_ptr->listening = DAT_FALSE; sp_ptr->state = DAPL_SP_STATE_FREE; dapl_os_unlock(&sp_ptr->header.lock); dat_status = dapls_ib_remove_conn_listener(ia_ptr, sp_ptr); if (dat_status != DAT_SUCCESS) { sp_ptr->state = DAPL_SP_STATE_RSP_LISTENING; goto bail; } dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); } else { /* The RSP is now in the pending state, where it will sit until * the connection terminates or the app uses the same * ServiceID again, which will reactivate it. */ sp_ptr->state = DAPL_SP_STATE_RSP_PENDING; dapl_os_unlock(&sp_ptr->header.lock); } bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_rsp_query.c000066400000000000000000000050621255317474200200610ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_rsp_query.c * * PURPOSE: Connection management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 4 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_rsp_query * * uDAPL: User Direct Access Program Library Version 1.1, 6.4.1.6 * * Provide arguments of the reserved service points * * Input: * rsp_handle * rsp_args_mask * * Output: * rsp_args * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_rsp_query(IN DAT_RSP_HANDLE rsp_handle, IN DAT_RSP_PARAM_MASK rsp_mask, OUT DAT_RSP_PARAM * rsp_param) { DAPL_SP *sp_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(rsp_handle, DAPL_MAGIC_RSP)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RSP); goto bail; } if (NULL == rsp_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } sp_ptr = (DAPL_SP *) rsp_handle; /* * Fill in the RSP params */ dats_get_ia_handle(sp_ptr->header.owner_ia, &rsp_param->ia_handle); rsp_param->conn_qual = sp_ptr->conn_qual; rsp_param->evd_handle = sp_ptr->evd_handle; rsp_param->ep_handle = sp_ptr->ep_handle; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * c-brace-offset: -4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_set_consumer_context.c000066400000000000000000000046611255317474200223060ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_set_consumer_context.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_set_consumer_context * * DAPL Requirements Version xxx, 6.2.2.1 * * Set a consumer context in the provided dat_handle * * Input: * dat_handle * context * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_set_consumer_context(IN DAT_HANDLE dat_handle, IN DAT_CONTEXT context) { DAT_RETURN dat_status; DAPL_HEADER *header; dat_status = DAT_SUCCESS; header = (DAPL_HEADER *) dat_handle; if (((header) == NULL) || DAPL_BAD_PTR(header) || (header->magic != DAPL_MAGIC_IA && header->magic != DAPL_MAGIC_EVD && header->magic != DAPL_MAGIC_EP && header->magic != DAPL_MAGIC_LMR && header->magic != DAPL_MAGIC_RMR && header->magic != DAPL_MAGIC_PZ && header->magic != DAPL_MAGIC_PSP && header->magic != DAPL_MAGIC_RSP && header->magic != DAPL_MAGIC_CR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } header->user_context = context; bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_sp_util.c000066400000000000000000000134541255317474200175130ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_sp_util.c * * PURPOSE: Manage PSP Info structure * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ep_util.h" #include "dapl_sp_util.h" #include "dapl_cr_util.h" /* * Local definitions */ /* * dapl_sp_alloc * * alloc and initialize a PSP INFO struct * * Input: * IA INFO struct ptr * * Output: * sp_ptr * * Returns: * NULL * pointer to sp info struct * */ DAPL_SP *dapls_sp_alloc(IN DAPL_IA * ia_ptr, IN DAT_BOOLEAN is_psp) { DAPL_SP *sp_ptr; /* Allocate EP */ sp_ptr = (DAPL_SP *) dapl_os_alloc(sizeof(DAPL_SP)); if (sp_ptr == NULL) { return (NULL); } /* zero the structure */ dapl_os_memzero(sp_ptr, sizeof(DAPL_SP)); /* * initialize the header */ sp_ptr->header.provider = ia_ptr->header.provider; if (is_psp) { sp_ptr->header.magic = DAPL_MAGIC_PSP; sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP; } else { sp_ptr->header.magic = DAPL_MAGIC_RSP; sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP; } sp_ptr->header.owner_ia = ia_ptr; sp_ptr->header.user_context.as_64 = 0; sp_ptr->header.user_context.as_ptr = NULL; dapl_llist_init_entry(&sp_ptr->header.ia_list_entry); dapl_os_lock_init(&sp_ptr->header.lock); #if defined(_VENDOR_IBAL_) dapl_os_wait_object_init(&sp_ptr->wait_object); #endif /* * Initialize the Body (set to NULL above) */ dapl_llist_init_head(&sp_ptr->cr_list_head); return (sp_ptr); } /* * dapl_sp_free * * Free the passed in PSP structure. * * Input: * entry point pointer * * Output: * none * * Returns: * none * */ void dapls_sp_free_sp(IN DAPL_SP * sp_ptr) { dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP || sp_ptr->header.magic == DAPL_MAGIC_RSP); dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head)); #if defined(_VENDOR_IBAL_) dapl_os_wait_object_destroy(&sp_ptr->wait_object); #endif dapl_os_lock(&sp_ptr->header.lock); sp_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapl_os_unlock(&sp_ptr->header.lock); dapl_os_free(sp_ptr, sizeof(DAPL_SP)); } /* * dapl_cr_link_cr * * Add a cr to a PSP structure * * Input: * sp_ptr * cr_ptr * * Output: * none * * Returns: * none * */ void dapl_sp_link_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr) { dapl_os_lock(&sp_ptr->header.lock); dapl_llist_add_tail(&sp_ptr->cr_list_head, &cr_ptr->header.ia_list_entry, cr_ptr); sp_ptr->cr_list_count++; dapl_os_unlock(&sp_ptr->header.lock); } /* * dapl_sp_search_cr * * Search for a CR on the PSP cr_list with a matching cm_handle. When * found, remove it from the list and update fields. * * Must be called with the sp_ptr lock taken. * * Input: * sp_ptr * ib_cm_handle * * Output: * none * * Returns: * cr_ptr_fnd Pointer to matching DAPL_CR * */ DAPL_CR *dapl_sp_search_cr(IN DAPL_SP * sp_ptr, IN dp_ib_cm_handle_t ib_cm_handle) { DAPL_CR *cr_ptr; DAPL_CR *cr_ptr_fnd; if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) { return NULL; } cr_ptr_fnd = NULL; cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head); dapl_os_assert(cr_ptr); do { if (cr_ptr->ib_cm_handle == ib_cm_handle) { cr_ptr_fnd = cr_ptr; break; } cr_ptr = cr_ptr->header.ia_list_entry.flink->data; } while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data); return cr_ptr_fnd; } /* * dapl_sp_remove_cr * * Remove the CR from the PSP. Done prior to freeing the CR resource. * * Must be called with the sp_ptr lock taken. * * Input: * sp_ptr * cr_ptr * * Output: * none * * Returns: * void * */ void dapl_sp_remove_cr(IN DAPL_SP * sp_ptr, IN DAPL_CR * cr_ptr) { if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "**dapl_sp_remove_cr: removing from empty queue! sp %p\n", sp_ptr); return; } dapl_log(DAPL_DBG_TYPE_CM, " dapl_sp_remove_cr: SP %p CR %p cnt %d\n", sp_ptr, cr_ptr, sp_ptr->cr_list_count); dapl_llist_remove_entry(&sp_ptr->cr_list_head, &cr_ptr->header.ia_list_entry); sp_ptr->cr_list_count--; } /* * dapl_sp_remove_ep * * Remove a CR from a PSP, given an EP. * * * Input: * ep_ptr * * Output: * none * * Returns: * void * */ void dapl_sp_remove_ep(IN DAPL_EP * ep_ptr) { DAPL_SP *sp_ptr; DAPL_CR *cr_ptr; cr_ptr = ep_ptr->cr_ptr; if (cr_ptr != NULL) { sp_ptr = cr_ptr->sp_ptr; dapl_os_lock(&sp_ptr->header.lock); /* Remove the CR from the queue */ dapl_sp_remove_cr(sp_ptr, cr_ptr); dapl_os_unlock(&sp_ptr->header.lock); ep_ptr->cr_ptr = NULL; /* free memory outside of the lock */ dapls_cr_free(cr_ptr); return; } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_sp_util.h000066400000000000000000000034711255317474200175160ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_sp_util.h * * PURPOSE: Utility defs & routines for the PSP & RSP data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_PSP_UTIL_H_ #define _DAPL_PSP_UTIL_H_ DAPL_SP *dapls_sp_alloc ( IN DAPL_IA *ia_ptr, IN DAT_BOOLEAN is_psp ); void dapls_sp_free_sp ( IN DAPL_SP *sp_ptr ); void dapl_sp_link_cr ( IN DAPL_SP *sp_ptr, IN DAPL_CR *cr_ptr ); DAPL_CR *dapl_sp_search_cr ( IN DAPL_SP *sp_ptr, IN dp_ib_cm_handle_t ib_cm_handle ); void dapl_sp_remove_cr ( IN DAPL_SP *sp_ptr, IN DAPL_CR *cr_ptr ); void dapl_sp_remove_ep ( IN DAPL_EP *ep_ptr ); #endif /* _DAPL_PSP_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_srq_create.c000066400000000000000000000071261255317474200201630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_create.c * * PURPOSE: Shared Receive Queue management * Description: Interfaces in this file are completely described in * the DAPL 1.2 API, Chapter 6, section 5.1 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_srq_util.h" #include "dapl_adapter_util.h" /* * dapl_srq_create * * DAPL Version 1.2, 6.5.1 * * Create an instance of a Shared Receive Queue that is provided to the * consumer at srq_handle. * * Input: * ia_handle * pz_handle * srq_attr * * Output: * srq_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * ?DAT_INVALID_ATTRIBUTE?? * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_srq_create(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_SRQ_ATTR * srq_attr, OUT DAT_SRQ_HANDLE * srq_handle) { DAPL_IA *ia_ptr; DAPL_SRQ *srq_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_create (%p, %p, %p, %p)\n", ia_handle, pz_handle, srq_attr, srq_handle); ia_ptr = (DAPL_IA *) ia_handle; /* * Verify parameters */ if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_SRQ_CREATE); if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } if (srq_handle == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } if (DAPL_BAD_PTR(srq_attr)) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } /* Allocate SRQ */ srq_ptr = dapl_srq_alloc(ia_ptr, srq_attr); if (srq_ptr == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } srq_ptr->param.ia_handle = (DAT_IA_HANDLE) ia_ptr; srq_ptr->param.pz_handle = pz_handle; /* * Get a SRQ from the IB provider */ dat_status = dapls_ib_srq_alloc(srq_ptr); if (dat_status != DAT_SUCCESS) { dapl_srq_dealloc(srq_ptr); goto bail; } /* Link it onto the IA */ dapl_ia_link_srq(ia_ptr, srq_ptr); *srq_handle = srq_ptr; /* Ready */ srq_ptr->param.srq_state = DAT_SRQ_STATE_OPERATIONAL; bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_srq_free.c000066400000000000000000000062161255317474200176400ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_free.c * * PURPOSE: Shared Receive Queue management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5.5 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_srq_util.h" #include "dapl_adapter_util.h" /* * dapl_srq_free * * DAPL Version 1.2, 6.5.5 * * Destroy an instance of an SRQ * * Input: * srq_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_srq_free(IN DAT_SRQ_HANDLE srq_handle) { DAPL_SRQ *srq_ptr; DAPL_IA *ia_ptr; DAT_SRQ_PARAM *param; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_free (%p)\n", srq_handle); srq_ptr = (DAPL_SRQ *) srq_handle; param = &srq_ptr->param; ia_ptr = srq_ptr->header.owner_ia; /* * Verify parameters */ if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } /* * Verify parameter & state */ if (DAPL_BAD_HANDLE(srq_ptr, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } dapl_os_lock(&ia_ptr->header.lock); if (dapl_os_atomic_read(&srq_ptr->srq_ref_count) != 0) { /* * The DAPL 1.2 spec says to return DAT_SRQ_IN_USE, which does * not exist. Have filed the following as an errata. */ dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_SRQ_IN_USE); dapl_os_unlock(&ia_ptr->header.lock); goto bail; } param->srq_state = DAT_SRQ_STATE_SHUTDOWN; dapl_os_unlock(&ia_ptr->header.lock); DAPL_CNTR(ia_ptr, DCNT_IA_SRQ_FREE); dapl_ia_unlink_srq(srq_ptr->header.owner_ia, srq_ptr); dapls_ib_srq_free(srq_ptr); /* Free the resource */ dapl_srq_dealloc(srq_ptr); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_srq_post_recv.c000066400000000000000000000065641255317474200207310ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_post_recv.c * * PURPOSE: Shared Receive Queue management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 5.8 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cookie.h" #include "dapl_adapter_util.h" /* * dapl_srq_post_recv * * DAPL Requirements Version 1.2, 6.5.8 * * Post a receive buffer that can be used by any incoming * message by any connected EP using the SRQ. Request to receive data * over a connection of any ep handle into local_iov * * Input: * srq_handle * num_segments * local_iov * user_cookie * * Output: * None. * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_PROTECTION_VIOLATION * DAT_PROVILEGES_VIOLATION */ DAT_RETURN DAT_API dapl_srq_post_recv(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie) { DAPL_SRQ *srq_ptr; DAPL_COOKIE *cookie; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_post_recv (%p, %d, %p, %p)\n", srq_handle, num_segments, local_iov, user_cookie.as_64); if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } srq_ptr = (DAPL_SRQ *) srq_handle; /* * Synchronization ok since this buffer is only used for receive * requests, which aren't allowed to race with each other. The * app must syncronize access to the SRQ. */ dat_status = dapls_dto_cookie_alloc(&srq_ptr->recv_buffer, DAPL_DTO_TYPE_RECV_SRQ, user_cookie, &cookie); if (DAT_SUCCESS != dat_status) { goto bail; } /* * Take reference before posting to avoid race conditions with * completions */ dapl_os_atomic_inc(&srq_ptr->recv_count); /* * Invoke provider specific routine to post DTO */ dat_status = dapls_ib_post_srq_recv(srq_ptr, cookie, num_segments, local_iov); if (dat_status != DAT_SUCCESS) { dapl_os_atomic_dec(&srq_ptr->recv_count); dapls_cookie_dealloc(&srq_ptr->recv_buffer, cookie); } bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_srq_query.c000066400000000000000000000051351255317474200200630ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_query.c * * PURPOSE: Shared Receive Queue management * * Description: Interfaces in this file are completely described in * the DAPL 1.2 API, Chapter 6, section 5.6 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_srq_query * * DAPL Requirements Version 1.2, 6.5.6 * * Return SRQ parameters to the consumer * * Input: * srq_handle * srq_param_mask * * Output: * srq_param * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_srq_query(IN DAT_SRQ_HANDLE srq_handle, IN DAT_SRQ_PARAM_MASK srq_param_mask, OUT DAT_SRQ_PARAM * srq_param) { DAPL_SRQ *srq_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_query (%p, %x, %p)\n", srq_handle, srq_param_mask, srq_param); if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } if (srq_param == NULL) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } srq_ptr = (DAPL_SRQ *) srq_handle; srq_ptr->param.available_dto_count = DAT_VALUE_UNKNOWN; srq_ptr->param.outstanding_dto_count = dapl_os_atomic_read(&srq_ptr->recv_count); *srq_param = srq_ptr->param; dats_get_ia_handle(srq_ptr->header.owner_ia, &srq_param->ia_handle); bail: return dat_status; } dapl-2.1.5/dapl/common/dapl_srq_resize.c000066400000000000000000000053501255317474200202160ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_resize.c * * PURPOSE: Shared Receive Queue management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 5.7 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_srq_util.h" #include "dapl_adapter_util.h" /* * dapl_srq_resize * * DAPL Requirements Version 1.2, 6.5.7 * * Modify the size of the event queue of a Shared Receive Queue * * Input: * srq_handle * srq_max_recv_dto * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_srq_resize(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT srq_max_recv_dto) { DAPL_SRQ *srq_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_resize (%p, %d)\n", srq_handle, srq_max_recv_dto); if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } srq_ptr = (DAPL_SRQ *) srq_handle; /* * Check for nonsense requests per the spec */ if (srq_max_recv_dto <= srq_ptr->param.low_watermark || srq_max_recv_dto < dapl_os_atomic_read(&srq_ptr->recv_count)) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_NO_SUBTYPE); goto bail; } dat_status = dapls_ib_srq_resize(srq_ptr, (uint32_t)srq_max_recv_dto); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_srq_set_lw.c000066400000000000000000000047341255317474200202170ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_srq_set_lw.c * * PURPOSE: Shared Receive Queue management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 5.4 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_srq_util.h" #include "dapl_adapter_util.h" /* * dapl_srq_set_lw * * DAPL Requirements Version 1.2, 6.5.4 * * Set the low water mark for an SRQ and arm the SRQ to generate an * event if it is reached. * * Input: * srq_handle * srq_max_recv_dto * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER * DAT_MODEL_NOT_SUPPORTED */ DAT_RETURN DAT_API dapl_srq_set_lw(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT low_watermark) { DAPL_SRQ *srq_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_srq_set_lw (%p, %d)\n", srq_handle, low_watermark); if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); goto bail; } srq_ptr = (DAPL_SRQ *) srq_handle; dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_srq_util.c000066400000000000000000000065121255317474200176730ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ep_util.c * * PURPOSE: Shared Receive Queue management and support * * $Id:$ **********************************************************************/ #include "dapl_srq_util.h" #include "dapl_ia_util.h" #include "dapl_cookie.h" /* * dapl_srq_alloc * * alloc and initialize an SRQ struct * * Input: * IA INFO struct ptr * SRQ ATTR ptr * * Output: * none * * Returns: * pointer to srq * */ DAPL_SRQ *dapl_srq_alloc(IN DAPL_IA * ia_ptr, IN const DAT_SRQ_ATTR * srq_attr) { DAPL_SRQ *srq_ptr; /* Allocate SRQ */ srq_ptr = (DAPL_SRQ *) dapl_os_alloc(sizeof(DAPL_SRQ)); if (srq_ptr == NULL) { goto bail; } /* zero the structure */ dapl_os_memzero(srq_ptr, sizeof(DAPL_SRQ)); /* * initialize the header */ srq_ptr->header.provider = ia_ptr->header.provider; srq_ptr->header.magic = DAPL_MAGIC_SRQ; srq_ptr->header.handle_type = DAT_HANDLE_TYPE_SRQ; srq_ptr->header.owner_ia = ia_ptr; srq_ptr->header.user_context.as_64 = 0; srq_ptr->header.user_context.as_ptr = NULL; dapl_os_atomic_set(&srq_ptr->srq_ref_count, 0); dapl_llist_init_entry(&srq_ptr->header.ia_list_entry); dapl_os_lock_init(&srq_ptr->header.lock); /* * Initialize the body. */ srq_ptr->param.max_recv_dtos = srq_attr->max_recv_dtos; srq_ptr->param.max_recv_iov = srq_attr->max_recv_iov; srq_ptr->param.low_watermark = srq_attr->low_watermark; /* Get a cookie buffer to track outstanding recvs */ if (DAT_SUCCESS != dapls_cb_create(&srq_ptr->recv_buffer, (DAPL_EP *) srq_ptr, /* just saves the value */ srq_ptr->param.max_recv_dtos)) { dapl_srq_dealloc(srq_ptr); srq_ptr = NULL; goto bail; } bail: return srq_ptr; } /* * dapl_srq_dealloc * * Free the passed in SRQ structure. * * Input: * SRQ pointer * * Output: * none * * Returns: * none * */ void dapl_srq_dealloc(IN DAPL_SRQ * srq_ptr) { dapl_os_assert(srq_ptr->header.magic == DAPL_MAGIC_SRQ); srq_ptr->header.magic = DAPL_MAGIC_INVALID; /* reset magic to prevent reuse */ dapls_cb_free(&srq_ptr->recv_buffer); dapl_os_lock_destroy(&srq_ptr->header.lock); dapl_os_free(srq_ptr, sizeof(DAPL_SRQ)); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_srq_util.h000066400000000000000000000031501255317474200176730ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_srq_util.h * * PURPOSE: Utility defs & routines for the SRQ data structure * * $Id:$ * **********************************************************************/ #ifndef _DAPL_SRQ_UTIL_H_ #define _DAPL_SRQ_UTIL_H_ #include "dapl.h" /* function prototypes */ extern DAPL_SRQ * dapl_srq_alloc ( IN DAPL_IA *ia, IN const DAT_SRQ_ATTR *srq_attr ); extern void dapl_srq_dealloc ( IN DAPL_SRQ *srq_ptr ); #endif /* _DAPL_SRQ_UTIL_H_ */ dapl-2.1.5/dapl/common/dapl_timer_util.c000066400000000000000000000235171255317474200202120ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_timer_util.c * * PURPOSE: DAPL timer management * Description: Routines to add and cancel timer records. A timer record * is put on the global timer queue. If the timer thread is * not running, start it. The timer thread will sleep * until a timer event or until a process wakes it up * to notice a new timer is available; we use a DAPL_WAIT_OBJ * for synchronization. * * If a timer is cancelled, it is simlpy removed from the * queue. The timer may wakeup and notice there is no timer * record to awaken at this time, so it will reset for the * next entry. When there are no timer records to manage, * the timer thread just sleeps until awakened. * * This file also contains the timer handler thread, * embodied in dapls_timer_thread(). * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_timer_util.h" #define DAPL_TIMER_INIT 0 #define DAPL_TIMER_RUN 1 #define DAPL_TIMER_DESTROY 2 #define DAPL_TIMER_EXIT 3 struct timer_head { DAPL_LLIST_HEAD timer_list_head; DAPL_OS_LOCK lock; DAPL_OS_WAIT_OBJECT wait_object; DAPL_OS_THREAD timeout_thread_handle; int state; } g_daplTimerHead; typedef struct timer_head DAPL_TIMER_HEAD; void dapls_timer_thread(void *arg); void dapls_timer_init() { /* * Set up the timer thread elements. The timer thread isn't * started until it is actually needed */ g_daplTimerHead.timer_list_head = NULL; dapl_os_lock_init(&g_daplTimerHead.lock); dapl_os_wait_object_init(&g_daplTimerHead.wait_object); g_daplTimerHead.timeout_thread_handle = 0; g_daplTimerHead.state = DAPL_TIMER_INIT; } void dapls_timer_release() { dapl_os_lock(&g_daplTimerHead.lock); if (g_daplTimerHead.state != DAPL_TIMER_RUN) { dapl_os_unlock(&g_daplTimerHead.lock); return; } g_daplTimerHead.state = DAPL_TIMER_DESTROY; dapl_os_unlock(&g_daplTimerHead.lock); while (g_daplTimerHead.state != DAPL_TIMER_EXIT) { dapl_os_wait_object_wakeup(&g_daplTimerHead.wait_object); dapl_os_sleep_usec(2000); } } /* * dapls_timer_set * * Set a timer. The timer will invoke the specified function * after a number of useconds expires. * * Input: * timer User provided timer structure * func Function to invoke when timer expires * data Argument passed to func() * expires microseconds until timer fires * * Returns: * no return value * */ DAT_RETURN dapls_timer_set(IN DAPL_OS_TIMER * timer, IN void (*func) (uintptr_t), IN void *data, IN DAPL_OS_TIMEVAL expires) { DAPL_OS_TIMER *list_ptr; DAPL_OS_TIMEVAL cur_time; DAT_BOOLEAN wakeup_tmo_thread; /* * Start the timer thread the first time we need a timer */ if (g_daplTimerHead.timeout_thread_handle == 0) { dapl_os_thread_create(dapls_timer_thread, &g_daplTimerHead, &g_daplTimerHead.timeout_thread_handle); while (g_daplTimerHead.state != DAPL_TIMER_RUN) dapl_os_sleep_usec(2000); } dapl_llist_init_entry(&timer->list_entry); wakeup_tmo_thread = DAT_FALSE; dapl_os_get_time(&cur_time); timer->expires = cur_time + expires; /* calculate future time */ timer->function = func; timer->data = data; /* * Put the element on the queue: sorted by wakeup time, eariliest * first. */ dapl_os_lock(&g_daplTimerHead.lock); if (g_daplTimerHead.state != DAPL_TIMER_RUN) { dapl_os_unlock(&g_daplTimerHead.lock); return DAT_INVALID_STATE; } /* * Deal with 3 cases due to our list structure: * 1) list is empty: become the list head * 2) New timer is sooner than list head: become the list head * 3) otherwise, sort the timer into the list, no need to wake * the timer thread up */ if (dapl_llist_is_empty(&g_daplTimerHead.timer_list_head)) { /* Case 1: add entry to head of list */ dapl_llist_add_head(&g_daplTimerHead.timer_list_head, (DAPL_LLIST_ENTRY *) & timer->list_entry, timer); wakeup_tmo_thread = DAT_TRUE; } else { list_ptr = (DAPL_OS_TIMER *) dapl_llist_peek_head(&g_daplTimerHead.timer_list_head); if (timer->expires < list_ptr->expires) { /* Case 2: add entry to head of list */ dapl_llist_add_head(&g_daplTimerHead.timer_list_head, (DAPL_LLIST_ENTRY *) & timer-> list_entry, timer); wakeup_tmo_thread = DAT_TRUE; } else { /* Case 3: figure out where entry goes in sorted list */ list_ptr = dapl_llist_next_entry(&g_daplTimerHead. timer_list_head, (DAPL_LLIST_ENTRY *) & list_ptr->list_entry); while (list_ptr != NULL) { if (timer->expires < list_ptr->expires) { dapl_llist_add_entry(&g_daplTimerHead. timer_list_head, (DAPL_LLIST_ENTRY *) & list_ptr-> list_entry, (DAPL_LLIST_ENTRY *) & timer-> list_entry, timer); break; } list_ptr = dapl_llist_next_entry(&g_daplTimerHead. timer_list_head, (DAPL_LLIST_ENTRY *) & list_ptr->list_entry); } if (list_ptr == NULL) { /* entry goes to the end of the list */ dapl_llist_add_tail(&g_daplTimerHead. timer_list_head, (DAPL_LLIST_ENTRY *) & timer->list_entry, timer); } } } dapl_os_unlock(&g_daplTimerHead.lock); if (wakeup_tmo_thread == DAT_TRUE) { dapl_os_wait_object_wakeup(&g_daplTimerHead.wait_object); } return DAT_SUCCESS; } /* * dapls_os_timer_cancel * * Cancel a timer. Simply deletes the timer with no function invocations * * Input: * timer User provided timer structure * * Returns: * no return value */ void dapls_timer_cancel(IN DAPL_OS_TIMER * timer) { dapl_os_lock(&g_daplTimerHead.lock); /* * make sure the entry has not been removed by another thread */ if (!dapl_llist_is_empty(&g_daplTimerHead.timer_list_head) && timer->list_entry.list_head == &g_daplTimerHead.timer_list_head) { dapl_llist_remove_entry(&g_daplTimerHead.timer_list_head, (DAPL_LLIST_ENTRY *) & timer-> list_entry); } /* * If this was the first entry on the queue we could awaken the * thread and have it reset the list; but it will just wake up * and find that the timer entry has been removed, then go back * to sleep, so don't bother. */ dapl_os_unlock(&g_daplTimerHead.lock); } /* * dapls_timer_thread * * Core worker thread dealing with all timers. Basic algorithm: * - Sleep until work shows up * - Take first element of sorted timer list and wake * invoke the callback if expired * - Sleep for the timeout period if not expired * * Input: * timer_head Timer head structure to manage timer lists * * Returns: * no return value */ void dapls_timer_thread(void *arg) { DAPL_OS_TIMER *list_ptr; DAPL_OS_TIMEVAL cur_time; DAT_RETURN dat_status; DAPL_TIMER_HEAD *timer_head; timer_head = arg; dapl_os_lock(&timer_head->lock); timer_head->state = DAPL_TIMER_RUN; dapl_os_unlock(&timer_head->lock); for (;;) { if (dapl_llist_is_empty(&timer_head->timer_list_head)) { dat_status = dapl_os_wait_object_wait(&timer_head->wait_object, DAT_TIMEOUT_INFINITE); } /* * Lock policy: * While this thread is accessing the timer list, it holds the * lock. Otherwise, it doesn't. */ dapl_os_lock(&timer_head->lock); while (!dapl_llist_is_empty(&timer_head->timer_list_head)) { list_ptr = (DAPL_OS_TIMER *) dapl_llist_peek_head(&g_daplTimerHead. timer_list_head); dapl_os_get_time(&cur_time); if (list_ptr->expires <= cur_time || timer_head->state == DAPL_TIMER_DESTROY) { /* * Remove the entry from the list. Sort out how much * time we need to sleep for the next one */ list_ptr = dapl_llist_remove_head(&timer_head-> timer_list_head); dapl_os_unlock(&timer_head->lock); /* * Invoke the user callback */ list_ptr->function((uintptr_t) list_ptr->data); /* timer structure was allocated by caller, we don't * free it here. */ /* reacquire the lock */ dapl_os_lock(&timer_head->lock); } else { dapl_os_unlock(&timer_head->lock); dat_status = dapl_os_wait_object_wait(&timer_head-> wait_object, (DAT_TIMEOUT) (list_ptr-> expires - cur_time)); dapl_os_lock(&timer_head->lock); } } /* Destroy - all timers triggered and list is empty */ if (timer_head->state == DAPL_TIMER_DESTROY) { timer_head->state = DAPL_TIMER_EXIT; dapl_os_unlock(&timer_head->lock); break; } /* * release the lock before going back to the top to sleep */ dapl_os_unlock(&timer_head->lock); if (dat_status == DAT_INTERNAL_ERROR) { /* * XXX What do we do here? */ } } /* for (;;) */ } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/common/dapl_timer_util.h000066400000000000000000000031301255317474200202040ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_timer_util.h * * PURPOSE: DAPL timer management * Description: support for dapl_timer.h * * $Id:$ **********************************************************************/ void dapls_timer_init ( void ); void dapls_timer_release( void ); DAT_RETURN dapls_timer_set ( IN DAPL_OS_TIMER *timer, IN void (*func) (uintptr_t), IN void *data, IN DAPL_OS_TIMEVAL expires ); void dapls_timer_cancel ( IN DAPL_OS_TIMER *timer); dapl-2.1.5/dapl/include/000077500000000000000000000000001255317474200150145ustar00rootroot00000000000000dapl-2.1.5/dapl/include/dapl.h000077500000000000000000001135271255317474200161210ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl.h * * PURPOSE: defines common data structures for the DAPL reference implemenation * * Description: This file describes the working data structures used within * DAPL RI. * * * $Id: dapl.h 1317 2005-04-25 17:29:42Z jlentini $ **********************************************************************/ #ifndef _DAPL_H_ #define _DAPL_H_ #if defined(__KERNEL__) #include #else #include #endif /* defined(__KERNEL__) */ #include #include "dapl_osd.h" #include "dapl_debug.h" /********************************************************************* * * * Enumerations * * * *********************************************************************/ typedef enum dapl_magic { /* magic number values for verification & debug */ DAPL_MAGIC_IA = 0xCafeF00d, DAPL_MAGIC_EVD = 0xFeedFace, DAPL_MAGIC_EP = 0xDeadBabe, DAPL_MAGIC_LMR = 0xBeefCafe, DAPL_MAGIC_RMR = 0xABadCafe, DAPL_MAGIC_PZ = 0xDeafBeef, DAPL_MAGIC_PSP = 0xBeadeD0c, DAPL_MAGIC_RSP = 0xFab4Feed, DAPL_MAGIC_SRQ = 0xC001Babe, DAPL_MAGIC_CR = 0xBe12Cee1, DAPL_MAGIC_CR_DESTROYED = 0xB12bDead, DAPL_MAGIC_CNO = 0xDeadF00d, DAPL_MAGIC_INVALID = 0xFFFFFFFF } DAPL_MAGIC; typedef enum dapl_evd_state { DAPL_EVD_STATE_TERMINAL, DAPL_EVD_STATE_INITIAL, DAPL_EVD_STATE_OPEN, DAPL_EVD_STATE_WAITED, DAPL_EVD_STATE_DEAD = 0xDEAD } DAPL_EVD_STATE; typedef enum dapl_evd_completion { DAPL_EVD_STATE_INIT, DAPL_EVD_STATE_SOLICITED_WAIT, DAPL_EVD_STATE_THRESHOLD, DAPL_EVD_STATE_UNSIGNALLED } DAPL_EVD_COMPLETION; typedef enum dapl_cno_state { DAPL_CNO_STATE_UNTRIGGERED, DAPL_CNO_STATE_TRIGGERED, DAPL_CNO_STATE_DEAD = 0xDeadFeed, } DAPL_CNO_STATE; typedef enum dapl_qp_state { DAPL_QP_STATE_UNCONNECTED, DAPL_QP_STATE_RESERVED, DAPL_QP_STATE_PASSIVE_CONNECTION_PENDING, DAPL_QP_STATE_ACTIVE_CONNECTION_PENDING, DAPL_QP_STATE_TENTATIVE_CONNECTION_PENDING, DAPL_QP_STATE_CONNECTED, DAPL_QP_STATE_DISCONNECT_PENDING, DAPL_QP_STATE_ERROR, DAPL_QP_STATE_NOT_REUSABLE, DAPL_QP_STATE_FREE } DAPL_QP_STATE; /********************************************************************* * * * Constants * * * *********************************************************************/ /* * number of HCAs allowed */ #define DAPL_MAX_HCA_COUNT 4 /* * Configures the RMR bind evd restriction */ #define DAPL_RMR_BIND_EVD_RESTRICTION DAT_RMR_EVD_SAME_AS_REQUEST_EVD /* * special qp_state indicating the EP does not have a QP attached yet */ #define DAPL_QP_STATE_UNATTACHED 0xFFF0 #define DAPL_MAX_PRIVATE_DATA_SIZE 256 /********************************************************************* * * * Macros * * * *********************************************************************/ #if defined (sun) || defined(__sun) || defined(_sun_) || defined (__solaris__) #define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3) #elif defined(__linux__) #define DAPL_BAD_PTR(a) ((unsigned long)(a) & 3) #elif defined(_WIN64) #define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3) #elif defined(_WIN32) #define DAPL_BAD_PTR(a) ((unsigned long)((DAT_UINT64)(a)) & 3) #endif /* * Simple macro to verify a handle is bad. Conditions: * - pointer is NULL * - pointer is not word aligned * - pointer's magic number is wrong */ #define DAPL_BAD_HANDLE(h, magicNum) ( \ ((h) == NULL) || \ DAPL_BAD_PTR(h) || \ (((DAPL_HEADER *)(h))->magic != (magicNum))) #define DAPL_MIN(a, b) ((a < b) ? (a) : (b)) #define DAPL_MAX(a, b) ((a > b) ? (a) : (b)) #if NDEBUG > 0 #define DEBUG_IS_BAD_HANDLE(h, magicNum) (DAPL_BAD_HANDLE(h, magicNum)) #else #define DEBUG_IS_BAD_HANDLE(h, magicNum) (0) #endif #define DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType)) /********************************************************************* * * * Typedefs * * * *********************************************************************/ typedef struct dapl_llist_entry DAPL_LLIST_ENTRY; typedef DAPL_LLIST_ENTRY * DAPL_LLIST_HEAD; typedef struct dapl_ring_buffer DAPL_RING_BUFFER; typedef struct dapl_cookie_buffer DAPL_COOKIE_BUFFER; typedef struct dapl_hash_table DAPL_HASH_TABLE; typedef struct dapl_hash_table * DAPL_HASH_TABLEP; typedef DAT_UINT64 DAPL_HASH_KEY; typedef void * DAPL_HASH_DATA; typedef struct dapl_hca DAPL_HCA; typedef struct dapl_header DAPL_HEADER; typedef struct dapl_ia DAPL_IA; typedef struct dapl_cno DAPL_CNO; typedef struct dapl_evd DAPL_EVD; typedef struct dapl_ep DAPL_EP; typedef struct dapl_srq DAPL_SRQ; typedef struct dapl_pz DAPL_PZ; typedef struct dapl_lmr DAPL_LMR; typedef struct dapl_rmr DAPL_RMR; typedef struct dapl_sp DAPL_SP; typedef struct dapl_cr DAPL_CR; typedef struct dapl_cookie DAPL_COOKIE; typedef struct dapl_dto_cookie DAPL_DTO_COOKIE; typedef struct dapl_rmr_cookie DAPL_RMR_COOKIE; typedef struct dapl_private DAPL_PRIVATE; /********************************************************************* * * * Structures * * * *********************************************************************/ struct dapl_llist_entry { struct dapl_llist_entry *flink; struct dapl_llist_entry *blink; void *data; DAPL_LLIST_HEAD *list_head; /* for consistency checking */ }; struct dapl_ring_buffer { void **base; /* base of element array */ DAT_COUNT lim; /* mask, number of entries - 1 */ DAPL_ATOMIC head; /* head pointer index */ DAPL_ATOMIC tail; /* tail pointer index */ }; struct dapl_cookie_buffer { DAPL_COOKIE *pool; DAT_COUNT pool_size; DAPL_ATOMIC head; DAPL_ATOMIC tail; }; #ifdef IBAPI #include "dapl_ibapi_util.h" #elif VAPI #include "dapl_vapi_util.h" #elif __OPENIB__ #include "dapl_openib_util.h" #include "dapl_openib_cm.h" #elif DUMMY #include "dapl_dummy_util.h" #elif OPENIB #include "dapl_ib_util.h" #else /* windows - IBAL and/or IBAL+Sock_CM */ #include "dapl_ibal_util.h" #endif struct dapl_hca { DAPL_OS_LOCK lock; DAPL_LLIST_HEAD ia_list_head; /* list of all open IAs */ DAPL_ATOMIC handle_ref_count; /* count of ia_opens on handle */ DAPL_EVD *async_evd; DAPL_EVD *async_error_evd; DAT_SOCK_ADDR6 hca_address; /* local address of HCA*/ char *name; /* provider name */ ib_hca_handle_t ib_hca_handle; unsigned long port_num; /* physical port number */ ib_hca_transport_t ib_trans; /* Values specific transport API */ /* Memory Subsystem Support */ DAPL_HASH_TABLE *lmr_hash_table; /* Limits & useful HCA attributes */ DAT_IA_ATTR ia_attr; }; /* DAPL Objects always have the following header */ struct dapl_header { DAT_PROVIDER *provider; /* required by DAT - must be first */ DAPL_MAGIC magic; /* magic number for verification */ DAT_HANDLE_TYPE handle_type; /* struct type */ DAPL_IA *owner_ia; /* ia which owns this stuct */ DAPL_LLIST_ENTRY ia_list_entry; /* link entry on ia struct */ DAT_CONTEXT user_context; /* user context - opaque to DAPL */ DAPL_OS_LOCK lock; /* lock - in header for easier macros */ }; /* DAPL_IA maps to DAT_IA_HANDLE */ struct dapl_ia { DAPL_HEADER header; DAPL_HCA *hca_ptr; DAPL_EVD *async_error_evd; DAT_BOOLEAN cleanup_async_error_evd; DAPL_LLIST_ENTRY hca_ia_list_entry; /* HCAs list of IAs */ DAPL_LLIST_HEAD ep_list_head; /* EP queue */ DAPL_LLIST_HEAD lmr_list_head; /* LMR queue */ DAPL_LLIST_HEAD rmr_list_head; /* RMR queue */ DAPL_LLIST_HEAD pz_list_head; /* PZ queue */ DAPL_LLIST_HEAD evd_list_head; /* EVD queue */ DAPL_LLIST_HEAD cno_list_head; /* CNO queue */ DAPL_LLIST_HEAD psp_list_head; /* PSP queue */ DAPL_LLIST_HEAD rsp_list_head; /* RSP queue */ DAPL_LLIST_HEAD srq_list_head; /* SRQ queue */ #ifdef DAPL_COUNTERS void *cntrs; #endif }; /* DAPL_CNO maps to DAT_CNO_HANDLE */ struct dapl_cno { DAPL_HEADER header; /* A CNO cannot be freed while it is referenced elsewhere. */ DAPL_ATOMIC cno_ref_count; DAPL_CNO_STATE cno_state; DAT_COUNT cno_waiters; DAPL_EVD *cno_evd_triggered; #if defined(__KERNEL__) DAT_UPCALL_OBJECT cno_upcall; DAT_UPCALL_POLICY cno_upcall_policy; #else DAT_OS_WAIT_PROXY_AGENT cno_wait_agent; #endif /* defined(__KERNEL__) */ DAPL_OS_WAIT_OBJECT cno_wait_object; }; /* DAPL_EVD maps to DAT_EVD_HANDLE */ struct dapl_evd { DAPL_HEADER header; DAPL_EVD_STATE evd_state; DAT_EVD_FLAGS evd_flags; DAT_BOOLEAN evd_enabled; /* For attached CNO. */ DAT_BOOLEAN evd_waitable; /* EVD state. */ /* Every EVD has a CQ unless it is a SOFTWARE_EVENT only EVD */ ib_cq_handle_t ib_cq_handle; /* An Event Dispatcher cannot be freed while * it is referenced elsewhere. */ DAPL_ATOMIC evd_ref_count; /* Set if there has been a catastrophic overflow */ DAT_BOOLEAN catastrophic_overflow; /* the actual events */ DAT_COUNT qlen; DAT_EVENT *events; DAPL_RING_BUFFER free_event_queue; DAPL_RING_BUFFER pending_event_queue; /* CQ Completions are not placed into 'deferred_events' ** rather they are simply left on the Completion Queue ** and the fact that there was a notification is flagged. */ DAT_BOOLEAN cq_notified; DAPL_OS_TICKS cq_notified_when; DAT_COUNT cno_active_count; DAPL_CNO *cno_ptr; DAPL_OS_WAIT_OBJECT wait_object; DAT_COUNT threshold; DAPL_EVD_COMPLETION completion_type; #ifdef DAPL_COUNTERS void *cntrs; #endif }; /* DAPL_PRIVATE used to pass private data in a connection */ struct dapl_private { #ifdef IBHOSTS_NAMING DAT_SOCK_ADDR6 hca_address; /* local address of HCA*/ #endif /* IBHOSTS_NAMING */ unsigned char private_data[DAPL_MAX_PRIVATE_DATA_SIZE]; }; /* uDAPL timer entry, used to queue timeouts */ struct dapl_timer_entry { DAPL_LLIST_ENTRY list_entry; /* link entry on ia struct */ DAPL_OS_TIMEVAL expires; void (*function) (uintptr_t); void *data; }; #ifdef DAPL_DBG_IO_TRC #define DBG_IO_TRC_QLEN 32 /* length of trace buffer */ #define DBG_IO_TRC_IOV 3 /* iov elements we keep track of */ struct io_buf_track { Ib_send_op_type op_type; DAPL_COOKIE *cookie; DAT_LMR_TRIPLET iov[DBG_IO_TRC_IOV]; DAT_RMR_TRIPLET remote_iov; unsigned int done; /* count to track completion ordering */ int status; void *wqe; }; #endif /* DAPL_DBG_IO_TRC */ /* DAPL_EP maps to DAT_EP_HANDLE */ struct dapl_ep { DAPL_HEADER header; /* What the DAT Consumer asked for */ DAT_EP_PARAM param; /* The RC Queue Pair (IBM OS API) */ ib_qp_handle_t qp_handle; unsigned int qpn; /* qp number */ ib_qp_state_t qp_state; /* communications manager handle (IBM OS API) */ // dp_ib_cm_handle_t cm_handle; /* Add support for multiple CM object ownership */ DAPL_LLIST_HEAD cm_list_head; /* store the remote IA address here, reference from the param * struct which only has a pointer, no storage */ DAT_SOCK_ADDR6 remote_ia_address; /* For passive connections we maintain a back pointer to the CR */ void * cr_ptr; /* pointer to connection timer, if set */ struct dapl_timer_entry *cxn_timer; /* private data container */ DAPL_PRIVATE private; /* DTO data */ DAPL_ATOMIC req_count; DAPL_ATOMIC recv_count; DAPL_COOKIE_BUFFER req_buffer; DAPL_COOKIE_BUFFER recv_buffer; #ifdef DAPL_DBG_IO_TRC int ibt_dumped; struct io_buf_track *ibt_base; DAPL_RING_BUFFER ibt_queue; #endif /* DAPL_DBG_IO_TRC */ #ifdef DAPL_COUNTERS void *cntrs; #endif }; /* DAPL_SRQ maps to DAT_SRQ_HANDLE */ struct dapl_srq { DAPL_HEADER header; DAT_SRQ_PARAM param; DAPL_ATOMIC srq_ref_count; DAPL_COOKIE_BUFFER recv_buffer; DAPL_ATOMIC recv_count; ib_srq_handle_t srq_handle; }; /* DAPL_PZ maps to DAT_PZ_HANDLE */ struct dapl_pz { DAPL_HEADER header; ib_pd_handle_t pd_handle; DAPL_ATOMIC pz_ref_count; }; /* DAPL_LMR maps to DAT_LMR_HANDLE */ struct dapl_lmr { DAPL_HEADER header; DAT_LMR_PARAM param; ib_mr_handle_t mr_handle; DAPL_ATOMIC lmr_ref_count; #ifdef _OPENIB_MCM_ off_t sci_addr; int sci_off; int mr_id; #endif #if !defined(__KDAPL__) char shmid[DAT_LMR_COOKIE_SIZE]; /* shared memory ID */ ib_shm_transport_t ib_trans; /* provider specific data */ #endif /* !__KDAPL__ */ }; /* DAPL_RMR maps to DAT_RMR_HANDLE */ struct dapl_rmr { DAPL_HEADER header; DAT_RMR_PARAM param; DAPL_EP *ep; DAPL_PZ *pz; DAPL_LMR *lmr; ib_mw_handle_t mw_handle; }; /* SP types, indicating the state and queue */ typedef enum dapl_sp_state { DAPL_SP_STATE_FREE, DAPL_SP_STATE_PSP_LISTENING, DAPL_SP_STATE_PSP_PENDING, DAPL_SP_STATE_RSP_LISTENING, DAPL_SP_STATE_RSP_PENDING } DAPL_SP_STATE; /* DAPL_SP maps to DAT_PSP_HANDLE and DAT_RSP_HANDLE */ struct dapl_sp { DAPL_HEADER header; DAPL_SP_STATE state; /* type and queue of the SP */ /* PSP/RSP PARAM fields */ DAT_CONN_QUAL conn_qual; DAT_EVD_HANDLE evd_handle; DAT_PSP_FLAGS psp_flags; DAT_EP_HANDLE ep_handle; /* maintenence fields */ DAT_BOOLEAN listening; /* PSP is registered & active */ ib_cm_srvc_handle_t cm_srvc_handle; /* Used by Mellanox CM */ DAPL_LLIST_HEAD cr_list_head; /* CR pending queue */ DAT_COUNT cr_list_count; /* count of CRs on queue */ #if defined(_VENDOR_IBAL_) DAPL_OS_WAIT_OBJECT wait_object; /* cancel & destroy. */ #endif }; /* DAPL_CR maps to DAT_CR_HANDLE */ struct dapl_cr { DAPL_HEADER header; /* for convenience the data is kept as a DAT_CR_PARAM. * however, the "local_endpoint" field is always NULL * so this wastes a pointer. This is probably ok to * simplify code, espedially dat_cr_query. */ DAT_CR_PARAM param; /* IB specific fields */ dp_ib_cm_handle_t ib_cm_handle; DAT_SOCK_ADDR6 remote_ia_address; /* Assuming that the maximum private data size is small. * If it gets large, use of a pointer may be appropriate. */ unsigned char private_data[DAPL_MAX_PRIVATE_DATA_SIZE]; /* * Need to be able to associate the CR back to the PSP for * dapl_cr_reject. */ DAPL_SP *sp_ptr; }; typedef enum dapl_dto_type { DAPL_DTO_TYPE_SEND, DAPL_DTO_TYPE_RECV, DAPL_DTO_TYPE_RECV_SRQ, DAPL_DTO_TYPE_RDMA_WRITE, DAPL_DTO_TYPE_RDMA_READ, #ifdef DAT_EXTENSIONS DAPL_DTO_TYPE_EXTENSION, #endif } DAPL_DTO_TYPE; typedef enum dapl_cookie_type { DAPL_COOKIE_TYPE_NULL, DAPL_COOKIE_TYPE_DTO, DAPL_COOKIE_TYPE_RMR, } DAPL_COOKIE_TYPE; /* DAPL_DTO_COOKIE used as context for DTO WQEs */ struct dapl_dto_cookie { DAPL_DTO_TYPE type; DAT_DTO_COOKIE cookie; DAT_COUNT size; /* used for SEND and RDMA write */ }; /* DAPL_RMR_COOKIE used as context for bind WQEs */ struct dapl_rmr_cookie { DAPL_RMR *rmr; DAT_RMR_COOKIE cookie; }; /* DAPL_COOKIE used as context for WQEs */ struct dapl_cookie { DAPL_COOKIE_TYPE type; /* Must be first, to define struct. */ DAPL_EP *ep; DAT_COUNT index; union { DAPL_DTO_COOKIE dto; DAPL_RMR_COOKIE rmr; } val; }; /* * Private Data operations. Used to obtain the size of the private * data from the provider layer. */ typedef enum dapl_private_data_op { DAPL_PDATA_CONN_REQ = 0, /* connect request */ DAPL_PDATA_CONN_REP = 1, /* connect reply */ DAPL_PDATA_CONN_REJ = 2, /* connect reject */ DAPL_PDATA_CONN_DREQ = 3, /* disconnect request */ DAPL_PDATA_CONN_DREP = 4, /* disconnect reply */ } DAPL_PDATA_OP; /* * Generic HCA name field */ #define DAPL_HCA_NAME_MAX_LEN 260 typedef char DAPL_HCA_NAME[DAPL_HCA_NAME_MAX_LEN+1]; #ifdef IBHOSTS_NAMING /* * Simple mapping table to match IP addresses to GIDs. Loaded * by dapl_init. */ typedef struct _dapl_gid_map_table { uint32_t ip_address; ib_gid_t gid; } DAPL_GID_MAP; #endif /* IBHOSTS_NAMING */ /* * IBTA defined reason for reject message: See IBTA 1.1 specification, * 12.6.7.2 REJECTION REASON section. */ #define IB_CM_REJ_REASON_CONSUMER_REJ 0x001C #if defined(DAPL_DBG_IO_TRC) /********************************************************************* * * * Debug I/O tracing support prototypes * * * *********************************************************************/ /* * I/O tracing support */ void dapls_io_trc_alloc ( DAPL_EP *ep_ptr); void dapls_io_trc_update_completion ( DAPL_EP *ep_ptr, DAPL_COOKIE *cookie, ib_uint32_t ib_status ); void dapls_io_trc_dump ( DAPL_EP *ep_ptr, ib_work_completion_t *cqe_ptr, ib_uint32_t ib_status); #else /* DAPL_DBG_IO_TRC */ #define dapls_io_trc_alloc(a) #define dapls_io_trc_update_completion(a, b, c) #define dapls_io_trc_dump(a, b, c) #endif /* DAPL_DBG_IO_TRC */ /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ typedef void (*DAPL_CONNECTION_STATE_HANDLER) ( IN DAPL_EP *, IN ib_cm_events_t, IN const void *, OUT DAT_EVENT *); /* * DAT Mandated functions */ extern DAT_RETURN DAT_API dapl_ia_open ( IN const DAT_NAME_PTR, /* name */ IN DAT_COUNT, /* asynch_evd_qlen */ INOUT DAT_EVD_HANDLE *, /* asynch_evd_handle */ OUT DAT_IA_HANDLE *); /* ia_handle */ extern DAT_RETURN DAT_API dapl_ia_close ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CLOSE_FLAGS ); /* ia_flags */ extern DAT_RETURN DAT_API dapl_ia_query ( IN DAT_IA_HANDLE, /* ia handle */ OUT DAT_EVD_HANDLE *, /* async_evd_handle */ IN DAT_IA_ATTR_MASK, /* ia_params_mask */ OUT DAT_IA_ATTR *, /* ia_params */ IN DAT_PROVIDER_ATTR_MASK, /* provider_params_mask */ OUT DAT_PROVIDER_ATTR * ); /* provider_params */ /* helper functions */ extern DAT_RETURN DAT_API dapl_set_consumer_context ( IN DAT_HANDLE, /* dat handle */ IN DAT_CONTEXT); /* context */ extern DAT_RETURN DAT_API dapl_get_consumer_context ( IN DAT_HANDLE, /* dat handle */ OUT DAT_CONTEXT * ); /* context */ extern DAT_RETURN DAT_API dapl_get_handle_type ( IN DAT_HANDLE, OUT DAT_HANDLE_TYPE * ); extern DAT_RETURN DAT_API dats_get_ia_handle ( IN DAT_HANDLE, /* dat_handle */ OUT DAT_IA_HANDLE * ); /* ia handle */ /* CNO functions */ #if !defined(__KERNEL__) extern DAT_RETURN DAT_API dapl_cno_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_OS_WAIT_PROXY_AGENT, /* agent */ OUT DAT_CNO_HANDLE *); /* cno_handle */ extern DAT_RETURN DAT_API dapl_cno_modify_agent ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_OS_WAIT_PROXY_AGENT); /* agent */ extern DAT_RETURN DAT_API dapl_cno_query ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_CNO_PARAM_MASK, /* cno_param_mask */ OUT DAT_CNO_PARAM * ); /* cno_param */ extern DAT_RETURN DAT_API dapl_cno_free ( IN DAT_CNO_HANDLE); /* cno_handle */ extern DAT_RETURN DAT_API dapl_cno_wait ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_TIMEOUT, /* timeout */ OUT DAT_EVD_HANDLE *); /* evd_handle */ extern DAT_RETURN DAT_API dapl_cno_fd_create ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_FD *, /* file_descriptor */ OUT DAT_CNO_HANDLE *); /* cno_handle */ extern DAT_RETURN DAT_API dapl_cno_trigger ( IN DAT_CNO_HANDLE, /* cno_handle */ OUT DAT_EVD_HANDLE *); /* evd_handle */ #endif /* !defined(__KERNEL__) */ /* CR Functions */ extern DAT_RETURN DAT_API dapl_cr_query ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CR_PARAM_MASK, /* cr_args_mask */ OUT DAT_CR_PARAM * ); /* cwr_args */ extern DAT_RETURN DAT_API dapl_cr_accept ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ extern DAT_RETURN DAT_API dapl_cr_reject ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ extern DAT_RETURN DAT_API dapl_cr_handoff ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CONN_QUAL); /* handoff */ /* EVD Functions */ #if defined(__KERNEL__) extern DAT_RETURN DAT_API dapl_ia_memtype_hint ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_MEM_TYPE, /* mem_type */ IN DAT_VLEN, /* length */ IN DAT_MEM_OPT, /* mem_optimization */ OUT DAT_VLEN *, /* suggested_length */ OUT DAT_VADDR *); /* suggested_alignment */ extern DAT_RETURN DAT_API dapl_evd_kcreate ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COUNT, /* evd_min_qlen */ IN DAT_UPCALL_POLICY, /* upcall_policy */ IN const DAT_UPCALL_OBJECT *, /* upcall */ IN DAT_EVD_FLAGS, /* evd_flags */ OUT DAT_EVD_HANDLE * ); /* evd_handle */ extern DAT_RETURN DAT_API dapl_evd_kquery ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_EVD_PARAM_MASK, /* evd_args_mask */ OUT DAT_EVD_PARAM * ); /* evd_args */ #else extern DAT_RETURN DAT_API dapl_evd_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COUNT, /* evd_min_qlen */ IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_EVD_FLAGS, /* evd_flags */ OUT DAT_EVD_HANDLE * ); /* evd_handle */ extern DAT_RETURN DAT_API dapl_evd_query ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_EVD_PARAM_MASK, /* evd_args_mask */ OUT DAT_EVD_PARAM * ); /* evd_args */ #endif /* defined(__KERNEL__) */ #if defined(__KERNEL__) extern DAT_RETURN DAT_API dapl_evd_modify_upcall ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_UPCALL_POLICY, /* upcall_policy */ IN const DAT_UPCALL_OBJECT * ); /* upcall */ #else extern DAT_RETURN DAT_API dapl_evd_modify_cno ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_CNO_HANDLE); /* cno_handle */ #endif extern DAT_RETURN DAT_API dapl_evd_enable ( IN DAT_EVD_HANDLE); /* evd_handle */ extern DAT_RETURN DAT_API dapl_evd_disable ( IN DAT_EVD_HANDLE); /* evd_handle */ #if !defined(__KERNEL__) extern DAT_RETURN DAT_API dapl_evd_wait ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* threshold */ OUT DAT_EVENT *, /* event */ OUT DAT_COUNT *); /* nmore */ #endif /* !defined(__KERNEL__) */ extern DAT_RETURN DAT_API dapl_evd_resize ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_COUNT ); /* evd_qlen */ extern DAT_RETURN DAT_API dapl_evd_post_se ( DAT_EVD_HANDLE, /* evd_handle */ const DAT_EVENT * ); /* event */ extern DAT_RETURN DAT_API dapl_evd_dequeue ( IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_EVENT * ); /* event */ extern DAT_RETURN DAT_API dapl_evd_free ( IN DAT_EVD_HANDLE ); extern DAT_RETURN DAT_API dapl_evd_set_unwaitable ( IN DAT_EVD_HANDLE evd_handle ); extern DAT_RETURN DAT_API dapl_evd_clear_unwaitable ( IN DAT_EVD_HANDLE evd_handle ); /* EP functions */ extern DAT_RETURN DAT_API dapl_ep_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* in_dto_completion_evd_handle */ IN DAT_EVD_HANDLE, /* out_dto_completion_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN const DAT_EP_ATTR *, /* ep_parameters */ OUT DAT_EP_HANDLE * ); /* ep_handle */ extern DAT_RETURN DAT_API dapl_ep_query ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_args_mask */ OUT DAT_EP_PARAM * ); /* ep_args */ extern DAT_RETURN DAT_API dapl_ep_modify ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_args_mask */ IN const DAT_EP_PARAM * ); /* ep_args */ extern DAT_RETURN DAT_API dapl_ep_connect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_IA_ADDRESS_PTR, /* remote_ia_address */ IN DAT_CONN_QUAL, /* remote_conn_qual */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS, /* quality_of_service */ IN DAT_CONNECT_FLAGS ); /* connect_flags */ extern DAT_RETURN DAT_API dapl_ep_common_connect ( IN DAT_EP_HANDLE ep, /* ep_handle */ IN DAT_IA_ADDRESS_PTR remote_addr, /* remote_ia_address */ IN DAT_TIMEOUT timeout, /* timeout */ IN DAT_COUNT pdata_size, /* private_data_size */ IN const DAT_PVOID pdata ); /* private_data */ extern DAT_RETURN DAT_API dapl_ep_dup_connect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_HANDLE, /* ep_dup_handle */ IN DAT_TIMEOUT, /* timeout*/ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS); /* quality_of_service */ extern DAT_RETURN DAT_API dapl_ep_disconnect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_CLOSE_FLAGS ); /* close_flags */ extern DAT_RETURN DAT_API dapl_ep_post_send ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dapl_ep_post_recv ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dapl_ep_post_rdma_read ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *, /* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dapl_ep_post_rdma_read_to_rmr ( IN DAT_EP_HANDLE, /* ep_handle */ IN const DAT_RMR_TRIPLET *,/* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS); /* completion_flags */ extern DAT_RETURN DAT_API dapl_ep_post_rdma_write ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *, /* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dapl_ep_post_send_with_invalidate ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ IN DAT_BOOLEAN, /* invalidate_flag */ IN DAT_RMR_CONTEXT); /* RMR context */ extern DAT_RETURN DAT_API dapl_ep_get_status ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_EP_STATE *, /* ep_state */ OUT DAT_BOOLEAN *, /* in_dto_idle */ OUT DAT_BOOLEAN * ); /* out_dto_idle */ extern DAT_RETURN DAT_API dapl_ep_free ( IN DAT_EP_HANDLE); /* ep_handle */ extern DAT_RETURN DAT_API dapl_ep_reset ( IN DAT_EP_HANDLE); /* ep_handle */ extern DAT_RETURN DAT_API dapl_ep_create_with_srq ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* recv_evd_handle */ IN DAT_EVD_HANDLE, /* request_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN DAT_SRQ_HANDLE, /* srq_handle */ IN const DAT_EP_ATTR *, /* ep_attributes */ OUT DAT_EP_HANDLE *); /* ep_handle */ extern DAT_RETURN DAT_API dapl_ep_recv_query ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_COUNT *, /* nbufs_allocated */ OUT DAT_COUNT *); /* bufs_alloc_span */ extern DAT_RETURN DAT_API dapl_ep_set_watermark ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* soft_high_watermark */ IN DAT_COUNT); /* hard_high_watermark */ /* LMR functions */ #if defined(__KERNEL__) extern DAT_RETURN DAT_API dapl_lmr_kcreate ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_MEM_TYPE, /* mem_type */ IN DAT_REGION_DESCRIPTION, /* region_description */ IN DAT_VLEN, /* length */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_MEM_PRIV_FLAGS, /* privileges */ IN DAT_VA_TYPE, /* va_type */ IN DAT_MEM_OPT, /* optimization */ OUT DAT_LMR_HANDLE *, /* lmr_handle */ OUT DAT_LMR_CONTEXT *, /* lmr_context */ OUT DAT_RMR_CONTEXT *, /* rmr_context */ OUT DAT_VLEN *, /* registered_length */ OUT DAT_VADDR * ); /* registered_address */ #else extern DAT_RETURN DAT_API dapl_lmr_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_MEM_TYPE, /* mem_type */ IN DAT_REGION_DESCRIPTION, /* region_description */ IN DAT_VLEN, /* length */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_MEM_PRIV_FLAGS, /* privileges */ IN DAT_VA_TYPE, /* va_type */ OUT DAT_LMR_HANDLE *, /* lmr_handle */ OUT DAT_LMR_CONTEXT *, /* lmr_context */ OUT DAT_RMR_CONTEXT *, /* rmr_context */ OUT DAT_VLEN *, /* registered_length */ OUT DAT_VADDR * ); /* registered_address */ #endif /* defined(__KERNEL__) */ extern DAT_RETURN DAT_API dapl_lmr_query ( IN DAT_LMR_HANDLE, IN DAT_LMR_PARAM_MASK, OUT DAT_LMR_PARAM *); extern DAT_RETURN DAT_API dapl_lmr_free ( IN DAT_LMR_HANDLE); extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_read ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *, /* local_segments */ IN DAT_VLEN); /* num_segments */ extern DAT_RETURN DAT_API dapl_lmr_sync_rdma_write ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *, /* local_segments */ IN DAT_VLEN); /* num_segments */ /* RMR Functions */ extern DAT_RETURN DAT_API dapl_rmr_create ( IN DAT_PZ_HANDLE, /* pz_handle */ OUT DAT_RMR_HANDLE *); /* rmr_handle */ extern DAT_RETURN DAT_API dapl_rmr_create_for_ep ( IN DAT_PZ_HANDLE pz_handle, /* pz_handle */ OUT DAT_RMR_HANDLE *rmr_handle); /* rmr_handle */ extern DAT_RETURN DAT_API dapl_rmr_query ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_RMR_PARAM_MASK, /* rmr_args_mask */ OUT DAT_RMR_PARAM *); /* rmr_args */ extern DAT_RETURN DAT_API dapl_rmr_bind ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_LMR_HANDLE, /* lmr_handle */ IN const DAT_LMR_TRIPLET *, /* lmr_triplet */ IN DAT_MEM_PRIV_FLAGS, /* mem_priv */ IN DAT_VA_TYPE, /* va_type */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_RMR_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ INOUT DAT_RMR_CONTEXT * ); /* context */ extern DAT_RETURN DAT_API dapl_rmr_free ( IN DAT_RMR_HANDLE); /* PSP Functions */ extern DAT_RETURN DAT_API dapl_psp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE * ); /* psp_handle */ extern DAT_RETURN DAT_API dapl_psp_create_any ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_CONN_QUAL *, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE *); /* psp_handle */ extern DAT_RETURN DAT_API dapl_psp_query ( IN DAT_PSP_HANDLE, IN DAT_PSP_PARAM_MASK, OUT DAT_PSP_PARAM * ); extern DAT_RETURN DAT_API dapl_psp_free ( IN DAT_PSP_HANDLE ); /* psp_handle */ /* RSP Functions */ extern DAT_RETURN DAT_API dapl_rsp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_RSP_HANDLE * ); /* rsp_handle */ extern DAT_RETURN DAT_API dapl_rsp_query ( IN DAT_RSP_HANDLE, IN DAT_RSP_PARAM_MASK, OUT DAT_RSP_PARAM * ); extern DAT_RETURN DAT_API dapl_rsp_free ( IN DAT_RSP_HANDLE ); /* rsp_handle */ /* PZ Functions */ extern DAT_RETURN DAT_API dapl_pz_create ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_PZ_HANDLE * ); /* pz_handle */ extern DAT_RETURN DAT_API dapl_pz_query ( IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_PZ_PARAM_MASK, /* pz_args_mask */ OUT DAT_PZ_PARAM * ); /* pz_args */ extern DAT_RETURN DAT_API dapl_pz_free ( IN DAT_PZ_HANDLE ); /* pz_handle */ /* SRQ functions */ extern DAT_RETURN DAT_API dapl_srq_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_SRQ_ATTR *, /* srq_attr */ OUT DAT_SRQ_HANDLE *); /* srq_handle */ extern DAT_RETURN DAT_API dapl_srq_free ( IN DAT_SRQ_HANDLE); /* srq_handle */ extern DAT_RETURN DAT_API dapl_srq_post_recv ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE); /* user_cookie */ extern DAT_RETURN DAT_API dapl_srq_query ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_SRQ_PARAM_MASK, /* srq_param_mask */ OUT DAT_SRQ_PARAM *); /* srq_param */ extern DAT_RETURN DAT_API dapl_srq_resize ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT); /* srq_max_recv_dto */ extern DAT_RETURN DAT_API dapl_srq_set_lw ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT); /* low_watermark */ /* CSP functions */ extern DAT_RETURN DAT_API dapl_csp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COMM *, /* communicator */ IN DAT_IA_ADDRESS_PTR, /* address */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_CSP_HANDLE *); /* csp_handle */ extern DAT_RETURN DAT_API dapl_csp_query ( IN DAT_CSP_HANDLE, /* csp_handle */ IN DAT_CSP_PARAM_MASK, /* csp_param_mask */ OUT DAT_CSP_PARAM *); /* csp_param */ extern DAT_RETURN DAT_API dapl_csp_free ( IN DAT_CSP_HANDLE); /* csp_handle */ /* HA functions */ DAT_RETURN DAT_API dapl_ia_ha ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_NAME_PTR, /* provider */ OUT DAT_BOOLEAN *); /* answer */ #ifdef DAT_EXTENSIONS #include extern DAT_RETURN DAT_API dapl_extensions ( IN DAT_HANDLE, /* handle */ IN DAT_EXTENDED_OP, /* extended op */ IN va_list); /* argument list */ #endif /* * DAPL internal utility function prototpyes */ extern void dapl_llist_init_head ( DAPL_LLIST_HEAD * head); extern void dapl_llist_init_entry ( DAPL_LLIST_ENTRY * entry); extern DAT_BOOLEAN dapl_llist_is_empty ( DAPL_LLIST_HEAD * head); extern void dapl_llist_add_head ( DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, void * data); extern void dapl_llist_add_tail ( DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, void * data); extern void dapl_llist_add_entry ( DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry, DAPL_LLIST_ENTRY * new_entry, void * data); extern void * dapl_llist_remove_head ( DAPL_LLIST_HEAD * head); extern void * dapl_llist_remove_tail ( DAPL_LLIST_HEAD * head); extern void * dapl_llist_remove_entry ( DAPL_LLIST_HEAD * head, DAPL_LLIST_ENTRY * entry); extern void * dapl_llist_peek_head ( DAPL_LLIST_HEAD * head); extern void * dapl_llist_next_entry ( IN DAPL_LLIST_HEAD *head, IN DAPL_LLIST_ENTRY *cur_ent); extern void dapl_llist_debug_print_list ( DAPL_LLIST_HEAD * head); #endif dapl-2.1.5/dapl/include/dapl_debug.h000066400000000000000000000104031255317474200172510ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_debug.h * * PURPOSE: defines common deuggging flags & data for the DAPL reference * implemenation * * Description: * * * $Id:$ **********************************************************************/ #ifndef _DAPL_DEBUG_H_ #define _DAPL_DEBUG_H_ /* * Debug level switches * * Use these bits to enable various tracing/debug options. Each bit * represents debugging in a particular subsystem or area of the code. * * The ERR bit should always be on unless someone disables it for a * reason: The ERR flag is used sparingly and will print useful * information if it fires. */ typedef enum { DAPL_DBG_TYPE_ERR = 0x0001, DAPL_DBG_TYPE_WARN = 0x0002, DAPL_DBG_TYPE_EVD = 0x0004, DAPL_DBG_TYPE_CM = 0x0008, DAPL_DBG_TYPE_EP = 0x0010, DAPL_DBG_TYPE_UTIL = 0x0020, DAPL_DBG_TYPE_CALLBACK = 0x0040, DAPL_DBG_TYPE_DTO_COMP_ERR = 0x0080, DAPL_DBG_TYPE_API = 0x0100, DAPL_DBG_TYPE_RTN = 0x0200, DAPL_DBG_TYPE_EXCEPTION = 0x0400, DAPL_DBG_TYPE_SRQ = 0x0800, DAPL_DBG_TYPE_CNTR = 0x1000, DAPL_DBG_TYPE_CM_LIST = 0x2000, DAPL_DBG_TYPE_THREAD = 0x4000, DAPL_DBG_TYPE_CM_EST = 0x8000, DAPL_DBG_TYPE_CM_WARN = 0x10000, DAPL_DBG_TYPE_EXTENSION = 0x20000, DAPL_DBG_TYPE_CM_STATS = 0x40000, DAPL_DBG_TYPE_CM_ERRS = 0x80000, DAPL_DBG_TYPE_LINK_ERRS = 0x100000, DAPL_DBG_TYPE_LINK_WARN = 0x200000, DAPL_DBG_TYPE_DIAG_ERRS = 0x400000, DAPL_DBG_TYPE_SYS_WARN = 0x800000, DAPL_DBG_TYPE_VER = 0x1000000, DAPL_DBG_TYPE_IA_STATS = 0x2000000, } DAPL_DBG_TYPE; typedef enum { DAPL_DBG_DEST_STDOUT = 0x0001, DAPL_DBG_DEST_SYSLOG = 0x0002, } DAPL_DBG_DEST; extern DAPL_DBG_TYPE g_dapl_dbg_level; extern DAPL_DBG_TYPE g_dapl_dbg_type; extern DAPL_DBG_DEST g_dapl_dbg_dest; extern int g_dapl_dbg_mem; extern void dapl_internal_dbg_log(DAPL_DBG_TYPE type, const char *fmt, ...); #define dapl_log !g_dapl_dbg_type && !g_dapl_dbg_level ? (void) 1 : dapl_internal_dbg_log #if defined(DAPL_DBG) #define dapl_dbg_log !g_dapl_dbg_type && !g_dapl_dbg_level ? (void) 1 : dapl_internal_dbg_log #else #define dapl_dbg_log(...) #endif #include #ifdef DAPL_COUNTERS #define DAPL_CNTR(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr]++ #define DAPL_CNTR_DATA(h_ptr, cntr, data) ((DAT_UINT64*)h_ptr->cntrs)[cntr]+= data #define DAPL_CNTR_RESET(h_ptr, cntr) ((DAT_UINT64*)h_ptr->cntrs)[cntr] = 0 DAT_RETURN dapl_query_counter(DAT_HANDLE dh, int counter, void *p_cntrs_out, int reset); char *dapl_query_counter_name(DAT_HANDLE dh, int counter); void dapl_print_counter(DAT_HANDLE dh, int counter, int reset); void dapl_print_counter_str(DAT_HANDLE dh, int counter, int reset, const char *pattern); void dapl_start_counters(DAT_HANDLE ia, DAT_IA_COUNTER_TYPE type); void dapl_stop_counters(DAT_HANDLE ia, DAT_IA_COUNTER_TYPE type); void dapli_start_counters(DAT_HANDLE ia); void dapli_stop_counters(DAT_HANDLE ia); #else #define DAPL_CNTR(handle, cntr) #define DAPL_CNTR_DATA(handle, cntr, data) #define DAPL_CNTR_RESET(handle, cntr) #endif /* DAPL_COUNTERS */ #endif /* _DAPL_DEBUG_H_ */ dapl-2.1.5/dapl/include/dapl_ipoib_names.h000066400000000000000000000167161255317474200204650ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: ipoib_naming.h * * PURPOSE: Defines flags and prototypes for IPoIB API * * Description: * This defines a simple naming interface for discovering * the IP addresses available to a provider, then a set * of query mechanisms useful to map an IP address to * a provider specific address; a GID in InfiniBand. * * NOTE: As implementations mature this may not be necessary. * * $Id:$ **********************************************************************/ #ifndef _IPOIB_NAMING_H_ #define _IPOIB_NAMING_H_ typedef enum _ipoib_port_num { HCA_PORT_1= 1, HCA_PORT_2, HCA_PORT_ANY } IPOIB_PORT_NUM; typedef struct if_query_info { uint64_t guid; uint32_t port_num; uint32_t state; }IF_QUERY_INFO; /*********************************************************************** * ipoib_enum_if() * * PURPOSE * Returns count of IP interfaces. * * ARGUMENTS * hca_index: index of HCA in the provider library. In general * terms, the index represents the HCA number, e.g. * 1 == First HCA, 2 == Second HCA, etc. * * port: an enum of * HCA_PORT_0 * HCA_PORT_1 * HCA_PORT_ANY * HCA_PORT_ANY enum value returns all IP instances assigned to the HCA. * * RETURNS * count of IP interfaces supported on physical port * ***********************************************************************/ int ipoib_enum_if( IN uint32_t hca_index, IN IPOIB_PORT_NUM port); /*********************************************************************** * ipoib_get_if() * * PURPOSE * Returns array of IP Addresses of all instances. Port parameter may * restrict instances of interest. * * ARGUMENTS * hca_index: index of HCA in the provider library. * * port: IPOIB_PORT_NUM as described above * * ip_addr_list: pointer to user-allocated space in which an array of * IP addresses found for this hca and port will be returned * * ip_addr_count: number of returned addresses * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_get_if( IN uint32_t hca_index, IN IPOIB_PORT_NUM port, OUT struct sockaddr **ip_addr_list, OUT int *ip_addr_count); /*********************************************************************** * * PURPOSE * Returns a handle to this interface, to be used for subsequent * operations * * ARGUMENTS * ip_address: input IP address * * ipoib_handle: handle to be used in subsequent operations. * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_open_if( IN struct sockaddr *ip_address, OUT void *ipoib_handle); /*********************************************************************** * ipoib_query_if() * * PURPOSE * if_query_if returns information on local ipoib_handle such as GID, * Port number, IPoIB state, anything interesting * * ARGUMENTS * ipoib_handle: handle for instance * * if_qry_info: info struct. Looks like: * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_query_if( IN void *ipoib_handle, OUT IF_QUERY_INFO *if_qry_info); /*********************************************************************** * * * PURPOSE * Obtain a GID from an IP Address. Used by the active side of * a connection. * * The behavior of this routine is specified to provide control * over the underlying implementation. * Returns immediately if the remote information is available. If * callback_routine_ptr is NULL then it will block until information is * available or known to be unavailable. If callback_routine_ptr is * specified then it will be invoked when remote information is * available or known to be unavailable. Remote_Addr_info contains * remote GID information. * * ARGUMENTS * ipoib_handle: handle for instance * * remote_ip_address: IP address of remote instance * * callback_routine_ptr: routine to invoke for asynch callback. If * NULL ipoib_getaddrinfo() will block. * * context: argument to pass to asynch callback_routine. * * Remote_Addr_info: Remote GID * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_getaddrinfo( IN void *ipoib_handle, IN struct sockaddr *remote_ip_address, IN void *callback_routine_ptr, IN void *context, OUT void *Remote_Addr_info ); /*********************************************************************** * * * PURPOSE * Obtain an IP Address from a GID. Used by the passive side of a * connection. * * The behavior of this routine is specified to provide control over * the underlying implementation. Returns immediately if the remote * information is available. If callback_routine_ptr is NULL then it * will block until information is available or known to be * unavailable. If callback_routine_ptr is specified then it will be * invoked when remote information is available or known to be * unavailable. * * ARGUMENTS * ipoib_handle: handle for instance * * remote_gidAddr: Remote GID. It is not defined on how the application * will obtain this GID from the connection manager. * * callback_routine_ptr: * routine to invoke for async callback. If NULL * ipoib_getgidinfo() will block. * * context: argument to pass to asynch callback_routine. * * remote_ip_address: * IP address of remote instance * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_getgidinfo( IN void *ipoib_handle, IN GID *remote_gid, IN void *callback_routine_ptr, IN void *context, OUT struct sockaddr *remote_ip_address); /*********************************************************************** * * PURPOSE * Release handle. * * ARGUMENTS * ipoib_handle: handle for instance * * RETURNS * 0 for SUCCESS * !0 for failure * ***********************************************************************/ int ipoib_close( IN void *ipoib_handle); #endif /* _IPOIB_NAMING_H_ */ dapl-2.1.5/dapl/include/dapl_vendor.h000066400000000000000000000076551255317474200174770ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_vendor.h * * PURPOSE: * Vendor provides values for their implementation. Most of * these values are returned in the DAT_IA_ATTR parameter of * dat_ia_query() * * $Id:$ **********************************************************************/ /********************************************************************** * DAT_IA_ATTR attributes * * These values are used in the provider support routine * dapls_ib_query_hca (). Many of the values there are HW * specific, the the vendor should look to make sure they are * appropriate for their implementation. Specifically, * vendors are encouraged to update transport and vendor * attributes: the reference implementation sets these to NULL. */ /* * Product name of the adapter. * Returned in DAT_IA_ATTR.adapter_name */ #define VN_ADAPTER_NAME "Generic OpenFabrics HCA" /* * Vendor name * Returned in DAT_IA_ATTR.vendor_name */ #define VN_VENDOR_NAME "DAPL OpenFabrics Implementation" /********************************************************************** * PROVIDER Attributes * * These values are used in ./common/dapl_ia_query.c, in dapl_ia_query (). * The values below are the most common for vendors to change, but * there are several other values that may be updated once the * implementation becomes mature. * */ /* * Provider Versions * Returned in DAT_PROVIDER_ATTR.provider_version_major and * DAT_PROVIDER_ATTR.provider_version_minor */ #define VN_PROVIDER_MAJOR 2 #define VN_PROVIDER_MINOR 0 /* * Provider support for memory types. The reference implementation * always supports DAT_MEM_TYPE_VIRTUAL and DAT_MEM_TYPE_LMR, so * the vendor must indicate if they support DAT_MEM_TYPE_SHARED_VIRTUAL. * Set this value to '1' if DAT_MEM_TYPE_SHARED_VIRTUAL is supported. * * Returned in DAT_PROVIDER_ATTR.lmr_mem_types_supported */ #define VN_MEM_SHARED_VIRTUAL_SUPPORT 1 /********************************************************************** * * This value will be assigned to dev_name_prefix in ./udapl/dapl_init.c. * * DAT is designed to support multiple DAPL instances simultaneously, * with different dapl libraries originating from different providers. * There is always the possibility of name conflicts, so a dat name * prefix is provided to make a vendor's adapter name unique. This is * especially true of the IBM Access API, which returns adapter * names that are simply ordinal numbers (e.g. 0, 1, 2). If * a vendor doesn't need or want a prefix, it should be left * as a NULL (use ""). * * Values that might be used: * #define VN_PREFIX "ia" (generic prefix) * #define VN_PREFIX "jni" (JNI: OS Acces API) * #define VN_PREFIX "ibm" (IBM: OS Acces API) * #define VN_PREFIX "" (Mellanox: VAPI) * #define VN_PREFIX "" (Intel: IB Common API) */ #define VN_PREFIX "ia" dapl-2.1.5/dapl/openib_cma/000077500000000000000000000000001255317474200154655ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_cma/cm.c000066400000000000000000001051151255317474200162330ustar00rootroot00000000000000/* * Copyright (c) 2005 Voltaire Inc. All rights reserved. * Copyright (c) 2005-2015 Intel Corporation. All rights reserved. * Copyright (c) 2004-2005, Mellanox Technologies, Inc. All rights reserved. * Copyright (c) 2003 Topspin Corporation. All rights reserved. * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ib_cm.c * * PURPOSE: The OFED provider - uCMA, name and route resolution * * $Id: $ * **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_sp_util.h" #include "dapl_cr_util.h" #include "dapl_name_service.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_vendor.h" #include "dapl_osd.h" extern struct rdma_event_channel *g_cm_events; /* local prototypes */ static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn, struct rdma_cm_event *event); static void dapli_cm_active_cb(struct dapl_cm_id *conn, struct rdma_cm_event *event); static void dapli_cm_passive_cb(struct dapl_cm_id *conn, struct rdma_cm_event *event); static void dapli_addr_resolve(struct dapl_cm_id *conn); static void dapli_route_resolve(struct dapl_cm_id *conn); /* cma requires 16 bit SID, in network order */ #define IB_PORT_MOD 32001 #define IB_PORT_BASE (65535 - IB_PORT_MOD) #define SID_TO_PORT(SID) \ (SID > 0xffff ? \ htons((unsigned short)((SID % IB_PORT_MOD) + IB_PORT_BASE)) :\ htons((unsigned short)SID)) #define PORT_TO_SID(p) ntohs(p) /* private data header to validate consumer rejects versus abnormal events */ struct dapl_pdata_hdr { DAT_UINT32 version; }; static void dapli_addr_resolve(struct dapl_cm_id *conn) { int ret, tos; #ifdef DAPL_DBG struct rdma_addr *ipaddr = &conn->cm_id->route.addr; #endif dapl_dbg_log(DAPL_DBG_TYPE_CM, " addr_resolve: cm_id %p SRC %x DST %x\n", conn->cm_id, ntohl(((struct sockaddr_in *) &ipaddr->src_addr)->sin_addr.s_addr), ntohl(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_addr.s_addr)); tos = dapl_os_get_env_val("DAPL_CM_TOS", 0); if (tos) { ret = rdma_set_option(conn->cm_id,RDMA_OPTION_ID,RDMA_OPTION_ID_TOS,&tos,sizeof(uint8_t)); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_connect: failed to set TOS ERR 0x%x %s\n", ret, strerror(errno)); } } ret = rdma_resolve_route(conn->cm_id, conn->route_timeout); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_connect: rdma_resolve_route ERR 0x%x %s\n", ret, strerror(errno)); dapl_evd_connection_callback(conn, IB_CME_LOCAL_FAILURE, NULL, 0, conn->ep); } } static void dapli_route_resolve(struct dapl_cm_id *conn) { int ret; #ifdef DAPL_DBG struct rdma_addr *ipaddr = &conn->cm_id->route.addr; #endif dapl_dbg_log(DAPL_DBG_TYPE_CM, " route_resolve: cm_id %p SRC %x DST %x PORT %d\n", conn->cm_id, ntohl(((struct sockaddr_in *) &ipaddr->src_addr)->sin_addr.s_addr), ntohl(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_addr.s_addr), ntohs(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_port)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " route_resolve: SRC GID subnet %016llx id %016llx\n", (unsigned long long) ntohll(ipaddr->addr.ibaddr.sgid.global.subnet_prefix), (unsigned long long) ntohll(ipaddr->addr.ibaddr.sgid.global.interface_id)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " route_resolve: DST GID subnet %016llx id %016llx\n", (unsigned long long) ntohll(ipaddr->addr.ibaddr.dgid.global.subnet_prefix), (unsigned long long) ntohll(ipaddr->addr.ibaddr.dgid.global.interface_id)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " route_resolve: cm_id %p pdata %p plen %d rr %d ind %d\n", conn->cm_id, conn->params.private_data, conn->params.private_data_len, conn->params.responder_resources, conn->params.initiator_depth); ret = rdma_connect(conn->cm_id, &conn->params); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_connect: rdma_connect ERR %d %s\n", ret, strerror(errno)); goto bail; } return; bail: dapl_evd_connection_callback(conn, IB_CME_LOCAL_FAILURE, NULL, 0, conn->ep); } dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep) { dp_ib_cm_handle_t conn; struct rdma_cm_id *cm_id; /* Allocate CM and initialize lock */ if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL) return NULL; dapl_os_memzero(conn, sizeof(*conn)); dapl_os_lock_init(&conn->lock); dapls_cm_acquire(conn); /* create CM_ID, bind to local device, create QP */ if (rdma_create_id(g_cm_events, &cm_id, (void *)conn, RDMA_PS_TCP)) { dapls_cm_release(conn); return NULL; } conn->cm_id = cm_id; /* setup timers for address and route resolution */ conn->arp_timeout = dapl_os_get_env_val("DAPL_CM_ARP_TIMEOUT_MS", IB_ARP_TIMEOUT); conn->arp_retries = dapl_os_get_env_val("DAPL_CM_ARP_RETRY_COUNT", IB_ARP_RETRY_COUNT); conn->route_timeout = dapl_os_get_env_val("DAPL_CM_ROUTE_TIMEOUT_MS", IB_ROUTE_TIMEOUT); conn->route_retries = dapl_os_get_env_val("DAPL_CM_ROUTE_RETRY_COUNT", IB_ROUTE_RETRY_COUNT); if (ep != NULL) { dapl_ep_link_cm(ep, conn); conn->ep = ep; conn->hca = ((DAPL_IA *)ep->param.ia_handle)->hca_ptr; } return conn; } static void dapli_cm_dealloc(dp_ib_cm_handle_t conn) { dapl_os_assert(!conn->ref_count); dapl_os_lock_destroy(&conn->lock); dapl_os_free(conn, sizeof(*conn)); } void dapls_cm_acquire(dp_ib_cm_handle_t conn) { dapl_os_lock(&conn->lock); conn->ref_count++; dapl_os_unlock(&conn->lock); } void dapls_cm_release(dp_ib_cm_handle_t conn) { dapl_os_lock(&conn->lock); conn->ref_count--; if (conn->ref_count) { dapl_os_unlock(&conn->lock); return; } dapl_os_unlock(&conn->lock); dapli_cm_dealloc(conn); } /* BLOCKING: called from dapl_ep_free, EP link will be last ref */ void dapls_cm_free(dp_ib_cm_handle_t conn) { dapl_log(DAPL_DBG_TYPE_CM, " cm_free: cm %p ep %p refs=%d\n", conn, conn->ep, conn->ref_count); dapls_cm_release(conn); /* release alloc ref */ /* Destroy cm_id, wait until EP is last ref */ dapl_os_lock(&conn->lock); if (conn->cm_id) { struct rdma_cm_id *cm_id = conn->cm_id; if (cm_id->qp) rdma_destroy_qp(cm_id); conn->cm_id = NULL; dapl_os_unlock(&conn->lock); rdma_destroy_id(cm_id); /* blocking, event processing */ dapl_os_lock(&conn->lock); } /* EP linking is last reference */ while (conn->ref_count != 1) { dapl_os_unlock(&conn->lock); dapl_os_sleep_usec(10000); dapl_os_lock(&conn->lock); } dapl_os_unlock(&conn->lock); /* unlink, dequeue from EP. Final ref so release will destroy */ dapl_ep_unlink_cm(conn->ep, conn); } DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr) { return DAT_NOT_IMPLEMENTED; } static struct dapl_cm_id *dapli_req_recv(struct dapl_cm_id *conn, struct rdma_cm_event *event) { struct dapl_cm_id *new_conn; #ifdef DAPL_DBG struct rdma_addr *ipaddr = &event->id->route.addr; #endif if (conn->sp == NULL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " dapli_rep_recv: on invalid listen " "handle\n"); return NULL; } /* allocate new cm_id and merge listen parameters */ new_conn = dapl_os_alloc(sizeof(*new_conn)); if (new_conn) { (void)dapl_os_memzero(new_conn, sizeof(*new_conn)); dapl_os_lock_init(&new_conn->lock); dapls_cm_acquire(new_conn); new_conn->cm_id = event->id; /* provided by uCMA */ event->id->context = new_conn; /* update CM_ID context */ new_conn->sp = conn->sp; new_conn->hca = conn->hca; /* Get requesters connect data, setup for accept */ new_conn->params.responder_resources = DAPL_MIN(event->param.conn.responder_resources, conn->hca->ib_trans.ib_cm.rd_atom_in); new_conn->params.initiator_depth = DAPL_MIN(event->param.conn.initiator_depth, conn->hca->ib_trans.ib_cm.rd_atom_out); new_conn->params.flow_control = event->param.conn.flow_control; new_conn->params.rnr_retry_count = event->param.conn.rnr_retry_count; new_conn->params.retry_count = event->param.conn.retry_count; /* save private data */ if (event->param.conn.private_data_len) { dapl_os_memcpy(new_conn->p_data, event->param.conn.private_data, event->param.conn.private_data_len); new_conn->params.private_data = new_conn->p_data; new_conn->params.private_data_len = event->param.conn.private_data_len; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: " "REQ: SP %p PORT %d LID %d " "NEW CONN %p ID %p pdata %p,%d\n", new_conn->sp, ntohs(((struct sockaddr_in *) &ipaddr->src_addr)->sin_port), event->listen_id, new_conn, event->id, event->param.conn.private_data, event->param.conn.private_data_len); dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: " "REQ: IP SRC %x PORT %d DST %x PORT %d " "rr %d init %d\n", ntohl(((struct sockaddr_in *) &ipaddr->src_addr)-> sin_addr.s_addr), ntohs(((struct sockaddr_in *) &ipaddr->src_addr)->sin_port), ntohl(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_addr.s_addr), ntohs(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_port), new_conn->params.responder_resources, new_conn->params.initiator_depth); } return new_conn; } static void dapli_cm_active_cb(struct dapl_cm_id *conn, struct rdma_cm_event *event) { DAPL_OS_LOCK *lock = &conn->lock; ib_cm_events_t ib_cm_event; const void *pdata = NULL; dapl_dbg_log(DAPL_DBG_TYPE_CM, " active_cb: conn %p id %d event %d\n", conn, conn->cm_id, event->event); /* There is a chance that we can get events after * the consumer calls disconnect in a pending state * since the IB CM and uDAPL states are not shared. * In some cases, IB CM could generate either a DCONN * or CONN_ERR after the consumer returned from * dapl_ep_disconnect with a DISCONNECTED event * already queued. Check state here and bail to * avoid any events after a disconnect. */ if (DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP)) return; dapl_os_lock(&conn->ep->header.lock); if (conn->ep->param.ep_state == DAT_EP_STATE_DISCONNECTED) { dapl_os_unlock(&conn->ep->header.lock); return; } if (event->event == RDMA_CM_EVENT_DISCONNECTED) conn->ep->param.ep_state = DAT_EP_STATE_DISCONNECTED; dapl_os_unlock(&conn->ep->header.lock); dapl_os_lock(lock); switch (event->event) { case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_CONNECT_ERROR: dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cma_active: CONN_ERR event=0x%x" " status=%d %s DST %s, %d\n", event->event, event->status, (event->status == -ETIMEDOUT) ? "TIMEOUT" : "", inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)-> sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)-> sin_port)); /* per DAT SPEC provider always returns UNREACHABLE */ ib_cm_event = IB_CME_DESTINATION_UNREACHABLE; break; case RDMA_CM_EVENT_REJECTED: dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapli_cm_active_handler: REJECTED reason=%d\n", event->status); /* valid REJ from consumer will always contain private data */ if (event->status == 28 && event->param.conn.private_data_len) { ib_cm_event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA; pdata = (unsigned char *)event->param.conn. private_data + sizeof(struct dapl_pdata_hdr); } else { ib_cm_event = IB_CME_DESTINATION_REJECT; dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cma_active: non-consumer REJ," " reason=%d, DST %s, %d\n", event->status, inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr. dst_addr)->sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr. dst_addr)->sin_port)); } break; case RDMA_CM_EVENT_ESTABLISHED: dapl_log(DAPL_DBG_TYPE_CM_EST, " CMA ACTIVE CONN: %x -> %s %x\n", ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.src_addr)->sin_port), inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_port)); /* setup local and remote ports for ep query */ conn->ep->param.remote_port_qual = PORT_TO_SID(rdma_get_dst_port(conn->cm_id)); conn->ep->param.local_port_qual = PORT_TO_SID(rdma_get_src_port(conn->cm_id)); ib_cm_event = IB_CME_CONNECTED; pdata = event->param.conn.private_data; break; case RDMA_CM_EVENT_DISCONNECTED: dapl_dbg_log(DAPL_DBG_TYPE_CM, " active_cb: DISC EVENT - EP %p\n",conn->ep); rdma_disconnect(conn->cm_id); /* required for DREP */ ib_cm_event = IB_CME_DISCONNECTED; /* validate EP handle */ if (DAPL_BAD_HANDLE(conn->ep, DAPL_MAGIC_EP)) conn = NULL; break; default: dapl_dbg_log(DAPL_DBG_TYPE_ERR, " dapli_cm_active_cb_handler: Unexpected CM " "event %d on ID 0x%p\n", event->event, conn->cm_id); conn = NULL; break; } dapl_os_unlock(lock); if (conn) dapl_evd_connection_callback(conn, ib_cm_event, pdata, event->param.conn.private_data_len, conn->ep); } static void dapli_cm_passive_cb(struct dapl_cm_id *conn, struct rdma_cm_event *event) { ib_cm_events_t ib_cm_event; struct dapl_cm_id *conn_recv = conn; const void *pdata = NULL; dapl_dbg_log(DAPL_DBG_TYPE_CM, " passive_cb: conn %p id %d event %d\n", conn, event->id, event->event); dapl_os_lock(&conn->lock); switch (event->event) { case RDMA_CM_EVENT_CONNECT_REQUEST: /* create new conn object with new conn_id from event */ conn_recv = dapli_req_recv(conn, event); ib_cm_event = IB_CME_CONNECTION_REQUEST_PENDING; pdata = event->param.conn.private_data; break; case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_CONNECT_ERROR: dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cm_passive: CONN_ERR event=0x%x status=%d %s," " DST %s,%d\n", event->event, event->status, (event->status == -ETIMEDOUT) ? "TIMEOUT" : "", inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)-> sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr. dst_addr)->sin_port)); ib_cm_event = IB_CME_DESTINATION_UNREACHABLE; break; case RDMA_CM_EVENT_REJECTED: /* will alwasys be abnormal NON-consumer from active side */ dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cm_passive: non-consumer REJ, reason=%d," " DST %s, %d\n", event->status, inet_ntoa(((struct sockaddr_in *)&conn->cm_id->route.addr.dst_addr)->sin_addr), ntohs(((struct sockaddr_in *)&conn->cm_id->route.addr.dst_addr)->sin_port)); ib_cm_event = IB_CME_DESTINATION_REJECT; break; case RDMA_CM_EVENT_ESTABLISHED: dapl_log(DAPL_DBG_TYPE_CM_EST, " CMA PASSIVE CONN: %x <- %s %x \n", ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)->sin_port), inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr.src_addr)->sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.src_addr)->sin_port)); ib_cm_event = IB_CME_CONNECTED; break; case RDMA_CM_EVENT_DISCONNECTED: rdma_disconnect(conn->cm_id); /* required for DREP */ ib_cm_event = IB_CME_DISCONNECTED; /* validate SP handle context */ if (DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_PSP) && DAPL_BAD_HANDLE(conn->sp, DAPL_MAGIC_RSP)) conn_recv = NULL; break; default: dapl_dbg_log(DAPL_DBG_TYPE_ERR, " passive_cb: " "Unexpected CM event %d on ID 0x%p\n", event->event, conn->cm_id); conn_recv = NULL; break; } dapl_os_unlock(&conn->lock); if (conn_recv) dapls_cr_callback(conn_recv, ib_cm_event, pdata, event->param.conn.private_data_len, conn_recv->sp); } /************************ DAPL provider entry points **********************/ /* * dapls_ib_connect * * Initiate a connection with the passive listener on another node * * Input: * ep_handle, * remote_ia_address, * remote_conn_qual, * prd_size size of private data and structure * prd_prt pointer to private data structure * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR r_addr, IN DAT_CONN_QUAL r_qual, IN DAT_COUNT p_size, IN void *p_data) { struct dapl_ep *ep_ptr = ep_handle; struct dapl_cm_id *conn = dapl_get_cm_from_ep(ep_ptr); int ret; dapl_os_assert(conn != NULL); dapl_dbg_log(DAPL_DBG_TYPE_CM, " connect: rSID 0x%llx rPort %d, pdata %p, ln %d\n", r_qual, ntohs(SID_TO_PORT(r_qual)), p_data, p_size); /* rdma conn and cm_id pre-bound; reference via ep_ptr->cm_handle */ /* Setup QP/CM parameters and private data in cm_id */ (void)dapl_os_memzero(&conn->params, sizeof(conn->params)); conn->params.responder_resources = ep_ptr->param.ep_attr.max_rdma_read_in; conn->params.initiator_depth = ep_ptr->param.ep_attr.max_rdma_read_out; conn->params.flow_control = 1; conn->params.rnr_retry_count = IB_RNR_RETRY_COUNT; conn->params.retry_count = IB_RC_RETRY_COUNT; if (p_size) { dapl_os_memcpy(conn->p_data, p_data, p_size); conn->params.private_data = conn->p_data; conn->params.private_data_len = p_size; } /* copy in remote address, need a copy for retry attempts */ dapl_os_memcpy(&conn->r_addr, r_addr, sizeof(*r_addr)); /* Resolve remote address, src already bound during QP create */ ((struct sockaddr_in *)&conn->r_addr)->sin_port = SID_TO_PORT(r_qual); ((struct sockaddr_in *)&conn->r_addr)->sin_family = AF_INET; ret = rdma_resolve_addr(conn->cm_id, NULL, (struct sockaddr *)&conn->r_addr, conn->arp_timeout); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_connect: rdma_resolve_addr ERR 0x%x %s\n", ret, strerror(errno)); return dapl_convert_errno(errno, "rdma_resolve_addr"); } dapl_dbg_log(DAPL_DBG_TYPE_CM, " connect: resolve_addr: cm_id %p -> %s port %d\n", conn->cm_id, inet_ntoa(((struct sockaddr_in *)&conn->r_addr)->sin_addr), ((struct sockaddr_in *)&conn->r_addr)->sin_port); return DAT_SUCCESS; } /* * dapls_ib_disconnect * * Disconnect an EP * * Input: * ep_handle, * disconnect_flags * * Output: * none * * Returns: * DAT_SUCCESS * */ DAT_RETURN dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags) { struct dapl_cm_id *conn = dapl_get_cm_from_ep(ep_ptr); int drep_time = 25; dapl_dbg_log(DAPL_DBG_TYPE_CM, " disconnect(ep %p, conn %p, id %d flags %x)\n", ep_ptr, conn, (conn ? conn->cm_id : 0), close_flags); if ((conn == NULL) || (conn->cm_id == NULL)) return DAT_SUCCESS; /* no graceful half-pipe disconnect option */ rdma_disconnect(conn->cm_id); /* ABRUPT close, wait for callback and DISCONNECTED state */ if (close_flags == DAT_CLOSE_ABRUPT_FLAG) { DAPL_EVD *evd = NULL; DAT_EVENT_NUMBER num = DAT_CONNECTION_EVENT_DISCONNECTED; dapl_os_lock(&ep_ptr->header.lock); /* limit DREP waiting, other side could be down */ while (--drep_time && ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) { dapl_os_unlock(&ep_ptr->header.lock); dapl_os_sleep_usec(10000); dapl_os_lock(&ep_ptr->header.lock); } if (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " WARNING: disconnect(ep %p, conn %p, id %d) timed out\n", ep_ptr, conn, (conn ? conn->cm_id : 0)); ep_ptr->param.ep_state = DAT_EP_STATE_DISCONNECTED; evd = (DAPL_EVD *)ep_ptr->param.connect_evd_handle; } dapl_os_unlock(&ep_ptr->header.lock); if (evd) { dapl_sp_remove_ep(ep_ptr); dapls_evd_post_connection_event(evd, num, ep_ptr, 0, 0); } } /* * DAT event notification occurs from the callback * Note: will fire even if DREQ goes unanswered on timeout */ return DAT_SUCCESS; } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. * * Input: * ep_ptr DAPL_EP * active Indicates active side of connection * * Output: * none * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { /* nothing to do */ } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * DAT_CONN_QUAL_UNAVAILBLE * DAT_CONN_QUAL_IN_USE * */ DAT_RETURN dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr, IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr) { DAT_RETURN dat_status = DAT_SUCCESS; ib_cm_srvc_handle_t conn; DAT_SOCK_ADDR6 addr; /* local binding address */ /* Allocate CM and initialize lock */ if ((conn = dapl_os_alloc(sizeof(*conn))) == NULL) return DAT_INSUFFICIENT_RESOURCES; dapl_os_memzero(conn, sizeof(*conn)); dapl_os_lock_init(&conn->lock); dapls_cm_acquire(conn); /* create CM_ID, bind to local device, create QP */ if (rdma_create_id(g_cm_events, &conn->cm_id, (void *)conn, RDMA_PS_TCP)) { dapls_cm_release(conn); return (dapl_convert_errno(errno, "rdma_create_id")); } /* open identifies the local device; per DAT specification */ /* Get family and address then set port to consumer's ServiceID */ dapl_os_memcpy(&addr, &ia_ptr->hca_ptr->hca_address, sizeof(addr)); addr.sin6_port = SID_TO_PORT(ServiceID); if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&addr)) { if ((errno == EBUSY) || (errno == EADDRINUSE) || (errno == EADDRNOTAVAIL)) dat_status = DAT_CONN_QUAL_IN_USE; else dat_status = dapl_convert_errno(errno, "rdma_bind_addr"); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " listen(ia_ptr %p SID 0x%llx Port %d sp %p conn %p id %d)\n", ia_ptr, ServiceID, ntohs(SID_TO_PORT(ServiceID)), sp_ptr, conn, conn->cm_id); sp_ptr->cm_srvc_handle = conn; conn->sp = sp_ptr; conn->hca = ia_ptr->hca_ptr; dapl_dbg_log(DAPL_DBG_TYPE_EP, " listen(conn=%p cm_id=%d)\n", sp_ptr->cm_srvc_handle, conn->cm_id); if (rdma_listen(conn->cm_id, 0)) { /* max cma backlog */ if ((errno == EBUSY) || (errno == EADDRINUSE) || (errno == EADDRNOTAVAIL)) dat_status = DAT_CONN_QUAL_IN_USE; else dat_status = dapl_convert_errno(errno, "rdma_listen"); goto bail; } /* success */ return DAT_SUCCESS; bail: rdma_destroy_id(conn->cm_id); dapls_cm_release(conn); return dat_status; } /* * dapl_ib_remove_conn_listener * * Have the CM remove a connection listener. * * Input: * ia_handle IA handle * ServiceID IB Channel Service ID * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr) { ib_cm_srvc_handle_t conn = sp_ptr->cm_srvc_handle; dapl_dbg_log(DAPL_DBG_TYPE_CM, " remove_listen(ia_ptr %p sp_ptr %p conn %p)\n", ia_ptr, sp_ptr, conn); if (conn != IB_INVALID_HANDLE) { sp_ptr->cm_srvc_handle = NULL; if (conn->cm_id) { rdma_destroy_id(conn->cm_id); conn->cm_id = NULL; } dapls_cm_release(conn); } return DAT_SUCCESS; } /* * dapls_ib_accept_connection * * Perform necessary steps to accept a connection * * Input: * cr_handle * ep_handle * private_data_size * private_data * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT p_size, IN const DAT_PVOID p_data) { DAPL_CR *cr_ptr = (DAPL_CR *) cr_handle; DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle; DAPL_IA *ia_ptr = ep_ptr->header.owner_ia; struct dapl_cm_id *cr_conn = cr_ptr->ib_cm_handle; struct dapl_cm_id *ep_conn = dapl_get_cm_from_ep(ep_ptr); int ret; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_CM, " accept(cr %p conn %p, id %p, p_data %p, p_sz=%d)\n", cr_ptr, cr_conn, cr_conn->cm_id, p_data, p_size); /* Obtain size of private data structure & contents */ if (p_size > IB_MAX_REP_PDATA_SIZE) { dat_status = DAT_ERROR(DAT_LENGTH_ERROR, DAT_NO_SUBTYPE); goto bail; } if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) { /* * If we are lazy attaching the QP then we may need to * hook it up here. Typically, we run this code only for * DAT_PSP_PROVIDER_FLAG */ dat_status = dapls_ib_qp_alloc(ia_ptr, ep_ptr, NULL); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_accept: qp_alloc ERR %d\n", dat_status); goto bail; } } /* * Validate device and port in EP cm_id against inbound * CR cm_id. The pre-allocated EP cm_id is already bound to * a local device (cm_id and QP) when created. Move the QP * to the new cm_id only if device and port numbers match. */ if (ep_conn->cm_id->verbs == cr_conn->cm_id->verbs && ep_conn->cm_id->port_num == cr_conn->cm_id->port_num) { /* move QP to new cr_conn, remove QP ref in EP cm_id */ cr_conn->cm_id->qp = ep_conn->cm_id->qp; /* remove old CM to EP linking, destroy CM object */ dapl_ep_unlink_cm(ep_ptr, ep_conn); ep_conn->cm_id->qp = NULL; ep_conn->ep = NULL; rdma_destroy_id(ep_conn->cm_id); dapls_cm_release(ep_conn); /* add new CM to EP linking, qp_handle unchanged, !PSP !RSP */ if (!cr_conn->sp->ep_handle && !cr_conn->sp->psp_flags) dapl_ep_link_cm(ep_ptr, cr_conn); cr_conn->ep = ep_ptr; } else { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_cma_accept: ERR dev(%p!=%p) or" " port mismatch(%d!=%d)\n", ep_conn->cm_id->verbs, cr_conn->cm_id->verbs, ntohs(ep_conn->cm_id->port_num), ntohs(cr_conn->cm_id->port_num)); dat_status = DAT_INTERNAL_ERROR; goto bail; } cr_ptr->param.local_ep_handle = ep_handle; cr_conn->params.private_data = p_data; cr_conn->params.private_data_len = p_size; ret = rdma_accept(cr_conn->cm_id, &cr_conn->params); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " dapl_rdma_accept: ERR %d %s\n", ret, strerror(errno)); dat_status = dapl_convert_errno(errno, "accept"); /* remove new cr_conn EP to CM linking */ dapl_ep_unlink_cm(ep_ptr, cr_conn); goto bail; } /* setup local and remote ports for ep query */ /* Note: port qual in network order */ ep_ptr->param.remote_port_qual = PORT_TO_SID(rdma_get_dst_port(cr_conn->cm_id)); ep_ptr->param.local_port_qual = PORT_TO_SID(rdma_get_src_port(cr_conn->cm_id)); return DAT_SUCCESS; bail: rdma_reject(cr_conn->cm_id, NULL, 0); /* no EP linking, ok to destroy */ rdma_destroy_id(cr_conn->cm_id); dapls_cm_release(cr_conn); return dat_status; } /* * dapls_ib_reject_connection * * Reject a connection * * Input: * cr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_handle, IN int reason, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data) { int ret; int offset = sizeof(struct dapl_pdata_hdr); struct dapl_pdata_hdr pdata_hdr; memset(&pdata_hdr, 0, sizeof pdata_hdr); pdata_hdr.version = htonl((DAT_VERSION_MAJOR << 24) | (DAT_VERSION_MINOR << 16) | (VN_PROVIDER_MAJOR << 8) | (VN_PROVIDER_MINOR)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " reject: handle %p reason %x, ver=%x, data %p, sz=%d\n", cm_handle, reason, ntohl(pdata_hdr.version), private_data, private_data_size); if (cm_handle == IB_INVALID_HANDLE) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " reject: invalid handle: reason %d\n", reason); return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); } /* setup pdata_hdr and users data, in CR pdata buffer */ dapl_os_memcpy(cm_handle->p_data, &pdata_hdr, offset); if (private_data_size) dapl_os_memcpy(cm_handle->p_data + offset, private_data, private_data_size); /* * Always some private data with reject so active peer can * determine real application reject from an abnormal * application termination */ ret = rdma_reject(cm_handle->cm_id, cm_handle->p_data, offset + private_data_size); /* no EP linking, ok to destroy */ rdma_destroy_id(cm_handle->cm_id); dapls_cm_release(cm_handle); return dapl_convert_errno(ret, "reject"); } /* * dapls_ib_cm_remote_addr * * Obtain the remote IP address given a connection * * Input: * cr_handle * * Output: * remote_ia_address: where to place the remote address * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * */ DAT_RETURN dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * raddr) { DAPL_HEADER *header; dp_ib_cm_handle_t conn; struct rdma_addr *ipaddr; dapl_dbg_log(DAPL_DBG_TYPE_EP, " remote_addr(cm_handle=%p, r_addr=%p)\n", dat_handle, raddr); header = (DAPL_HEADER *) dat_handle; if (header->magic == DAPL_MAGIC_EP) conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle); else if (header->magic == DAPL_MAGIC_CR) conn = ((DAPL_CR *) dat_handle)->ib_cm_handle; else return DAT_INVALID_HANDLE; /* get remote IP address from cm_id route */ ipaddr = &conn->cm_id->route.addr; dapl_dbg_log(DAPL_DBG_TYPE_CM, " remote_addr: conn %p id %p SRC %x DST %x PORT %d\n", conn, conn->cm_id, ntohl(((struct sockaddr_in *) &ipaddr->src_addr)->sin_addr.s_addr), ntohl(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_addr.s_addr), ntohs(((struct sockaddr_in *) &ipaddr->dst_addr)->sin_port)); dapl_os_memcpy(raddr, &ipaddr->dst_addr, sizeof(DAT_SOCK_ADDR)); return DAT_SUCCESS; } /* * dapls_ib_private_data_size * * Return the size of max private data * * Input: * hca_ptr hca pointer, needed for transport type * * Output: * None * * Returns: * maximum private data rdma_cm will supply from transport. * */ int dapls_ib_private_data_size(IN DAPL_HCA * hca_ptr) { return IB_MAX_REQ_PDATA_SIZE; } void dapli_cma_event_cb(void) { struct rdma_cm_event *event; /* process one CM event, fairness, non-blocking */ if (!rdma_get_cm_event(g_cm_events, &event)) { struct dapl_cm_id *conn; /* set proper conn from cm_id context */ if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST) conn = (struct dapl_cm_id *)event->listen_id->context; else conn = (struct dapl_cm_id *)event->id->context; dapls_cm_acquire(conn); /* destroying cm_id, consumer thread blocking waiting for ACK */ if (conn->cm_id == NULL) { dapls_cm_release(conn); rdma_ack_cm_event(event); return; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " cm_event: EVENT=%d ID=%p LID=%p CTX=%p\n", event->event, event->id, event->listen_id, conn); switch (event->event) { case RDMA_CM_EVENT_ADDR_RESOLVED: dapli_addr_resolve(conn); break; case RDMA_CM_EVENT_ROUTE_RESOLVED: dapli_route_resolve(conn); break; case RDMA_CM_EVENT_ADDR_ERROR: dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cma_active: CM ADDR ERROR: ->" " DST %s retry (%d)..\n", inet_ntoa(((struct sockaddr_in *) &conn->r_addr)->sin_addr), conn->arp_retries); /* retry address resolution */ if ((--conn->arp_retries) && (event->status == -ETIMEDOUT)) { int ret; ret = rdma_resolve_addr(conn->cm_id, NULL, (struct sockaddr *) &conn->r_addr, conn->arp_timeout); if (!ret) break; else { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " ERROR: rdma_resolve_addr = " "%d %s\n", ret, strerror(errno)); } } /* retries exhausted or resolve_addr failed */ dapl_log(DAPL_DBG_TYPE_ERR, "dapl_cma_active: ARP_ERR, retries(%d)" " exhausted -> DST %s,%d\n", IB_ARP_RETRY_COUNT, inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)-> sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr.dst_addr)-> sin_port)); dapl_evd_connection_callback(conn, IB_CME_DESTINATION_UNREACHABLE, NULL, 0, conn->ep); break; case RDMA_CM_EVENT_ROUTE_ERROR: dapl_log(DAPL_DBG_TYPE_WARN, "dapl_cma_active: CM ROUTE ERROR: ->" " DST %s retry (%d)..\n", inet_ntoa(((struct sockaddr_in *) &conn->r_addr)->sin_addr), conn->route_retries); /* retry route resolution */ if ((--conn->route_retries) && (event->status == -ETIMEDOUT)) dapli_addr_resolve(conn); else { dapl_log(DAPL_DBG_TYPE_ERR, "dapl_cma_active: PATH_RECORD_ERR," " retries(%d) exhausted, DST %s,%d\n", IB_ROUTE_RETRY_COUNT, inet_ntoa(((struct sockaddr_in *) &conn->cm_id->route.addr. dst_addr)->sin_addr), ntohs(((struct sockaddr_in *) &conn->cm_id->route.addr. dst_addr)->sin_port)); dapl_evd_connection_callback(conn, IB_CME_DESTINATION_UNREACHABLE, NULL, 0, conn->ep); } break; case RDMA_CM_EVENT_DEVICE_REMOVAL: dapl_evd_connection_callback(conn, IB_CME_LOCAL_FAILURE, NULL, 0, conn->ep); break; case RDMA_CM_EVENT_CONNECT_REQUEST: case RDMA_CM_EVENT_CONNECT_ERROR: case RDMA_CM_EVENT_UNREACHABLE: case RDMA_CM_EVENT_REJECTED: case RDMA_CM_EVENT_ESTABLISHED: case RDMA_CM_EVENT_DISCONNECTED: /* passive or active */ if (conn->sp) dapli_cm_passive_cb(conn, event); else dapli_cm_active_cb(conn, event); break; case RDMA_CM_EVENT_CONNECT_RESPONSE: #ifdef RDMA_CM_EVENT_TIMEWAIT_EXIT case RDMA_CM_EVENT_TIMEWAIT_EXIT: #endif break; default: dapl_dbg_log(DAPL_DBG_TYPE_CM, " cm_event: UNEXPECTED EVENT=%p ID=%p CTX=%p\n", event->event, event->id, event->id->context); break; } /* ack event, unblocks destroy_cm_id in consumer threads */ rdma_ack_cm_event(event); dapls_cm_release(conn); } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/openib_cma/dapl_ib_util.h000077500000000000000000000115711255317474200202750ustar00rootroot00000000000000/* * Copyright (c) 2005-2009 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /* * Definitions specific to OpenIB CMA provider. * Connection manager - rdma_cma, provided in separate library. */ #ifndef _DAPL_IB_UTIL_H_ #define _DAPL_IB_UTIL_H_ #define _OPENIB_CMA_ #include #include "openib_osd.h" #include "dapl_ib_common.h" #define IB_RC_RETRY_COUNT 7 #define IB_RNR_RETRY_COUNT 7 #define IB_CM_RESPONSE_TIMEOUT 23 /* 16 sec */ #define IB_CM_RETRIES 15 /* 240 sec total default */ #define IB_ARP_TIMEOUT 4000 /* 4 sec */ #define IB_ARP_RETRY_COUNT 15 /* 60 sec total */ #define IB_ROUTE_TIMEOUT 4000 /* 4 sec */ #define IB_ROUTE_RETRY_COUNT 15 /* 60 sec total */ #define IB_MAX_AT_RETRY 3 /* CMA private data areas, use CMA max with known transport definitions */ #ifndef RDMA_MAX_PRIVATE_DATA #if defined(_WIN64) || defined(_WIN32) #define RDMA_MAX_PRIVATE_DATA 64 #else #define RDMA_MAX_PRIVATE_DATA 256 #endif #endif #define CMA_PDATA_HDR 36 #define IB_MAX_REQ_PDATA_SIZE DAPL_MIN((92-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) #define IB_MAX_REP_PDATA_SIZE DAPL_MIN((196-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) #define IB_MAX_REJ_PDATA_SIZE DAPL_MIN((148-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) #define IB_MAX_DREQ_PDATA_SIZE DAPL_MIN((220-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) #define IB_MAX_DREP_PDATA_SIZE DAPL_MIN((224-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) #define IWARP_MAX_PDATA_SIZE DAPL_MIN((512-CMA_PDATA_HDR),RDMA_MAX_PRIVATE_DATA) /* DAPL CM objects MUST include list_entry, ref_count, event for EP linking */ struct dapl_cm_id { struct dapl_llist_entry list_entry; struct dapl_llist_entry local_entry; DAPL_OS_WAIT_OBJECT event; DAPL_OS_LOCK lock; int ref_count; int arp_retries; int arp_timeout; int route_retries; int route_timeout; struct rdma_cm_id *cm_id; struct dapl_hca *hca; struct dapl_sp *sp; struct dapl_ep *ep; struct rdma_conn_param params; DAT_SOCK_ADDR6 r_addr; int p_len; unsigned char p_data[256]; /* dapl max private data size */ ib_cm_msg_t dst; struct ibv_ah *ah; }; typedef struct dapl_cm_id *dp_ib_cm_handle_t; typedef struct dapl_cm_id *ib_cm_srvc_handle_t; /* ib_hca_transport_t, specific to this implementation */ typedef struct _ib_hca_transport { struct dapl_llist_entry entry; int destroy; struct rdma_cm_id *cm_id; struct ibv_comp_channel *ib_cq; ib_cq_handle_t ib_cq_empty; ib_async_handler_t async_unafiliated; void *async_un_ctx; ib_async_cq_handler_t async_cq_error; ib_async_dto_handler_t async_cq; ib_async_qp_handler_t async_qp_error; uint8_t max_cm_timeout; uint8_t max_cm_retries; struct ibv_context *ib_ctx; struct ibv_device *ib_dev; /* dapls_modify_qp_state */ ib_cm_attr_t ib_cm; /* dev attr for QP and CM */ uint64_t guid; char guid_str[32]; ib_named_attr_t na; #ifdef DAT_IB_COLLECTIVES /* Collective member device and address information */ ib_thread_state_t coll_thread_state; DAPL_OS_THREAD coll_thread; DAPL_OS_LOCK coll_lock; DAPL_OS_WAIT_OBJECT coll_event; struct dapl_llist_entry *grp_list; user_progress_func_t *user_func; int l_sock; struct sockaddr_in m_addr; void *m_ctx; void *m_info; void *f_info; int m_size; int f_size; int t_id; #endif } ib_hca_transport_t; /* prototypes */ void dapli_thread(void *arg); DAT_RETURN dapli_ib_thread_init(void); void dapli_ib_thread_destroy(void); void dapli_cma_event_cb(void); void dapli_async_event_cb(struct _ib_hca_transport *tp); void dapli_cq_event_cb(struct _ib_hca_transport *tp); dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep); void dapls_cm_acquire(dp_ib_cm_handle_t cm); void dapls_cm_release(dp_ib_cm_handle_t cm); void dapls_cm_free(dp_ib_cm_handle_t cm_ptr); DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr); #ifdef DAPL_COUNTERS STATIC _INLINE_ void dapls_print_cm_list(IN DAPL_IA * ia_ptr) { return; } #endif #endif /* _DAPL_IB_UTIL_H_ */ dapl-2.1.5/dapl/openib_cma/device.c000066400000000000000000000456041255317474200171010ustar00rootroot00000000000000/* * Copyright (c) 2005-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_ib_util.c * * PURPOSE: OFED provider - init, open, close, utilities, work thread * * $Id:$ * **********************************************************************/ #ifdef RCSID static const char rcsid[] = "$Id: $"; #endif #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_osd.h" #include #ifdef DAT_IB_COLLECTIVES #include #endif struct rdma_event_channel *g_cm_events = NULL; ib_thread_state_t g_ib_thread_state = 0; DAPL_OS_THREAD g_ib_thread; DAPL_OS_LOCK g_hca_lock; struct dapl_llist_entry *g_hca_list; char gid_str[INET6_ADDRSTRLEN]; #if defined(_WIN64) || defined(_WIN32) #include static COMP_SET ufds; static int dapls_os_init(void) { return CompSetInit(&ufds); } static void dapls_os_release(void) { CompSetCleanup(&ufds); } static int dapls_config_cm_channel(struct rdma_event_channel *channel) { channel->channel.Milliseconds = 0; return 0; } static int dapls_config_verbs(struct ibv_context *verbs) { verbs->channel.Milliseconds = 0; return 0; } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { channel->comp_channel.Milliseconds = 0; return 0; } static int dapls_thread_signal(void) { CompSetCancel(&ufds); return 0; } #else // _WIN64 || WIN32 int g_ib_pipe[2]; static int dapls_os_init(void) { /* create pipe for waking up work thread */ return pipe(g_ib_pipe); } static void dapls_os_release(void) { if (g_ib_pipe[0]) close(g_ib_pipe[0]); if (g_ib_pipe[1]) close(g_ib_pipe[1]); } static int dapls_config_fd(int fd) { int opts; opts = fcntl(fd, F_GETFL); if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on fd %d ERR %d %s\n", fd, opts, strerror(errno)); return errno; } return 0; } static int dapls_config_cm_channel(struct rdma_event_channel *channel) { return dapls_config_fd(channel->fd); } static int dapls_config_verbs(struct ibv_context *verbs) { return dapls_config_fd(verbs->async_fd); } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { return dapls_config_fd(channel->fd); } static int dapls_thread_signal(void) { return write(g_ib_pipe[1], "w", sizeof "w"); } #endif /* Get IP address using netdev name, address, or hostname * * Verify hostname before getting IP address to avoid name service delays */ static int getipaddr(char *name, char *addr, int len) { struct addrinfo *res, hint; char hostname[128]; /* netdev for first attempt, then IP address, and finally by hostname */ if (getipaddr_netdev(name, addr, len)) { memset(&hint, 0, sizeof hint); hint.ai_flags = AI_NUMERICHOST; if (getaddrinfo(name, NULL, &hint, &res)) { if (!gethostname(hostname, sizeof(hostname)) && !strcmp(name, hostname)) { hint.ai_flags = AI_CANONNAME; if (getaddrinfo(name, NULL, &hint, &res)) goto err; } else goto err; } if (len >= res->ai_addrlen) memcpy(addr, res->ai_addr, res->ai_addrlen); else { freeaddrinfo(res); return 1; } freeaddrinfo(res); } dapl_dbg_log( DAPL_DBG_TYPE_UTIL, " getipaddr: family %d port %d addr %d.%d.%d.%d\n", ((struct sockaddr_in *)addr)->sin_family, ((struct sockaddr_in *)addr)->sin_port, ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 0 & 0xff, ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 8 & 0xff, ((struct sockaddr_in *)addr)->sin_addr.s_addr >> 16 & 0xff, ((struct sockaddr_in *)addr)->sin_addr. s_addr >> 24 & 0xff); return 0; err: dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: getaddr_netdev ERROR:%s. Is %s configured?\n", strerror(errno), name); return 1; } /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ DAT_UINT32 g_parent = 0; int32_t dapls_ib_init(void) { g_parent = dapl_os_getpid(); /* initialize hca_list lock */ dapl_os_lock_init(&g_hca_lock); /* initialize hca list for CQ events */ dapl_llist_init_head(&g_hca_list); if (dapls_os_init()) return 1; return 0; } int32_t dapls_ib_release(void) { /* only parent will cleanup */ if (dapl_os_getpid() != g_parent) return 0; dapli_ib_thread_destroy(); if (g_cm_events != NULL) rdma_destroy_event_channel(g_cm_events); dapls_os_release(); return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr, IN DAPL_OPEN_FLAGS flags) { struct rdma_cm_id *cm_id = NULL; int ret; DAT_RETURN dat_status = DAT_SUCCESS; dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":"STD MODE"); /* HCA name will be hostname or IP address */ if (getipaddr((char *)hca_name, (char *)&hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6))) return DAT_INVALID_ADDRESS; if (flags & DAPL_OPEN_QUERY) { dapl_log(DAPL_DBG_TYPE_WARN, " WARNING! open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":""); goto done; } /* Setup the global cm event channel */ dapl_os_lock(&g_hca_lock); if (g_cm_events == NULL) { g_cm_events = rdma_create_event_channel(); if (g_cm_events == NULL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " open_hca: ERR - RDMA channel %s\n", strerror(errno)); dapl_os_unlock(&g_hca_lock); return DAT_INTERNAL_ERROR; } } dapl_os_unlock(&g_hca_lock); /* cm_id will bind local device/GID based on IP address */ if (rdma_create_id(g_cm_events, &cm_id, (void *)hca_ptr, RDMA_PS_TCP)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: rdma_create ERR %s\n", strerror(errno)); return DAT_INTERNAL_ERROR; } ret = rdma_bind_addr(cm_id, (struct sockaddr *)&hca_ptr->hca_address); if ((ret) || (cm_id->verbs == NULL)) { rdma_destroy_id(cm_id); dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: rdma_bind ERR %s." " Is %s configured as IPoIB?\n", strerror(errno), hca_name); return DAT_INVALID_ADDRESS; } /* keep reference to IB device and cm_id */ hca_ptr->ib_trans.cm_id = cm_id; hca_ptr->ib_hca_handle = cm_id->verbs; dapls_config_verbs(cm_id->verbs); hca_ptr->port_num = cm_id->port_num; hca_ptr->ib_trans.ib_dev = cm_id->verbs->device; hca_ptr->ib_trans.ib_ctx = cm_id->verbs; /* support for EVD's with CNO's: one channel via thread */ hca_ptr->ib_trans.ib_cq = ibv_create_comp_channel(hca_ptr->ib_hca_handle); if (hca_ptr->ib_trans.ib_cq == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_create_comp_channel ERR %s\n", strerror(errno)); rdma_destroy_id(cm_id); return DAT_INTERNAL_ERROR; } if (dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq)) { rdma_destroy_id(cm_id); return DAT_INTERNAL_ERROR; } /* set inline max with env or default, get local lid and gid 0 */ if (dapl_ib_inline_data(hca_ptr->ib_hca_handle)) { if (hca_ptr->ib_hca_handle->device->transport_type == IBV_TRANSPORT_IWARP) hca_ptr->ib_trans.ib_cm.max_inline = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_IWARP_DEFAULT); else hca_ptr->ib_trans.ib_cm.max_inline = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_IB_DEFAULT); } /* set CM timer defaults */ hca_ptr->ib_trans.max_cm_timeout = dapl_os_get_env_val("DAPL_MAX_CM_RESPONSE_TIME", IB_CM_RESPONSE_TIMEOUT); hca_ptr->ib_trans.max_cm_retries = dapl_os_get_env_val("DAPL_MAX_CM_RETRIES", IB_CM_RETRIES); dat_status = dapli_ib_thread_init(); if (dat_status != DAT_SUCCESS) return dat_status; /* * Put new hca_transport on list for async and CQ event processing * Wakeup work thread to add to polling list */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *) &hca_ptr->ib_trans.entry); dapl_os_lock(&g_hca_lock); dapl_llist_add_tail(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca_ptr->ib_trans.entry, &hca_ptr->ib_trans.entry); if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: thread wakeup error = %s\n", strerror(errno)); dapl_os_unlock(&g_hca_lock); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "%s open: dev %s port %d, GID %s, IP %s\n", PROVIDER_NAME, hca_name, hca_ptr->port_num, inet_ntop(AF_INET6, &cm_id->route.addr.addr.ibaddr.sgid, gid_str, sizeof(gid_str)), inet_ntoa(((struct sockaddr_in *) &hca_ptr->hca_address)->sin_addr)); #ifdef DAT_IB_COLLECTIVES if (dapli_create_collective_service(hca_ptr)) return DAT_INTERNAL_ERROR; #endif done: /* set default IB MTU */ hca_ptr->ib_trans.ib_cm.mtu = dapl_ib_mtu(2048); return DAT_SUCCESS; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p->%p\n", hca_ptr, hca_ptr->ib_hca_handle); if (!g_ib_thread_state) /* thread never started */ goto bail; #ifdef DAT_IB_COLLECTIVES dapli_free_collective_service(hca_ptr); #endif dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_RUN) { dapl_os_unlock(&g_hca_lock); goto bail; } dapl_os_unlock(&g_hca_lock); /* If HCA is on active hca list * Remove hca from async event processing list * Wakeup work thread to remove from polling list */ if (hca_ptr->ib_trans.entry.list_head == &g_hca_list) { hca_ptr->ib_trans.destroy = 1; if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: wait on hca %p destroy\n"); dapl_os_sleep_usec(1000); } } bail: if (hca_ptr->ib_trans.ib_cq) ibv_destroy_comp_channel(hca_ptr->ib_trans.ib_cq); if (hca_ptr->ib_trans.ib_cq_empty) { struct ibv_comp_channel *channel; channel = hca_ptr->ib_trans.ib_cq_empty->cq->channel; ibv_destroy_cq(hca_ptr->ib_trans.ib_cq_empty->cq); ibv_destroy_comp_channel(channel); } if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (rdma_destroy_id(hca_ptr->ib_trans.cm_id)) return (dapl_convert_errno(errno, "ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } return (DAT_SUCCESS); } DAT_RETURN dapli_ib_thread_init(void) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init(%d)\n", dapl_os_getpid()); dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_INIT) { dapl_os_unlock(&g_hca_lock); return DAT_SUCCESS; } /* uCMA events non-blocking */ if (dapls_config_cm_channel(g_cm_events)) { dapl_os_unlock(&g_hca_lock); return (dapl_convert_errno(errno, "create_thread ERR: cm_fd")); } g_ib_thread_state = IB_THREAD_CREATE; dapl_os_unlock(&g_hca_lock); /* create thread to process inbound connect request */ dat_status = dapl_os_thread_create(dapli_thread, NULL, &g_ib_thread); if (dat_status != DAT_SUCCESS) return (dapl_convert_errno(errno, "create_thread ERR:" " check resource limits")); /* wait for thread to start */ dapl_os_lock(&g_hca_lock); while (g_ib_thread_state != IB_THREAD_RUN) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init: waiting for ib_thread\n"); dapl_os_unlock(&g_hca_lock); dapl_os_sleep_usec(1000); dapl_os_lock(&g_hca_lock); } dapl_os_unlock(&g_hca_lock); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init(%d) exit\n", dapl_os_getpid()); return DAT_SUCCESS; } void dapli_ib_thread_destroy(void) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d)\n", dapl_os_getpid()); /* * wait for async thread to terminate. * pthread_join would be the correct method * but some applications have some issues */ /* destroy ib_thread, wait for termination, if not already */ dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_RUN) goto bail; g_ib_thread_state = IB_THREAD_CANCEL; while ((g_ib_thread_state != IB_THREAD_EXIT)) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: waiting for ib_thread\n"); if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); dapl_os_unlock(&g_hca_lock); dapl_os_sleep_usec(2000); dapl_os_lock(&g_hca_lock); } bail: dapl_os_unlock(&g_hca_lock); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d) exit\n", dapl_os_getpid()); } #if defined(_WIN64) || defined(_WIN32) /* work thread for uAT, uCM, CQ, and async events */ void dapli_thread(void *arg) { struct _ib_hca_transport *hca; struct _ib_hca_transport *uhca[8]; COMP_CHANNEL *channel; int ret, idx, cnt; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d,0x%x): ENTER: \n", dapl_os_getpid(), g_ib_thread); dapl_os_lock(&g_hca_lock); for (g_ib_thread_state = IB_THREAD_RUN; g_ib_thread_state == IB_THREAD_RUN; dapl_os_lock(&g_hca_lock)) { CompSetZero(&ufds); CompSetAdd(&g_cm_events->channel, &ufds); idx = 0; hca = dapl_llist_is_empty(&g_hca_list) ? NULL : dapl_llist_peek_head(&g_hca_list); while (hca) { CompSetAdd(&hca->ib_ctx->channel, &ufds); CompSetAdd(&hca->ib_cq->comp_channel, &ufds); uhca[idx++] = hca; hca = dapl_llist_next_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca->entry); } cnt = idx; dapl_os_unlock(&g_hca_lock); ret = CompSetPoll(&ufds, INFINITE); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) poll_event 0x%x\n", dapl_os_getpid(), ret); dapli_cma_event_cb(); /* check and process ASYNC events, per device */ for (idx = 0; idx < cnt; idx++) { if (uhca[idx]->destroy == 1) { dapl_os_lock(&g_hca_lock); dapl_llist_remove_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &uhca[idx]->entry); dapl_os_unlock(&g_hca_lock); uhca[idx]->destroy = 2; } else { dapli_cq_event_cb(uhca[idx]); dapli_async_event_cb(uhca[idx]); } } } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) EXIT\n", dapl_os_getpid()); g_ib_thread_state = IB_THREAD_EXIT; dapl_os_unlock(&g_hca_lock); } #else // _WIN64 || WIN32 /* work thread for uAT, uCM, CQ, and async events */ void dapli_thread(void *arg) { struct pollfd ufds[__FD_SETSIZE]; struct _ib_hca_transport *uhca[__FD_SETSIZE] = { NULL }; struct _ib_hca_transport *hca; int ret, idx, fds; char rbuf[2]; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d,0x%x): ENTER: pipe %d ucma %d\n", dapl_os_getpid(), g_ib_thread, g_ib_pipe[0], g_cm_events->fd); /* Poll across pipe, CM, AT never changes */ dapl_os_lock(&g_hca_lock); g_ib_thread_state = IB_THREAD_RUN; ufds[0].fd = g_ib_pipe[0]; /* pipe */ ufds[0].events = POLLIN; ufds[1].fd = g_cm_events->fd; /* uCMA */ ufds[1].events = POLLIN; while (g_ib_thread_state == IB_THREAD_RUN) { /* build ufds after pipe and uCMA events */ ufds[0].revents = 0; ufds[1].revents = 0; idx = 1; /* Walk HCA list and setup async and CQ events */ if (!dapl_llist_is_empty(&g_hca_list)) hca = dapl_llist_peek_head(&g_hca_list); else hca = NULL; while (hca) { /* uASYNC events */ ufds[++idx].fd = hca->ib_ctx->async_fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; /* CQ events are non-direct with CNO's */ ufds[++idx].fd = hca->ib_cq->fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) poll_fd: hca[%d]=%p," " async=%d pipe=%d cm=%d \n", dapl_os_getpid(), hca, ufds[idx - 1].fd, ufds[0].fd, ufds[1].fd); hca = dapl_llist_next_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca->entry); } /* unlock, and setup poll */ fds = idx + 1; dapl_os_unlock(&g_hca_lock); ret = poll(ufds, fds, -1); if (ret <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d): ERR %s poll\n", dapl_os_getpid(), strerror(errno)); dapl_os_lock(&g_hca_lock); continue; } dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) poll_event: " " async=0x%x pipe=0x%x cm=0x%x \n", dapl_os_getpid(), ufds[idx].revents, ufds[0].revents, ufds[1].revents); /* uCMA events */ if (ufds[1].revents == POLLIN) dapli_cma_event_cb(); /* check and process CQ and ASYNC events, per device */ for (idx = 2; idx < fds; idx++) { if (ufds[idx].revents == POLLIN) { dapli_cq_event_cb(uhca[idx]); dapli_async_event_cb(uhca[idx]); } } /* check and process user events, PIPE */ if (ufds[0].revents == POLLIN) { if (read(g_ib_pipe[0], rbuf, 2) == -1) dapl_log(DAPL_DBG_TYPE_THREAD, " cr_thread: pipe rd err= %s\n", strerror(errno)); /* cleanup any device on list marked for destroy */ for (idx = 3; idx < fds; idx++) { if (uhca[idx] && uhca[idx]->destroy == 1) { dapl_os_lock(&g_hca_lock); dapl_llist_remove_entry( &g_hca_list, (DAPL_LLIST_ENTRY*) &uhca[idx]->entry); dapl_os_unlock(&g_hca_lock); uhca[idx]->destroy = 2; } } } dapl_os_lock(&g_hca_lock); } dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) EXIT\n", dapl_os_getpid()); g_ib_thread_state = IB_THREAD_EXIT; dapl_os_unlock(&g_hca_lock); } #endif dapl-2.1.5/dapl/openib_cma/linux/000077500000000000000000000000001255317474200166245ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_cma/linux/openib_osd.h000066400000000000000000000005031255317474200211140ustar00rootroot00000000000000#ifndef OPENIB_OSD_H #define OPENIB_OSD_H #include #include #include #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #endif // OPENIB_OSD_H dapl-2.1.5/dapl/openib_common/000077500000000000000000000000001255317474200162155ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_common/collectives/000077500000000000000000000000001255317474200205315ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_common/collectives/fca_provider.c000066400000000000000000001237011255317474200233440ustar00rootroot00000000000000/* * Copyright (c) 2011 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /* * Mellanox ConnectX-2 MPI collective offload support - FCA (Fabric Collective Agent) */ #include #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_evd_util.h" #include "dapl_cookie.h" #ifdef DAT_IB_COLLECTIVES #ifdef DAT_FCA_PROVIDER #include #include #define DAT_COLL_SID 0x2234 static char *fca_specfile = "/tmp/fca_spec.ini"; void *fca_lhandle = NULL; static struct grp_req { int id; int sockfd; struct grp_req *next; } *qhead = NULL, *qtail=NULL; static int grp_req_queue(int id, int sockfd) { struct grp_req *p; p = malloc(sizeof *p); if (p==NULL) return -ENOMEM; p->id = id; p->sockfd = sockfd; p->next = NULL; if (qtail) { qtail->next = p; qtail = p; } else qhead = qtail = p; return 0; } static int grp_req_dequeue(int id) { struct grp_req *p, *q; int sockfd = -1; p = qhead; q = NULL; while (p) { if (p->id == id) { sockfd = p->sockfd; if (q) q->next = p->next; else qhead = p->next; if (p == qtail) qtail = q; free(p); break; } q = p; p = p->next; } return sockfd; } static int fca_dtype( enum dat_ib_collective_data_type type ) { int fca_type; switch (type) { case DAT_IB_COLLECTIVE_TYPE_INT8: fca_type = FCA_DTYPE_CHAR; break; case DAT_IB_COLLECTIVE_TYPE_UINT8: fca_type = FCA_DTYPE_UNSIGNED_CHAR; break; case DAT_IB_COLLECTIVE_TYPE_INT16: fca_type = FCA_DTYPE_SHORT; break; case DAT_IB_COLLECTIVE_TYPE_UINT16: fca_type = FCA_DTYPE_UNSIGNED_SHORT; break; case DAT_IB_COLLECTIVE_TYPE_INT32: fca_type = FCA_DTYPE_INT; break; case DAT_IB_COLLECTIVE_TYPE_UINT32: fca_type = FCA_DTYPE_UNSIGNED; break; case DAT_IB_COLLECTIVE_TYPE_INT64: fca_type = FCA_DTYPE_LONG; break; case DAT_IB_COLLECTIVE_TYPE_UINT64: fca_type = FCA_DTYPE_UNSIGNED_LONG; break; case DAT_IB_COLLECTIVE_TYPE_FLOAT: fca_type = FCA_DTYPE_FLOAT; break; case DAT_IB_COLLECTIVE_TYPE_DOUBLE: fca_type = FCA_DTYPE_DOUBLE; break; case DAT_IB_COLLECTIVE_TYPE_LONG_DOUBLE: /* no mapping to 128-bit quadruple precision */ default: fca_type = FCA_DTYPE_LAST+1; /* unsupported */ break; } return fca_type; } static int fca_dsize( enum dat_ib_collective_data_type type ) { int type_size; switch (type) { case DAT_IB_COLLECTIVE_TYPE_INT8: case DAT_IB_COLLECTIVE_TYPE_UINT8: type_size = sizeof(uint8_t); break; case DAT_IB_COLLECTIVE_TYPE_INT16: case DAT_IB_COLLECTIVE_TYPE_UINT16: type_size = sizeof(uint16_t); break; case DAT_IB_COLLECTIVE_TYPE_INT32: case DAT_IB_COLLECTIVE_TYPE_UINT32: type_size = sizeof(uint32_t); break; case DAT_IB_COLLECTIVE_TYPE_INT64: case DAT_IB_COLLECTIVE_TYPE_UINT64: type_size = sizeof(uint64_t); break; case DAT_IB_COLLECTIVE_TYPE_FLOAT: type_size = sizeof(float); break; case DAT_IB_COLLECTIVE_TYPE_DOUBLE: type_size = sizeof(double); break; case DAT_IB_COLLECTIVE_TYPE_LONG_DOUBLE: type_size = sizeof(long double); break; default: type_size = 0; break; } return type_size; } static int fca_op( enum dat_ib_collective_reduce_data_op op ) { int fop = 0; switch (op) { case DAT_IB_COLLECTIVE_REDUCE_OP_MAX: fop = FCA_OP_MAX; break; case DAT_IB_COLLECTIVE_REDUCE_OP_MIN: fop = FCA_OP_MIN; break; case DAT_IB_COLLECTIVE_REDUCE_OP_SUM: fop = FCA_OP_SUM; break; case DAT_IB_COLLECTIVE_REDUCE_OP_PROD: fop = FCA_OP_PROD; break; case DAT_IB_COLLECTIVE_REDUCE_OP_LAND: fop = FCA_OP_LAND; break; case DAT_IB_COLLECTIVE_REDUCE_OP_BAND: fop = FCA_OP_BAND; break; case DAT_IB_COLLECTIVE_REDUCE_OP_LOR: fop = FCA_OP_LOR; break; case DAT_IB_COLLECTIVE_REDUCE_OP_BOR: fop = FCA_OP_BOR; break; case DAT_IB_COLLECTIVE_REDUCE_OP_LXOR: fop = FCA_OP_LXOR; break; case DAT_IB_COLLECTIVE_REDUCE_OP_BXOR: fop = FCA_OP_BXOR; break; case DAT_IB_COLLECTIVE_REDUCE_OP_MAXLOC:fop = FCA_OP_MAXLOC; break; case DAT_IB_COLLECTIVE_REDUCE_OP_MINLOC:fop = FCA_OP_MINLOC; break; } return fop; } /* Progress function for consumer * Will be called from FCA collective operation context * periodically if FCA blocks there for too long. * Don't call with scheduled non-blocking operations */ void my_progress(void *arg) { ib_hca_transport_t *tp = (ib_hca_transport_t *) arg; if ((tp->user_func) && (tp->t_id != dapl_os_gettid()) ) { dapl_log(DAPL_DBG_TYPE_THREAD, "calling progress_func(%p)\n",tp); (*tp->user_func)(); } } /* forward prototypes */ DAT_RETURN dapli_free_collective_member(IN DAT_IA_HANDLE ia, IN DAT_IB_COLLECTIVE_MEMBER member); /******************* Internal Collective Calls **************************/ static int create_service(struct dapl_hca *hca) { ib_hca_transport_t *tp = &hca->ib_trans; struct fca_init_spec *fca_spec; struct fca_context *ctx; FILE *fp; int ret; /* create an empty spec file if it does not exist */ fp = fopen(fca_specfile, "r"); if (fp==NULL) fp = fopen(fca_specfile, "w"); if (fp) fclose(fp); dapl_log(DAPL_DBG_TYPE_EXTENSION, "create_service: enter(%p)\n", tp); /* Read INI file into global structures before setting any spec */ fca_spec = fca_parse_spec_file(fca_specfile); if (fca_spec == NULL) return 1; dapl_log(DAPL_DBG_TYPE_EXTENSION, " fca_init_spec\n"); fca_spec->element_type = FCA_ELEMENT_RANK; fca_spec->job_id = 0; fca_spec->rank_id = 0; fca_spec->progress.func = my_progress; fca_spec->progress.arg = tp; if ((ret = fca_init(fca_spec, &ctx))) return 1; fca_free_init_spec(fca_spec); tp->m_ctx = ctx; return 0; } static int create_member(struct dapl_hca *hca) { ib_hca_transport_t *tp = &hca->ib_trans; int size, ret = EFAULT; unsigned short lport = DAT_COLL_SID; dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_member: tp=%p, ctx=%p\n", tp, tp->m_ctx); if (!tp->m_ctx) goto bail; /* FCA address information */ tp->f_info = fca_get_rank_info(tp->m_ctx, &size); if (!tp->f_info) { dapl_log(DAPL_DBG_TYPE_ERR, "create_member: fca_get_rank_info() ERR ret=%s ctx=%p\n", strerror(errno), tp->m_ctx); ret = errno; goto err; } tp->m_info = malloc(sizeof(DAT_SOCK_ADDR) + size); if (!tp->m_info) { dapl_log(DAPL_DBG_TYPE_ERR, "create_member: malloc() ERR ret=%s ctx=%p\n", strerror(errno), tp->m_ctx); fca_free_rank_info(tp->f_info); goto err; } dapl_os_memzero(tp->m_info, sizeof(DAT_SOCK_ADDR) + size); if ((tp->l_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, "create_member: socket() ERR ret=%s \n", strerror(errno)); ret = errno; goto err; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_member listen socket\n"); /* * only rank0 needs listen, but we don't know who is rank0 yet. * Everyone listen, start on seed port until find one unused */ memcpy((void*)&tp->m_addr, (void*)&hca->hca_address, sizeof(DAT_SOCK_ADDR)); do { tp->m_addr.sin_port = htons(lport++); ret = bind(tp->l_sock, (struct sockaddr *)&tp->m_addr, sizeof(DAT_SOCK_ADDR)); } while (ret == -1 && errno == EADDRINUSE); if (ret == -1) goto err; if ((ret = listen(tp->l_sock, 1024)) < 0) goto err; dapl_log(DAPL_DBG_TYPE_EXTENSION, "create_member: listen port 0x%x,%d \n", ntohs(tp->m_addr.sin_port), ntohs(tp->m_addr.sin_port)); /* local fca_info and sock_addr to member buffer for MPI exchange */ tp->f_size = size; tp->m_size = size + sizeof(DAT_SOCK_ADDR); memcpy(tp->m_info, tp->f_info, size); memcpy( ((char*)tp->m_info + size), &tp->m_addr, sizeof(DAT_SOCK_ADDR)); /* free rank info after getting */ fca_free_rank_info(tp->f_info); tp->f_info = NULL; dapl_log(DAPL_DBG_TYPE_EXTENSION, "create_member: m_ptr=%p, sz=%d exit SUCCESS\n", tp->m_info, tp->m_size); return 0; err: /* cleanup */ if (tp->f_info) { fca_free_rank_info(tp->f_info); tp->f_info = NULL; } if (tp->m_info) { free(tp->m_info); tp->m_info = NULL; } if (tp->l_sock > 0) close(tp->l_sock); bail: return 1; } static void create_group(struct coll_group *group) { int *conn = group->conn; int i, g_id, ret = 0; DAT_IB_EXTENSION_EVENT_DATA eventx; dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: group=%p, id=%d\n", group->self, group, group->id); /* group creation event */ eventx.status = DAT_IB_COLL_COMP_ERR; eventx.type = DAT_IB_COLLECTIVE_CREATE_DATA; eventx.coll.handle = NULL; eventx.coll.context = group->user_context; /* Create and distribute group info and close connections*/ if (group->self == 0) { /* accept and send all ranks comm_desc info */ for (i = 1; i < group->ranks; ) { /* check for queue'd group id request */ conn[i] = grp_req_dequeue(group->id); if (conn[i] < 0) { conn[i] = accept(group->tp->l_sock, NULL, NULL); if (conn[i] < 0) goto error; /* Validate ID from ranks, all ranks have comm_desc */ ret = recv(conn[i], &g_id, sizeof(g_id), 0); if ((ret < 0) || (ret != sizeof(g_id))) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp[0]: rcv g_id ERR:\n"); goto error; } /* no match, queue it for other response */ if (g_id != group->id) { dapl_log(DAPL_DBG_TYPE_WARN, " create_grp[0]:" " rcv g_id %d != g_id %d\n", g_id, group->id); grp_req_queue(g_id, conn[i]); continue; /* try conn[i] again */ } dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[0]: rcv g_id %d == g_id %d\n", g_id, group->id); } /* Group match, send back FCA comm_desc information */ ret = send(conn[i], &group->comm_desc, sizeof(group->comm_desc), 0); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp[0]: snd %d comm: ERR:\n", i); goto error; } i++; /* next rank */ } /* all have comm_desc, close all sockets */ for (i = 1; i < group->ranks; ++i) close(conn[i]); } else { /* first group addr_info entry is rank 0 */ dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: connect -> %s 0x%x \n", group->self, inet_ntoa(group->addr_info->sin_addr), ntohs(group->addr_info->sin_port)); group->sock = socket(AF_INET, SOCK_STREAM, 0); if (group->sock < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: socket() ERR: %s\n", strerror(errno)); goto error; } ret = connect(group->sock, (struct sockaddr *)group->addr_info, sizeof(*group->addr_info)); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: connect() ERR: %s\n", strerror(errno)); goto error; } /* send group ID to identify with multiple groups */ ret = send(group->sock, &group->id, sizeof(group->id), 0); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: snd() ERR: %s g_id=\n", strerror(errno), group->id); goto error; } /* recv FCA comm_desc for this group ID */ ret = recv(group->sock, &group->comm_desc, sizeof(group->comm_desc), 0); if ((ret < 0) || (ret != sizeof(group->comm_desc))) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: recv() ERR: %s \n", strerror(errno)); goto error; } /* cleanup socket resources */ close(group->sock); group->sock = 0; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: fca_comm_init_spec() ranks=%d comm_id=0x%04x" " job_id=0x%lx m_type %d grp_id=%d\n", group->self, group->ranks, group->comm_desc.comm_id, group->comm_desc.job_id, group->comm_desc.comm_maddr.type, group->id); dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: fca_comm_init_spec() m_addr -> " "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x " "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", group->self,group->comm_desc.comm_maddr.data[0], group->comm_desc.comm_maddr.data[1], group->comm_desc.comm_maddr.data[2],group->comm_desc.comm_maddr.data[3], group->comm_desc.comm_maddr.data[4],group->comm_desc.comm_maddr.data[5], group->comm_desc.comm_maddr.data[6],group->comm_desc.comm_maddr.data[7], group->comm_desc.comm_maddr.data[8],group->comm_desc.comm_maddr.data[9], group->comm_desc.comm_maddr.data[10],group->comm_desc.comm_maddr.data[11], group->comm_desc.comm_maddr.data[12],group->comm_desc.comm_maddr.data[13], group->comm_desc.comm_maddr.data[14],group->comm_desc.comm_maddr.data[15], group->comm_desc.comm_maddr.data[16],group->comm_desc.comm_maddr.data[17], group->comm_desc.comm_maddr.data[18],group->comm_desc.comm_maddr.data[19], group->comm_desc.comm_maddr.data[20],group->comm_desc.comm_maddr.data[21], group->comm_desc.comm_maddr.data[22],group->comm_desc.comm_maddr.data[23], group->comm_desc.comm_maddr.data[24],group->comm_desc.comm_maddr.data[25], group->comm_desc.comm_maddr.data[26],group->comm_desc.comm_maddr.data[27], group->comm_desc.comm_maddr.data[28],group->comm_desc.comm_maddr.data[29], group->comm_desc.comm_maddr.data[30],group->comm_desc.comm_maddr.data[31]); /* init communicator, node p_idx and procs, total ranks, all ranks */ group->comm_init.desc = group->comm_desc; group->comm_init.rank = group->self; group->comm_init.size = group->ranks; group->comm_init.proc_idx = group->g_info.local_rank; group->comm_init.num_procs = group->g_info.local_size; dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: fca_comm_init() ranks=%d local_rank=%d, local_size%d\n", group->self, group->ranks, group->g_info.local_rank, group->g_info.local_size); if (fca_comm_init(group->ctx, &group->comm_init, &group->comm)) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: fca_comm_init() ERR: %s", strerror(errno)); goto error; } fca_comm_get_caps(group->comm, &group->comm_caps); eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; error: dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); if (eventx.status != DAT_OP_SUCCESS) dapli_free_collective_group((DAT_IB_COLLECTIVE_HANDLE)group); return; } /* worker thread to support non-blocking group creations and operations */ static void coll_thread(void *arg) { struct coll_group *grp, *next; struct dapl_hca *hca = (struct dapl_hca*)arg; ib_hca_transport_t *tp = &hca->ib_trans; dapl_os_lock(&tp->coll_lock); tp->coll_thread_state = IB_THREAD_RUN; tp->t_id = dapl_os_gettid(); if (create_service(hca)) goto err; if (create_member(hca)) goto err; while (tp->coll_thread_state == IB_THREAD_RUN) { dapl_os_unlock(&tp->coll_lock); dapl_os_wait_object_wait(&tp->coll_event, DAT_TIMEOUT_INFINITE); if (!dapl_llist_is_empty(&tp->grp_list)) next = dapl_llist_peek_head(&tp->grp_list); else next = NULL; while (next) { grp = next; create_group(grp); next = dapl_llist_next_entry(&tp->grp_list, (DAPL_LLIST_ENTRY *) &grp->list_entry); dapl_llist_remove_entry(&tp->grp_list, (DAPL_LLIST_ENTRY *) &grp->list_entry); } dapl_os_lock(&tp->coll_lock); } err: tp->coll_thread_state = IB_THREAD_EXIT; dapl_os_unlock(&tp->coll_lock); } static DAT_RETURN coll_thread_init(struct dapl_hca *hca) { DAT_RETURN dat_status; ib_hca_transport_t *tp = &hca->ib_trans; dapl_os_lock(&tp->coll_lock); if (tp->coll_thread_state != IB_THREAD_INIT) { dapl_os_unlock(&tp->coll_lock); return DAT_SUCCESS; } tp->coll_thread_state = IB_THREAD_CREATE; dapl_os_unlock(&tp->coll_lock); /* thread to process group comm creation */ dat_status = dapl_os_thread_create(coll_thread, (void*)hca, &tp->coll_thread); if (dat_status != DAT_SUCCESS) return (dapl_convert_errno(errno, "create_coll_thread ERR:" " check resource limits")); /* wait for thread to start */ dapl_os_lock(&tp->coll_lock); while (tp->coll_thread_state != IB_THREAD_RUN) { dapl_os_unlock(&tp->coll_lock); dapl_os_sleep_usec(2000); dapl_os_lock(&tp->coll_lock); } dapl_os_unlock(&tp->coll_lock); return DAT_SUCCESS; } static void coll_thread_destroy(struct dapl_hca *hca) { ib_hca_transport_t *tp = &hca->ib_trans; dapl_os_lock(&tp->coll_lock); if (tp->coll_thread_state != IB_THREAD_RUN) goto bail; tp->coll_thread_state = IB_THREAD_CANCEL; while (tp->coll_thread_state != IB_THREAD_EXIT) { dapl_os_wait_object_wakeup(&tp->coll_event); dapl_os_unlock(&tp->coll_lock); dapl_os_sleep_usec(2000); dapl_os_lock(&tp->coll_lock); } bail: dapl_os_unlock(&tp->coll_lock); } /******************* External Collective Calls **************************/ /* Create context for FCA, get adapter and port from hca_ptr */ int dapli_create_collective_service(IN struct dapl_hca *hca) { ib_hca_transport_t *tp = &hca->ib_trans; dapl_os_lock_init(&tp->coll_lock); dapl_llist_init_head(&tp->grp_list); dapl_os_wait_object_init(&tp->coll_event); /* non-blocking, FCA calls in work thread */ if (coll_thread_init(hca)) return 1; return 0; } void dapli_free_collective_service(IN struct dapl_hca *hca) { ib_hca_transport_t *tp = &hca->ib_trans; if (tp->m_ctx) { fca_cleanup(tp->m_ctx); tp->m_ctx = NULL; } coll_thread_destroy(hca); dapl_os_wait_object_destroy(&tp->coll_event); } DAT_RETURN dapli_create_collective_member( IN DAT_IA_HANDLE ia, IN void *progress_func, OUT DAT_COUNT *member_size, OUT DAT_IB_COLLECTIVE_MEMBER *member ) { struct dapl_hca *hca = ((DAPL_IA*)ia)->hca_ptr; ib_hca_transport_t *tp = &hca->ib_trans; dapl_log(DAPL_DBG_TYPE_EXTENSION, "create_member: hca=%p, psz=%p pmem=%p tp=%p, ctx=%p\n", hca, member_size, member, tp, tp->m_ctx); if (!tp->m_ctx) return DAT_INVALID_PARAMETER; /* copy out member info, initialized in create_service */ *member_size = tp->m_size; *member = tp->m_info; /* set the progress function, called during long offload delays */ tp->user_func = progress_func; return DAT_SUCCESS; } DAT_RETURN dapli_free_collective_member( IN DAT_IA_HANDLE ia, IN DAT_IB_COLLECTIVE_MEMBER member ) { struct dapl_hca *hca = ((DAPL_IA*)ia)->hca_ptr; ib_hca_transport_t *tp = &hca->ib_trans; dapl_log(DAPL_DBG_TYPE_EXTENSION, "free_member: enter hca=%p, member=%p \n", hca, member); if ((member == NULL) || (member != tp->m_info)) return DAT_INVALID_PARAMETER; /* release FCA info */ if (tp->f_info) { fca_free_rank_info(tp->f_info); tp->f_info = NULL; } /* free member buffer */ if (tp->m_info) { free(tp->m_info); tp->m_info = NULL; } if (tp->l_sock > 0) close(tp->l_sock); return DAT_SUCCESS; } /* * This asynchronous call initiates the process of creating a collective * group and must be called by all group members. The collective_group * argument points to an array of address/connection qualifier pairs that * identify the members of the group in rank order. The group_size argument * specifies the size of the group and therefore the size of the coll_group * array. The self argument identifies the rank of the caller. * The group_id argument specifies a network-unique identifier for this * instance of the collective group. All members of the group must specify * the same group_id value for the same collective instance. The evd_handle * argument specifies the EVD used for all asynchronous collective completions * including this call. The user_context argument will be returned in the * DAT_EXT_COLLECTIVE_CREATE_DATA event. * * On a successful completion, each group member will receive a * DAT_EXT_COLLECTIVE_CREATE_DATA event on the EVD specified by evd_handle. * The event contains the collective handle, the rank of the receiving * endpoint within the collective group, the size of the group, and the * caller specified user_context. The returned collective handle can be used * in network clock, multicast, and other collective operations. * * Multiple collective groups can be defined and an endpoint may belong * to more than one collective group. */ DAT_RETURN dapli_create_collective_group( IN DAT_EVD_HANDLE evd_handle, IN DAT_PZ_HANDLE pz, IN DAT_IB_COLLECTIVE_MEMBER *members, IN DAT_COUNT ranks, IN DAT_IB_COLLECTIVE_RANK self, IN DAT_IB_COLLECTIVE_ID id, IN DAT_IB_COLLECTIVE_GROUP *g_info, IN DAT_CONTEXT user_ctx) { DAPL_EVD *evd = (DAPL_EVD*)evd_handle; DAPL_IA *ia; ib_hca_transport_t *tp; struct coll_group *group; DAT_RETURN dat_status; int i; dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: enter evd=%p cq=%p pz=%p " "m=%p *m=%p t_ranks=%d g_id=%d l_idx=%d l_ranks=%d\n", self, evd, evd->ib_cq_handle, pz, members, *members, ranks, id, g_info->local_rank, g_info->local_size); /* Validate EVD handle, extended flag MUST be set */ if (DAPL_BAD_HANDLE(evd, DAPL_MAGIC_EVD) || DAPL_BAD_HANDLE(pz, DAPL_MAGIC_PZ)) return(dapl_convert_errno(EINVAL, " coll_grp")); ia = (DAPL_IA*)evd->header.owner_ia; tp = &ia->hca_ptr->ib_trans; /* Allocate group object */ group = (struct coll_group *)dapl_os_alloc(sizeof(*group)); if (!group) return(dapl_convert_errno(ENOMEM," create_grp")); dapl_os_memzero(group, sizeof(*group)); /* Initialize the header and save group info, COLLECTIVE handle */ group->header.provider = ia->header.provider; group->header.handle_type = DAT_IB_HANDLE_TYPE_COLLECTIVE; group->header.magic = DAPL_MAGIC_COLL; group->header.owner_ia = ia; group->user_context = user_ctx; group->evd = (DAPL_EVD*)evd; group->pz = (DAPL_PZ*)pz; group->ranks = ranks; group->id = id; group->self = self; group->ctx = tp->m_ctx; group->tp = tp; /* Rank0 connected sockets for group, to exchange information */ if (self == 0) { group->conn = (int *)dapl_os_alloc(ranks * sizeof(*group->conn)); if (group->conn == NULL) return(dapl_convert_errno(ENOMEM," create_grp connections")); dapl_os_memzero(group->conn, ranks * sizeof(*group->conn)); } /* need FCA information in array for new comm group call */ group->fca_info = dapl_os_alloc(ranks * tp->f_size); if (!group->fca_info ) { dapl_os_free(group, sizeof(struct coll_group)); return(dapl_convert_errno(ENOMEM," create_grp fca_info")); } dapl_os_memzero(group->fca_info, ranks * tp->f_size); /* need FCA information in array for new comm group call */ group->addr_info = (struct sockaddr_in*)dapl_os_alloc(ranks * sizeof(struct sockaddr_in)); if (!group->addr_info) { dapl_os_free(group->fca_info, ranks * tp->f_size); dapl_os_free(group, sizeof(struct coll_group)); return(dapl_convert_errno(ENOMEM," create_grp fca_info")); } dapl_os_memzero(group->addr_info, ranks * sizeof(struct sockaddr_in)); /* Separate group member info into Address and FCA arrays */ for (i=0; ifca_info + (i * tp->f_size)), (void*) *(members + i), tp->f_size); memcpy((void*) ((char*)group->addr_info + (i * sizeof(struct sockaddr_in))), (void*) ((char*)(*(members + i)) + tp->f_size), sizeof(struct sockaddr_in)); } /* Intranode and Internode process layout info */ group->g_info = *g_info; if (group->self == 0) { /* rank 0 - create new communicator */ group->comm_new.rank_info = group->fca_info; group->comm_new.rank_count = group->ranks; group->comm_new.is_comm_world = 0; /* FIX */ dapl_log(DAPL_DBG_TYPE_EXTENSION, " create_grp[%d]: calling comm_new..\n", group->self); if (fca_comm_new(group->ctx, &group->comm_new, &group->comm_desc)) { dapl_log(DAPL_DBG_TYPE_ERR, " create_grp: fca_comm_new() ERR: %s", strerror(errno)); dat_status = dapl_convert_errno(errno, " fca_comm_new"); goto error; } } /* initialize all lists, events, etc */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&group->list_entry); dapl_llist_init_head(&group->op_free); dapl_llist_init_head(&group->op_pend); dapl_os_wait_object_init(&group->op_event); /* allocate object pool for non-blocking collective operations */ group->op_pool = (struct coll_op *)dapl_os_alloc(sizeof(struct coll_op) * COLL_OP_CNT); if (!group->op_pool) return(dapl_convert_errno(ENOMEM," create_grp")); dapl_os_memzero(group->op_pool, sizeof(*group)); /* non-blocking, schedule on work thread */ dapl_os_lock(&tp->coll_lock); dapl_llist_add_tail(&tp->grp_list, (DAPL_LLIST_ENTRY *)&group->list_entry, group); dapl_os_unlock(&tp->coll_lock); dapl_os_wait_object_wakeup(&tp->coll_event); return DAT_SUCCESS; error: /* clean up partial group */ dapli_free_collective_group((DAT_IB_COLLECTIVE_HANDLE)group); return(dat_status); }; /* * This synchronous call destroys a previously created collective group * associated with the collective_handle argument. Any pending or * in-process requests associated with the collective group will be * terminated and be posted to the appropriate EVD. */ DAT_RETURN dapli_free_collective_group( IN DAT_IB_COLLECTIVE_HANDLE coll_handle) { struct coll_group *group = (struct coll_group *)coll_handle; if (DAPL_BAD_HANDLE(coll_handle, DAPL_MAGIC_COLL)) return(dapl_convert_errno(EINVAL, " free_grp")); dapl_log(DAPL_DBG_TYPE_EXTENSION, " free_coll_group[%d]: pz=%p gp=%p complete!\n", group->self, group->pz, group ); /* reset magic and free memory */ group->header.magic = DAPL_MAGIC_INVALID; /* free client socket resources */ if (group->sock) close(group->sock); if (group->conn) dapl_os_free(group->conn, group->ranks * sizeof(*group->conn)); /* FCA and address info arrays */ if (group->fca_info) dapl_os_free(group->fca_info, group->ranks * group->tp->m_size); if (group->addr_info) dapl_os_free(group->addr_info, group->ranks * group->tp->m_size); fca_comm_destroy(group->comm); if (group->self == 0) fca_comm_end(group->ctx, group->comm_desc.comm_id); dapl_os_free(group, sizeof(struct coll_group)); return DAT_SUCCESS; }; /* * This call will synchronize all endpoints of the collective * group specified by coll_handle. This is an asynchronous call that * will post a completion to the collective EVD when all endpoints * have synchronized. */ DAT_RETURN dapli_collective_barrier( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_DTO_COOKIE user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; int ret; if (DAPL_BAD_HANDLE(coll_handle, DAPL_MAGIC_COLL)) return(dapl_convert_errno(EINVAL, " barrier")); dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_barrer: grp_hndl=%p u_ctx=%llx flgs=%d\n", coll_handle, user_context, comp_flags); ret = fca_do_barrier(group->comm); if (ret < 0) return(dapl_convert_errno(-ret, " fca_barrier")); /* setup and post successful barrier, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_BARRIER_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; }; /* * This call performs a broadcast send operation that transfers * data specified by the buffer argument of the root into the buffer argument * of all other endpoints in the collective group specified by coll_handle. * The operation is completed on the collective EVD unless completions are * suppressed through the completion flags. All broadcasts are considered * �in place� transfers. The tables below show the result of a broadcast * operation. */ DAT_RETURN dapli_collective_broadcast( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID buffer, IN DAT_COUNT byte_count, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; struct fca_bcast_spec bcast; int ret; if (DAPL_BAD_HANDLE(coll_handle, DAPL_MAGIC_COLL)) return(dapl_convert_errno(EINVAL, " fca_bcast")); dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_bcast[%d]: group=%p buf=%p size=%d root=%d" " ctxt=%llx flgs=%d\n", group->self, coll_handle, buffer, byte_count, root, user_context, comp_flags ); /* Run FCA BCAST, if */ bcast.root = root; bcast.buf = buffer; bcast.size = byte_count; ret = fca_do_bcast(group->comm, &bcast); if (ret < 0) return(dapl_convert_errno(-ret, " fca_bcast")); /* setup and post successful bcast, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_BROADCAST_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; }; DAT_RETURN dapli_collective_reduce( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; fca_reduce_spec_t reduce; int ret; dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_reduce[%d]: group=%p sbuf=%p slen=%d rbuf=%p rlen=%d" " root=%d op=%d type=%d ctxt=%llx cflgs=%d\n", group->self, coll_handle, snd_buf, snd_len, rcv_buf, rcv_len, root, op, type, user_context, comp_flags ); if (DAPL_BAD_HANDLE(coll_handle, DAPL_MAGIC_COLL)) return(dapl_convert_errno(EINVAL, " reduce")); reduce.root = root; reduce.sbuf = snd_buf; reduce.rbuf = rcv_buf; reduce.buf_size = snd_len; /* bytes */ reduce.dtype = fca_dtype(type); reduce.length = snd_len/fca_dsize(type); /* bytes to elements */ reduce.op = fca_op(op); if (group->self == root && snd_buf == NULL) /* MPI_IN_PLACE */ reduce.sbuf = rcv_buf; ret = fca_do_reduce(group->comm, &reduce); if (ret < 0) return(dapl_convert_errno(-ret, " fca_reduce")); /* setup and post successful reduce, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_REDUCE_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; } DAT_RETURN dapli_collective_allreduce( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; fca_reduce_spec_t reduce; int ret; dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_allreduce[%d]: group=%p sbuf=%p slen=%d,%d rbuf=%p rlen=%d" " op=%d type=%d ctxt=%llx cflgs=%d\n", group->self, coll_handle, snd_buf, snd_len, snd_len/fca_dsize(type), rcv_buf, rcv_len, op, type, user_context, comp_flags ); reduce.root = 0; /* ignored for allreduce */ reduce.sbuf = snd_buf; reduce.rbuf = rcv_buf; reduce.buf_size = snd_len; /* bytes */ reduce.dtype = fca_dtype(type); reduce.length = snd_len/fca_dsize(type); /* bytes to elements */ reduce.op = fca_op(op); if (snd_buf == NULL) /* MPI_IN_PLACE */ reduce.sbuf = rcv_buf; ret = fca_do_all_reduce(group->comm, &reduce); if (ret < 0) return(dapl_convert_errno(-ret, " fca_allreduce")); /* setup and post successful reduce, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_ALLREDUCE_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; } /* * This call performs a scatter of the data specified by the * send_buffer argument to the collective group specified by coll_handle. * Data is received in the buffer specified by the recv_buffer argument. * The recv_byte_count argument specifies the size of the receive buffer. * Data from the root send_buffer will be divided by the number of members * in the collective group to form equal and contiguous memory partitions. * Each member of the collective group will receive its rank relative * partition. An error is returned if the send_byte_count does not describe * memory that can be evenly divided by the size of the collective group. * An �in place� transfer for the root rank can be indicated by passing NULL * as the recv_buffer argument. The send_buffer and send_byte_count * arguments are ignored on non-root members. The operation is completed on * the collective EVD unless completions are suppressed through the * completion flags. */ DAT_RETURN dapli_collective_scatter( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } /* * This call performs a non-uniform scatter of the data * specified by the send_buffers array argument to the collective group * specified by coll_handle. The send_buffers array contains one buffer * pointer for each member of the collective group, in rank order. * The send_byte_counts array contains a byte count for each corresponding * send buffer pointer. The recv_buffer and recev_byte_count arguments * specify where received portions of the scatter are to be received. * An �in place� transfer for the root rank can be indicated by passing * NULL as the recv_buffer argument. The send_buffers and send_byte_counts * arguments are ignored on non-root members. The operation is completed * on the collective EVD unless completions are suppressed through the * completion flags. */ DAT_RETURN dapli_collective_scatterv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID *snd_bufs, IN DAT_COUNT *snd_lens, IN DAT_COUNT *displs, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } /* * This call performs a gather of the data sent by all * members of the collective specified by the collective_handle argument. * The data to be sent is specified by the send_buffer and send_byte_count * arguments. Data is received by the collective member specified by the * root argument in the buffer specified by the recv_buffer and * recv_byte_count arguments. Data is placed into the receive buffer in * collective rank order. An �in place� transfer for the root rank can * be indicated by passing NULL as the send_buffer argument. * The recv_buffer and recv_byte_count arguments are ignored on non-root * members. The operation is completed on the collective EVD unless * completions are suppressed through the completion flags. */ DAT_RETURN dapli_collective_gather( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } /* * This call performs a non-uniform gather of the data sent by * all members of the collective specified by the collective_handle argument. * The data to be sent is specified by the send_buffer and send_byte_count * arguments. Data is received by the collective member specified by the * root argument into the buffers specified by the recv_buffers and * recv_byte_counts array arguments. Data is placed into the receive buffer * associated with the rank that sent it. An �in place� transfer for the root * rank can be indicated by passing NULL as the send_buffer argument. * The recv_buffers and recv_byte_counts arguments are ignored on non-root * members. The operation is completed on the collective EVD unless * completions are suppressed through the completion flags. */ DAT_RETURN dapli_collective_gatherv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *displs, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } /* * This call is equivalent to having all members of a collective * group perform a dat_collective_gather() as the root. This results in all * members of the collective having identical contents in their receive buffer */ DAT_RETURN dapli_collective_allgather( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; fca_gather_spec_t gather; int ret; dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_allgather[%d]: group=%p sbuf=%p slen=%d rbuf=%p rlen=%d" " ctxt=%llx cflgs=%d\n", group->self, coll_handle, snd_buf, snd_len, rcv_buf, rcv_len, user_context, comp_flags ); gather.sbuf = snd_buf; gather.size = snd_len; gather.rbuf = rcv_buf; if (snd_buf == NULL) /* MPI_IN_PLACE */ gather.sbuf = rcv_buf + rcv_len * group->self; ret = fca_do_allgather(group->comm, &gather); if (ret < 0) return(dapl_convert_errno(-ret, " fca_allreduce")); /* setup and post successful reduce, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_ALLGATHER_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; } /* * This call performs a non-uniform dat_collective_allgather() * operation. It is equivalent to having all members of a collective group * perform a dat_collective_gatherv() as the root. This results in all * members of the collective having identical contents in their receive * buffer. */ DAT_RETURN dapli_collective_allgatherv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *displs, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { DAT_IB_EXTENSION_EVENT_DATA eventx; struct coll_group *group = (struct coll_group *)coll_handle; fca_gatherv_spec_t gatherv; int ret; dapl_log(DAPL_DBG_TYPE_EXTENSION, " coll_gather[%d]: group=%p sbuf=%p slen=%d rbufs=%p rlens=%p" " displs=%p ctxt=%llx cflgs=%d\n", group->self, coll_handle, snd_buf, snd_len, rcv_bufs, rcv_lens, displs, user_context, comp_flags ); gatherv.sbuf = snd_buf; gatherv.sendsize = snd_len; gatherv.rbuf = rcv_bufs; gatherv.recvsizes = rcv_lens; gatherv.displs = displs; if (snd_buf == NULL) /* MPI_IN_PLACE */ gatherv.sbuf = rcv_bufs + displs[group->self]; ret = fca_do_allgatherv(group->comm, &gatherv); if (ret < 0) return(dapl_convert_errno(-ret, " fca_allreduce")); /* setup and post successful reduce, make sync for now */ eventx.type = DAT_IB_COLLECTIVE_ALLGATHER_STATUS; eventx.status = DAT_OP_SUCCESS; eventx.coll.handle = group; eventx.coll.context = user_context; dapls_evd_post_event_ext(group->evd, DAT_IB_COLLECTIVE_EVENT, 0, (DAT_UINT64*)&eventx); return DAT_SUCCESS; } DAT_RETURN dapli_collective_alltoall( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } DAT_RETURN dapli_collective_alltoallv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID *snd_bufs, IN DAT_COUNT *snd_lens, IN DAT_COUNT *snd_displs, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *rcv_displs, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } DAT_RETURN dapli_collective_reduce_scatter( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT *rcv_lens, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } DAT_RETURN dapli_collective_scan( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags) { return DAT_NOT_IMPLEMENTED; } #endif /* DAT_FCA_PROVIDER */ #endif /* DAT_IB_COLLECTIVES */ dapl-2.1.5/dapl/openib_common/collectives/fca_provider.h000066400000000000000000000076301255317474200233530ustar00rootroot00000000000000/* * Copyright (c) 2011 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _FCA_PROVIDER_H_ #define _FCA_PROVIDER_H_ #include #include /* Collective Group Object */ struct coll_group { DAPL_HEADER header; /* collective type header, group lock */ DAT_CONTEXT user_context; /* user context for group */ struct dapl_llist_entry list_entry; /* group creation list for work thread */ /* Basic group information */ DAPL_EVD *evd; /* DAT consumer evd for group, COLL type */ DAPL_PZ *pz; /* DAT protection domain */ ib_hca_transport_t *tp; /* IA device transport object */ int id; /* group id */ int self; /* my rank index */ int ranks; /* nprocs in group */ int sock; /* socket, needed to get grp comm_desc */ int *conn; /* connections to exchange member info */ void *op_pool; /* operations queue buffer pool */ struct dapl_llist_entry *op_pend; /* in-process, in-order operations */ struct dapl_llist_entry *op_free; /* free list for operations */ DAPL_OS_LOCK op_lock; /* operations queue lock */ DAPL_OS_WAIT_OBJECT op_event; /* operations completion event */ /* provider specific information */ struct fca_context *ctx; /* FCA device */ void *fca_info; /* FCA member info, element = tp->f_size */ struct sockaddr_in *addr_info; /* RANK address array, element = DAT_SOCK_ADDR */ fca_comm_caps_t comm_caps; /* FCA comm group capabilities */ struct fca_rank_comm *comm; /* FCA comm group initialized */ struct fca_comm_new_spec comm_new; /* comm new spec */ int comm_id; /* FCA comm group id */ fca_comm_desc_t comm_desc; /* FCA comm group */ fca_comm_init_spec_t comm_init; /* FCA comm init parameters */ DAT_IB_COLLECTIVE_GROUP g_info; /* Process layout info */ }; /* Collective Operation Object, for non-blocking support */ #define COLL_OP_CNT 32 struct coll_op { struct dapl_llist_entry list_entry; struct coll_group *grp; DAT_IA_HANDLE ia; enum dat_ib_op op; DAT_IB_COLLECTIVE_RANK root; DAT_IB_COLLECTIVE_RANK self; DAT_CONTEXT ctx; DAT_COMPLETION_FLAGS cflgs; DAT_PVOID sbuf; DAT_COUNT ssize; DAT_COUNT *ssizes; DAT_COUNT *sdispls; DAT_PVOID rbuf; DAT_COUNT rsize; DAT_COUNT *rsizes; DAT_COUNT *rdispls; DAT_IB_COLLECTIVE_REDUCE_DATA_OP reduce_op; DAT_IB_COLLECTIVE_DATA_TYPE reduce_type; DAT_UINT64 clock; void *progress_func; DAT_COUNT *member_size; DAT_IB_COLLECTIVE_MEMBER *member; DAT_RETURN status; }; #endif /* _FCA_PROVIDER_H_ */ dapl-2.1.5/dapl/openib_common/collectives/ib_collectives.h000066400000000000000000000147671255317474200237070ustar00rootroot00000000000000/* * Copyright (c) 2011 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _IB_COLLECTIVES_H_ #define _IB_COLLECTIVES_H_ #ifdef DAT_IB_COLLECTIVES /* DAPL handle magic for collective */ #define DAPL_MAGIC_COLL 0xbabeface /* IB Collective Provider */ #ifdef DAT_FCA_PROVIDER #include #endif /* IB Collective Provider Prototypes */ int dapli_create_collective_service(IN struct dapl_hca *hca); void dapli_free_collective_service(IN struct dapl_hca *hca); DAT_RETURN dapli_create_collective_member( IN DAT_IA_HANDLE ia_handle, IN void *progress_func, OUT DAT_COUNT *member_size, OUT DAT_IB_COLLECTIVE_MEMBER *member); DAT_RETURN dapli_free_collective_member( IN DAT_IA_HANDLE ia_handle, IN DAT_IB_COLLECTIVE_MEMBER member); DAT_RETURN dapli_create_collective_group( IN DAT_EVD_HANDLE evd_handle, IN DAT_PZ_HANDLE pz, IN DAT_IB_COLLECTIVE_MEMBER *members, IN DAT_COUNT ranks, IN DAT_IB_COLLECTIVE_RANK self, IN DAT_IB_COLLECTIVE_ID id, IN DAT_IB_COLLECTIVE_GROUP *g_info, IN DAT_DTO_COOKIE user_ctx); DAT_RETURN dapli_free_collective_group( IN DAT_IB_COLLECTIVE_HANDLE coll_handle); DAT_RETURN dapli_collective_barrier( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_DTO_COOKIE user_context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_broadcast( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID buffer, IN DAT_COUNT byte_count, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_reduce( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_allreduce( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_scatter( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_scatterv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID *snd_bufs, IN DAT_COUNT *snd_lens, IN DAT_COUNT *displs, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_gather( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_gatherv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *displs, IN DAT_IB_COLLECTIVE_RANK root, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_allgather( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_allgatherv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *displs, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_alltoall( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_alltoallv( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID *snd_bufs, IN DAT_COUNT *snd_lens, IN DAT_COUNT *snd_displs, IN DAT_PVOID *rcv_bufs, IN DAT_COUNT *rcv_lens, IN DAT_COUNT *rcv_displs, IN DAT_CONTEXT context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_reduce_scatter( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT *rcv_lens, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags); DAT_RETURN dapli_collective_scan( IN DAT_IB_COLLECTIVE_HANDLE coll_handle, IN DAT_PVOID snd_buf, IN DAT_COUNT snd_len, IN DAT_PVOID rcv_buf, IN DAT_COUNT rcv_len, IN DAT_IB_COLLECTIVE_REDUCE_DATA_OP op, IN DAT_IB_COLLECTIVE_DATA_TYPE type, IN DAT_CONTEXT user_context, IN DAT_COMPLETION_FLAGS comp_flags); #endif /* DAT_IB_COLLECTIVES */ #endif /* _IB_COLLECTIVES_H_ */ dapl-2.1.5/dapl/openib_common/cq.c000066400000000000000000000361431255317474200167730ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" #include "dapl_evd_util.h" #include "dapl_ring_buffer_util.h" /* * Map all verbs DTO completion codes to the DAT equivelent. * * Not returned by verbs: DAT_DTO_ERR_PARTIAL_PACKET */ static struct ib_status_map { int ib_status; DAT_DTO_COMPLETION_STATUS dat_status; } ib_status_map[] = { /* 00 */ {IBV_WC_SUCCESS, DAT_DTO_SUCCESS}, /* 01 */ {IBV_WC_LOC_LEN_ERR, DAT_DTO_ERR_LOCAL_LENGTH}, /* 02 */ {IBV_WC_LOC_QP_OP_ERR, DAT_DTO_ERR_LOCAL_EP}, /* 03 */ {IBV_WC_LOC_EEC_OP_ERR, DAT_DTO_ERR_TRANSPORT}, /* 04 */ {IBV_WC_LOC_PROT_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 05 */ {IBV_WC_WR_FLUSH_ERR, DAT_DTO_ERR_FLUSHED}, /* 06 */ {IBV_WC_MW_BIND_ERR, DAT_RMR_OPERATION_FAILED}, /* 07 */ {IBV_WC_BAD_RESP_ERR, DAT_DTO_ERR_BAD_RESPONSE}, /* 08 */ {IBV_WC_LOC_ACCESS_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 09 */ {IBV_WC_REM_INV_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 10 */ {IBV_WC_REM_ACCESS_ERR, DAT_DTO_ERR_REMOTE_ACCESS}, /* 11 */ {IBV_WC_REM_OP_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 12 */ {IBV_WC_RETRY_EXC_ERR, DAT_DTO_ERR_TRANSPORT}, /* 13 */ {IBV_WC_RNR_RETRY_EXC_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 14 */ {IBV_WC_LOC_RDD_VIOL_ERR, DAT_DTO_ERR_LOCAL_PROTECTION}, /* 15 */ {IBV_WC_REM_INV_RD_REQ_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 16 */ {IBV_WC_REM_ABORT_ERR, DAT_DTO_ERR_REMOTE_RESPONDER}, /* 17 */ {IBV_WC_INV_EECN_ERR, DAT_DTO_ERR_TRANSPORT}, /* 18 */ {IBV_WC_INV_EEC_STATE_ERR, DAT_DTO_ERR_TRANSPORT}, /* 19 */ {IBV_WC_FATAL_ERR, DAT_DTO_ERR_TRANSPORT}, /* 20 */ {IBV_WC_RESP_TIMEOUT_ERR, DAT_DTO_ERR_RECEIVER_NOT_READY}, /* 21 */ {IBV_WC_GENERAL_ERR, DAT_DTO_ERR_TRANSPORT}, }; /* * dapls_ib_get_dto_status * * Return the DAT status of a DTO operation * * Input: * cqe_ptr pointer to completion queue entry * * Output: * none * * Returns: * Value from ib_status_map table above */ DAT_DTO_COMPLETION_STATUS dapls_ib_get_dto_status(IN ib_work_completion_t * cqe_ptr) { uint32_t ib_status; int i; ib_status = DAPL_GET_CQE_STATUS(cqe_ptr); /* * Due to the implementation of verbs completion code, we need to * search the table for the correct value rather than assuming * linear distribution. */ for (i = 0; i <= IBV_WC_GENERAL_ERR; i++) { if (ib_status == ib_status_map[i].ib_status) { if (ib_status != IBV_WC_SUCCESS) { dapl_log(DAPL_DBG_TYPE_DTO_COMP_ERR, " DTO completion ERROR: %d:" " op %#x\n", ib_status, DAPL_GET_CQE_OPTYPE(cqe_ptr)); } return ib_status_map[i].dat_status; } } return DAT_DTO_FAILURE; } DAT_RETURN dapls_ib_get_async_event(IN ib_error_record_t * err_record, OUT DAT_EVENT_NUMBER * async_event) { DAT_RETURN dat_status = DAT_SUCCESS; int err_code = err_record->event_type; dapl_log(DAPL_DBG_TYPE_EXCEPTION, " %s %s\n", __FUNCTION__, dapl_ib_async_str(err_code)); switch (err_code) { /* OVERFLOW error */ case IBV_EVENT_CQ_ERR: *async_event = DAT_ASYNC_ERROR_EVD_OVERFLOW; break; /* INTERNAL errors */ case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: /* CATASTROPHIC errors */ *async_event = DAT_ASYNC_ERROR_IA_CATASTROPHIC; break; /* BROKEN QP error */ case IBV_EVENT_SQ_DRAINED: case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_QP_LAST_WQE_REACHED: *async_event = DAT_ASYNC_ERROR_EP_BROKEN; break; /* connection completion */ case IBV_EVENT_COMM_EST: *async_event = DAT_CONNECTION_EVENT_ESTABLISHED; break; /* non-catastrophic events */ case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_CLIENT_REREGISTER: break; default: dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0); } return dat_status; } /* * dapl_ib_cq_alloc * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_cq_alloc(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen) { struct ibv_comp_channel *channel = NULL; int opts, ret = ENOMEM; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: evd %p cqlen=%d \n", evd_ptr, *cqlen); /* create CQ object */ evd_ptr->ib_cq_handle = dapl_os_alloc(sizeof(struct dcm_ib_cq)); if (!evd_ptr->ib_cq_handle) goto err; dapl_os_memzero(evd_ptr->ib_cq_handle, sizeof(struct dcm_ib_cq)); evd_ptr->ib_cq_handle->tp = &ia_ptr->hca_ptr->ib_trans; evd_ptr->ib_cq_handle->evd = evd_ptr; #ifdef _OPENIB_MCM_ /* shadow support for TX, MPXYD */ if (ia_ptr->hca_ptr->ib_trans.scif_ep) { ret = dapli_mix_cq_create(evd_ptr->ib_cq_handle, *cqlen); if (ret) goto err; /* cross-socket: shadow both RX and TX, no IB CQ on MIC */ if (MXS_EP(&ia_ptr->hca_ptr->ib_trans.addr)) return DAT_SUCCESS; } dapl_llist_init_entry(&evd_ptr->ib_cq_handle->entry); #endif if (!evd_ptr->cno_ptr) channel = ibv_create_comp_channel(ia_ptr->hca_ptr->ib_hca_handle); else channel = ia_ptr->hca_ptr->ib_trans.ib_cq; if (!channel) goto err; /* move channel FD to non-blocking */ opts = fcntl(channel->fd, F_GETFL); if (opts < 0 || fcntl(channel->fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on channel->fd %d ERR %d %s\n", channel->fd, opts, strerror(errno)); goto err; } evd_ptr->ib_cq_handle->cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, *cqlen, evd_ptr, channel, 0); if (!evd_ptr->ib_cq_handle->cq) goto err; /* arm cq for events */ dapls_set_cq_notify(ia_ptr, evd_ptr); /* update with returned cq entry size */ *cqlen = evd_ptr->ib_cq_handle->cq->cqe; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "dapls_ib_cq_alloc: new_cq %p cqlen=%d \n", evd_ptr->ib_cq_handle, *cqlen); return DAT_SUCCESS; err: dapl_log(DAPL_DBG_TYPE_ERR, "ib_cq_alloc ERR (%d): new_cq %p cqlen=%d ret %d %s\n", evd_ptr->ib_cq_handle, *cqlen, ret, strerror(errno)); if (evd_ptr->ib_cq_handle) dapl_os_free(evd_ptr->ib_cq_handle, sizeof(struct dcm_ib_cq)); if (!evd_ptr->cno_ptr && channel) ibv_destroy_comp_channel(channel); return dapl_convert_errno(ret, "cq_allocate" ); } /* * dapls_ib_cq_free * * destroy a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_free(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr) { DAT_EVENT event; ib_work_completion_t wc; struct ibv_comp_channel *channel; if (evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { #ifdef _OPENIB_MCM_ /* remove from device PI processing list */ dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.cqlock); if (evd_ptr->ib_cq_handle->entry.list_head) dapl_llist_remove_entry(&ia_ptr->hca_ptr->ib_trans.cqlist, &evd_ptr->ib_cq_handle->entry); dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.cqlock); /* shadow support, MPXYD */ if (ia_ptr->hca_ptr->ib_trans.scif_ep) { dapli_mix_cq_free(evd_ptr->ib_cq_handle); if (!evd_ptr->ib_cq_handle->cq) { dapl_os_free(evd_ptr->ib_cq_handle, sizeof(struct dcm_ib_cq)); evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; return DAT_SUCCESS; } } #endif /* pull off CQ and EVD entries and toss */ while (ibv_poll_cq(evd_ptr->ib_cq_handle->cq, 1, &wc) == 1) ; while (dapl_evd_dequeue(evd_ptr, &event) == DAT_SUCCESS) ; channel = evd_ptr->ib_cq_handle->cq->channel; if (ibv_destroy_cq(evd_ptr->ib_cq_handle->cq)) return (dapl_convert_errno(errno, "ibv_destroy_cq")); if (!evd_ptr->cno_ptr) ibv_destroy_comp_channel(channel); dapl_os_free(evd_ptr->ib_cq_handle, sizeof(struct dcm_ib_cq)); evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } DAT_RETURN dapls_evd_dto_wakeup(IN DAPL_EVD * evd_ptr) { dapl_log(DAPL_DBG_TYPE_EVD, " cq_object_wakeup: EVD %p CQ %p\n", evd_ptr, evd_ptr->ib_cq_handle); /* EVD with CNO; waiting on OS wait object */ if (evd_ptr->cno_ptr) { dapl_os_wait_object_wakeup(&evd_ptr->wait_object); return DAT_SUCCESS; } #ifdef _OPENIB_MCM_ { int flags = evd_ptr->ib_cq_handle->flags; if (((flags & DCM_CQ_TX) && (flags & DCM_CQ_TX_INDIRECT)) || ((flags & DCM_CQ_RX) && (flags & DCM_CQ_RX_INDIRECT))) dapl_os_wait_object_wakeup(&evd_ptr->wait_object); } #endif /* otherwise, no wake up mechanism */ return DAT_SUCCESS; } #if defined(_WIN32) static int dapls_wait_comp_channel(IN struct ibv_comp_channel *channel, IN uint32_t timeout) { channel->comp_channel.Milliseconds = (timeout == DAT_TIMEOUT_INFINITE) ? INFINITE : timeout / 1000; return 0; } #else // WIN32 static int dapls_wait_comp_channel(IN struct ibv_comp_channel *channel, IN uint32_t timeout) { int status, timeout_ms; struct pollfd cq_fd = { .fd = channel->fd, .events = POLLIN, .revents = 0 }; /* uDAPL timeout values in usecs */ timeout_ms = (timeout == DAT_TIMEOUT_INFINITE) ? -1 : timeout / 1000; status = poll(&cq_fd, 1, timeout_ms); if (status > 0) return 0; else if (status == 0) return ETIMEDOUT; else return errno; } #endif DAT_RETURN dapls_evd_dto_wait(IN DAPL_EVD * evd_ptr, IN uint32_t timeout) { struct ibv_comp_channel *channel; struct ibv_cq *ibv_cq = NULL; void *context; int status; dapl_log(DAPL_DBG_TYPE_EVD, " cq_object_wait: EVD %p CQ %p time %d\n", evd_ptr, evd_ptr->ib_cq_handle, timeout); #ifdef _OPENIB_MCM_ { int flags = evd_ptr->ib_cq_handle->flags; if (((flags & DCM_CQ_TX) && (flags & DCM_CQ_TX_INDIRECT)) || ((flags & DCM_CQ_RX) && (flags & DCM_CQ_RX_INDIRECT))) { return (dapl_os_wait_object_wait(&evd_ptr->wait_object, timeout)); } } #endif channel = evd_ptr->ib_cq_handle->cq->channel; status = dapls_wait_comp_channel(channel, timeout); if (!status) { if (!ibv_get_cq_event(channel, &ibv_cq, &context)) { ibv_ack_cq_events(ibv_cq, 1); } } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cq_object_wait: RET evd %p ibv_cq %p %s\n", evd_ptr, ibv_cq, strerror(status)); return dapl_convert_errno(status, "cq_wait_object_wait"); } void dapli_cq_event_cb(struct _ib_hca_transport *tp) { /* check all comp events on this device */ struct dapl_evd *evd = NULL; struct ibv_cq *ibv_cq = NULL; dapl_dbg_log(DAPL_DBG_TYPE_UTIL," dapli_cq_event_cb(%p)\n", tp); while (!ibv_get_cq_event(tp->ib_cq, &ibv_cq, (void*)&evd)) { if (!DAPL_BAD_HANDLE(evd, DAPL_MAGIC_EVD)) { /* Both EVD or EVD->CNO event via callback */ dapl_evd_dto_callback(tp->ib_ctx, evd->ib_cq_handle, (void*)evd); } ibv_ack_cq_events(ibv_cq, 1); } } /* * dapl_ib_cq_resize * * Alloc a CQ * * Input: * ia_handle IA handle * evd_ptr pointer to EVD struct * cqlen minimum QLen * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_cq_resize(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr, IN DAT_COUNT * cqlen) { ib_cq_handle_t old_cq, new_cq; DAT_RETURN ret; old_cq = evd_ptr->ib_cq_handle; ret = dapls_ib_cq_alloc(ia_ptr, evd_ptr, cqlen); if (ret) goto err; new_cq = evd_ptr->ib_cq_handle; evd_ptr->ib_cq_handle = old_cq; dapls_ib_cq_free(ia_ptr, evd_ptr); evd_ptr->ib_cq_handle = new_cq; return DAT_SUCCESS; err: evd_ptr->ib_cq_handle = old_cq; return ret; } /* * dapls_set_cq_notify * * Set the CQ notification for next * * Input: * hca_handl hca handle * DAPL_EVD evd handle * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_set_cq_notify(IN DAPL_IA * ia_ptr, IN DAPL_EVD * evd_ptr) { if (evd_ptr->ib_cq_handle->cq && ibv_req_notify_cq(evd_ptr->ib_cq_handle->cq, 0)) return (dapl_convert_errno(errno, "notify_cq")); else return DAT_SUCCESS; } /* * dapls_ib_completion_notify * * Set the CQ notification type * * Input: * hca_handl hca handle * evd_ptr evd handle * type notification type * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno */ DAT_RETURN dapls_ib_completion_notify(IN ib_hca_handle_t hca_handle, IN DAPL_EVD * evd_ptr, IN ib_notification_type_t type) { if (evd_ptr->ib_cq_handle->cq && ibv_req_notify_cq(evd_ptr->ib_cq_handle->cq, type)) return (dapl_convert_errno(errno, "notify_cq_type")); else return DAT_SUCCESS; } /* * dapls_ib_completion_poll * * CQ poll for completions * * Input: * hca_handl hca handle * evd_ptr evd handle * wc_ptr work completion * * Output: * none * * Returns: * DAT_SUCCESS * DAT_QUEUE_EMPTY * */ DAT_RETURN dapls_ib_completion_poll(IN DAPL_HCA * hca_ptr, IN DAPL_EVD * evd_ptr, IN ib_work_completion_t * wc_ptr) { int ret; #ifdef _OPENIB_MCM_ if (!evd_ptr->ib_cq_handle->cq) /* proxy service, no direct CQ */ return DAT_QUEUE_EMPTY; #endif ret = ibv_poll_cq(evd_ptr->ib_cq_handle->cq, 1, wc_ptr); #ifdef _OPENIB_MCM_ /* * HST->MXS, we need to intercept direct TX WC in flight * because there is no way to know if indirect or direct CQ * service is needed at the time of QP creation. */ if (ret==1) { DAPL_EP *ep_ptr; DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t) DAPL_GET_CQE_WRID(wc_ptr); dapl_os_assert((NULL != cookie)); ep_ptr = cookie->ep; dapl_os_assert((NULL != ep_ptr)); if ((!ep_ptr->qp_handle->tp->scif_ep) && (ep_ptr->qp_handle->ep_map == MIC_XSOCK_DEV) && (DAPL_GET_CQE_OPTYPE(wc_ptr) == OP_RDMA_WRITE_IMM)) { dapl_log(DAPL_DBG_TYPE_EP, " cq_dto_event: MCM RW_pi: evd %p ep %p st %d op %s ln %d wr_id %p\n", evd_ptr, ep_ptr, DAPL_GET_CQE_STATUS(wc_ptr), DAPL_GET_CQE_OP_STR(wc_ptr), cookie->val.dto.size, cookie); ret = 0; /* WR RW_imm to PI, WC pending from PI */ } else { dapl_log(DAPL_DBG_TYPE_EP, " cq_dto_event: MCM RW_direct: evd %p ep %p st %d op %s ln %d wr_id %p\n", evd_ptr, ep_ptr, DAPL_GET_CQE_STATUS(wc_ptr), DAPL_GET_CQE_OP_STR(wc_ptr), cookie->val.dto.size, cookie); } } #endif if (ret == 1) return DAT_SUCCESS; return DAT_QUEUE_EMPTY; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/openib_common/dapl_ib_common.h000066400000000000000000000373201255317474200213350ustar00rootroot00000000000000/* * Copyright (c) 2009-2015 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /* * Definitions common to all OpenIB providers, cma, scm, ucm */ #ifndef _DAPL_IB_COMMON_H_ #define _DAPL_IB_COMMON_H_ #include #ifdef DAT_EXTENSIONS #include #endif #ifndef __cplusplus #define false 0 #define true 1 #endif /*__cplusplus */ #define DCM_AH_SPACE (0xC000) /* unicast LID range */ /* Typedefs to map common DAPL provider types to IB verbs */ struct dcm_ib_qp { struct _ib_hca_transport *tp; struct dapl_ep *ep; struct ibv_qp *qp; /* local QP1 snd-rcv or rcv from PO */ struct ibv_ah **ah; /* UD AH cache, LID index */ #ifdef _OPENIB_MCM_ struct dcm_ib_cq *req_cq; /* ref to req CQ for HST->MXS */ struct dcm_ib_cq *rcv_cq; /* ref to rcv CQ for HST->MXS */ struct ibv_qp *qp2; /* local QP2 snd-rcv to-from PI */ uint32_t qp_id; /* proxy, SND or RCV */ uint32_t m_inline; /* proxy inline threshold */ uint32_t wr_hd; /* PO,PI work request head */ uint32_t wr_tl; /* PO,PI work request tail */ uint32_t wc_tl; /* local WC tail */ uint64_t wc_addr; /* WC queue for remote PI */ struct ibv_mr *wc_mr; /* WC IB mr info */ struct mcm_wrc_info wrc; /* local WC info */ struct mcm_wrc_info wrc_rem; /* remote WR info */ DAPL_OS_LOCK lock; /* Proxy WR and WC queues */ uint8_t ep_map; /* Peer EP mapping, MXS, MSS, HST */ uint32_t seg_sz; /* Peer MXS Proxy-in segment size */ char *wr_buf_rx; /* mcm_wr_rx_t entries, devices without inline data */ struct ibv_mr *wr_buf_rx_mr; #endif }; #define DCM_CQ_TX 0x1 #define DCM_CQ_RX 0x2 #define DCM_CQ_TX_INDIRECT 0x4 #define DCM_CQ_RX_INDIRECT 0x8 struct dcm_ib_cq { struct _ib_hca_transport *tp; struct dapl_evd *evd; struct ibv_cq *cq; /* CQ -> QP1, local rcv, direct */ int flags; #ifdef _OPENIB_MCM_ struct dapl_llist_entry entry; uint32_t cq_id; /* proxy, SND or RCV */ #endif }; typedef struct dcm_ib_cq *ib_cq_handle_t; typedef struct dcm_ib_qp *ib_qp_handle_t; typedef struct ibv_pd *ib_pd_handle_t; typedef struct ibv_mr *ib_mr_handle_t; typedef struct ibv_mw *ib_mw_handle_t; typedef struct ibv_wc ib_work_completion_t; typedef struct ibv_ah *ib_ah_handle_t; typedef union ibv_gid *ib_gid_handle_t; typedef struct ibv_srq *ib_srq_handle_t; /* HCA context type maps to IB verbs */ typedef struct ibv_context *ib_hca_handle_t; typedef ib_hca_handle_t dapl_ibal_ca_t; /* QP info to exchange, wire protocol version for these CM's */ /* Version 8, 24-bit port space and rtns value */ #define DCM_VER 8 #define DCM_VER_XPS 8 /* extended port space, rtns */ #define DCM_VER_MIN 6 /* backward compatibility limit */ /* CM private data areas, same for all operations */ #define DCM_MAX_PDATA_SIZE 68 /* * UCM DAPL IB/QP address (lid, qp_num, gid) mapping to * DAT_IA_ADDRESS_PTR, DAT_SOCK_ADDR2 (28 bytes) * For applications, like MPI, that exchange IA_ADDRESS * across the fabric before connecting, it eliminates the * overhead of name and address resolution to the destination's * CM services. UCM provider uses the following for * DAT_IA_ADDRESS. Note: family == AF_INET6 to insure proper * callee storage for address. */ union dcm_addr { DAT_SOCK_ADDR6 so; struct { uint16_t family; /* sin6_family */ uint16_t lid; /* sin6_port */ uint32_t qpn; /* sin6_flowinfo */ uint8_t gid[16]; /* sin6_addr */ uint16_t port; /* sin6_scope_id */ uint8_t sl; uint8_t qp_type; } ib; }; typedef struct _ib_cm_msg { uint16_t ver; uint16_t op; uint16_t sport; /* src cm port */ uint16_t dport; /* dst cm port */ uint32_t sqpn; /* src cm qpn */ uint32_t dqpn; /* dst cm qpn */ uint16_t p_size; uint32_t s_id; /* src pid */ uint32_t d_id; /* dst pid */ uint8_t rd_in; /* atomic_rd_in */ uint8_t sportx; /* extend to 24 bits */ uint8_t dportx; /* extend to 24 bits */ uint8_t rtns; /* retransmissions */ uint8_t resv[2]; union dcm_addr saddr; union dcm_addr daddr; union dcm_addr saddr_alt; union dcm_addr daddr_alt; uint8_t p_data[DCM_MAX_PDATA_SIZE]; } ib_cm_msg_t; typedef struct _ib_named_attr { const char *dev; const char *mode; const char *read; const char *guid; const char *mtu; const char *port; const char *port_num; } ib_named_attr_t; typedef struct _ib_cm_attr { uint8_t ack_timer; uint8_t ack_retry; uint8_t rnr_timer; uint8_t rnr_retry; uint8_t global; uint8_t hop_limit; uint8_t tclass; uint8_t sl; uint8_t mtu; uint8_t rd_atom_in; uint8_t rd_atom_out; uint8_t pkey_idx; uint16_t pkey; uint16_t max_inline; } ib_cm_attr_t; /* CM events */ typedef enum { IB_CME_CONNECTED, IB_CME_DISCONNECTED, IB_CME_DISCONNECTED_ON_LINK_DOWN, IB_CME_CONNECTION_REQUEST_PENDING, IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA, IB_CME_CONNECTION_REQUEST_ACKED, IB_CME_DESTINATION_REJECT, IB_CME_DESTINATION_REJECT_PRIVATE_DATA, IB_CME_DESTINATION_UNREACHABLE, IB_CME_TOO_MANY_CONNECTION_REQUESTS, IB_CME_LOCAL_FAILURE, IB_CME_BROKEN, IB_CME_TIMEOUT } ib_cm_events_t; /* Operation and state mappings */ typedef int ib_send_op_type_t; typedef struct ibv_sge ib_data_segment_t; typedef enum ibv_qp_state ib_qp_state_t; typedef enum ibv_event_type ib_async_event_type; typedef struct ibv_async_event ib_error_record_t; /* CQ notifications */ typedef enum { IB_NOTIFY_ON_NEXT_COMP, IB_NOTIFY_ON_SOLIC_COMP } ib_notification_type_t; /* other mappings */ typedef int ib_bool_t; typedef union ibv_gid GID; typedef char *IB_HCA_NAME; typedef uint16_t ib_hca_port_t; /* Definitions */ #define IB_INVALID_HANDLE NULL /* inline send rdma threshold */ #define INLINE_SEND_IWARP_DEFAULT 64 #define INLINE_SEND_IB_DEFAULT 64 /* qkey for UD QP's */ #define DAT_UD_QKEY 0x78654321 /* RC timer - retry count defaults */ #define DCM_ACK_TIMER 20 /* 5 bits, 4.096us*2^ack_timer. 16== 268ms, 20==4.2s */ #define DCM_ACK_RETRY 7 /* 3 bits, 7 * 4.2 == 30 seconds */ #define DCM_RNR_TIMER 12 /* 5 bits, 12 =.64ms, 28 =163ms, 31 =491ms */ #define DCM_RNR_RETRY 7 /* 3 bits, 7 == infinite */ #define DCM_IB_MTU 2048 /* Global routing defaults */ #define DCM_GLOBAL 0 /* global routing is disabled */ #define DCM_HOP_LIMIT 0xff #define DCM_TCLASS 0 /* DAPL uCM timers, default queue sizes */ #define DCM_RETRY_CNT 10 #define DCM_REP_TIME 800 /* reply timeout in m_secs */ #define DCM_RTU_TIME 800 /* rtu timeout in m_secs */ #define DCM_WAIT_TIME 60000 /* wait timeout in m_secs */ #define DCM_QP_SIZE 500 /* uCM tx, rx qp size */ #define DCM_CQ_SIZE 500 /* uCM cq size */ #define DCM_TX_BURST 50 /* uCM signal, every TX burst msgs posted */ #define DCM_DREQ_CNT 1 /* DREQ retry count */ #define DCM_DREP_TIME 200 /* disconnect reply timeout in m_secs */ #define DCM_CM_TIMER 200 /* CM timer interval, m_secs */ /* DTO OPs, ordered for DAPL ENUM definitions */ #define OP_RDMA_WRITE IBV_WR_RDMA_WRITE #define OP_RDMA_WRITE_IMM IBV_WR_RDMA_WRITE_WITH_IMM #define OP_SEND IBV_WR_SEND #define OP_SEND_IMM IBV_WR_SEND_WITH_IMM #define OP_RDMA_READ IBV_WR_RDMA_READ #define OP_COMP_AND_SWAP IBV_WR_ATOMIC_CMP_AND_SWP #define OP_FETCH_AND_ADD IBV_WR_ATOMIC_FETCH_AND_ADD #define OP_RECEIVE 7 /* internal op */ #define OP_RECEIVE_IMM 8 /* rdma write with immed, internel op */ #define OP_RECEIVE_MSG_IMM 9 /* recv msg with immed, internel op */ #define OP_BIND_MW 10 /* internal op */ #define OP_SEND_UD 11 /* internal op */ #define OP_RECV_UD 12 /* internal op */ #define OP_INVALID 0xff /* Definitions to map QP state */ #define IB_QP_STATE_RESET IBV_QPS_RESET #define IB_QP_STATE_INIT IBV_QPS_INIT #define IB_QP_STATE_RTR IBV_QPS_RTR #define IB_QP_STATE_RTS IBV_QPS_RTS #define IB_QP_STATE_SQD IBV_QPS_SQD #define IB_QP_STATE_SQE IBV_QPS_SQE #define IB_QP_STATE_ERROR IBV_QPS_ERR /* Definitions for ibverbs/mthca return codes, should be defined in verbs.h */ /* some are errno and some are -n values */ /** * ibv_get_device_name - Return kernel device name * ibv_get_device_guid - Return device's node GUID * ibv_open_device - Return ibv_context or NULL * ibv_close_device - Return 0, (errno?) * ibv_get_async_event - Return 0, -1 * ibv_alloc_pd - Return ibv_pd, NULL * ibv_dealloc_pd - Return 0, errno * ibv_reg_mr - Return ibv_mr, NULL * ibv_dereg_mr - Return 0, errno * ibv_create_cq - Return ibv_cq, NULL * ibv_destroy_cq - Return 0, errno * ibv_get_cq_event - Return 0 & ibv_cq/context, int * ibv_poll_cq - Return n & ibv_wc, 0 ok, -1 empty, -2 error * ibv_req_notify_cq - Return 0 (void?) * ibv_create_qp - Return ibv_qp, NULL * ibv_modify_qp - Return 0, errno * ibv_destroy_qp - Return 0, errno * ibv_post_send - Return 0, -1 & bad_wr * ibv_post_recv - Return 0, -1 & bad_wr */ /* async handler for DTO, CQ, QP, and unafiliated */ typedef void (*ib_async_dto_handler_t)( IN ib_hca_handle_t ib_hca_handle, IN ib_error_record_t *err_code, IN void *context); typedef void (*ib_async_cq_handler_t)( IN ib_hca_handle_t ib_hca_handle, IN ib_cq_handle_t ib_cq_handle, IN ib_error_record_t *err_code, IN void *context); typedef void (*ib_async_qp_handler_t)( IN ib_hca_handle_t ib_hca_handle, IN ib_qp_handle_t ib_qp_handle, IN ib_error_record_t *err_code, IN void *context); typedef void (*ib_async_handler_t)( IN ib_hca_handle_t ib_hca_handle, IN ib_error_record_t *err_code, IN void *context); typedef enum { IB_THREAD_INIT, IB_THREAD_CREATE, IB_THREAD_RUN, IB_THREAD_CANCEL, IB_THREAD_EXIT } ib_thread_state_t; typedef enum dapl_cm_op { DCM_REQ = 1, DCM_REP, DCM_REJ_USER, /* user reject */ DCM_REJ_CM, /* cm reject, no SID */ DCM_RTU, DCM_DREQ, DCM_DREP } DAPL_CM_OP; typedef enum dapl_cm_state { DCM_INIT, DCM_LISTEN, DCM_CONN_PENDING, DCM_REP_PENDING, DCM_ACCEPTING, DCM_ACCEPTING_DATA, DCM_ACCEPTED, DCM_REJECTING, DCM_REJECTED, DCM_CONNECTED, DCM_RELEASE, DCM_DREQ_OUT, DCM_DISCONNECTED, DCM_DESTROY, DCM_RTU_PENDING, DCM_DREQ_IN, DCM_FREE, DCM_TIMEWAIT } DAPL_CM_STATE; /* provider specfic fields for shared memory support */ typedef uint32_t ib_shm_transport_t; typedef void user_progress_func_t( void ); /* prototypes */ int32_t dapls_ib_init(void); int32_t dapls_ib_release(void); /* util.c */ enum ibv_mtu dapl_ib_mtu(int mtu); const char *dapl_ib_mtu_str(enum ibv_mtu mtu); int getipaddr_netdev(char *name, char *addr, int addr_len); DAT_RETURN getlocalipaddr(char *addr, int addr_len); /* qp.c */ DAT_RETURN dapls_modify_qp_ud(IN DAPL_HCA *hca, IN struct ibv_qp *qp); DAT_RETURN dapls_modify_qp_state(IN struct ibv_qp *qp_handle, IN ib_qp_state_t qp_state, IN uint32_t qpn, IN uint16_t lid, IN ib_gid_handle_t gid); ib_ah_handle_t dapls_create_ah( IN DAPL_HCA *hca, IN ib_pd_handle_t pd, IN struct ibv_qp *qp, IN uint16_t lid, IN ib_gid_handle_t gid); /* inline functions */ STATIC _INLINE_ IB_HCA_NAME dapl_ib_convert_name (IN char *name) { /* use ascii; name of local device */ return dapl_os_strdup(name); } STATIC _INLINE_ void dapl_ib_release_name (IN IB_HCA_NAME name) { return; } STATIC _INLINE_ int dapl_ib_inline_data (IN struct ibv_context *ib_ctx) { struct ibv_qp_init_attr qp_create; struct ibv_pd *ib_pd = NULL; struct ibv_cq *ib_cq = NULL; struct ibv_qp *ib_qp = NULL; int ret = 0; ib_pd = ibv_alloc_pd(ib_ctx); if (!ib_pd) goto bail; ib_cq = ibv_create_cq(ib_ctx, 10, ib_ctx, NULL, 0); if (!ib_cq) goto bail; dapl_os_memzero((void *)&qp_create, sizeof(qp_create)); qp_create.qp_type = IBV_QPT_RC; qp_create.send_cq = ib_cq; qp_create.recv_cq = ib_cq; qp_create.cap.max_send_wr = 1; qp_create.cap.max_send_sge = 1; qp_create.cap.max_inline_data = 64; qp_create.qp_context = (void *)ib_ctx; ib_qp = ibv_create_qp(ib_pd, &qp_create); if (ib_qp && qp_create.cap.max_inline_data >= 64) ret = 1; bail: if (ib_qp) ibv_destroy_qp(ib_qp); if (ib_cq) ibv_destroy_cq(ib_cq); if (ib_pd) ibv_dealloc_pd(ib_pd); return ret; } /* * Convert errno to DAT_RETURN values */ STATIC _INLINE_ DAT_RETURN dapl_convert_errno( IN int err, IN const char *str ) { if (!err) return DAT_SUCCESS; if ((err != EAGAIN) && (err != ETIMEDOUT)) dapl_log (DAPL_DBG_TYPE_ERR," DAPL ERR %s %s\n", str, strerror(err)); switch( err ) { case EOVERFLOW : return DAT_LENGTH_ERROR; case EACCES : return DAT_PRIVILEGES_VIOLATION; case EPERM : return DAT_PROTECTION_VIOLATION; case EINVAL : return DAT_INVALID_PARAMETER; case EISCONN : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_CONNECTED; case ECONNREFUSED : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_NOTREADY; case ETIMEDOUT : return DAT_TIMEOUT_EXPIRED; case ENETUNREACH: return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_UNREACHABLE; case EADDRINUSE : return DAT_CONN_QUAL_IN_USE; case EALREADY : return DAT_INVALID_STATE | DAT_INVALID_STATE_EP_ACTCONNPENDING; case ENOMEM : return DAT_INSUFFICIENT_RESOURCES; case EAGAIN : return DAT_QUEUE_EMPTY; case EINTR : return DAT_INTERRUPTED_CALL; case EAFNOSUPPORT : return DAT_INVALID_ADDRESS | DAT_INVALID_ADDRESS_MALFORMED; case EFAULT : default : return DAT_INTERNAL_ERROR; } } STATIC _INLINE_ char * dapl_cm_state_str(IN int st) { static char *state[] = { "CM_INIT", "CM_LISTEN", "CM_CONN_PENDING", "CM_REP_PENDING", "CM_ACCEPTING", "CM_ACCEPTING_DATA", "CM_ACCEPTED", "CM_REJECTING", "CM_REJECTED", "CM_CONNECTED", "CM_RELEASE", "CM_DREQ_OUT", "CM_DISCONNECTED", "CM_DESTROY", "CM_RTU_PENDING", "CM_DREQ_IN", "CM_FREE", "CM_TIMEWAIT" }; return ((st < 0 || st > 17) ? "Invalid CM state?" : state[st]); } STATIC _INLINE_ char * dapl_cm_op_str(IN int op) { static char *ops[] = { "INVALID", "REQ", "REP", "REJ_USER", "REJ_CM", "RTU", "DREQ", "DREP", }; return ((op < 1 || op > 7) ? "Invalid OP?" : ops[op]); } static inline char * dapl_ib_async_str(IN int st) { static char *state[] = { "IBV_EVENT_CQ_ERR", "IBV_EVENT_QP_FATAL", "IBV_EVENT_QP_REQ_ERR", "IBV_EVENT_QP_ACCESS_ERR", "IBV_EVENT_COMM_EST", "IBV_EVENT_SQ_DRAINED", "IBV_EVENT_PATH_MIG", "IBV_EVENT_PATH_MIG_ERR", "IBV_EVENT_DEVICE_FATAL", "IBV_EVENT_PORT_ACTIVE", "IBV_EVENT_PORT_ERR", "IBV_EVENT_LID_CHANGE", "IBV_EVENT_PKEY_CHANGE", "IBV_EVENT_SM_CHANGE", "IBV_EVENT_SRQ_ERR", "IBV_EVENT_SRQ_LIMIT_REACHED", "IBV_EVENT_QP_LAST_WQE_REACHED", "IBV_EVENT_CLIENT_REREGISTER", }; return ((st < 0 || st > 17) ? "Invalid IB async event?" : state[st]); } #endif /* _DAPL_IB_COMMON_H_ */ dapl-2.1.5/dapl/openib_common/dapl_ib_dto.h000066400000000000000000000405061255317474200206330ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_IB_DTO_H_ #define _DAPL_IB_DTO_H_ #include "dapl_ib_util.h" #include "dapl_ep_util.h" #ifdef DAT_EXTENSIONS #include #define CQE_WR_TYPE_UD(id) \ ((int)((DAPL_COOKIE *)(uintptr_t)id)->ep->param.ep_attr.service_type == (int)DAT_IB_SERVICE_TYPE_UD) #else #define CQE_WR_TYPE_UD(id) (0) #endif STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p); #if defined(_OPENIB_MCM_) #define PROVIDER_NAME "MCM" #elif defined(_OPENIB_CMA_) #define PROVIDER_NAME "CMA" #elif defined(_OPENIB_UCM_) #define PROVIDER_NAME "UCM" #elif defined(_OPENIB_SCM_) #define PROVIDER_NAME "SCM" #else #define PROVIDER_NAME "" #endif /* * dapls_ib_post_recv * * Provider specific Post RECV function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_recv ( IN DAPL_EP *ep_ptr, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov ) { struct ibv_recv_wr wr; struct ibv_recv_wr *bad_wr; ib_data_segment_t *ds = (ib_data_segment_t *)local_iov; DAT_COUNT i, total_len; int ret; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_rcv: ep %p cookie %p segs %d l_iov %p\n", ep_ptr, cookie, segments, local_iov); /* setup work request */ total_len = 0; wr.next = 0; wr.num_sge = segments; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds; if (cookie != NULL) { for (i = 0; i < segments; i++) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_rcv: l_key 0x%x va %p len %d\n", ds->lkey, ds->addr, ds->length ); total_len += ds->length; ds++; } cookie->val.dto.size = total_len; } #ifdef _OPENIB_MCM_ if (ep_ptr->qp_handle->tp->scif_ep && !ep_ptr->qp_handle->qp) /* QPr shadowed on proxy */ ret = dapli_mix_post_recv(ep_ptr->qp_handle, total_len, &wr, &bad_wr); else ret = ibv_post_recv(ep_ptr->qp_handle->qp, &wr, &bad_wr); #else ret = ibv_post_recv(ep_ptr->qp_handle->qp, &wr, &bad_wr); #endif if (ret) return(dapl_convert_errno(errno,"ibv_recv")); DAPL_CNTR(ep_ptr, DCNT_EP_POST_RECV); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_RECV_DATA, total_len); return DAT_SUCCESS; } /* * dapls_ib_post_srq_recv * * Provider specific Post SRQ RECV function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_srq_recv ( IN DAPL_SRQ *srq_ptr, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov ) { struct ibv_recv_wr wr; struct ibv_recv_wr *bad_wr; ib_data_segment_t *ds = (ib_data_segment_t *)local_iov; DAT_COUNT i, total_len; int ret; dapl_dbg_log(DAPL_DBG_TYPE_SRQ, " post_srq_rcv: srq %p cookie %p segs %d l_iov %p\n", srq_ptr, cookie, segments, local_iov); /* setup work request */ total_len = 0; wr.next = 0; wr.num_sge = segments; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds; if (cookie != NULL) { for (i = 0; i < segments; i++) { dapl_dbg_log(DAPL_DBG_TYPE_SRQ, " post_srq_rcv: l_key 0x%x va %p len %d\n", ds->lkey, ds->addr, ds->length ); total_len += ds->length; ds++; } cookie->val.dto.size = total_len; } ret = ibv_post_srq_recv(srq_ptr->srq_handle, &wr, &bad_wr); if (ret) return(dapl_convert_errno(errno,"ibv_recv")); return DAT_SUCCESS; } /* * dapls_ib_post_send * * Provider specific Post SEND function */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_send ( IN DAPL_EP *ep_ptr, IN ib_send_op_type_t op_type, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { struct ibv_send_wr wr; struct ibv_send_wr *bad_wr; ib_data_segment_t *ds = (ib_data_segment_t *)local_iov; DAT_COUNT i, total_len; int ret; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: %s ep %p op %d ck %p u_ck %llx sgs %d l_iov %p r_iov %p f %d\n", PROVIDER_NAME, ep_ptr, op_type, cookie, cookie->val.dto.cookie.as_64, segments, local_iov, remote_iov, completion_flags); #ifdef DAT_EXTENSIONS if (ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP)); #endif /* setup the work request */ wr.next = 0; wr.opcode = op_type; wr.num_sge = segments; wr.send_flags = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds; total_len = 0; if (cookie != NULL) { for (i = 0; i < segments; i++ ) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: lkey 0x%x va %p len %d\n", ds->lkey, ds->addr, ds->length ); total_len += ds->length; ds++; } cookie->val.dto.size = total_len; } if (wr.num_sge && (op_type == OP_RDMA_WRITE || op_type == OP_RDMA_READ)) { wr.wr.rdma.remote_addr = remote_iov->virtual_address; wr.wr.rdma.rkey = remote_iov->rmr_context; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd_rdma: rkey 0x%x va %#016Lx\n", wr.wr.rdma.rkey, wr.wr.rdma.remote_addr); } #ifndef _OPENIB_MCM_ /* don't use inline for MCM, optimized for large messages */ /* inline data for send or write ops */ if ((total_len <= ep_ptr->qp_handle->tp->ib_cm.max_inline) && ((op_type == OP_SEND) || (op_type == OP_RDMA_WRITE))) wr.send_flags |= IBV_SEND_INLINE; #endif /* set completion flags in work request */ wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & completion_flags) ? 0 : IBV_SEND_SIGNALED; wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & completion_flags) ? IBV_SEND_FENCE : 0; wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & completion_flags) ? IBV_SEND_SOLICITED : 0; dapl_log(DAPL_DBG_TYPE_EP, " post_snd: %s ep %p op %x flgs %x sgl %p,%d ln %d wr_id %Lx\n", PROVIDER_NAME, ep_ptr, wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge, total_len, wr.wr_id); #ifdef _OPENIB_MCM_ if (ep_ptr->qp_handle->tp->scif_ep) ret = dapli_mix_post_send(ep_ptr->qp_handle, total_len, &wr, &bad_wr); else if (ep_ptr->qp_handle->ep_map == MIC_XSOCK_DEV) ret = mcm_send_pi(ep_ptr->qp_handle, total_len, &wr, &bad_wr); else ret = ibv_post_send(ep_ptr->qp_handle->qp2, &wr, &bad_wr); #else ret = ibv_post_send(ep_ptr->qp_handle->qp, &wr, &bad_wr); #endif if (ret) return(dapl_convert_errno(errno,"ibv_send")); #ifdef DAPL_COUNTERS switch (op_type) { case OP_SEND: DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_DATA,total_len); break; case OP_RDMA_WRITE: DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_DATA,total_len); break; case OP_RDMA_READ: DAPL_CNTR(ep_ptr, DCNT_EP_POST_READ); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_READ_DATA,total_len); break; default: break; } #endif /* DAPL_COUNTERS */ dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n"); return DAT_SUCCESS; } /* map Work Completions to DAPL WR operations */ STATIC _INLINE_ DAT_DTOS dapls_cqe_dtos_opcode(ib_work_completion_t *cqe_p) { switch (cqe_p->opcode) { case IBV_WC_SEND: #ifdef DAT_EXTENSIONS if (CQE_WR_TYPE_UD(cqe_p->wr_id)) return (DAT_IB_DTO_SEND_UD); else #endif return (DAT_DTO_SEND); case IBV_WC_RDMA_READ: return (DAT_DTO_RDMA_READ); case IBV_WC_BIND_MW: return (DAT_DTO_BIND_MW); #ifdef DAT_EXTENSIONS case IBV_WC_RDMA_WRITE: if (cqe_p->wc_flags & IBV_WC_WITH_IMM) return (DAT_IB_DTO_RDMA_WRITE_IMMED); else return (DAT_DTO_RDMA_WRITE); case IBV_WC_COMP_SWAP: return (DAT_IB_DTO_CMP_SWAP); case IBV_WC_FETCH_ADD: return (DAT_IB_DTO_FETCH_ADD); case IBV_WC_RECV_RDMA_WITH_IMM: return (DAT_IB_DTO_RECV_IMMED); #else case IBV_WC_RDMA_WRITE: return (DAT_DTO_RDMA_WRITE); #endif case IBV_WC_RECV: #ifdef DAT_EXTENSIONS if (CQE_WR_TYPE_UD(cqe_p->wr_id)) return (DAT_IB_DTO_RECV_UD); else if (cqe_p->wc_flags & IBV_WC_WITH_IMM) return (DAT_IB_DTO_RECV_MSG_IMMED); else #endif return (DAT_DTO_RECEIVE); default: return (0xff); } } #define DAPL_GET_CQE_DTOS_OPTYPE(cqe_p) dapls_cqe_dtos_opcode(cqe_p) #ifdef DAT_EXTENSIONS /* * dapls_ib_post_ext_send * * Provider specific extended Post SEND function for atomics * OP_COMP_AND_SWAP and OP_FETCH_AND_ADD */ STATIC _INLINE_ DAT_RETURN dapls_ib_post_ext_send ( IN DAPL_EP *ep_ptr, IN ib_send_op_type_t op_type, IN DAPL_COOKIE *cookie, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET *local_iov, IN const DAT_RMR_TRIPLET *remote_iov, IN DAT_UINT32 immed_data, IN DAT_UINT64 compare_add, IN DAT_UINT64 swap, IN DAT_COMPLETION_FLAGS completion_flags, IN DAT_IB_ADDR_HANDLE *remote_ah) { struct ibv_send_wr wr; struct ibv_send_wr *bad_wr; ib_data_segment_t *ds = (ib_data_segment_t *)local_iov; DAT_COUNT i, total_len; int ret; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_ext_snd: ep %p op %d ck %p sgs", "%d l_iov %p r_iov %p f %d ah %p\n", ep_ptr, op_type, cookie, segments, local_iov, remote_iov, completion_flags, remote_ah); /* setup the work request */ wr.next = 0; wr.opcode = op_type; wr.num_sge = segments; wr.send_flags = 0; wr.wr_id = (uint64_t)(uintptr_t)cookie; wr.sg_list = ds; total_len = 0; if (cookie != NULL) { for (i = 0; i < segments; i++ ) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: lkey 0x%x va %p len %d\n", ds->lkey, ds->addr, ds->length ); total_len += ds->length; ds++; } cookie->val.dto.size = total_len; } switch (op_type) { case OP_RDMA_WRITE_IMM: /* OP_RDMA_WRITE)IMMED has direct IB wr_type mapping */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_ext: rkey 0x%x va %#016Lx immed=0x%x\n", remote_iov?remote_iov->rmr_context:0, remote_iov?remote_iov->virtual_address:0, immed_data); wr.imm_data = immed_data; if (wr.num_sge) { wr.wr.rdma.remote_addr = remote_iov->virtual_address; wr.wr.rdma.rkey = remote_iov->rmr_context; } break; case OP_COMP_AND_SWAP: /* OP_COMP_AND_SWAP has direct IB wr_type mapping */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_ext: OP_COMP_AND_SWAP=%lx," "%lx rkey 0x%x va %#016Lx\n", compare_add, swap, remote_iov->rmr_context, remote_iov->virtual_address); wr.wr.atomic.compare_add = compare_add; wr.wr.atomic.swap = swap; wr.wr.atomic.remote_addr = remote_iov->virtual_address; wr.wr.atomic.rkey = remote_iov->rmr_context; break; case OP_FETCH_AND_ADD: /* OP_FETCH_AND_ADD has direct IB wr_type mapping */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_ext: OP_FETCH_AND_ADD=%lx," "%lx rkey 0x%x va %#016Lx\n", compare_add, remote_iov->rmr_context, remote_iov->virtual_address); wr.wr.atomic.compare_add = compare_add; wr.wr.atomic.remote_addr = remote_iov->virtual_address; wr.wr.atomic.rkey = remote_iov->rmr_context; break; case OP_SEND_UD: /* post must be on EP with service_type of UD */ if (ep_ptr->qp_handle->qp->qp_type != IBV_QPT_UD) return(DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP)); dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_ext: OP_SEND_UD ah=%p" " qp_num=0x%x\n", remote_ah->ah, remote_ah->qpn); wr.opcode = OP_SEND; wr.wr.ud.ah = remote_ah->ah; wr.wr.ud.remote_qpn = remote_ah->qpn; wr.wr.ud.remote_qkey = DAT_UD_QKEY; break; default: break; } /* set completion flags in work request */ wr.send_flags |= (DAT_COMPLETION_SUPPRESS_FLAG & completion_flags) ? 0 : IBV_SEND_SIGNALED; wr.send_flags |= (DAT_COMPLETION_BARRIER_FENCE_FLAG & completion_flags) ? IBV_SEND_FENCE : 0; wr.send_flags |= (DAT_COMPLETION_SOLICITED_WAIT_FLAG & completion_flags) ? IBV_SEND_SOLICITED : 0; dapl_dbg_log(DAPL_DBG_TYPE_EP, " post_snd: op 0x%x flags 0x%x sglist %p, %d\n", wr.opcode, wr.send_flags, wr.sg_list, wr.num_sge); #ifdef _OPENIB_MCM_ if (ep_ptr->qp_handle->tp->scif_ep) ret = dapli_mix_post_send(ep_ptr->qp_handle, total_len, &wr, &bad_wr); else if (ep_ptr->qp_handle->ep_map == MIC_XSOCK_DEV) ret = mcm_send_pi(ep_ptr->qp_handle, total_len, &wr, &bad_wr); else ret = ibv_post_send(ep_ptr->qp_handle->qp2, &wr, &bad_wr); #else ret = ibv_post_send(ep_ptr->qp_handle->qp, &wr, &bad_wr); #endif if (ret) return( dapl_convert_errno(errno,"ibv_send_ext") ); #ifdef DAPL_COUNTERS switch (op_type) { case OP_RDMA_WRITE_IMM: DAPL_CNTR(ep_ptr, DCNT_EP_POST_WRITE_IMM); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_WRITE_IMM_DATA, total_len); break; case OP_COMP_AND_SWAP: DAPL_CNTR(ep_ptr, DCNT_EP_POST_CMP_SWAP); break; case OP_FETCH_AND_ADD: DAPL_CNTR(ep_ptr, DCNT_EP_POST_FETCH_ADD); break; case OP_SEND_UD: DAPL_CNTR(ep_ptr, DCNT_EP_POST_SEND_UD); DAPL_CNTR_DATA(ep_ptr, DCNT_EP_POST_SEND_UD_DATA, total_len); break; default: break; } #endif /* DAPL_COUNTERS */ dapl_dbg_log(DAPL_DBG_TYPE_EP," post_snd: returned\n"); return DAT_SUCCESS; } #endif STATIC _INLINE_ DAT_RETURN dapls_ib_optional_prv_dat( IN DAPL_CR *cr_ptr, IN const void *event_data, OUT DAPL_CR **cr_pp) { return DAT_SUCCESS; } /* map Work Completions to DAPL WR operations */ STATIC _INLINE_ int dapls_cqe_opcode(ib_work_completion_t *cqe_p) { #ifdef DAPL_COUNTERS DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t)cqe_p->wr_id; #endif /* DAPL_COUNTERS */ switch (cqe_p->opcode) { case IBV_WC_SEND: if (CQE_WR_TYPE_UD(cqe_p->wr_id)) return(OP_SEND_UD); else return (OP_SEND); case IBV_WC_RDMA_WRITE: if (cqe_p->wc_flags & IBV_WC_WITH_IMM) return (OP_RDMA_WRITE_IMM); else return (OP_RDMA_WRITE); case IBV_WC_RDMA_READ: return (OP_RDMA_READ); case IBV_WC_COMP_SWAP: return (OP_COMP_AND_SWAP); case IBV_WC_FETCH_ADD: return (OP_FETCH_AND_ADD); case IBV_WC_BIND_MW: return (OP_BIND_MW); case IBV_WC_RECV: if (CQE_WR_TYPE_UD(cqe_p->wr_id)) { DAPL_CNTR(cookie->ep, DCNT_EP_RECV_UD); DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_UD_DATA, cqe_p->byte_len); return (OP_RECV_UD); } else if (cqe_p->wc_flags & IBV_WC_WITH_IMM) { DAPL_CNTR(cookie->ep, DCNT_EP_RECV_IMM); DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_IMM_DATA, cqe_p->byte_len); return (OP_RECEIVE_IMM); } else { DAPL_CNTR(cookie->ep, DCNT_EP_RECV); DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_DATA, cqe_p->byte_len); return (OP_RECEIVE); } case IBV_WC_RECV_RDMA_WITH_IMM: DAPL_CNTR(cookie->ep, DCNT_EP_RECV_RDMA_IMM); DAPL_CNTR_DATA(cookie->ep, DCNT_EP_RECV_RDMA_IMM_DATA, cqe_p->byte_len); return (OP_RECEIVE_IMM); default: return (OP_INVALID); } } #define DAPL_GET_CQE_OPTYPE(cqe_p) dapls_cqe_opcode(cqe_p) #define DAPL_GET_CQE_WRID(cqe_p) ((ib_work_completion_t*)cqe_p)->wr_id #define DAPL_GET_CQE_QP_NUM(cqe_p) ((ib_work_completion_t*)cqe_p)->qp_num #define DAPL_GET_CQE_STATUS(cqe_p) ((ib_work_completion_t*)cqe_p)->status #define DAPL_GET_CQE_VENDOR_ERR(cqe_p) ((ib_work_completion_t*)cqe_p)->vendor_err #define DAPL_GET_CQE_BYTESNUM(cqe_p) ((ib_work_completion_t*)cqe_p)->byte_len #define DAPL_GET_CQE_IMMED_DATA(cqe_p) ((ib_work_completion_t*)cqe_p)->imm_data STATIC _INLINE_ char * dapls_dto_op_str(int op) { static char *optable[] = { "OP_RDMA_WRITE", "OP_RDMA_WRITE_IMM", "OP_SEND", "OP_SEND_IMM", "OP_RDMA_READ", "OP_COMP_AND_SWAP", "OP_FETCH_AND_ADD", "OP_RECEIVE", "OP_RECEIVE_MSG_IMM", "OP_RECEIVE_RDMA_IMM", "OP_BIND_MW", "OP_SEND_UD", "OP_RECV_UD" }; return ((op < 0 || op > 12) ? "Invalid CQE OP?" : optable[op]); } static _INLINE_ char * dapls_cqe_op_str(IN ib_work_completion_t *cqe_ptr) { return dapls_dto_op_str(DAPL_GET_CQE_OPTYPE(cqe_ptr)); } #define DAPL_GET_CQE_OP_STR(cqe) dapls_cqe_op_str(cqe) #endif /* _DAPL_IB_DTO_H_ */ dapl-2.1.5/dapl/openib_common/dapl_mic_common.h000077500000000000000000000645131255317474200215220ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_mic_common.h * * PURPOSE: Definitions for MIC Proxy RDMA services * * MCM provider <-> MPXYD service * * This service enables MIC based DAPL provider (MCM) to use * proxy service (host CPU) for sends and RDMA write operations. * proxy RDMA reads are not supported. This service * communicates within a server platform over PCI-E bus using SCIF * and a new MIX within messaging protocol. The MCM provider uses * DAPL MCM messaging protocols on the wire. MIX protocol is defined * as part of the communication protocol between MCM provider on MIC * and the MPXYD service on the host CPU. * ***********************************************************************/ #ifndef _DAPL_MIC_COMMON_H_ #define _DAPL_MIC_COMMON_H_ #include #include /***** MIC Indirect CM (MCM) protocol over IB fabrics *****/ #define DAT_MCM_VER 1 #define DAT_MCM_UD_QKEY 0x78655322 #define DAT_MCM_PDATA_SIZE 64 #define DAT_MCM_PROXY_DATA 40 #define DAT_MCM_SEG_PO2 17 #define ALIGN_64(o) ((o + 64 - 1) & ~(64-1)) #define ALIGN_P64(o) ((((uintptr_t)o) + 64 - 1)& ~(64-1)) #define ALIGN_DOWN_64(o) ((o) & ~(64-1)) #define OFFSET_64(o) ((o) & (64-1)) #define ALIGN_PAGE(o) ((o + 4096 - 1) & ~(4096-1)) #define ALIGN_UP_PPAGE(o) ((((uintptr_t)o) + 4096 - 1)& ~(4096-1)) #define ALIGN_DOWN_PPAGE(o) ((((uintptr_t)o)) & ~(4096-1)) static inline char * mcm_qp_state_str(IN int st) { static char *qp_state[] = { "RESET", "INIT", "RTR", "RTS", "SQD", "SQE", "ERR" }; return ((st < 0 || st > 6) ? "Invalid QP state?" : qp_state[st]); } typedef enum dat_mcm_op { MCM_INVALID, MCM_REQ, MCM_REP, MCM_REJ_USER, /* user reject */ MCM_REJ_CM, /* cm reject */ MCM_RTU, MCM_DREQ, MCM_DREP } DAT_MCM_OP; static inline char * mcm_op_str(IN int op) { static char *ops[] = { "INVALID", "REQ", "REP", "REJ_USER", "REJ_CM", "RTU", "DREQ", "DREP", }; return ((op < 1 || op > 7) ? "Invalid OP?" : ops[op]); } typedef enum dat_mcm_state { MCM_INIT, MCM_LISTEN, MCM_CONN_PENDING, MCM_REP_PENDING, MCM_REP_RCV, MCM_ACCEPTING, MCM_ACCEPTING_DATA, MCM_ACCEPTED, MCM_REJECTING, MCM_REJECTED, MCM_CONNECTED, MCM_RELEASE, MCM_DISC_PENDING, MCM_DISCONNECTED, MCM_DESTROY, MCM_RTU_PENDING, MCM_DISC_RECV, MCM_FREE, } DAT_MCM_STATE; static inline char * mcm_state_str(IN int st) { static char *state[] = { "INIT", "LISTEN", "CONN_PENDING", "REP_PENDING", "REP_RECV", "ACCEPTING", "ACCEPTING_DATA", "ACCEPTED", "REJECTING", "REJECTED", "CONNECTED", "RELEASE", "DISC_PENDING", "DISCONNECTED", "DESTROY", "RTU_PENDING", "DISC_RECV", "FREE" }; return ((st < 0 || st > 17) ? "Invalid CM state?" : state[st]); } static inline char * mcm_ib_async_str(IN int st) { static char *state[] = { "IBV_EVENT_CQ_ERR", "IBV_EVENT_QP_FATAL", "IBV_EVENT_QP_REQ_ERR", "IBV_EVENT_QP_ACCESS_ERR", "IBV_EVENT_COMM_EST", "IBV_EVENT_SQ_DRAINED", "IBV_EVENT_PATH_MIG", "IBV_EVENT_PATH_MIG_ERR", "IBV_EVENT_DEVICE_FATAL", "IBV_EVENT_PORT_ACTIVE", "IBV_EVENT_PORT_ERR", "IBV_EVENT_LID_CHANGE", "IBV_EVENT_PKEY_CHANGE", "IBV_EVENT_SM_CHANGE", "IBV_EVENT_SRQ_ERR", "IBV_EVENT_SRQ_LIMIT_REACHED", "IBV_EVENT_QP_LAST_WQE_REACHED", "IBV_EVENT_CLIENT_REREGISTER", }; return ((st < 0 || st > 17) ? "Invalid IB async event?" : state[st]); } /* ep_map: mappings hint: node type and locality to device */ #define HOST_SOCK_DEV 1 /* host to HCA, any socket */ #define MIC_SSOCK_DEV 2 /* MIC to HCA, same socket */ #define MIC_XSOCK_DEV 3 /* MIC to HCA, cross socket */ #define MIC_FULL_DEV 4 /* MIC to HCA, full proxy offload, no direct verbs */ #define UND_EP(x) ((x)->ep_map < 1 || (x)->ep_map > 4) #define HST_EP(x) ((x)->ep_map == HOST_SOCK_DEV) #define MSS_EP(x) ((x)->ep_map == MIC_SSOCK_DEV) #define MXS_EP(x) ((x)->ep_map == MIC_XSOCK_DEV) #define MFO_EP(x) ((x)->ep_map == MIC_FULL_DEV) #define MXF_EP(x) ((x)->ep_map == MIC_XSOCK_DEV || (x)->ep_map == MIC_FULL_DEV) static inline char * mcm_map_str(IN uint8_t ep_map) { static char *map[] = { "", "HST", "MSS", "MXS", "MFO" }; return ((ep_map < 1 || ep_map > 4) ? "???" : map[ep_map]); } /* MCM address, 28 bytes */ typedef struct dat_mcm_addr { uint16_t family; uint16_t lid; uint32_t qpn; uint8_t gid[16]; uint8_t port; uint8_t ep_map; uint8_t sl; uint8_t qp_type; } __attribute__((packed)) dat_mcm_addr_t; /* MCM message extended after existing fields, 256 bytes */ typedef struct dat_mcm_msg { uint16_t ver; uint16_t op; uint16_t sport; /* src cm port */ uint16_t dport; /* dst cm port */ uint32_t sqpn; /* src cm qpn */ uint32_t dqpn; /* dst cm qpn */ uint16_t p_size; uint32_t s_id; /* src pid */ uint32_t d_id; /* dst pid */ uint8_t rd_in; /* atomic_rd_in */ uint8_t rsvd[4]; uint8_t seg_sz; /* data segment size in power of 2 */ dat_mcm_addr_t saddr1; /* QPt local, MPXY or MCM on non-MIC node */ dat_mcm_addr_t saddr2; /* QPr local, MIC or MCM on non-MIC node or MPXY */ dat_mcm_addr_t daddr1; /* QPt remote, MPXY or MCM on non-MIC node */ dat_mcm_addr_t daddr2; /* QPr remote, MIC or MCM on non-MIC node or MPXY */ uint8_t p_data[DAT_MCM_PDATA_SIZE]; uint8_t p_proxy[DAT_MCM_PROXY_DATA]; uint64_t sys_guid; /* system image guid */ } __attribute__((packed)) dat_mcm_msg_t; /* MCM message, 208 bytes */ typedef struct dat_mcm_msg_compat { uint16_t ver; uint16_t op; uint16_t sport; /* src cm port */ uint16_t dport; /* dst cm port */ uint32_t sqpn; /* src cm qpn */ uint32_t dqpn; /* dst cm qpn */ uint16_t p_size; uint32_t s_id; /* src pid */ uint32_t d_id; /* dst pid */ uint8_t rd_in; /* atomic_rd_in */ uint8_t resv[5];/* Shadow QP's, 2 connections */ dat_mcm_addr_t saddr; /* QPt local, MPXY or MCM on non-MIC node */ dat_mcm_addr_t saddr2; /* QPr local, MIC or MCM on non-MIC node */ dat_mcm_addr_t daddr; /* QPt remote, MPXY or MCM on non-MIC node */ dat_mcm_addr_t daddr2; /* QPr remote, MIC or MCM on non-MIC node */ uint8_t p_data[DAT_MCM_PDATA_SIZE]; } __attribute__((packed)) dat_mcm_msg_compat_t; /***** MIC Indirect Exchange (MIX) protocol over SCIF ****/ /* Revisions: * v1 - Initial release * v2 - Support 3 separate EP's per device (Operations/CM, unsolicited events, transmit) * v3 - reduce SGE from 7 to 4, add post_send inline support * v4 - pack all command structures, replace verbs wr/wc types with defined MIX types * v5 - CM services with proxy_in, private data */ #define DAT_MIX_VER 5 #define DAT_MIX_INLINE_MAX 256 #define DAT_MIX_RDMA_MAX (8*1024*1024) #define DAT_MIX_WR_MAX 500 typedef enum dat_mix_ops { MIX_IA_OPEN = 2, MIX_IA_CLOSE, MIX_LISTEN, MIX_LISTEN_FREE, MIX_MR_CREATE, MIX_MR_FREE, MIX_QP_CREATE, MIX_QP_MODIFY, MIX_QP_FREE, MIX_CQ_CREATE, MIX_CQ_FREE, MIX_CQ_POLL, MIX_CQ_POLL_NOTIFY, MIX_CM_REQ, MIX_CM_REP, MIX_CM_ACCEPT, MIX_CM_REJECT, MIX_CM_RTU, MIX_CM_EST, MIX_CM_DISC, MIX_CM_DREP, MIX_CM_EVENT, MIX_DTO_EVENT, MIX_SEND, MIX_WRITE, MIX_PROV_ATTR, MIX_RECV, MIX_CM_REJECT_USER, } dat_mix_ops_t; static inline char * mix_op_str(IN int op) { static char *mix_ops[] = { "", "", "IA_OPEN", "IA_CLOSE", "LISTEN", "LISTEN_FREE", "MR_CREATE", "MR_FREE", "QP_CREATE", "QP_MODIFY", "QP_FREE", "CQ_CREATE", "CQ_FREE", "CQ_POLL", "CQ_POLL_NOTIFY", "CM_REQ", "CM_REP", "CM_ACCEPT", "CM_REJECT", "CM_RTU", "CM_EST", "CM_DISC", "CM_DREP", "CM_EVENT", "DTO_EVENT", "POST_SEND", "POST_WRITE", "PROV_ATTR", "POST_RECV", "CM_REJECT_USER", }; return ((op < 2 || op > 28) ? "Invalid OP?" : mix_ops[op]); } typedef enum dat_mix_op_flags { MIX_OP_REQ = 0x01, MIX_OP_RSP = 0x02, MIX_OP_SYNC = 0x04, MIX_OP_ASYNC = 0x08, MIX_OP_INLINE = 0x10, MIX_OP_SET = 0x20, } dat_mix_op_flags_t; typedef enum dat_mix_op_status { MIX_SUCCESS = 0, MIX_EFAULT, /* internal error */ MIX_ENOMEM, /* no space */ MIX_EINVAL, /* invalid parameter */ MIX_ENOTCONN, /* no active RDMA channels */ MIX_ENODEV, /* no device available */ MIX_ECONNRESET, /* RDMA channel reset */ MIX_EBADF, /* RDMA channel or CM id invalid */ MIX_EAGAIN, /* busy */ MIX_EADDRINUSE, /* port or address in use */ MIX_ENETUNREACH, /* remote address unreachable */ MIX_ETIMEDOUT, /* connection time out */ MIX_EAFNOSUPPORT, /* invalid address */ MIX_EPERM, /* invalid permission */ MIX_EALREADY, /* invalid state */ MIX_ECONNREFUSED, /* connection rejected */ MIX_EISCONN, /* already connected */ MIX_EOVERFLOW, /* length error */ } dat_mix_op_status_t; /* MIX message header, 8 bytes */ typedef struct dat_mix_hdr { uint8_t ver; /* version */ uint8_t op; /* operation type */ uint8_t flags; /* operation flags */ uint8_t status; /* operation status */ uint32_t req_id; /* operation id, multiple operations */ } __attribute__((packed)) dat_mix_hdr_t; /**** MIX device attributes, 16 bytes *****/ typedef struct dat_mix_dev_attr { uint8_t ack_timer; uint8_t ack_retry; uint8_t rnr_timer; uint8_t rnr_retry; uint8_t global; uint8_t hop_limit; uint8_t tclass; uint8_t sl; uint8_t mtu; uint8_t rd_atom_in; uint8_t rd_atom_out; uint8_t pkey_idx; uint16_t pkey; uint16_t max_inline; } __attribute__((packed)) dat_mix_dev_attr_t; /**** MIX attributes, 120 bytes *****/ typedef struct dat_mix_prov_attr { uint32_t max_msg_sz; uint32_t max_tx_dtos; uint32_t max_rx_dtos; uint32_t max_tx_pool; uint32_t max_rx_pool; uint32_t tx_segment_sz; uint32_t rx_segment_sz; uint32_t cm_retry; uint32_t cm_disc_retry; uint32_t cm_rep_time_ms; uint32_t cm_rtu_time_ms; uint32_t cm_drep_time_ms; uint32_t log_level; uint32_t counters; dat_mix_dev_attr_t dev_attr; uint64_t system_guid; uint8_t gid_idx; uint32_t cpu_model; uint32_t cpu_family; uint8_t resv[31]; } __attribute__((packed)) dat_mix_prov_attr_t; /***** MIX open, device address info returned */ typedef struct dat_mix_open { dat_mix_hdr_t hdr; char name[64]; uint16_t port; /* ib physical port number */ dat_mix_dev_attr_t dev_attr; dat_mcm_addr_t dev_addr; } __attribute__((packed)) dat_mix_open_t; /***** MIX get,set attributes, 128 bytes */ typedef struct dat_mix_attr { dat_mix_hdr_t hdr; dat_mix_prov_attr_t attr; } __attribute__((packed)) dat_mix_attr_t; /***** MIX memory registration, IB and SCIF *****/ typedef struct dat_mix_mr { dat_mix_hdr_t hdr; uint64_t ctx; uint32_t mr_id; uint32_t mr_len; uint32_t ib_lkey; /* ib rkey */ uint32_t ib_rkey; /* ib rkey */ uint64_t ib_addr; /* ib addr mapping */ uint64_t sci_addr; /* scif addr, must be page aligned */ uint32_t sci_off; /* scif offset to starting address */ } __attribute__((packed)) dat_mix_mr_t; typedef struct dat_mix_mr_compat { dat_mix_hdr_t hdr; uint32_t mr_id; uint32_t len; uint64_t off; uint64_t ctx; } __attribute__((packed)) dat_mix_mr_compat_t; /***** MIX listen, status returned, no data *****/ typedef struct dat_mix_listen { dat_mix_hdr_t hdr; uint64_t sp_ctx; uint16_t sid; uint16_t backlog; } __attribute__((packed)) dat_mix_listen_t; /***** MIX create QP, 52 bytes *****/ typedef struct dat_mix_qp_attr { uint8_t qp_type; uint8_t state; uint8_t cur_state; uint8_t sq_sig_all; uint32_t qp_num; uint32_t qkey; uint32_t max_send_wr; uint32_t max_recv_wr; uint32_t max_send_sge; uint32_t max_recv_sge; uint32_t max_inline_data; uint32_t qp_id; uint32_t scq_id; uint32_t rcq_id; uint64_t ctx; } __attribute__((packed)) dat_mix_qp_attr_t; /* * For initial prototyping write streams we don't have many * completions. SCIF should be 2x speeds so once we pipeline * it will keep up with IB speeds. */ typedef struct dat_mix_qp { dat_mix_hdr_t hdr; dat_mix_qp_attr_t qp_t; /* on Proxy */ dat_mix_qp_attr_t qp_r; /* on MIC */ uint64_t m_off; /* SCIF DMA buffer pool */ uint64_t wr_off; /* SCIF work request buffer pool */ uint32_t m_len; /* size */ uint32_t m_seg; /* segment size */ uint32_t wr_len; /* size */ uint32_t m_inline; /* mpxyd inline threshold for SCIF dma */ } __attribute__((packed)) dat_mix_qp_t; /***** MIX CQ operations, create, free, poll, event *****/ typedef struct dat_mix_cq { dat_mix_hdr_t hdr; uint64_t cq_ctx; uint32_t cq_len; uint32_t cq_id; uint64_t wr_id; uint32_t status; uint32_t opcode; uint32_t vendor_err; uint32_t byte_len; uint32_t qp_num; uint32_t src_qp; uint32_t wc_flags; } __attribute__((packed)) dat_mix_cq_t; typedef struct dat_mix_cm { dat_mix_hdr_t hdr; uint64_t sp_ctx; uint64_t cm_ctx; uint32_t cm_id; uint32_t qp_id; dat_mcm_msg_t msg; } dat_mix_cm_t; typedef struct dat_mix_cm_compat { dat_mix_hdr_t hdr; uint64_t sp_ctx; uint64_t cm_ctx; uint32_t cm_id; uint32_t qp_id; dat_mcm_msg_compat_t msg; } dat_mix_cm_compat_t; typedef struct dat_mix_cm_event { dat_mix_hdr_t hdr; uint64_t cm_ctx; uint64_t qp_ctx; uint32_t cm_id; uint32_t qp_id; uint32_t event; } __attribute__((packed)) dat_mix_cm_event_t; typedef struct dat_mix_wc { uint64_t wr_id; uint32_t status; uint32_t opcode; uint32_t vendor_err; uint32_t byte_len; uint32_t imm_data; /* in network byte order */ uint32_t qp_num; uint32_t src_qp; uint32_t wc_flags; uint16_t pkey_index; uint16_t slid; uint8_t sl; uint8_t dlid_path_bits; } __attribute__((packed)) dat_mix_wc_t; typedef struct dat_mix_sge { uint64_t addr; uint32_t length; uint32_t lkey; } dat_mix_sge_t; typedef struct dat_mix_wr { uint64_t wr_id; uint32_t num_sge; uint32_t opcode; uint32_t send_flags; uint32_t imm_data; /* in network byte order */ union { struct { uint64_t remote_addr; uint32_t rkey; } rdma; struct { uint64_t remote_addr; uint64_t compare_add; uint64_t swap; uint32_t rkey; } atomic; struct { struct ibv_ah *ah; uint32_t remote_qpn; uint32_t remote_qkey; } ud; } wr; } __attribute__((packed)) dat_mix_wr_t; #define DAT_MIX_WC_MAX 4 typedef struct dat_mix_dto_comp { dat_mix_hdr_t hdr; uint64_t cq_ctx; uint32_t cq_id; uint32_t wc_cnt; struct dat_mix_wc wc[DAT_MIX_WC_MAX]; } __attribute__((packed)) dat_mix_dto_comp_t; #define DAT_MIX_SGE_MAX 4 typedef struct dat_mix_sr { dat_mix_hdr_t hdr; uint64_t qp_ctx; uint32_t qp_id; uint32_t len; struct dat_mix_wr wr; struct dat_mix_sge sge[DAT_MIX_SGE_MAX]; } __attribute__((packed)) dat_mix_sr_t; typedef union dat_mix_msg { dat_mix_open_t op; dat_mix_dev_attr_t dev; dat_mix_prov_attr_t prv; dat_mix_mr_t mr; dat_mix_listen_t ls; dat_mix_qp_t qp; dat_mix_cq_t cq; dat_mix_cm_t cm; dat_mix_cm_compat_t cm_comp; dat_mix_wc_t wc; dat_mix_wr_t wr; dat_mix_dto_comp_t dto; dat_mix_sr_t sr; } DAT_MIX_MSG; #define DAT_MIX_MSG_MAX sizeof(DAT_MIX_MSG) /* * MCM to MPXYD: work request and completion definitions * * Messaging Protocol between MCM Proxy-out and Proxy-in service agents * - WR and WC management vi IB RDMA write_imm and RDMA reads * - WR and WC written directly from remote proxy peer agent, * - Proxy-in buffer management on receive side, IB RR * - Proxy-out buffer management on send side * IB RW directly to user buffer if peer is MIC same socket * IB RW_imm to PI WR, PI RR, scif_writeto if MIC is remote socket * */ #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif /* WRC (work request/completion) imm_data definition, qdepth limits of 16 bits */ #define WRC_MAX_QLEN 1 << 16; #define MCM_WRC_QLEN 512 /* data types, WR or WC */ #define M_WR_TYPE 1 #define M_WC_TYPE 2 /* WR flags */ #define M_WR_FS 1 #define M_WR_LS 2 #define WRC_ID_DATA(x) ((x) & 0x0000ffff) #define WRC_TYPE_DATA(x) (((x) >> 16) & 0x000000ff) #define WRC_FLAGS_DATA(x) (((x) >> 24) & 0x000000ff) /* wr aligned on 64 bytes, use 4 lower bits for type id */ #define WRID_TX_RW 0x1 /* proxy out, m_wr type, RW */ #define WRID_TX_RW_IMM 0x2 /* proxy out, m_wr type, RW_imm op */ #define WRID_RX_RR 0x3 /* proxy in, m_wr_rx type, RR op */ #define WRID_RX_RW_IMM 0x4 /* proxy in, m_wr_rx type, RW_immed op */ #define WRID_MASK 0xfffffffffffffff0 #define WRID_SET(x,y) (((uint64_t)(x) | (uint64_t)(y))) #define WRID_TYPE(x) ((x & ~WRID_MASK)) #define WRID_ADDR(x) ((x & WRID_MASK)) typedef struct wrc_idata { uint16_t id; /* work request or completion slot */ uint8_t type; /* data types, WR, WC, etc */ uint8_t flags; /* flags */ } __attribute__((packed)) wrc_idata_t; enum mcm_wr_flags { M_SEND_POSTED = 1 << 0, /* m_wr already posted */ M_SEND_CN_SIG = 1 << 1, /* m_wr consumer signaled, IB completion */ M_SEND_CN_EAGER_SIG = 1 << 2, /* m_wr consumer eager signaled, SCIF read completion */ M_SEND_MP_SIG = 1 << 3, /* m_wr mpxyd signaled, segmentation, manage proxy buf/wr resources */ M_SEND_FS = 1 << 4, /* m_wr - first segment */ M_SEND_LS = 1 << 5, /* m_wr - last segment */ M_SEND_PI = 1 << 6, /* m_wr - forwarded to proxy in service */ M_SEND_INLINE = 1 << 7, /* m_wr - data in cmd msg, no scif_readfrom */ M_READ_PAUSED = 1 << 8, /* m_wr_rx waiting for proxy buffer */ M_RECV_PAUSED = 1 << 9, /* m_wr_rx waiting for posted rcv message */ M_READ_POSTED = 1 << 10, /* m_wr_rx ibv posted */ M_READ_DONE = 1 << 11, /* m_wr_rx ibv completed */ M_READ_WRITE_TO = 1 << 12, /* m_wr_rx read data forwarded to MIC scif_writeto */ M_READ_WRITE_TO_DONE = 1 << 13, /* m_wr_rx read data forwarded to MIC scif_writeto */ M_READ_CN_SIG = 1 << 14, /* m_wr_rx consumer signaled, IB completion needed */ M_READ_MP_SIG = 1 << 15, /* m_wr_rx mpxyd signaled, segmentation, manage proxy buf/wr resources */ M_READ_FROM_DONE = 1 << 16, /* m_wr mpxyd read_from_done, ready for posting */ M_SEND_DIRECT = 1 << 17, /* m_wr SEND direct from host memory, no proxy out buffer */ }; /* 80 bytes */ typedef struct mcm_sr { uint64_t wr_id; /* from consumer post_recv */ uint32_t len; /* total len */ uint32_t num_sge; /* number of sglist entries, max 4 */ uint32_t m_idx; /* proxy buffer, src */ uint32_t w_idx; /* wr_rx WR idx, data xfer in process */ uint32_t s_idx; /* my idx, sr_tl update */ struct dat_mix_sge sg[DAT_MIX_SGE_MAX]; /* consumer buffer on MIC, off_t */ } mcm_sr_t; /* 128 bytes */ typedef struct mcm_wr { struct ibv_send_wr wr; struct ibv_sge sg[DAT_MIX_SGE_MAX]; uint64_t org_id; uint64_t context; uint32_t m_idx; uint32_t w_idx; uint32_t flags; } mcm_wr_t; /* DAT_MCM_PROXY_DATA private data max (40 bytes), Proxy-in WR and WC info exchange */ typedef struct mcm_wrc_info { uint64_t wr_addr; uint32_t wr_rkey; uint32_t wr_len; uint16_t wr_sz; uint16_t wr_end; uint64_t wc_addr; uint32_t wc_rkey; uint32_t wc_len; uint16_t wc_sz; uint16_t wc_end; } __attribute__((packed)) mcm_wrc_info_t; /* WR: 160 bytes, direct RDMA write from remote Proxy-in service */ typedef struct mcm_wr_rx { struct dat_mix_wr wr; struct dat_mix_sge sg[DAT_MIX_SGE_MAX]; uint64_t org_id; uint64_t context; uint32_t m_idx; uint32_t w_idx; uint32_t s_idx; uint32_t flags; uint32_t time; uint32_t qcnt; } __attribute__((packed)) mcm_wr_rx_t; /* WC: 80 bytes, direct RDMA write from remote Proxy-in service */ typedef struct mcm_wc_rx { struct dat_mix_wc wc; uint64_t org_id; uint64_t context; uint32_t wr_idx; /* proxy-out, proxy-in WR idx */ uint32_t wr_tl; /* proxy-in WR tl update */ uint32_t flags; uint8_t rsv[6]; } __attribute__((packed)) mcm_wc_rx_t; /* Helper functions */ /* construct WRC info to msg->p_proxy, network order, during outbound CM request or reply */ static inline void mcm_hton_wrc(mcm_wrc_info_t *dst, mcm_wrc_info_t *src) { if (src->wr_addr) { dst->wr_addr = htonll(src->wr_addr); dst->wr_rkey = htonl(src->wr_rkey); dst->wr_len = htons(src->wr_len); dst->wr_sz = htons(src->wr_sz); dst->wr_end = htons(src->wr_end); } if (src->wc_addr) { dst->wc_addr = htonll(src->wc_addr); dst->wc_rkey = htonl(src->wc_rkey); dst->wc_len = htons(src->wc_len); dst->wc_sz = htons(src->wc_sz); dst->wc_end = htons(src->wc_end); } } /* get WRC info from msg->p_proxy, network order, during inbound CM request or reply */ static inline void mcm_ntoh_wrc(mcm_wrc_info_t *dst, mcm_wrc_info_t *src) { dst->wr_addr = ntohll(src->wr_addr); dst->wr_rkey = ntohl(src->wr_rkey); dst->wr_len = ntohs(src->wr_len); dst->wr_sz = ntohs(src->wr_sz); dst->wr_end = ntohs(src->wr_end); dst->wc_addr = ntohll(src->wc_addr); dst->wc_rkey = ntohl(src->wc_rkey); dst->wc_len = ntohs(src->wc_len); dst->wc_sz = ntohs(src->wc_sz); dst->wc_end = ntohs(src->wc_end); } /* construct rx_wr, network order, to send to remote proxy-in service */ static inline void mcm_hton_wr_rx(struct mcm_wr_rx *m_wr_rx, struct mcm_wr *m_wr, int wc_tl) { int i; memset((void*)m_wr_rx, 0, sizeof(*m_wr_rx)); m_wr_rx->org_id = (uint64_t) htonll((uint64_t)m_wr); /* proxy_out WR */ m_wr_rx->flags = htonl(m_wr->flags); m_wr_rx->w_idx = htonl(wc_tl); /* snd back wc tail */ m_wr_rx->wr.num_sge = htonl(m_wr->wr.num_sge); m_wr_rx->wr.opcode = htonl(m_wr->wr.opcode); m_wr_rx->wr.send_flags = htonl(m_wr->wr.send_flags); m_wr_rx->wr.imm_data = htonl(m_wr->wr.imm_data); m_wr_rx->wr.wr.rdma.remote_addr = htonll(m_wr->wr.wr.rdma.remote_addr); /* final dst on MIC */ m_wr_rx->wr.wr.rdma.rkey = htonl(m_wr->wr.wr.rdma.rkey); for (i=0;iwr.num_sge;i++) { m_wr_rx->sg[i].addr = htonll(m_wr->sg[i].addr); /* proxy-out buffer */ m_wr_rx->sg[i].lkey = htonl(m_wr->sg[i].lkey); m_wr_rx->sg[i].length = htonl(m_wr->sg[i].length); } } /* convert rx wr, arrived across fabric from remote proxy-out service in network order */ static inline void mcm_ntoh_wr_rx(struct mcm_wr_rx *m_wr_rx) { int i; m_wr_rx->org_id = ntohll(m_wr_rx->org_id); /* proxy_out WR */ m_wr_rx->flags = ntohl(m_wr_rx->flags); m_wr_rx->w_idx = ntohl(m_wr_rx->w_idx); /* WC tail update from proxy_out */ m_wr_rx->wr.num_sge = ntohl(m_wr_rx->wr.num_sge); m_wr_rx->wr.opcode = ntohl(m_wr_rx->wr.opcode); m_wr_rx->wr.send_flags = ntohl(m_wr_rx->wr.send_flags); m_wr_rx->wr.imm_data = ntohl(m_wr_rx->wr.imm_data); m_wr_rx->wr.wr.rdma.remote_addr = ntohll(m_wr_rx->wr.wr.rdma.remote_addr); /* final dest on MIC */ m_wr_rx->wr.wr.rdma.rkey = ntohl(m_wr_rx->wr.wr.rdma.rkey); for (i=0;iwr.num_sge;i++) { m_wr_rx->sg[i].addr = ntohll(m_wr_rx->sg[i].addr); /* proxy-out buffer segment, ibv */ m_wr_rx->sg[i].lkey = ntohl(m_wr_rx->sg[i].lkey); m_wr_rx->sg[i].length = ntohl(m_wr_rx->sg[i].length); } /* For HST->MXS sg[0-3] can be direct SRC segments for RR, all others will be 1 seg */ /* sg[1] == proxy-in buffer segment, ibv */ /* sg[2] == proxy-in scif sendto src segment, scif offset */ /* sg[3] == proxy-in scif sendto dst segment, scif offset */ } /* construct a rx_wc in network order to send to remote proxy-in service */ static inline void mcm_hton_wc_rx(struct mcm_wc_rx *m_wc_rx, struct mcm_wr_rx *m_wr_rx, int wr_tl, int status) { memset((void*)m_wc_rx, 0, sizeof(*m_wc_rx)); m_wc_rx->wr_idx = htonl(m_wr_rx->w_idx); /* proxy-in WR idx == proxy-out WR idx */ m_wc_rx->wr_tl = htonl(wr_tl); /* proxy-in WR tail update, moves slower than proxy-out */ m_wc_rx->flags = htonl(m_wr_rx->flags); m_wc_rx->wc.wr_id = htonll(m_wr_rx->org_id); m_wc_rx->wc.status = htonl(status); m_wc_rx->wc.byte_len = htonl(m_wr_rx->sg[0].length); if (m_wr_rx->wr.opcode == IBV_WR_RDMA_WRITE_WITH_IMM) { m_wc_rx->wc.wc_flags = htonl(IBV_WC_WITH_IMM); m_wc_rx->wc.opcode = htonl(IBV_WC_RDMA_WRITE); } else if (m_wr_rx->wr.opcode == IBV_WR_RDMA_WRITE) m_wc_rx->wc.opcode = htonl(IBV_WC_RDMA_WRITE); else m_wc_rx->wc.opcode = htonl(IBV_WC_SEND); } /* convert rx wc, arrived across fabric from remote proxy-in service in network order */ static inline void mcm_ntoh_wc_rx(struct mcm_wc_rx *m_wc_rx) { m_wc_rx->wr_idx = ntohl(m_wc_rx->wr_idx); m_wc_rx->wr_tl = ntohl(m_wc_rx->wr_tl); m_wc_rx->flags = ntohl(m_wc_rx->flags); m_wc_rx->wc.wr_id = ntohll(m_wc_rx->wc.wr_id); m_wc_rx->wc.status = ntohl(m_wc_rx->wc.status); m_wc_rx->wc.byte_len = ntohl(m_wc_rx->wc.byte_len); m_wc_rx->wc.opcode = ntohl(m_wc_rx->wc.opcode); m_wc_rx->wc.wc_flags = ntohl(m_wc_rx->wc.wc_flags); } static inline void mcm_const_mix_wr(struct dat_mix_wr *mwr, struct ibv_send_wr *iwr) { memset((void*)mwr, 0, sizeof(*mwr)); mwr->wr_id = iwr->wr_id; mwr->num_sge = iwr->num_sge; mwr->opcode = iwr->opcode; mwr->send_flags = iwr->send_flags; mwr->imm_data = iwr->imm_data; mwr->wr.rdma.remote_addr = iwr->wr.rdma.remote_addr; mwr->wr.rdma.rkey = iwr->wr.rdma.rkey; } static inline void mcm_const_ib_wc(struct ibv_wc *iwc, struct dat_mix_wc *mwc, int entries) { int i; for (i=0;i #ifdef DAT_IB_COLLECTIVES #include "collectives/ib_collectives.h" #endif DAT_RETURN dapli_post_ext(IN DAT_EP_HANDLE ep_handle, IN DAT_UINT64 cmp_add, IN DAT_UINT64 swap, IN DAT_UINT32 immed_data, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN int op_type, IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah); DAT_RETURN dapli_open_query_ext(IN const DAT_NAME_PTR name, OUT DAT_IA_HANDLE * ia_handle, IN DAT_IA_ATTR_MASK ia_mask, OUT DAT_IA_ATTR * ia_attr, IN DAT_PROVIDER_ATTR_MASK pr_mask, OUT DAT_PROVIDER_ATTR * pr_attr); /* * dapl_extensions * * Process extension requests * * Input: * ext_type, * ... * * Output: * Depends.... * * Returns: * DAT_SUCCESS * DAT_NOT_IMPLEMENTED * ..... * */ DAT_RETURN dapl_extensions(IN DAT_HANDLE dat_handle, IN DAT_EXTENDED_OP ext_op, IN va_list args) { DAT_EP_HANDLE ep; DAT_IB_ADDR_HANDLE *ah = NULL; DAT_LMR_TRIPLET *lmr_p; DAT_DTO_COOKIE cookie; const DAT_RMR_TRIPLET *rmr_p; DAT_UINT64 dat_uint64a, dat_uint64b; DAT_UINT32 dat_uint32; DAT_COUNT segments = 1; DAT_COMPLETION_FLAGS comp_flags; DAT_RETURN status = DAT_NOT_IMPLEMENTED; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_extensions(hdl %p operation %d, ...)\n", dat_handle, ext_op); switch ((int)ext_op) { case DAT_IB_OPEN_QUERY_OP: { dapl_dbg_log(DAPL_DBG_TYPE_RTN, " OPEN_QUERY extension call\n"); DAT_IA_HANDLE *ia_handle = va_arg(args, DAT_IA_HANDLE *); DAT_IA_ATTR_MASK ia_mask = va_arg(args, DAT_IA_ATTR_MASK); DAT_IA_ATTR *ia_attr = va_arg(args, DAT_IA_ATTR *); DAT_PROVIDER_ATTR_MASK pr_mask = va_arg(args, DAT_PROVIDER_ATTR_MASK); DAT_PROVIDER_ATTR *pr_attr = va_arg(args, DAT_PROVIDER_ATTR *); DAT_NAME_PTR name = (DAT_NAME_PTR) dat_handle; status = dapli_open_query_ext(name, ia_handle, ia_mask, ia_attr, pr_mask, pr_attr); break; } case DAT_IB_CLOSE_QUERY_OP: dapl_dbg_log(DAPL_DBG_TYPE_RTN, " CLOSE_QUERY extension call\n"); status = dapl_ia_close(dat_handle, DAT_CLOSE_ABRUPT_FLAG); break; case DAT_IB_RDMA_WRITE_IMMED_OP: dapl_dbg_log(DAPL_DBG_TYPE_RTN, " WRITE_IMMED_DATA extension call\n"); ep = dat_handle; /* ep_handle */ segments = va_arg(args, DAT_COUNT); /* num segments */ lmr_p = va_arg(args, DAT_LMR_TRIPLET *); cookie = va_arg(args, DAT_DTO_COOKIE); rmr_p = va_arg(args, const DAT_RMR_TRIPLET *); dat_uint32 = va_arg(args, DAT_UINT32); /* immed data */ comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); status = dapli_post_ext(ep, 0, 0, dat_uint32, segments, lmr_p, cookie, rmr_p, OP_RDMA_WRITE_IMM, comp_flags, ah); break; case DAT_IB_CMP_AND_SWAP_OP: dapl_dbg_log(DAPL_DBG_TYPE_RTN, " CMP_AND_SWAP extension call\n"); ep = dat_handle; /* ep_handle */ dat_uint64a = va_arg(args, DAT_UINT64); /* cmp_value */ dat_uint64b = va_arg(args, DAT_UINT64); /* swap_value */ lmr_p = va_arg(args, DAT_LMR_TRIPLET *); cookie = va_arg(args, DAT_DTO_COOKIE); rmr_p = va_arg(args, const DAT_RMR_TRIPLET *); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); status = dapli_post_ext(ep, dat_uint64a, dat_uint64b, 0, segments, lmr_p, cookie, rmr_p, OP_COMP_AND_SWAP, comp_flags, ah); break; case DAT_IB_FETCH_AND_ADD_OP: dapl_dbg_log(DAPL_DBG_TYPE_RTN, " FETCH_AND_ADD extension call\n"); ep = dat_handle; /* ep_handle */ dat_uint64a = va_arg(args, DAT_UINT64); /* add value */ lmr_p = va_arg(args, DAT_LMR_TRIPLET *); cookie = va_arg(args, DAT_DTO_COOKIE); rmr_p = va_arg(args, const DAT_RMR_TRIPLET *); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); status = dapli_post_ext(ep, dat_uint64a, 0, 0, segments, lmr_p, cookie, rmr_p, OP_FETCH_AND_ADD, comp_flags, ah); break; case DAT_IB_UD_SEND_OP: dapl_dbg_log(DAPL_DBG_TYPE_RTN, " UD post_send extension call\n"); ep = dat_handle; /* ep_handle */ segments = va_arg(args, DAT_COUNT); /* segments */ lmr_p = va_arg(args, DAT_LMR_TRIPLET *); ah = va_arg(args, DAT_IB_ADDR_HANDLE *); cookie = va_arg(args, DAT_DTO_COOKIE); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); status = dapli_post_ext(ep, 0, 0, 0, segments, lmr_p, cookie, NULL, OP_SEND_UD, comp_flags, ah); break; case DAT_IB_UD_CM_FREE_OP: { ib_cm_srvc_handle_t cm; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " UD cm_free extension call\n"); ep = dat_handle; cm = (ib_cm_srvc_handle_t) va_arg(args, DAT_UINT64); if (DAPL_BAD_HANDLE(ep, DAPL_MAGIC_EP)) status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); else { status = dapls_ud_cm_free(ep, cm); } break; } case DAT_IB_UD_AH_FREE_OP: { DAT_IB_ADDR_HANDLE *dat_ah; uint16_t lid; int ret; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " UD ah_free extension call\n"); ep = dat_handle; dat_ah = va_arg(args, DAT_IB_ADDR_HANDLE *); if (DAPL_BAD_HANDLE(ep, DAPL_MAGIC_EP)) { status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } else { lid = ntohs(((union dcm_addr *)&dat_ah->ia_addr)->ib.lid); if (lid > DCM_AH_SPACE) { status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); break; } errno = 0; if (!((DAPL_EP *)ep)->qp_handle->ah[lid]) ret = ibv_destroy_ah(dat_ah->ah); status = dapl_convert_errno(errno, "destroy_ah"); } break; } #ifdef DAPL_COUNTERS case DAT_QUERY_COUNTERS_OP: { int cntr, reset; DAT_UINT64 *p_cntr_out; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " Query counter extension call\n"); cntr = va_arg(args, int); p_cntr_out = va_arg(args, DAT_UINT64 *); reset = va_arg(args, int); status = dapl_query_counter(dat_handle, cntr, p_cntr_out, reset); break; } case DAT_PRINT_COUNTERS_OP: { int cntr, reset; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " Print counter extension call\n"); cntr = va_arg(args, int); reset = va_arg(args, int); dapl_print_counter(dat_handle, cntr, reset); status = DAT_SUCCESS; break; } case DAT_IB_START_COUNTERS_OP: { DAT_IA_COUNTER_TYPE type; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " Start counter extension call\n"); type = va_arg(args, int); dapl_start_counters(dat_handle, type); status = DAT_SUCCESS; break; } case DAT_IB_STOP_COUNTERS_OP: { DAT_IA_COUNTER_TYPE type; dapl_dbg_log(DAPL_DBG_TYPE_RTN, " Start counter extension call\n"); type = va_arg(args, int); dapl_stop_counters(dat_handle, type); status = DAT_SUCCESS; break; } #endif /* DAPL_COUNTERS */ #ifdef DAT_IB_COLLECTIVES case DAT_IB_COLLECTIVE_CREATE_MEMBER_OP: { void *progress_func; DAT_IB_COLLECTIVE_MEMBER *member_p; DAT_COUNT *size_p; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, " COLLECTIVE_CREATE_MEMBER extension call\n"); progress_func = va_arg(args, void *); member_p = va_arg(args, DAT_IB_COLLECTIVE_MEMBER *); size_p = va_arg(args, DAT_COUNT *); return dapli_create_collective_member(dat_handle, progress_func, size_p, member_p); } case DAT_IB_COLLECTIVE_FREE_MEMBER_OP: { DAT_IB_COLLECTIVE_MEMBER member; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, " COLLECTIVE_FREE_MEMBER extension call\n"); member = va_arg(args, DAT_IB_COLLECTIVE_MEMBER); return dapli_free_collective_member(dat_handle, member); } case DAT_IB_COLLECTIVE_CREATE_GROUP_OP: { DAT_CONTEXT context; DAT_IB_COLLECTIVE_MEMBER *members; DAT_IB_COLLECTIVE_GROUP *grp; DAT_IB_COLLECTIVE_RANK rank; DAT_IB_COLLECTIVE_ID id; DAT_PZ_HANDLE pd; DAT_COUNT size; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, " DAT_IB_COLLECTIVE_CREATE_GROUP extension call\n"); members = va_arg(args, DAT_IB_COLLECTIVE_MEMBER *);/* array */ size = va_arg(args, DAT_COUNT);/* member count */ rank = va_arg(args, DAT_IB_COLLECTIVE_RANK);/* rank */ id = va_arg(args, DAT_IB_COLLECTIVE_ID);/* group id */ grp = va_arg(args, DAT_IB_COLLECTIVE_GROUP *);/* group info */ pd = va_arg(args, DAT_PZ_HANDLE);/* prot domain */ context = va_arg(args, DAT_CONTEXT); return dapli_create_collective_group(dat_handle, pd, members, size, rank, id, grp, context); } case DAT_IB_COLLECTIVE_FREE_GROUP_OP: { dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, " DAT_IB_COLLECTIVE_FREE_GROUP extension call\n"); return dapli_free_collective_group(dat_handle); } case DAT_IB_COLLECTIVE_BARRIER_OP: { DAT_CONTEXT context; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_BARRIER extension call\n"); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_barrier(dat_handle, context, comp_flags); } case DAT_IB_COLLECTIVE_BROADCAST_OP: { DAT_CONTEXT context; DAT_PVOID buf; DAT_COUNT size; DAT_IB_COLLECTIVE_RANK root; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_BROADCAST extension call\n"); buf = va_arg(args, DAT_PVOID); size = va_arg(args, DAT_COUNT); root = va_arg(args, DAT_IB_COLLECTIVE_RANK); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_broadcast(dat_handle, buf, size, root, context, comp_flags); } case DAT_IB_COLLECTIVE_REDUCE_OP: { DAT_CONTEXT context; DAT_IB_COLLECTIVE_RANK root; DAT_PVOID sbuf, rbuf; DAT_COUNT slen, rlen; DAT_IB_COLLECTIVE_REDUCE_DATA_OP op; DAT_IB_COLLECTIVE_DATA_TYPE type; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_REDUCE extension call\n"); sbuf = va_arg(args, DAT_PVOID); slen = va_arg(args, DAT_COUNT); rbuf = va_arg(args, DAT_PVOID); rlen = va_arg(args, DAT_COUNT); op = va_arg(args, DAT_IB_COLLECTIVE_REDUCE_DATA_OP); type = va_arg(args, DAT_IB_COLLECTIVE_DATA_TYPE); root = va_arg(args, DAT_IB_COLLECTIVE_RANK); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_reduce(dat_handle, sbuf, slen, rbuf, rlen, op, type, root, context, comp_flags); } case DAT_IB_COLLECTIVE_ALLREDUCE_OP: { DAT_CONTEXT context; DAT_PVOID sbuf, rbuf; DAT_COUNT slen, rlen; DAT_IB_COLLECTIVE_REDUCE_DATA_OP op; DAT_IB_COLLECTIVE_DATA_TYPE type; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_ALLREDUCE extension call\n"); sbuf = va_arg(args, DAT_PVOID); slen = va_arg(args, DAT_COUNT); rbuf = va_arg(args, DAT_PVOID); rlen = va_arg(args, DAT_COUNT); op = va_arg(args, DAT_IB_COLLECTIVE_REDUCE_DATA_OP); type = va_arg(args, DAT_IB_COLLECTIVE_DATA_TYPE); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_allreduce(dat_handle, sbuf, slen, rbuf, rlen, op, type, context, comp_flags); } case DAT_IB_COLLECTIVE_ALLGATHER_OP: { DAT_CONTEXT context; DAT_PVOID sbuf, rbuf; DAT_COUNT slen, rlen; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_ALLGATHER extension call\n"); sbuf = va_arg(args, DAT_PVOID); slen = va_arg(args, DAT_COUNT); rbuf = va_arg(args, DAT_PVOID); rlen = va_arg(args, DAT_COUNT); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_allgather(dat_handle, sbuf, slen, rbuf, rlen, context, comp_flags); } case DAT_IB_COLLECTIVE_ALLGATHERV_OP: { DAT_CONTEXT context; DAT_PVOID sbuf, rbuf; DAT_COUNT slen; DAT_COUNT *rlens; DAT_COUNT *displs; dapl_dbg_log(DAPL_DBG_TYPE_EXTENSION, "Got DAT_IB_COLLECTIVE_ALLGATHERV extension call\n"); sbuf = va_arg(args, DAT_PVOID); slen = va_arg(args, DAT_COUNT); rbuf = va_arg(args, DAT_PVOID); rlens = va_arg(args, DAT_COUNT *); displs = va_arg(args, DAT_COUNT *); context = va_arg(args, DAT_CONTEXT); comp_flags = va_arg(args, DAT_COMPLETION_FLAGS); return dapli_collective_allgatherv(dat_handle, sbuf, slen, rbuf, rlens, displs, context, comp_flags); } #endif default: dapl_dbg_log(DAPL_DBG_TYPE_ERR, "unsupported extension(%d)\n", (int)ext_op); } return (status); } DAT_RETURN dapli_post_ext(IN DAT_EP_HANDLE ep_handle, IN DAT_UINT64 cmp_add, IN DAT_UINT64 swap, IN DAT_UINT32 immed_data, IN DAT_COUNT segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN int op_type, IN DAT_COMPLETION_FLAGS flags, IN DAT_IB_ADDR_HANDLE * ah) { DAPL_EP *ep_ptr; ib_qp_handle_t qp_ptr; DAPL_COOKIE *cookie = NULL; DAT_RETURN dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, " post_ext_op: ep %p cmp_val %d " "swap_val %d cookie 0x%x, r_iov %p, flags 0x%x, ah %p\n", ep_handle, (unsigned)cmp_add, (unsigned)swap, (unsigned)user_cookie.as_64, remote_iov, flags, ah); if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP)); ep_ptr = (DAPL_EP *) ep_handle; qp_ptr = ep_ptr->qp_handle; /* * Synchronization ok since this buffer is only used for send * requests, which aren't allowed to race with each other. */ dat_status = dapls_dto_cookie_alloc(&ep_ptr->req_buffer, DAPL_DTO_TYPE_EXTENSION, user_cookie, &cookie); if (dat_status != DAT_SUCCESS) goto bail; /* * Take reference before posting to avoid race conditions with * completions */ dapl_os_atomic_inc(&ep_ptr->req_count); /* * Invoke provider specific routine to post DTO */ dat_status = dapls_ib_post_ext_send(ep_ptr, op_type, cookie, segments, /* data segments */ local_iov, remote_iov, immed_data, /* immed data */ cmp_add, /* compare or add */ swap, /* swap */ flags, ah); if (dat_status != DAT_SUCCESS) { dapl_os_atomic_dec(&ep_ptr->req_count); dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie); } bail: return dat_status; } /* * New provider routine to process extended DTO events */ void dapls_cqe_to_event_extension(IN DAPL_EP * ep_ptr, IN DAPL_COOKIE * cookie, IN ib_work_completion_t * cqe_ptr, IN DAT_EVENT * event_ptr) { uint32_t ibtype; DAT_DTO_COMPLETION_EVENT_DATA *dto = &event_ptr->event_data.dto_completion_event_data; DAT_IB_EXTENSION_EVENT_DATA *ext_data = (DAT_IB_EXTENSION_EVENT_DATA *) & event_ptr->event_extension_data[0]; DAT_DTO_COMPLETION_STATUS dto_status; /* Get status from cqe */ dto_status = dapls_ib_get_dto_status(cqe_ptr); dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: dto_ptr %p ext_ptr %p status %d\n", dto, ext_data, dto_status); event_ptr->event_number = DAT_IB_DTO_EVENT; dto->ep_handle = cookie->ep; dto->user_cookie = cookie->val.dto.cookie; dto->operation = DAPL_GET_CQE_DTOS_OPTYPE(cqe_ptr); /* new for 2.0 */ dto->status = ext_data->status = dto_status; if (dto_status != DAT_DTO_SUCCESS) return; /* * Get operation type from CQ work completion entry and * if extented operation then set extended event data */ ibtype = DAPL_GET_CQE_OPTYPE(cqe_ptr); switch (ibtype) { case OP_RDMA_WRITE_IMM: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: OP_RDMA_WRITE_IMMED\n"); /* type and outbound rdma write transfer size */ dto->transfered_length = cookie->val.dto.size; ext_data->type = DAT_IB_RDMA_WRITE_IMMED; break; case OP_RECEIVE_IMM: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: OP_RECEIVE_RDMA_IMMED\n"); /* immed recvd, type and inbound rdma write transfer size */ dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); ext_data->type = DAT_IB_RDMA_WRITE_IMMED_DATA; ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr); break; case OP_RECEIVE_MSG_IMM: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: OP_RECEIVE_MSG_IMMED\n"); /* immed recvd, type and inbound recv message transfer size */ dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); ext_data->type = DAT_IB_RECV_IMMED_DATA; ext_data->val.immed.data = DAPL_GET_CQE_IMMED_DATA(cqe_ptr); break; case OP_COMP_AND_SWAP: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: COMP_AND_SWAP_RESP\n"); /* original data is returned in LMR provided with post */ ext_data->type = DAT_IB_CMP_AND_SWAP; dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); break; case OP_FETCH_AND_ADD: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: FETCH_AND_ADD_RESP\n"); /* original data is returned in LMR provided with post */ ext_data->type = DAT_IB_FETCH_AND_ADD; dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); break; case OP_SEND_UD: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_SEND\n"); /* type and outbound send transfer size */ ext_data->type = DAT_IB_UD_SEND; dto->transfered_length = cookie->val.dto.size; break; case OP_RECV_UD: dapl_dbg_log(DAPL_DBG_TYPE_EVD, " cqe_to_event_ext: UD_RECV\n"); /* type and inbound recv message transfer size */ ext_data->type = DAT_IB_UD_RECV; dto->transfered_length = DAPL_GET_CQE_BYTESNUM(cqe_ptr); break; default: /* not extended operation */ ext_data->status = DAT_IB_OP_ERR; dto->status = DAT_DTO_ERR_TRANSPORT; break; } } /* * dapli_open_query_ext * * * Direct link to provider for quick provider query without full IA device open * * Input: * provider name * ia_attr * provider_attr * * Output: * ia_attr * provider_attr * * Return Values: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_PROVIDER_NOT_FOUND (returned by dat registry if necessary) */ DAT_RETURN dapli_open_query_ext(IN const DAT_NAME_PTR name, OUT DAT_IA_HANDLE * ia_handle_ptr, IN DAT_IA_ATTR_MASK ia_mask, OUT DAT_IA_ATTR * ia_attr, IN DAT_PROVIDER_ATTR_MASK pr_mask, OUT DAT_PROVIDER_ATTR * pr_attr) { DAT_RETURN dat_status = DAT_SUCCESS; DAT_PROVIDER *provider; DAPL_HCA *hca_ptr = NULL; DAT_IA_HANDLE ia_ptr = NULL; dapl_log(DAPL_DBG_TYPE_EXTENSION, "dapli_open_query_ext (%s, 0x%llx, %p, 0x%x, %p)\n", name, ia_mask, ia_attr, pr_mask, pr_attr); dat_status = dapl_provider_list_search(name, &provider); if (DAT_SUCCESS != dat_status) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); goto bail; } /* ia_handle_ptr and async_evd_handle_ptr cannot be NULL */ if ((ia_attr == NULL) && (pr_attr == NULL)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); } /* initialize the caller's OUT param */ *ia_handle_ptr = DAT_HANDLE_NULL; /* get the hca_ptr */ hca_ptr = (DAPL_HCA *) provider->extension; /* log levels could be reset and set between open_query calls */ if (dapl_os_get_env_val("DAPL_DBG_TYPE", 0)) g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE", 0); /* * Open the HCA if it has not been done before. */ dapl_os_lock(&hca_ptr->lock); if (hca_ptr->ib_hca_handle == IB_INVALID_HANDLE) { /* open in query mode */ dat_status = dapls_ib_open_hca(hca_ptr->name, hca_ptr, DAPL_OPEN_QUERY); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_ib_open_hca failed %x\n", dat_status); dapl_os_unlock(&hca_ptr->lock); goto bail; } } /* Take a reference on the hca_handle */ dapl_os_atomic_inc(&hca_ptr->handle_ref_count); dapl_os_unlock(&hca_ptr->lock); /* Allocate and initialize ia structure */ ia_ptr = (DAT_IA_HANDLE) dapl_ia_alloc(provider, hca_ptr); if (!ia_ptr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto cleanup; } dat_status = dapl_ia_query(ia_ptr, NULL, ia_mask, ia_attr, pr_mask, pr_attr); if (dat_status != DAT_SUCCESS) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_ib_query_hca failed %x\n", dat_status); goto cleanup; } *ia_handle_ptr = ia_ptr; return DAT_SUCCESS; cleanup: /* close device and release HCA reference */ if (ia_ptr) { dapl_ia_close(ia_ptr, DAT_CLOSE_ABRUPT_FLAG); } else { dapl_os_lock(&hca_ptr->lock); dapls_ib_close_hca(hca_ptr); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; dapl_os_atomic_dec(&hca_ptr->handle_ref_count); dapl_os_unlock(&hca_ptr->lock); } bail: return dat_status; } dapl-2.1.5/dapl/openib_common/mem.c000066400000000000000000000244161255317474200171460ustar00rootroot00000000000000/* * Copyright (c) 2005-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_lmr_util.h" /* * dapls_convert_privileges * * Convert LMR privileges to provider * * Input: * DAT_MEM_PRIV_FLAGS * * Output: * none * * Returns: * ibv_access_flags * */ STATIC _INLINE_ int dapls_convert_privileges(IN DAT_MEM_PRIV_FLAGS privileges) { int access = 0; /* * if (DAT_MEM_PRIV_LOCAL_READ_FLAG & privileges) do nothing */ if (DAT_MEM_PRIV_LOCAL_WRITE_FLAG & privileges) access |= IBV_ACCESS_LOCAL_WRITE; if (DAT_MEM_PRIV_REMOTE_WRITE_FLAG & privileges) access |= IBV_ACCESS_REMOTE_WRITE; if (DAT_MEM_PRIV_REMOTE_READ_FLAG & privileges) access |= IBV_ACCESS_REMOTE_READ; #ifdef DAT_EXTENSIONS if (DAT_IB_MEM_PRIV_REMOTE_ATOMIC & privileges) access |= IBV_ACCESS_REMOTE_ATOMIC; #endif return access; } /* * dapl_ib_pd_alloc * * Alloc a PD * * Input: * ia_handle IA handle * pz pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_pd_alloc(IN DAPL_IA * ia_ptr, IN DAPL_PZ * pz) { /* get a protection domain */ pz->pd_handle = ibv_alloc_pd(ia_ptr->hca_ptr->ib_hca_handle); if (!pz->pd_handle) return (dapl_convert_errno(ENOMEM, "alloc_pd")); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " pd_alloc: pd_handle=%p\n", pz->pd_handle); return DAT_SUCCESS; } /* * dapl_ib_pd_free * * Free a PD * * Input: * ia_handle IA handle * PZ_ptr pointer to PZ struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_pd_free(IN DAPL_PZ * pz) { if (pz->pd_handle != IB_INVALID_HANDLE) { ibv_dealloc_pd(pz->pd_handle); pz->pd_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register * * Register a virtual memory region * * Input: * ia_handle IA handle * lmr pointer to dapl_lmr struct * virt_addr virtual address of beginning of mem region * length length of memory region * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register(IN DAPL_IA * ia_ptr, IN DAPL_LMR * lmr, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type) { struct ibv_device *ibv_dev = ia_ptr->hca_ptr->ib_hca_handle->device; int ib_access = dapls_convert_privileges(privileges); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " mr_register: ia=%p, lmr=%p va=%p ln=%d pv=0x%x\n", ia_ptr, lmr, virt_addr, length, privileges); if (lmr->param.mem_type == DAT_MEM_TYPE_SHARED_VIRTUAL) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* iWARP only support */ if ((va_type == DAT_VA_TYPE_ZB) && (ibv_dev->transport_type != IBV_TRANSPORT_IWARP)) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " va_type == DAT_VA_TYPE_ZB: NOT SUPPORTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } #ifdef _OPENIB_MCM_ ib_access |= IBV_ACCESS_REMOTE_READ; /* HST->MXS, peer PI RR */ #endif /* local read is default on IB */ lmr->mr_handle = ibv_reg_mr(((DAPL_PZ *) lmr->param.pz_handle)->pd_handle, virt_addr, length, ib_access); if (!lmr->mr_handle) return (dapl_convert_errno(ENOMEM, "reg_mr")); lmr->param.lmr_context = lmr->mr_handle->lkey; lmr->param.rmr_context = lmr->mr_handle->rkey; lmr->param.registered_size = length; lmr->param.registered_address = (DAT_VADDR) (uintptr_t) virt_addr; dapl_log(DAPL_DBG_TYPE_UTIL, " mr_register: mr=%p addr=%p pd %p ctx %p " "lkey=0x%x rkey=0x%x priv=%x\n", lmr->mr_handle, lmr->mr_handle->addr, lmr->mr_handle->pd, lmr->mr_handle->context, lmr->mr_handle->lkey, lmr->mr_handle->rkey, length, dapls_convert_privileges(privileges)); #ifdef _OPENIB_MCM_ /* RDMA proxy with MPXYD register with SCIF */ if (ia_ptr->hca_ptr->ib_trans.scif_tx_ep) { DAT_VLEN offset = (DAT_VLEN)(virt_addr - ALIGN_DOWN_PPAGE(virt_addr)); lmr->sci_addr = scif_register(ia_ptr->hca_ptr->ib_trans.scif_tx_ep, (void*)ALIGN_DOWN_PPAGE(virt_addr), ALIGN_PAGE(length + offset), (off_t)0, SCIF_PROT_READ | SCIF_PROT_WRITE, 0); if (lmr->sci_addr == (off_t)(-1)) { dapl_log(DAPL_DBG_TYPE_ERR, " mr_reg: SCIF va=%p, %p len=%d ep=%d, %s\n", virt_addr, (void*)ALIGN_DOWN_PPAGE(virt_addr), ALIGN_PAGE(length + offset), ia_ptr->hca_ptr->ib_trans.scif_tx_ep, strerror(errno)); return (dapl_convert_errno(ENOMEM, "reg_mr_scif")); } lmr->sci_off = offset; dapl_log(DAPL_DBG_TYPE_UTIL, " mr_reg: SCIF va %p, scif_addr 0x%llx, off 0x%x ln %d %s\n", (void*)ALIGN_DOWN_PPAGE(virt_addr), lmr->sci_addr, lmr->sci_off, ALIGN_PAGE(length + offset), mcm_map_str(ia_ptr->hca_ptr->ib_trans.addr.ep_map)); /* plus cross socket proxy-in; send registration info to MPXYD */ if (MXS_EP(&ia_ptr->hca_ptr->ib_trans.addr)) { if (dapli_mix_mr_create(&ia_ptr->hca_ptr->ib_trans, lmr)) { dapls_ib_mr_deregister(lmr); return (dapl_convert_errno(ENOMEM, "reg_mr")); } } } #endif dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " mr_register: ia=%p, lmr=%p va=%p ln=%d priv=%d return\n", ia_ptr, lmr, virt_addr, length, privileges); return DAT_SUCCESS; } /* * dapl_ib_mr_deregister * * Free a memory region * * Input: * lmr pointer to dapl_lmr struct * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mr_deregister(IN DAPL_LMR * lmr) { #ifdef _OPENIB_MCM_ if (lmr->header.owner_ia->hca_ptr->ib_trans.scif_ep) { int ret; if (lmr->header.owner_ia->hca_ptr->ib_trans.addr.ep_map == MIC_XSOCK_DEV) { if (dapli_mix_mr_free(&lmr->header.owner_ia->hca_ptr->ib_trans, lmr)) { dapl_log(DAPL_DBG_TYPE_ERR, " mr_deregister: ERR: lmr_remove; id %d sci_addr %p, off 0x%llx, len %d ret=%s\n", lmr->mr_id, lmr->param.registered_address, lmr->sci_addr, ALIGN_PAGE(lmr->param.registered_size+lmr->sci_off), strerror(errno)); } } ret = scif_unregister(lmr->header.owner_ia->hca_ptr->ib_trans.scif_tx_ep, lmr->sci_addr, ALIGN_PAGE(lmr->param.registered_size+lmr->sci_off)); if (ret) dapl_log(DAPL_DBG_TYPE_ERR, " mr_deregister: ERR: SCIF_unreg addr %p, off 0x%llx, len %d ret=%s\n", lmr->param.registered_address, lmr->sci_off, ALIGN_PAGE(lmr->param.registered_size+lmr->sci_off), strerror(errno)); lmr->sci_addr = 0; lmr->sci_off = 0; lmr->mr_id = 0; } #endif if (lmr->mr_handle != IB_INVALID_HANDLE) { if (ibv_dereg_mr(lmr->mr_handle)) return (dapl_convert_errno(errno, "dereg_mr")); lmr->mr_handle = IB_INVALID_HANDLE; } return DAT_SUCCESS; } /* * dapl_ib_mr_register_shared * * Register a virtual memory region * * Input: * ia_ptr IA handle * lmr pointer to dapl_lmr struct * privileges * va_type * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mr_register_shared(IN DAPL_IA * ia_ptr, IN DAPL_LMR * lmr, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mr_register_shared: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_alloc * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_alloc(IN DAPL_RMR * rmr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_alloc: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_free * * Release bindings of a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_mw_free(IN DAPL_RMR * rmr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_free: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_bind * * Bind a protection domain to a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_bind(IN DAPL_RMR * rmr, IN DAPL_LMR * lmr, IN DAPL_EP * ep, IN DAPL_COOKIE * cookie, IN DAT_VADDR virtual_address, IN DAT_VLEN length, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_BOOLEAN is_signaled) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_bind: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * dapls_ib_mw_unbind * * Unbind a protection domain from a memory window * * Input: * rmr Initialized rmr to hold binding handles * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER; * DAT_INVALID_STATE; * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_mw_unbind(IN DAPL_RMR * rmr, IN DAPL_EP * ep, IN DAPL_COOKIE * cookie, IN DAT_BOOLEAN is_signaled) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " mw_unbind: NOT IMPLEMENTED\n"); return DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/openib_common/qp.c000066400000000000000000000645511255317474200170140ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifdef HAVE_CONFIG_H #include #endif #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ep_util.h" #include #include /* * dapl_ib_qp_alloc * * Alloc a QP * * Input: * *ep_ptr pointer to EP INFO * ib_hca_handle provider HCA handle * ib_pd_handle provider protection domain handle * cq_recv provider recv CQ handle * cq_send provider send CQ handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_qp_alloc(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr, IN DAPL_EP * ep_ctx_ptr) { DAT_EP_ATTR *attr; DAPL_EVD *rcv_evd, *req_evd; DAPL_SRQ *dapl_srq = (DAPL_SRQ *)ep_ptr->param.srq_handle; ib_cq_handle_t rcv_cq, req_cq; ib_pd_handle_t ib_pd_handle; ib_srq_handle_t ib_srq_handle = NULL; int ret = EINVAL; int max_inline = ia_ptr->hca_ptr->ib_trans.ib_cm.max_inline; struct ibv_qp_init_attr qp_create; #ifdef _OPENIB_CMA_ dp_ib_cm_handle_t conn; #endif attr = &ep_ptr->param.ep_attr; ib_pd_handle = ((DAPL_PZ *) ep_ptr->param.pz_handle)->pd_handle; if (dapl_srq) ib_srq_handle = dapl_srq->srq_handle; rcv_evd = (DAPL_EVD *) ep_ptr->param.recv_evd_handle; req_evd = (DAPL_EVD *) ep_ptr->param.request_evd_handle; dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_alloc: ia %p ep %p ctx %p: SQ %d,%d evd %p - RQ %d,%d evd %p\n", ia_ptr, ep_ptr, ep_ctx_ptr, attr->max_request_dtos, attr->max_request_iov, req_evd, attr->max_recv_dtos, attr->max_recv_iov, rcv_evd); /* * DAT allows usage model of EP's with no EVD's but IB does not. * Create a CQ with zero entries under the covers to support and * catch any invalid posting. */ if ((!rcv_evd || !req_evd) && !ia_ptr->hca_ptr->ib_trans.ib_cq_empty) { struct ibv_comp_channel *channel; channel = ibv_create_comp_channel(ia_ptr->hca_ptr->ib_hca_handle); if (!channel) return (dapl_convert_errno(ENOMEM, "QP create_cq_chan")); /* Call IB verbs to create CQ */ rcv_cq = dapl_os_alloc(sizeof(struct dcm_ib_cq)); if (!rcv_cq) return (dapl_convert_errno(ENOMEM, "QP alloc cq")); dapl_os_memzero(rcv_cq, sizeof(struct dcm_ib_cq)); rcv_cq->cq = ibv_create_cq(ia_ptr->hca_ptr->ib_hca_handle, 1, NULL, channel, 0); if (!rcv_cq->cq) { ibv_destroy_comp_channel(channel); return (dapl_convert_errno(ENOMEM, "QP create_cq")); } ia_ptr->hca_ptr->ib_trans.ib_cq_empty = rcv_cq; } if (rcv_evd) rcv_cq = rcv_evd->ib_cq_handle; else rcv_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; if (req_evd) req_cq = req_evd->ib_cq_handle; else req_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty; /* create QP object */ ep_ptr->qp_handle = dapl_os_alloc(sizeof(struct dcm_ib_qp)); if (!ep_ptr->qp_handle) return (dapl_convert_errno(errno, "create_qp")); dapl_os_memzero(ep_ptr->qp_handle, sizeof(struct dcm_ib_qp)); ep_ptr->qp_handle->tp = &ia_ptr->hca_ptr->ib_trans; ep_ptr->qp_handle->ep = ep_ptr; /* * IMPLEMENTATION NOTE: * uDAPL allows consumers to post buffers on the EP after creation * and before a connect request (outbound and inbound). This forces * a binding to a device during the hca_open call and requires the * consumer to predetermine which device to listen on or connect from. * This restriction eliminates any option of listening or connecting * over multiple devices. uDAPL should add API's to resolve addresses * and bind to the device at the approriate time (before connect * and after CR arrives). Discovery should happen at connection time * based on addressing and not on static configuration during open. */ #ifdef _OPENIB_CMA_ /* Allocate CM and initialize lock */ if ((conn = dapls_ib_cm_create(ep_ptr)) == NULL) { ret = ENOMEM; goto err; } /* open identifies the local device; per DAT specification */ if (rdma_bind_addr(conn->cm_id, (struct sockaddr *)&ia_ptr->hca_ptr->hca_address)) { dapls_cm_free(conn); ret = EAFNOSUPPORT; goto err; } #endif /* Setup attributes and create qp */ dapl_os_memzero((void *)&qp_create, sizeof(qp_create)); qp_create.recv_cq = rcv_cq->cq; qp_create.cap.max_recv_wr = rcv_evd ? attr->max_recv_dtos:0; qp_create.cap.max_recv_sge = rcv_evd ? attr->max_recv_iov:0; qp_create.send_cq = req_cq->cq; qp_create.cap.max_send_wr = req_evd ? attr->max_request_dtos:0; qp_create.cap.max_send_sge = req_evd ? attr->max_request_iov:0; qp_create.cap.max_inline_data = max_inline; qp_create.qp_type = IBV_QPT_RC; qp_create.qp_context = (void *)ep_ptr; qp_create.srq = ib_srq_handle; #ifdef DAT_EXTENSIONS if ((int)attr->service_type == (int)DAT_IB_SERVICE_TYPE_UD) { #ifdef _OPENIB_CMA_ goto err; #endif qp_create.qp_type = IBV_QPT_UD; if (attr->max_message_size > (128 << ia_ptr->hca_ptr->ib_trans.ib_cm.mtu)) { goto err; } ep_ptr->qp_handle->ah = (ib_ah_handle_t*) dapl_os_alloc(sizeof(ib_ah_handle_t) * DCM_AH_SPACE); if (!ep_ptr->qp_handle->ah) goto err; dapl_os_memzero(ep_ptr->qp_handle->ah, sizeof(ib_ah_handle_t) * DCM_AH_SPACE); } #endif #ifdef _OPENIB_CMA_ if (rdma_create_qp(conn->cm_id, ib_pd_handle, &qp_create)) { dapls_cm_free(conn); ret = errno; goto err; } ep_ptr->qp_handle->qp = conn->cm_id->qp; ep_ptr->qp_state = IBV_QPS_INIT; ep_ptr->param.local_port_qual = rdma_get_src_port(conn->cm_id); #else #ifdef _OPENIB_MCM_ if (dapl_os_lock_init(&ep_ptr->qp_handle->lock)) goto err; /* mark type of CQ, ref to QP */ req_cq->flags |= DCM_CQ_TX; rcv_cq->flags |= DCM_CQ_RX; /* save resources, 1st QP is receiver, 2nd is sender */ if (ia_ptr->hca_ptr->ib_trans.scif_ep) { qp_create.cap.max_inline_data = 0; qp_create.cap.max_send_wr = 1; qp_create.cap.max_send_sge = 1; } /* Don't create any QP if MIC xsocket, QPt and QPr both on MPXYD */ if (!ia_ptr->hca_ptr->ib_trans.scif_ep || (ia_ptr->hca_ptr->ib_trans.scif_ep && !MXS_EP(&ia_ptr->hca_ptr->ib_trans.addr))) { /* QP1 needed for RX only, set QP1 req_cq empty */ qp_create.send_cq = ia_ptr->hca_ptr->ib_trans.ib_cq_empty->cq; } else { goto skip_qp; } #endif ep_ptr->qp_handle->qp = ibv_create_qp(ib_pd_handle, &qp_create); if (!ep_ptr->qp_handle->qp) { dapl_log(1," qp_alloc ERR %d %s on device %s\n", errno, strerror(errno), ibv_get_device_name(ia_ptr->hca_ptr->ib_trans.ib_dev)); dapl_log(1," qp_attr: SQ %d,%d cq %p RQ %d,%d cq %p SRQ %p [inl %d typ %d]\n", qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, req_cq, qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge, rcv_cq, qp_create.srq, qp_create.cap.max_inline_data, qp_create.qp_type); ret = errno; goto err; } dapl_dbg_log(DAPL_DBG_TYPE_EP, " QP_ALLOC: QPr %p-0x%x SQ %d,%d cq %p, RQ %d,%d cq %p\n", ep_ptr->qp_handle->qp, ep_ptr->qp_handle->qp->qp_num, qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, req_cq, qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge, rcv_cq); #ifdef _OPENIB_MCM_ skip_qp: /* shadow support, MPXYD */ ep_ptr->qp_handle->qp_id = 0; if (ia_ptr->hca_ptr->ib_trans.scif_ep) { /* MIC: shadow QPt on proxy */ req_cq->flags |= DCM_CQ_TX_INDIRECT; qp_create.send_cq = req_cq->cq; qp_create.cap.max_inline_data = 32; /* setup for bw not latency */ qp_create.cap.max_send_wr = attr->max_request_dtos; qp_create.cap.max_send_sge = attr->max_request_iov; if (ep_ptr->qp_handle->qp) { /* MIC: unused shadow QPr on proxy */ qp_create.cap.max_recv_wr = 1; qp_create.cap.max_recv_sge = 1; } else { /* MIC: shadow QPr on proxy */ rcv_cq->flags |= DCM_CQ_RX_INDIRECT; qp_create.cap.max_recv_wr = attr->max_recv_dtos; qp_create.cap.max_recv_sge = attr->max_recv_iov; } dapl_dbg_log(DAPL_DBG_TYPE_EP, " QP_ALLOC: QPt (MPXYD) SQ %d,%d %s RQ %d,%d\n", qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, ep_ptr->qp_handle->qp ? "":"QPr", qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge); ret = dapli_mix_qp_create(ep_ptr->qp_handle, &qp_create, req_cq, rcv_cq); if (ret) goto err; } else { /* NON-MIC: need QPt, in case of shadowed QP's on remote MIC's */ /* Prep for HST -> MXS: xfers via remote PI instead of direct */ ia_ptr->hca_ptr->ib_trans.ib_cm.max_inline = DAPL_MAX(sizeof(struct mcm_wr_rx), max_inline); /* create CQ for peer PI, HST->MXS case */ if (mcm_create_pi_cq(ep_ptr->qp_handle, MCM_WRC_QLEN)) goto err; qp_create.recv_cq = ep_ptr->qp_handle->rcv_cq->cq; qp_create.send_cq = req_cq->cq; qp_create.cap.max_recv_wr = MCM_WRC_QLEN; qp_create.cap.max_recv_sge = 1; qp_create.cap.max_send_wr = DAPL_MAX(MCM_WRC_QLEN, attr->max_request_dtos); qp_create.cap.max_send_sge = attr->max_request_iov; qp_create.cap.max_inline_data = ia_ptr->hca_ptr->ib_trans.ib_cm.max_inline; ep_ptr->qp_handle->qp2 = ibv_create_qp(ib_pd_handle, &qp_create); if (!ep_ptr->qp_handle->qp2) { ret = errno; goto err; } /* enable RR from remote PI */ if (dapls_modify_qp_state(ep_ptr->qp_handle->qp2, IBV_QPS_INIT, 0, 0, 0) != DAT_SUCCESS) { ret = errno; goto err; } ep_ptr->qp_handle->req_cq = req_cq; dapl_dbg_log(DAPL_DBG_TYPE_EP, " QP_ALLOC: QPt %p-0x%x SQ %d,%d cq %p, RQ %d,%d cq %p, il %d\n", ep_ptr->qp_handle->qp2, ep_ptr->qp_handle->qp2->qp_num, qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, ep_ptr->qp_handle->rcv_cq, qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge, ep_ptr->qp_handle->req_cq, qp_create.cap.max_inline_data); } if (!ep_ptr->qp_handle->qp) { /* QPr and QPs both shadowed */ ep_ptr->qp_state = IBV_QPS_INIT; return DAT_SUCCESS; } #endif /* Setup QP attributes for INIT state on the way out */ if (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_INIT, 0, 0, 0) != DAT_SUCCESS) { ret = errno; goto err; } #endif dapl_dbg_log(DAPL_DBG_TYPE_EP, " qp_alloc: qpn 0x%x type %d sq %d,%d rq %d,%d\n", ep_ptr->qp_handle->qp->qp_num, ep_ptr->qp_handle->qp->qp_type, qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge); return DAT_SUCCESS; err: if (ep_ptr->qp_handle) { if (ep_ptr->qp_handle->qp) ibv_destroy_qp(ep_ptr->qp_handle->qp); #ifdef _OPENIB_MCM_ if (ep_ptr->qp_handle->qp2) ibv_destroy_qp(ep_ptr->qp_handle->qp2); #endif if (ep_ptr->qp_handle->ah) dapl_os_free(ep_ptr->qp_handle->ah, sizeof(ib_ah_handle_t) * DCM_AH_SPACE); dapl_os_free(ep_ptr->qp_handle, sizeof(struct dcm_ib_qp)); } ep_ptr->qp_handle = IB_INVALID_HANDLE; return (dapl_convert_errno(ret, "create_qp")); } /* * dapl_ib_qp_free * * Free a QP * * Input: * ia_handle IA handle * *ep_ptr pointer to EP INFO * * Output: * none * * Returns: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_qp_free(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr) { struct ibv_qp *qp; struct ibv_qp_attr qp_attr; dapl_log(DAPL_DBG_TYPE_EP, " dapls_ib_qp_free: ep_ptr %p qp_handle %p\n", ep_ptr, ep_ptr->qp_handle); #ifdef _OPENIB_CMA_ dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr); if (!cm_ptr) return DAT_SUCCESS; #endif dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->qp_handle) { qp = ep_ptr->qp_handle->qp; dapl_os_unlock(&ep_ptr->header.lock); qp_attr.qp_state = IBV_QPS_ERR; if (qp) ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE); dapls_ep_flush_cqs(ep_ptr); #ifdef _OPENIB_CMA_ rdma_destroy_qp(cm_ptr->cm_id); cm_ptr->cm_id->qp = NULL; #else if (qp && ibv_destroy_qp(qp)) { dapl_log(DAPL_DBG_TYPE_ERR, " qp_free: ibv_destroy_qp error - %s\n", strerror(errno)); } #endif #ifdef _OPENIB_MCM_ /* MIC: shadow support on MPXYD node */ if (ia_ptr->hca_ptr->ib_trans.scif_ep) dapli_mix_qp_free(ep_ptr->qp_handle); else /* NON MIC: local shadow queue */ ibv_destroy_qp(ep_ptr->qp_handle->qp2); dapl_os_lock_destroy(&ep_ptr->qp_handle->lock); mcm_destroy_pi_cq(ep_ptr->qp_handle); mcm_destroy_wc_q(ep_ptr->qp_handle); #endif } else { dapl_os_unlock(&ep_ptr->header.lock); } /* destroy any UD address handles */ if (ep_ptr->qp_handle->ah) { int i; for (i = 0; i < DCM_AH_SPACE; i++) { if (ep_ptr->qp_handle->ah[i]) ibv_destroy_ah(ep_ptr->qp_handle->ah[i]); } dapl_os_free(ep_ptr->qp_handle->ah, sizeof(ib_ah_handle_t) * DCM_AH_SPACE); } dapl_os_free(ep_ptr->qp_handle, sizeof(struct dcm_ib_qp)); ep_ptr->qp_handle = IB_INVALID_HANDLE; return DAT_SUCCESS; } /* * dapl_ib_qp_modify * * Set the QP to the parameters specified in an EP_PARAM * * The EP_PARAM structure that is provided has been * sanitized such that only non-zero values are valid. * * Input: * ib_hca_handle HCA handle * qp_handle QP handle * ep_attr Sanitized EP Params * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_qp_modify(IN DAPL_IA * ia_ptr, IN DAPL_EP * ep_ptr, IN DAT_EP_ATTR * attr) { struct ibv_qp_attr qp_attr; if (ep_ptr->qp_handle == IB_INVALID_HANDLE) return DAT_INVALID_PARAMETER; /* * EP state, qp_handle state should be an indication * of current state but the only way to be sure is with * a user mode ibv_query_qp call which is NOT available */ /* move to error state if necessary */ if ((ep_ptr->qp_state == IB_QP_STATE_ERROR) && (ep_ptr->qp_handle->qp->state != IBV_QPS_ERR)) { return (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_ERR, 0, 0, 0)); } /* consumer ep_modify, init state */ if (ep_ptr->qp_handle->qp->state == IBV_QPS_INIT) { return (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_INIT, 0, 0, 0)); } /* * Check if we have the right qp_state to modify attributes */ if ((ep_ptr->qp_handle->qp->state != IBV_QPS_RTR) && (ep_ptr->qp_handle->qp->state != IBV_QPS_RTS)) return DAT_INVALID_STATE; /* Adjust to current EP attributes */ dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.cap.max_send_wr = attr->max_request_dtos; qp_attr.cap.max_recv_wr = attr->max_recv_dtos; qp_attr.cap.max_send_sge = attr->max_request_iov; qp_attr.cap.max_recv_sge = attr->max_recv_iov; dapl_dbg_log(DAPL_DBG_TYPE_EP, "modify_qp: qp_h %p sq %d,%d, rq %d,%d\n", ep_ptr->qp_handle, qp_attr.cap.max_send_wr, qp_attr.cap.max_send_sge, qp_attr.cap.max_recv_wr, qp_attr.cap.max_recv_sge); if (ibv_modify_qp(ep_ptr->qp_handle->qp, &qp_attr, IBV_QP_CAP)) { dapl_log(DAPL_DBG_TYPE_EP, "modify_qp: modify ep %p qp_h %p failed, state=%d\n", ep_ptr, ep_ptr->qp_handle->qp, ep_ptr->qp_state); return (DAT_INVALID_STATE); } return DAT_SUCCESS; } /* * dapls_ib_reinit_ep * * Move the QP to INIT state again. * * Input: * ep_ptr DAPL_EP * * Output: * none * * Returns: * void * */ #if defined(_WIN32) || defined(_WIN64) || defined(_OPENIB_CMA_) void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr) { dp_ib_cm_handle_t cm_ptr, next_cm_ptr; /* work around bug in low level driver - 3/24/09 */ /* RTS -> RESET -> INIT -> ERROR QP transition crashes system */ if (ep_ptr->qp_handle != IB_INVALID_HANDLE) { dapls_ib_qp_free(ep_ptr->header.owner_ia, ep_ptr); /* free any CM object's created */ cm_ptr = (dapl_llist_is_empty(&ep_ptr->cm_list_head) ? NULL : dapl_llist_peek_head(&ep_ptr->cm_list_head)); while (cm_ptr != NULL) { next_cm_ptr = dapl_llist_next_entry(&ep_ptr->cm_list_head, &cm_ptr->list_entry); dapls_cm_free(cm_ptr); cm_ptr = next_cm_ptr; } dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr); } } #else // _WIN32 || _WIN64 void dapls_ib_reinit_ep(IN DAPL_EP * ep_ptr) { if (ep_ptr->qp_handle != IB_INVALID_HANDLE && ep_ptr->qp_handle->qp->qp_type != IBV_QPT_UD) { /* move to RESET state and then to INIT */ dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_RESET,0,0,0); dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_INIT,0,0,0); } } #endif // _WIN32 || _WIN64 #if DAPL_USE_IBACM #ifndef RAI_NOROUTE #define RAI_NOROUTE 0 #endif uint8_t dapls_get_sl(DAPL_HCA *hca_ptr, uint16_t dlid) { struct rdma_addrinfo hint, *res; struct ibv_path_record path; uint8_t sl = hca_ptr->ib_trans.sl; int ret; memset(&path, 0, sizeof path); path.reversible_numpath = IBV_PATH_RECORD_REVERSIBLE | 1; path.slid = hca_ptr->ib_trans.lid; path.dlid = dlid; memset(&hint, 0, sizeof hint); hint.ai_flags = RAI_NOROUTE; hint.ai_route = &path; hint.ai_route_len = sizeof(path); ret = rdma_getaddrinfo(NULL, NULL, &hint, &res); if (ret) goto out; if (res->ai_route_len) sl = ntohs(((struct ibv_path_record *) res->ai_route)-> qosclass_sl) & 0xF; else dapl_log(DAPL_DBG_TYPE_CM_WARN, " dapls_get_sl: Warning, route miss 0x%x -> 0x%x\n", path.slid, path.dlid); rdma_freeaddrinfo(res); out: return sl; } #else uint8_t dapls_get_sl(DAPL_HCA *hca_ptr, uint16_t dlid) { return hca_ptr->ib_trans.ib_cm.sl; } #endif /* * Generic QP modify for init, reset, error, RTS, RTR * For UD, create_ah on RTR, qkey on INIT * CM msg provides QP attributes, info in network order */ DAT_RETURN dapls_modify_qp_state(IN struct ibv_qp *qp_handle, IN ib_qp_state_t qp_state, IN uint32_t qpn, IN uint16_t lid, IN ib_gid_handle_t gid) { struct ibv_qp_attr qp_attr; enum ibv_qp_attr_mask mask = IBV_QP_STATE; DAPL_EP *ep_ptr = (DAPL_EP *) qp_handle->qp_context; DAPL_IA *ia_ptr = ep_ptr->header.owner_ia; int ret; dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = qp_state; switch (qp_state) { case IBV_QPS_RTR: mask |= IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN | IBV_QP_RQ_PSN | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER; qp_attr.dest_qp_num = ntohl(qpn); qp_attr.rq_psn = 1; qp_attr.path_mtu = ia_ptr->hca_ptr->ib_trans.ib_cm.mtu; qp_attr.min_rnr_timer = ia_ptr->hca_ptr->ib_trans.ib_cm.rnr_timer; #ifdef _OPENIB_MCM_ qp_attr.max_dest_rd_atomic = ia_ptr->hca_ptr->ib_trans.ib_cm.rd_atom_in; #else qp_attr.max_dest_rd_atomic = ep_ptr->param.ep_attr.max_rdma_read_in; #endif dapl_dbg_log(DAPL_DBG_TYPE_EP, " QPS_RTR: type %d l_qpn %x qpn %x lid 0x%x" " port %d ep %p qp_state %d rd_atomic %d\n", qp_handle->qp_type, qp_handle->qp_num, ntohl(qpn), ntohs(lid), ia_ptr->hca_ptr->port_num, ep_ptr, ep_ptr->qp_state, qp_attr.max_dest_rd_atomic); /* address handle. RC and UD */ qp_attr.ah_attr.dlid = ntohs(lid); if (gid && ia_ptr->hca_ptr->ib_trans.ib_cm.global) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " QPS_RTR: GID Subnet 0x" F64x " ID 0x" F64x "\n", (unsigned long long)htonll(gid->global.subnet_prefix), (unsigned long long)htonll(gid->global.interface_id)); qp_attr.ah_attr.is_global = 1; qp_attr.ah_attr.grh.dgid.global.subnet_prefix = gid->global.subnet_prefix; qp_attr.ah_attr.grh.dgid.global.interface_id = gid->global.interface_id; qp_attr.ah_attr.grh.hop_limit = ia_ptr->hca_ptr->ib_trans.ib_cm.hop_limit; qp_attr.ah_attr.grh.traffic_class = ia_ptr->hca_ptr->ib_trans.ib_cm.tclass; } qp_attr.ah_attr.sl = dapls_get_sl(ia_ptr->hca_ptr, lid); qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = ia_ptr->hca_ptr->port_num; /* UD: already in RTR, RTS state */ if (qp_handle->qp_type == IBV_QPT_UD) { mask = IBV_QP_STATE; if (ep_ptr->qp_state == IBV_QPS_RTR || ep_ptr->qp_state == IBV_QPS_RTS) return DAT_SUCCESS; } break; case IBV_QPS_RTS: if (qp_handle->qp_type == IBV_QPT_RC) { mask |= IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.timeout = ia_ptr->hca_ptr->ib_trans.ib_cm.ack_timer; qp_attr.retry_cnt = ia_ptr->hca_ptr->ib_trans.ib_cm.ack_retry; qp_attr.rnr_retry = ia_ptr->hca_ptr->ib_trans.ib_cm.rnr_retry; #ifdef _OPENIB_MCM_ qp_attr.max_rd_atomic = ia_ptr->hca_ptr->ib_trans.ib_cm.rd_atom_out; #else qp_attr.max_rd_atomic = ep_ptr->param.ep_attr.max_rdma_read_out; #endif } /* RC and UD */ qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 1; dapl_dbg_log(DAPL_DBG_TYPE_EP, " QPS_RTS: psn %x rd_atomic %d ack %d " " retry %d rnr_retry %d ep %p qp_state %d\n", qp_attr.sq_psn, qp_attr.max_rd_atomic, qp_attr.timeout, qp_attr.retry_cnt, qp_attr.rnr_retry, ep_ptr, ep_ptr->qp_state); if (qp_handle->qp_type == IBV_QPT_UD) { /* already RTS, multi remote AH's on QP */ if (ep_ptr->qp_state == IBV_QPS_RTS) return DAT_SUCCESS; else mask = IBV_QP_STATE | IBV_QP_SQ_PSN; } break; case IBV_QPS_INIT: mask |= IBV_QP_PKEY_INDEX | IBV_QP_PORT; if (qp_handle->qp_type == IBV_QPT_RC) { mask |= IBV_QP_ACCESS_FLAGS; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_ATOMIC | IBV_ACCESS_MW_BIND; } if (qp_handle->qp_type == IBV_QPT_UD) { /* already INIT, multi remote AH's on QP */ if (ep_ptr->qp_state == IBV_QPS_INIT) return DAT_SUCCESS; mask |= IBV_QP_QKEY; qp_attr.qkey = DAT_UD_QKEY; } qp_attr.pkey_index = ia_ptr->hca_ptr->ib_trans.ib_cm.pkey_idx; qp_attr.port_num = ia_ptr->hca_ptr->port_num; dapl_dbg_log(DAPL_DBG_TYPE_EP, " QPS_INIT: pi %x port %x acc %x qkey 0x%x\n", qp_attr.pkey_index, qp_attr.port_num, qp_attr.qp_access_flags, qp_attr.qkey); break; default: break; } ret = ibv_modify_qp(qp_handle, &qp_attr, mask); if (ret == 0) { ep_ptr->qp_state = qp_state; return DAT_SUCCESS; } else { dapl_log(DAPL_DBG_TYPE_ERR, " modify_qp_state: ERR type %d qpn 0x%x gid %p (%d) lid 0x%x" " port %d state %d mtu %d rd %d rnr %d sl %d\n", qp_handle->qp_type, ntohl(qpn), gid, ia_ptr->hca_ptr->ib_trans.ib_cm.global, ntohs(lid), ia_ptr->hca_ptr->port_num, ep_ptr->qp_state, qp_attr.path_mtu, qp_attr.max_dest_rd_atomic, qp_attr.min_rnr_timer, qp_attr.ah_attr.sl); return (dapl_convert_errno(errno, "modify_qp_state")); } } /* Modify UD type QP from init, rtr, rts, info network order */ DAT_RETURN dapls_modify_qp_ud(IN DAPL_HCA *hca, IN struct ibv_qp *qp) { struct ibv_qp_attr qp_attr; /* modify QP, setup and prepost buffers */ dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = hca->ib_trans.ib_cm.pkey_idx; qp_attr.port_num = hca->port_num; #ifdef _OPENIB_MCM_ qp_attr.qkey = DAT_MCM_UD_QKEY; /* MCM gets different key */ #else qp_attr.qkey = DAT_UD_QKEY; #endif if (ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_QKEY)) { dapl_log(DAPL_DBG_TYPE_ERR, " modify_ud_qp INIT: ERR %s\n", strerror(errno)); return (dapl_convert_errno(errno, "modify_qp")); } dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_RTR; if (ibv_modify_qp(qp, &qp_attr,IBV_QP_STATE)) { dapl_log(DAPL_DBG_TYPE_ERR, " modify_ud_qp RTR: ERR %s\n", strerror(errno)); return (dapl_convert_errno(errno, "modify_qp")); } dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 1; if (ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE | IBV_QP_SQ_PSN)) { dapl_log(DAPL_DBG_TYPE_ERR, " modify_ud_qp RTS: ERR %s\n", strerror(errno)); return (dapl_convert_errno(errno, "modify_qp")); } return DAT_SUCCESS; } /* Create address handle for remote QP, info in network order */ ib_ah_handle_t dapls_create_ah(IN DAPL_HCA *hca, IN ib_pd_handle_t pd, IN struct ibv_qp *qp, IN uint16_t lid, IN ib_gid_handle_t gid) { struct ibv_qp_attr qp_attr; ib_ah_handle_t ah; if (qp->qp_type != IBV_QPT_UD) { dapl_log(DAPL_DBG_TYPE_ERR, " create_ah ERR: QP_type != UD\n"); return NULL; } dapl_os_memzero((void *)&qp_attr, sizeof(qp_attr)); qp_attr.qp_state = IBV_QP_STATE; /* address handle. RC and UD */ qp_attr.ah_attr.dlid = ntohs(lid); if (gid != NULL) { dapl_log(DAPL_DBG_TYPE_CM, "dapl_create_ah: with GID\n"); qp_attr.ah_attr.is_global = 1; qp_attr.ah_attr.grh.dgid.global.subnet_prefix = ntohll(gid->global.subnet_prefix); qp_attr.ah_attr.grh.dgid.global.interface_id = ntohll(gid->global.interface_id); qp_attr.ah_attr.grh.hop_limit = hca->ib_trans.ib_cm.hop_limit; qp_attr.ah_attr.grh.traffic_class = hca->ib_trans.ib_cm.tclass; } qp_attr.ah_attr.sl = dapls_get_sl(hca, lid); qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = hca->port_num; dapl_log(DAPL_DBG_TYPE_CM, " dapls_create_ah: port %x lid %x pd %p ctx %p handle 0x%x\n", hca->port_num,qp_attr.ah_attr.dlid, pd, pd->context, pd->handle); /* UD: create AH for remote side */ ah = ibv_create_ah(pd, &qp_attr.ah_attr); if (!ah) { dapl_log(DAPL_DBG_TYPE_ERR, " create_ah: ERR %s\n", strerror(errno)); return NULL; } dapl_log(DAPL_DBG_TYPE_CM, " dapls_create_ah: AH %p for lid %x\n", ah, qp_attr.ah_attr.dlid); return ah; } DAT_RETURN dapls_modify_qp_rtu(struct ibv_qp *qp, uint32_t qpn, uint16_t lid, ib_gid_handle_t gid) { DAT_RETURN ret; ret = dapls_modify_qp_state(qp, IBV_QPS_RTR, qpn, lid, gid); if (ret != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " MODIFY_QP_RTU: RTR err=%s qpn %x -> lid %x iqp %x\n", strerror(errno), qp->qp_num, ntohs(lid), ntohl(qpn)); return ret; } ret = dapls_modify_qp_state(qp, IBV_QPS_RTS, qpn, lid, NULL); if (ret != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " MODIFY_QP_RTU: RTS err=%s qpn %x -> lid %x iqp %x\n", strerror(errno), qp->qp_num, ntohs(lid), ntohl(qpn)); return ret; } return DAT_SUCCESS; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/openib_common/srq.c000066400000000000000000000064151255317474200171740ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifdef HAVE_CONFIG_H #include #endif #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ep_util.h" /* * dapl_ib_srq_alloc * * Alloc a SRQ * * Input: * ia_handle SRQ handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_srq_alloc(IN DAPL_SRQ *srq_ptr) { struct ibv_srq_init_attr srq_init_attr; ib_pd_handle_t ib_pd_handle; dapl_dbg_log(DAPL_DBG_TYPE_SRQ, " srq alloc: srq %p\n", srq_ptr); ib_pd_handle = ((DAPL_PZ *) srq_ptr->param.pz_handle)->pd_handle; srq_init_attr.srq_context = NULL; srq_init_attr.attr.max_wr = srq_ptr->param.max_recv_dtos; srq_init_attr.attr.max_sge = srq_ptr->param.max_recv_iov; srq_init_attr.attr.srq_limit = 0; srq_ptr->srq_handle = ibv_create_srq(ib_pd_handle, &srq_init_attr); if (!srq_ptr->srq_handle) goto err; return DAT_SUCCESS; err: dapl_log(DAPL_DBG_TYPE_ERR, "ib_srq_alloc ERR %s\n", strerror(errno)); return dapl_convert_errno(ENOMEM, "srq_allocate" ); } /* * dapl_ib_srq_free * * Free a SRQ * * Input: * ia_handle SRQ handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * dapl_convert_errno */ DAT_RETURN dapls_ib_srq_free(IN DAPL_SRQ *srq_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_SRQ, " srq free: srq %p\n", srq_ptr); if (srq_ptr->srq_handle == IB_INVALID_HANDLE) return DAT_INVALID_PARAMETER; if (ibv_destroy_srq(srq_ptr->srq_handle)) { dapl_log(DAPL_DBG_TYPE_ERR, " srq_free: ibv_destroy_srq error - %s\n", strerror(errno)); return (dapl_convert_errno(errno, "srq_free")); } return DAT_SUCCESS; } /* * dapl_ib_srq_resize * *Resize a SRQ * * Input: * SRQ handle * New size * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * */ DAT_RETURN dapls_ib_srq_resize(IN DAPL_SRQ *srq_ptr, IN uint32_t new_max_wr) { struct ibv_srq_attr srq_attr; dapl_dbg_log(DAPL_DBG_TYPE_SRQ, " srq resize: srq %p\n", srq_ptr); srq_attr.max_wr = new_max_wr; if (ibv_modify_srq(srq_ptr->srq_handle, &srq_attr, IBV_SRQ_MAX_WR)) { dapl_log(DAPL_DBG_TYPE_ERR, " srq_resize: ibv_modify_srq error - %s\n", strerror(errno)); return (dapl_convert_errno(errno, "srq_resize")); } return DAT_SUCCESS; } dapl-2.1.5/dapl/openib_common/util.c000066400000000000000000000621051255317474200173420ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_osd.h" #include #include int g_dapl_loopback_connection = 0; #if defined(_WIN64) || defined(_WIN32) #include "..\..\..\..\..\etc\user\comp_channel.cpp" #include int getipaddr_netdev(char *name, char *addr, int addr_len) { IWVProvider *prov; WV_DEVICE_ADDRESS devaddr; struct addrinfo *res, *ai; HRESULT hr; int index; if (strncmp(name, "rdma_dev", 8)) { return EINVAL; } index = atoi(name + 8); hr = WvGetObject(&IID_IWVProvider, (LPVOID *) &prov); if (FAILED(hr)) { return hr; } hr = getaddrinfo("..localmachine", NULL, NULL, &res); if (hr) { goto release; } for (ai = res; ai; ai = ai->ai_next) { hr = prov->lpVtbl->TranslateAddress(prov, ai->ai_addr, &devaddr); if (SUCCEEDED(hr) && (ai->ai_addrlen <= addr_len) && (index-- == 0)) { memcpy(addr, ai->ai_addr, ai->ai_addrlen); goto free; } } hr = ENODEV; free: freeaddrinfo(res); release: prov->lpVtbl->Release(prov); return hr; } DAT_RETURN getlocalipaddr(char *addr, int addr_len) { struct sockaddr_in *sin; struct addrinfo *res, hint, *ai; int ret; char hostname[256]; char *netdev = getenv("DAPL_SCM_NETDEV"); retry: /* use provided netdev instead of default hostname */ if (netdev != NULL) { ret = getipaddr_netdev(netdev, addr, addr_len); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " getlocalipaddr: NETDEV = %s" " but not configured on system? ERR = %s\n", netdev, strerror(ret)); return dapl_convert_errno(ret, "getlocalipaddr"); } else return DAT_SUCCESS; } if (addr_len < sizeof(*sin)) { return DAT_INTERNAL_ERROR; } ret = gethostname(hostname, 256); if (ret) return dapl_convert_errno(ret, "gethostname"); memset(&hint, 0, sizeof hint); hint.ai_flags = AI_PASSIVE; hint.ai_family = AF_INET; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; ret = getaddrinfo(hostname, NULL, &hint, &res); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " getaddrinfo ERR: %d %s\n", ret, gai_strerror(ret)); return DAT_INVALID_ADDRESS; } ret = DAT_INVALID_ADDRESS; for (ai = res; ai; ai = ai->ai_next) { sin = (struct sockaddr_in *)ai->ai_addr; if (*((uint32_t *) & sin->sin_addr) != htonl(0x7f000001)) { *((struct sockaddr_in *)addr) = *sin; ret = DAT_SUCCESS; break; } } freeaddrinfo(res); /* only loopback found, retry netdev eth0 */ if (ret == DAT_INVALID_ADDRESS) { netdev = "eth0"; goto retry; } return ret; } #else // _WIN64 || WIN32 /* Get IP address using network device name */ int getipaddr_netdev(char *name, char *addr, int addr_len) { struct ifreq ifr; int skfd, ret, len; /* Fill in the structure */ snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name); /* Create a socket fd */ skfd = socket(PF_INET, SOCK_STREAM, 0); ret = ioctl(skfd, SIOCGIFADDR, &ifr); if (ret) goto bail; switch (ifr.ifr_addr.sa_family) { #ifdef AF_INET6 case AF_INET6: len = sizeof(struct sockaddr_in6); break; #endif case AF_INET: default: len = sizeof(struct sockaddr); break; } if (len <= addr_len) memcpy(addr, &ifr.ifr_addr, len); else ret = EINVAL; bail: close(skfd); return ret; } /* IPv4 only, use IB if netdev set or it's the only interface */ DAT_RETURN getlocalipaddr (char *addr, int addr_len) { struct ifaddrs *ifap, *ifa; int ret, found=0, ib_ok=0; char *netdev = getenv("DAPL_SCM_NETDEV"); if (netdev != NULL) { ret = getipaddr_netdev(netdev, addr, addr_len); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: NETDEV = %s" " but not configured on system?\n", netdev); return dapl_convert_errno(errno, "getlocalipaddr"); } else { dapl_log(DAPL_DBG_TYPE_UTIL," my_addr %s NETDEV = %s\n", inet_ntoa(((struct sockaddr_in *)addr)->sin_addr), netdev); return DAT_SUCCESS; } } if ((ret = getifaddrs (&ifap))) return dapl_convert_errno(errno, "getifaddrs"); retry: for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if (ifa->ifa_addr->sa_family == AF_INET) { if (!found && !(ifa->ifa_flags & IFF_LOOPBACK) && ((!ib_ok && dapl_os_pstrcmp("ib", ifa->ifa_name)) || (ib_ok && !dapl_os_pstrcmp("ib", ifa->ifa_name)))) { memcpy(addr, ifa->ifa_addr, sizeof(struct sockaddr_in)); found++; } dapl_log(DAPL_DBG_TYPE_UTIL, " getifaddrs: %s -> %s\n", ifa->ifa_name, inet_ntoa(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr)); } } if (!found && !ib_ok) { ib_ok = 1; goto retry; } dapl_log(DAPL_DBG_TYPE_UTIL," my_addr %s\n", inet_ntoa(((struct sockaddr_in *)addr)->sin_addr)); freeifaddrs(ifap); return (found ? DAT_SUCCESS:DAT_INVALID_ADDRESS); } #endif #ifdef _OPENIB_MCM_ static int cpuinfo_atoi(const char *v_str) { char r_buf[500]; char *f_path = "/proc/cpuinfo"; char *token = ":"; int i, ii, fd, len, v_len, r_len; int val = 0; fd = open(f_path, O_RDONLY); if (fd < 0) return val; v_len = strlen(v_str); r_len = sizeof(r_buf) - 1; len = read(fd, r_buf, r_len); if (len < 1) return val; /* get value pattern followed by : followed by value */ for (i=0; i < len; i++) { for (ii=0; ii < v_len && i < len; ii++, i++) { if ((v_str[ii] == r_buf[i]) && (ii == v_len-1)) for (; i < len; i++) { if (!strncmp(&r_buf[i], token, 1)) { val = atoi(&r_buf[i+1]); i = len; } } else if (v_str[ii] != r_buf[i]) break; } } close(fd); return val; } #endif enum ibv_mtu dapl_ib_mtu(int mtu) { switch (mtu) { case 256: return IBV_MTU_256; case 512: return IBV_MTU_512; case 1024: return IBV_MTU_1024; case 2048: return IBV_MTU_2048; case 4096: return IBV_MTU_4096; default: return IBV_MTU_1024; } } const char *dapl_ib_mtu_str(enum ibv_mtu mtu) { switch (mtu) { case IBV_MTU_256: return "256"; case IBV_MTU_512: return "512"; case IBV_MTU_1024: return "1024"; case IBV_MTU_2048: return "2048"; case IBV_MTU_4096: return "4096"; default: return "1024"; } } const char *dapl_ib_port_str(enum ibv_port_state state) { switch (state) { case IBV_PORT_NOP: return "NOP"; case IBV_PORT_DOWN: return "DOWN"; case IBV_PORT_INIT: return "INIT"; case IBV_PORT_ARMED: return "ARMED"; case IBV_PORT_ACTIVE: return "ACTIVE"; case IBV_PORT_ACTIVE_DEFER: return "DEFER"; default: return "UNKNOWN"; } } const char *dapl_ib_port_num_str(unsigned long num) { switch (num) { case 1: return "1"; case 2: return "2"; case 3: return "3"; case 4: return "4"; default: return "UNKNOWN"; } } /* * dapls_ib_query_hca * * Query the hca attribute * * Input: * hca_handl hca handle * ia_attr attribute of the ia * ep_attr attribute of the ep * ip_addr ip address of DET NIC * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN dapls_ib_query_hca(IN DAPL_HCA * hca_ptr, OUT DAT_IA_ATTR * ia_attr, OUT DAT_EP_ATTR * ep_attr, OUT DAT_SOCK_ADDR6 * ip_addr) { ib_hca_transport_t *tp = &hca_ptr->ib_trans; struct ibv_device_attr dev_attr; struct ibv_port_attr port_attr; /* local IP address of device, set during ia_open */ if (ip_addr) memcpy(ip_addr, &hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6)); if (ia_attr == NULL && ep_attr == NULL) return DAT_SUCCESS; if (ia_attr != NULL) /* setup address ptr, even with no device */ ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR) &hca_ptr->hca_address; if (hca_ptr->ib_hca_handle == NULL) /* no open device, query mode */ return DAT_SUCCESS; #ifdef _OPENIB_MCM_ if (tp->self.node) tp->na.mode = "PROXY"; else tp->na.mode = "DIRECT"; tp->na.read = "FALSE"; sprintf(tp->ver_str, "%d", DAT_MIX_VER); if (!tp->pr_attr.cpu_family) { if (tp->self.node) { dapli_mix_get_attr(tp, &tp->pr_attr); } else { tp->pr_attr.cpu_family = cpuinfo_atoi("cpu family"); tp->pr_attr.cpu_model = cpuinfo_atoi("model"); } sprintf(tp->fam_str, "%d", tp->pr_attr.cpu_family); sprintf(tp->mod_str, "%d", tp->pr_attr.cpu_model); } #else tp->na.mode = "DIRECT"; tp->na.read = "TRUE"; #endif /* query verbs for this device and port attributes */ if (ibv_query_device(hca_ptr->ib_hca_handle, &dev_attr) || ibv_query_port(hca_ptr->ib_hca_handle, hca_ptr->port_num, &port_attr)) return (dapl_convert_errno(errno, "ib_query_hca")); dev_attr.max_qp_wr = DAPL_MIN(dev_attr.max_qp_wr, dapl_os_get_env_val("DAPL_WR_MAX", dev_attr.max_qp_wr)); #ifdef _OPENIB_MCM_ /* Adjust for CCL Proxy; limited sge's, no READ support, reduce QP and RDMA limits */ dev_attr.max_sge = DAPL_MIN(dev_attr.max_sge, DAT_MIX_SGE_MAX); dev_attr.max_qp_wr = DAPL_MIN(dev_attr.max_qp_wr, dapl_os_get_env_val("DAPL_MCM_WR_MAX", DAT_MIX_WR_MAX)); port_attr.max_msg_sz = DAPL_MIN(port_attr.max_msg_sz, dapl_os_get_env_val("DAPL_MCM_MSG_MAX", DAT_MIX_RDMA_MAX)); #endif if (ia_attr != NULL) { (void)dapl_os_memzero(ia_attr, sizeof(*ia_attr)); strncpy(ia_attr->adapter_name, ibv_get_device_name(tp->ib_dev), DAT_NAME_MAX_LENGTH - 1); ia_attr->adapter_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->vendor_name[DAT_NAME_MAX_LENGTH - 1] = '\0'; ia_attr->ia_address_ptr = (DAT_IA_ADDRESS_PTR) &hca_ptr->hca_address; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: %s %s \n", ia_attr->adapter_name, inet_ntoa(((struct sockaddr_in *) &hca_ptr->hca_address)->sin_addr)); ia_attr->hardware_version_major = dev_attr.hw_ver; /* ia_attr->hardware_version_minor = dev_attr.fw_ver; */ ia_attr->max_eps = dev_attr.max_qp; ia_attr->max_dto_per_ep = dev_attr.max_qp_wr; ia_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom; ia_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom; ia_attr->max_rdma_read_per_ep_in = dev_attr.max_qp_rd_atom; ia_attr->max_rdma_read_per_ep_out = dev_attr.max_qp_init_rd_atom; ia_attr->max_rdma_read_per_ep_in_guaranteed = DAT_TRUE; ia_attr->max_rdma_read_per_ep_out_guaranteed = DAT_TRUE; ia_attr->max_evds = dev_attr.max_cq; ia_attr->max_evd_qlen = dev_attr.max_cqe; ia_attr->max_iov_segments_per_dto = dev_attr.max_sge; ia_attr->max_lmrs = dev_attr.max_mr; /* 32bit attribute from 64bit, 4G-1 limit, DAT v2 needs fix */ ia_attr->max_lmr_block_size = (dev_attr.max_mr_size >> 32) ? ~0 : dev_attr.max_mr_size; ia_attr->max_rmrs = dev_attr.max_mw; ia_attr->max_lmr_virtual_address = dev_attr.max_mr_size; ia_attr->max_rmr_target_address = dev_attr.max_mr_size; ia_attr->max_pzs = dev_attr.max_pd; ia_attr->max_message_size = port_attr.max_msg_sz; ia_attr->max_rdma_size = port_attr.max_msg_sz; /* iWARP spec. - 1 sge for RDMA reads */ if (hca_ptr->ib_hca_handle->device->transport_type == IBV_TRANSPORT_IWARP) ia_attr->max_iov_segments_per_rdma_read = 1; else ia_attr->max_iov_segments_per_rdma_read = dev_attr.max_sge; ia_attr->max_iov_segments_per_rdma_write = dev_attr.max_sge; ia_attr->num_transport_attr = 0; ia_attr->transport_attr = NULL; ia_attr->num_vendor_attr = 0; ia_attr->vendor_attr = NULL; #ifdef DAT_EXTENSIONS ia_attr->extension_supported = DAT_EXTENSION_IB; ia_attr->extension_version = DAT_IB_EXTENSION_VERSION; #endif /* save key device attributes for CM exchange */ tp->ib_cm.rd_atom_in = dev_attr.max_qp_rd_atom; tp->ib_cm.rd_atom_out = dev_attr.max_qp_init_rd_atom; tp->ib_cm.mtu = DAPL_MIN(port_attr.active_mtu, tp->ib_cm.mtu); tp->ib_cm.ack_timer = DAPL_MAX(dev_attr.local_ca_ack_delay, tp->ib_cm.ack_timer); /* set provider/transport specific named attributes */ tp->na.dev = ia_attr->adapter_name; tp->na.mtu = dapl_ib_mtu_str(tp->ib_cm.mtu); tp->na.port = dapl_ib_port_str(port_attr.state); tp->na.port_num = dapl_ib_port_num_str(hca_ptr->port_num); if (!tp->guid) tp->guid = ntohll(ibv_get_device_guid(tp->ib_dev)); sprintf(tp->guid_str, "%04x:%04x:%04x:%04x", (unsigned) (tp->guid >> 48) & 0xffff, (unsigned) (tp->guid >> 32) & 0xffff, (unsigned) (tp->guid >> 16) & 0xffff, (unsigned) (tp->guid >> 0) & 0xffff); if (hca_ptr->ib_hca_handle->device->transport_type != IBV_TRANSPORT_IB) goto skip_ib; /* set SL, PKEY values, defaults = 0 */ tp->ib_cm.pkey_idx = 0; tp->ib_cm.pkey = htons(dapl_os_get_env_val("DAPL_IB_PKEY", 0)); tp->ib_cm.sl = dapl_os_get_env_val("DAPL_IB_SL", 0); /* index provided, get pkey; pkey provided, get index */ if (tp->ib_cm.pkey) { int i; uint16_t pkey = 0; for (i=0; i < dev_attr.max_pkeys; i++) { if (ibv_query_pkey(hca_ptr->ib_hca_handle, hca_ptr->port_num, i, &pkey)) { i = dev_attr.max_pkeys; break; } if (pkey == tp->ib_cm.pkey) { tp->ib_cm.pkey_idx = i; break; } } if (i == dev_attr.max_pkeys) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: new pkey(0x%x), query (%s)" " err or key !found, using default pkey_idx=0\n", ntohs(tp->ib_cm.pkey), strerror(errno)); } } skip_ib: #ifdef DEFINE_ATTR_LINK_LAYER #ifndef _OPENIB_CMA_ if (port_attr.link_layer != IBV_LINK_LAYER_INFINIBAND && port_attr.link_layer != IBV_LINK_LAYER_UNSPECIFIED) tp->ib_cm.global = 1; dapl_log(DAPL_DBG_TYPE_UTIL, " query_hca: port.link_layer = 0x%x, global = %d\n", port_attr.link_layer, tp->ib_cm.global); #endif #endif #ifdef _WIN32 #ifndef _OPENIB_CMA_ if (port_attr.transport != IBV_TRANSPORT_IB) tp->ib_cm.global = 1; dapl_log(DAPL_DBG_TYPE_UTIL, " query_hca: port.transport %d ib_trans.global %d\n", port_attr.transport, tp->ib_cm.global); #endif #endif dapl_log(DAPL_DBG_TYPE_UTIL, " query_hca: (%x.%x) eps %d, sz %d evds %d," " sz %d mtu %d pk %x pi %d sl %d gl %d inl %d\n", ia_attr->hardware_version_major, ia_attr->hardware_version_minor, ia_attr->max_eps, ia_attr->max_dto_per_ep, ia_attr->max_evds, ia_attr->max_evd_qlen, 128 << tp->ib_cm.mtu, ntohs(tp->ib_cm.pkey), tp->ib_cm.pkey_idx, tp->ib_cm.sl, tp->ib_cm.global, tp->ib_cm.max_inline); dapl_log(DAPL_DBG_TYPE_UTIL, " query_hca: msg %llu rdma %llu iov %d lmr %d rmr %d" " ack_time %d mr %u ia_addr_ptr %p\n", ia_attr->max_message_size, ia_attr->max_rdma_size, ia_attr->max_iov_segments_per_dto, ia_attr->max_lmrs, ia_attr->max_rmrs, tp->ib_cm.ack_timer, ia_attr->max_lmr_block_size, ia_attr->ia_address_ptr); } if (ep_attr != NULL) { (void)dapl_os_memzero(ep_attr, sizeof(*ep_attr)); ep_attr->max_message_size = port_attr.max_msg_sz; ep_attr->max_rdma_size = port_attr.max_msg_sz; ep_attr->max_recv_dtos = dev_attr.max_qp_wr; ep_attr->max_request_dtos = dev_attr.max_qp_wr; ep_attr->max_recv_iov = dev_attr.max_sge; ep_attr->max_request_iov = dev_attr.max_sge; ep_attr->max_rdma_read_in = dev_attr.max_qp_rd_atom; ep_attr->max_rdma_read_out = dev_attr.max_qp_init_rd_atom; ep_attr->max_rdma_read_iov = dev_attr.max_sge; ep_attr->max_rdma_write_iov = dev_attr.max_sge; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " query_hca: MAX msg %llu mtu %d qsz %d iov %d" " rdma i%d,o%d\n", ep_attr->max_message_size, 128 << tp->ib_cm.mtu, ep_attr->max_recv_dtos, ep_attr->max_recv_iov, ep_attr->max_rdma_read_in, ep_attr->max_rdma_read_out); } return DAT_SUCCESS; } /* * dapls_ib_setup_async_callback * * Set up an asynchronous callbacks of various kinds * * Input: * ia_handle IA handle * handler_type type of handler to set up * callback_handle handle param for completion callbacks * callback callback routine pointer * context argument for callback routine * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_setup_async_callback(IN DAPL_IA * ia_ptr, IN DAPL_ASYNC_HANDLER_TYPE handler_type, IN DAPL_EVD * evd_ptr, IN ib_async_handler_t callback, IN void *context) { ib_hca_transport_t *hca_ptr; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " setup_async_cb: ia %p type %d handle %p cb %p ctx %p\n", ia_ptr, handler_type, evd_ptr, callback, context); hca_ptr = &ia_ptr->hca_ptr->ib_trans; switch (handler_type) { case DAPL_ASYNC_UNAFILIATED: hca_ptr->async_unafiliated = (ib_async_handler_t) callback; hca_ptr->async_un_ctx = context; break; case DAPL_ASYNC_CQ_ERROR: hca_ptr->async_cq_error = (ib_async_cq_handler_t) callback; break; case DAPL_ASYNC_CQ_COMPLETION: hca_ptr->async_cq = (ib_async_dto_handler_t) callback; break; case DAPL_ASYNC_QP_ERROR: hca_ptr->async_qp_error = (ib_async_qp_handler_t) callback; break; default: break; } return DAT_SUCCESS; } void dapli_async_event_cb(struct _ib_hca_transport *hca) { struct ibv_async_event event; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " async_event(%p)\n", hca); if (hca->destroy) return; if (!ibv_get_async_event(hca->ib_ctx, &event)) { switch (event.event_type) { case IBV_EVENT_CQ_ERR: { struct dapl_evd *evd_ptr = event.element.cq->cq_context; dapl_log(DAPL_DBG_TYPE_ERR, "dapl async_event CQ (%p) ERR %d\n", evd_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_cq_error) hca->async_cq_error(hca->ib_ctx, evd_ptr->ib_cq_handle, &event, (void *)evd_ptr); break; } case IBV_EVENT_COMM_EST: { /* Received msgs on connected QP before RTU */ dapl_log(DAPL_DBG_TYPE_UTIL, " async_event COMM_EST(%p) rdata beat RTU\n", event.element.qp); break; } case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_QP_LAST_WQE_REACHED: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_SQ_DRAINED: { DAPL_DBG_TYPE dbg_type = DAPL_DBG_TYPE_ERR; struct dapl_ep *ep_ptr = event.element.qp->qp_context; if (event.event_type == IBV_EVENT_QP_LAST_WQE_REACHED && ep_ptr->param.srq_handle) { dbg_type = DAPL_DBG_TYPE_EVD; } dapl_log(dbg_type, "dapl async_event QP (%p) Event %d\n", ep_ptr, event.event_type); /* report up if async callback still setup */ if (hca->async_qp_error) hca->async_qp_error(hca->ib_ctx, ep_ptr->qp_handle, &event, (void *)ep_ptr); break; } case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ACTIVE: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: { dapl_log(DAPL_DBG_TYPE_WARN, "dapl async_event: DEV ERR %d\n", event.event_type); /* report up if async callback still setup */ if (hca->async_unafiliated) hca->async_unafiliated(hca->ib_ctx, &event, hca->async_un_ctx); break; } case IBV_EVENT_CLIENT_REREGISTER: /* no need to report this event this time */ dapl_log(DAPL_DBG_TYPE_WARN, " WARNING: IBV_CLIENT_REREGISTER\n"); break; default: dapl_log(DAPL_DBG_TYPE_WARN, "dapl async_event: %d UNKNOWN\n", event.event_type); break; } ibv_ack_async_event(&event); } } /* * dapls_query_provider_specific_attrs * * Common for openib providers: cma, ucm, scm, mcm * * Input: * attr_ptr Pointer provider specific attributes * * Output: * none * * Returns: * void */ DAT_NAMED_ATTR ib_attrs[] = { { "DAT_IB_PROVIDER_NAME", PROVIDER_NAME} , { "DAT_IB_DEVICE_NAME", "OFA_HCA_0000"} , { "DAT_IB_CONNECTIVITY_MODE", "DIRECT"} , { "DAT_IB_RDMA_READ", "TRUE"} , { "DAT_IB_NODE_GUID", "xxxx:xxxx:xxxx:xxxx"} , { "DAT_IB_TRANSPORT_MTU", "2048"} , { "DAT_IB_PORT_STATUS", "UNKNOWN"} , { "DAT_IB_PORT_NUMBER", "UNKNOWN"} , #ifdef DAT_EXTENSIONS { "DAT_EXTENSION_INTERFACE", "TRUE"} , #ifndef _OPENIB_MCM_ { DAT_IB_ATTR_FETCH_AND_ADD, "TRUE"} , { DAT_IB_ATTR_CMP_AND_SWAP, "TRUE"} , #endif { DAT_IB_ATTR_IMMED_DATA, "TRUE"} , #ifdef DAT_IB_COLLECTIVES { DAT_IB_COLL_BARRIER, "TRUE"} , { DAT_IB_COLL_BROADCAST, "TRUE"} , { DAT_IB_COLL_REDUCE, "TRUE"} , { DAT_IB_COLL_ALLREDUCE, "TRUE"} , { DAT_IB_COLL_ALLGATHER, "TRUE"} , { DAT_IB_COLL_ALLGATHERV, "TRUE"} , #endif /* DAT_IB_COLLECTIVES */ #if !defined(_OPENIB_CMA_) && !defined(_OPENIB_MCM_) { DAT_IB_ATTR_UD, "TRUE"} , #endif #ifdef DAPL_COUNTERS { DAT_ATTR_COUNTERS, "TRUE"} , #endif /* DAPL_COUNTERS */ #ifdef _OPENIB_MCM_ { "DAT_IB_PROXY_CPU_FAMILY", "UNKNOWN"} , { "DAT_IB_PROXY_CPU_MODEL", "UNKNOWN"} , { "DAT_IB_PROXY_VERSION", "UNKNOWN"} , #endif /* _OPENIB_MCM_, end of list */ #endif }; #define SPEC_ATTR_SIZE( x ) (sizeof( x ) / sizeof( DAT_NAMED_ATTR)) void dapls_query_provider_specific_attr(IN DAPL_IA * ia_ptr, IN DAT_PROVIDER_ATTR * attr_ptr) { attr_ptr->num_provider_specific_attr = SPEC_ATTR_SIZE(ib_attrs); attr_ptr->provider_specific_attr = ib_attrs; dapl_log(DAPL_DBG_TYPE_UTIL, " prov_attr: %p sz %d\n", ib_attrs, SPEC_ATTR_SIZE(ib_attrs)); /* update common attributes from providers */ ib_attrs[1].value = ia_ptr->hca_ptr->ib_trans.na.dev; ib_attrs[2].value = ia_ptr->hca_ptr->ib_trans.na.mode; ib_attrs[3].value = ia_ptr->hca_ptr->ib_trans.na.read; ib_attrs[4].value = ia_ptr->hca_ptr->ib_trans.guid_str; ib_attrs[5].value = ia_ptr->hca_ptr->ib_trans.na.mtu; ib_attrs[6].value = ia_ptr->hca_ptr->ib_trans.na.port; ib_attrs[7].value = ia_ptr->hca_ptr->ib_trans.na.port_num; #ifdef _OPENIB_MCM_ { int i = attr_ptr->num_provider_specific_attr; ib_attrs[i-3].value = ia_ptr->hca_ptr->ib_trans.fam_str; ib_attrs[i-2].value = ia_ptr->hca_ptr->ib_trans.mod_str; ib_attrs[i-1].value = ia_ptr->hca_ptr->ib_trans.ver_str; } #endif } /* * Map all socket CM event codes to the DAT equivelent. Common to all providers */ #define DAPL_IB_EVENT_CNT 13 static struct ib_cm_event_map { const ib_cm_events_t ib_cm_event; DAT_EVENT_NUMBER dat_event_num; } ib_cm_event_map[DAPL_IB_EVENT_CNT] = { /* 00 */ {IB_CME_CONNECTED, DAT_CONNECTION_EVENT_ESTABLISHED}, /* 01 */ {IB_CME_DISCONNECTED, DAT_CONNECTION_EVENT_DISCONNECTED}, /* 02 */ {IB_CME_DISCONNECTED_ON_LINK_DOWN, DAT_CONNECTION_EVENT_DISCONNECTED}, /* 03 */ {IB_CME_CONNECTION_REQUEST_PENDING, DAT_CONNECTION_REQUEST_EVENT}, /* 04 */ {IB_CME_CONNECTION_REQUEST_PENDING_PRIVATE_DATA, DAT_CONNECTION_REQUEST_EVENT}, /* 05 */ {IB_CME_CONNECTION_REQUEST_ACKED, DAT_CONNECTION_EVENT_ESTABLISHED}, /* 06 */ {IB_CME_DESTINATION_REJECT, DAT_CONNECTION_EVENT_NON_PEER_REJECTED}, /* 07 */ {IB_CME_DESTINATION_REJECT_PRIVATE_DATA, DAT_CONNECTION_EVENT_PEER_REJECTED}, /* 08 */ {IB_CME_DESTINATION_UNREACHABLE, DAT_CONNECTION_EVENT_UNREACHABLE}, /* 09 */ {IB_CME_TOO_MANY_CONNECTION_REQUESTS, DAT_CONNECTION_EVENT_NON_PEER_REJECTED}, /* 10 */ {IB_CME_BROKEN, DAT_CONNECTION_EVENT_BROKEN}, /* 11 */ {IB_CME_TIMEOUT, DAT_CONNECTION_EVENT_TIMED_OUT}, /* 12 */ {IB_CME_LOCAL_FAILURE, /* always last */ DAT_CONNECTION_EVENT_BROKEN} }; /* * dapls_ib_get_cm_event * * Return a DAT connection event given a provider CM event. * * Input: * dat_event_num DAT event we need an equivelent CM event for * * Output: * none * * Returns: * ib_cm_event of translated DAPL value */ DAT_EVENT_NUMBER dapls_ib_get_dat_event(IN const ib_cm_events_t ib_cm_event, IN DAT_BOOLEAN active) { DAT_EVENT_NUMBER dat_event_num; int i; active = active; if (ib_cm_event > IB_CME_LOCAL_FAILURE) return (DAT_EVENT_NUMBER) 0; dat_event_num = 0; for (i = 0; i < DAPL_IB_EVENT_CNT; i++) { if (ib_cm_event == ib_cm_event_map[i].ib_cm_event) { dat_event_num = ib_cm_event_map[i].dat_event_num; break; } } dapl_dbg_log(DAPL_DBG_TYPE_CALLBACK, "dapls_ib_get_dat_event: event translate(%s) ib=0x%x dat=0x%x\n", active ? "active" : "passive", ib_cm_event, dat_event_num); return dat_event_num; } /* * dapls_ib_get_dat_event * * Return a DAT connection event given a provider CM event. * * Input: * ib_cm_event event provided to the dapl callback routine * active switch indicating active or passive connection * * Output: * none * * Returns: * DAT_EVENT_NUMBER of translated provider value */ ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER dat_event_num) { ib_cm_events_t ib_cm_event; int i; ib_cm_event = 0; for (i = 0; i < DAPL_IB_EVENT_CNT; i++) { if (dat_event_num == ib_cm_event_map[i].dat_event_num) { ib_cm_event = ib_cm_event_map[i].ib_cm_event; break; } } return ib_cm_event; } dapl-2.1.5/dapl/openib_mcm/000077500000000000000000000000001255317474200155015ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_mcm/cm.c000066400000000000000000002063741255317474200162600ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" #include "dapl_name_service.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_osd.h" extern char gid_str[INET6_ADDRSTRLEN]; enum DAPL_FD_EVENTS { DAPL_FD_READ = POLLIN, DAPL_FD_WRITE = POLLOUT, DAPL_FD_ERROR = POLLERR }; struct dapl_fd_set { int index; struct pollfd set[DAPL_FD_SETSIZE]; }; static struct dapl_fd_set *dapl_alloc_fd_set(void) { return dapl_os_alloc(sizeof(struct dapl_fd_set)); } static void dapl_fd_zero(struct dapl_fd_set *set) { set->index = 0; } static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set, enum DAPL_FD_EVENTS event) { if (!s) return 0; if (set->index == DAPL_FD_SETSIZE - 1) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: cm_thread exceeded FD_SETSIZE %d\n", set->index + 1); return -1; } set->set[set->index].fd = s; set->set[set->index].revents = 0; set->set[set->index++].events = event; return 0; } static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event) { struct pollfd fds; int ret; if (!s) return 0; fds.fd = s; fds.events = event; fds.revents = 0; ret = poll(&fds, 1, 0); dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n", s, ret, fds.revents); if (ret == 0) return 0; else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " dapl_poll: ERR: fd=%d ret=%d, revent=0x%x\n", s,ret,fds.revents); return DAPL_FD_ERROR; } else return fds.revents; } static int dapl_select(struct dapl_fd_set *set, int time_ms) { int ret; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index); ret = poll(set->set, set->index, time_ms); dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret); return ret; } /* forward declarations */ static int mcm_reply(dp_ib_cm_handle_t cm); static void mcm_accept(ib_cm_srvc_handle_t cm, dat_mcm_msg_t *msg); static void mcm_accept_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg); static int mcm_send(ib_hca_transport_t *tp, dat_mcm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size); DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm); DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm); static void mcm_log_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in); /* Service ids - port space */ static uint16_t mcm_get_port(ib_hca_transport_t *tp, uint16_t port) { int i = 0; dapl_os_lock(&tp->plock); /* get specific ID */ if (port) { if (tp->sid[port] == 0) { tp->sid[port] = 1; i = port; } goto done; } /* get any free ID */ for (i = 0xffff; i > 0; i--) { if (tp->sid[i] == 0) { tp->sid[i] = 1; break; } } done: dapl_os_unlock(&tp->plock); return i; } static void mcm_free_port(ib_hca_transport_t *tp, uint16_t port) { dapl_os_lock(&tp->plock); tp->sid[port] = 0; dapl_os_unlock(&tp->plock); } static void mcm_check_timers(dp_ib_cm_handle_t cm, int *timer) { DAPL_OS_TIMEVAL time; if (cm->tp->scif_ep) /* CM timers running on MPXYD */ return; dapl_os_lock(&cm->lock); dapl_os_get_time(&time); switch (cm->state) { case MCM_REP_PENDING: *timer = cm->hca->ib_trans.cm_timer; /* wait longer each retry */ if ((time - cm->timer)/1000 > (cm->hca->ib_trans.rep_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_REQ retry %p %d [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x Time(ms) %d > %d\n", cm, cm->retries+1, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), (time - cm->timer)/1000, cm->hca->ib_trans.rep_time << cm->retries); cm->retries++; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_RETRY); dapl_os_unlock(&cm->lock); dapli_cm_connect(cm->ep, cm); return; } break; case MCM_RTU_PENDING: *timer = cm->hca->ib_trans.cm_timer; if ((time - cm->timer)/1000 > (cm->hca->ib_trans.rtu_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_REPLY retry %d %s [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x r_pid %x Time(ms) %d > %d\n", cm->retries+1, dapl_cm_op_str(ntohs(cm->msg.op)), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), (time - cm->timer)/1000, cm->hca->ib_trans.rtu_time << cm->retries); cm->retries++; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REP_RETRY); dapl_os_unlock(&cm->lock); mcm_reply(cm); return; } break; case MCM_DISC_PENDING: *timer = cm->hca->ib_trans.cm_timer; /* wait longer each retry */ if ((time - cm->timer)/1000 > (cm->hca->ib_trans.rtu_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_DREQ retry %d [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x r_pid %x Time(ms) %d > %d\n", cm->retries+1, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), (time - cm->timer)/1000, cm->hca->ib_trans.rtu_time << cm->retries); cm->retries++; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_DREQ_RETRY); dapl_os_unlock(&cm->lock); dapli_cm_disconnect(cm); return; } break; default: break; } dapl_os_unlock(&cm->lock); } /* SEND CM MESSAGE PROCESSING */ /* Get CM UD message from send queue, called with s_lock held */ static dat_mcm_msg_t *mcm_get_smsg(ib_hca_transport_t *tp) { dat_mcm_msg_t *msg = NULL; int ret, polled = 1, hd = tp->s_hd; hd++; if (hd == tp->qpe) hd = 0; retry: if (hd == tp->s_tl) { msg = NULL; if (polled % 1000000 == 0) dapl_log(DAPL_DBG_TYPE_WARN, " mcm_get_smsg: FULLq hd %d == tl %d," " completions stalled, polls=%d\n", hd, tp->s_tl, polled); } else { msg = &tp->sbuf[hd]; tp->s_hd = hd; /* new hd */ } /* if empty, process some completions */ if (msg == NULL) { struct ibv_wc wc; /* process completions, based on mcm_TX_BURST */ ret = ibv_poll_cq(tp->scq, 1, &wc); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_WARN, " get_smsg: cq %p %s\n", tp->scq, strerror(errno)); return NULL; } /* free up completed sends, update tail */ if (ret > 0) tp->s_tl = (int)wc.wr_id; polled++; goto retry; } DAPL_CNTR_DATA(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_FULLQ, polled > 1 ? 1:0); DAPL_CNTR_DATA(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_REQ_FULLQ_POLL, polled - 1); return msg; } /* RECEIVE CM MESSAGE PROCESSING */ static int mcm_post_rmsg(ib_hca_transport_t *tp, dat_mcm_msg_t *msg) { struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; recv_wr.wr_id = (uint64_t)(uintptr_t) msg; sge.length = sizeof(dat_mcm_msg_t) + sizeof(struct ibv_grh); sge.lkey = tp->mr_rbuf->lkey; sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh)); return (ibv_post_recv(tp->qp, &recv_wr, &recv_err)); } static int mcm_reject(ib_hca_transport_t *tp, dat_mcm_msg_t *msg) { dat_mcm_msg_t smsg; /* setup op, rearrange the src, dst cm and addr info */ (void)dapl_os_memzero(&smsg, sizeof(smsg)); smsg.ver = htons(DAT_MCM_VER); smsg.op = htons(MCM_REJ_CM); smsg.dport = msg->sport; smsg.dqpn = msg->sqpn; smsg.sport = msg->dport; smsg.sqpn = msg->dqpn; dapl_os_memcpy(&smsg.daddr1, &msg->saddr1, sizeof(dat_mcm_addr_t)); /* no dst_addr IB info in REQ, init lid, gid, get type from saddr1 */ smsg.saddr1.lid = tp->addr.lid; smsg.saddr1.qp_type = msg->saddr1.qp_type; dapl_os_memcpy(&smsg.saddr1.gid[0], &tp->addr.gid, 16); dapl_os_memcpy(&smsg.saddr1, &msg->daddr1, sizeof(dat_mcm_addr_t)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " CM reject -> LID %x, QPN %x PORT %x\n", ntohs(smsg.daddr1.lid), ntohl(smsg.dqpn), ntohs(smsg.dport)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_REJ_TX); return (mcm_send(tp, &smsg, NULL, 0)); } void mcm_process_recv(ib_hca_transport_t *tp, dat_mcm_msg_t *msg, dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); switch (cm->state) { case MCM_LISTEN: /* passive */ dapl_os_unlock(&cm->lock); mcm_accept(cm, msg); break; case MCM_RTU_PENDING: /* passive */ dapl_os_unlock(&cm->lock); mcm_accept_rtu(cm, msg); break; case MCM_REP_PENDING: /* active */ dapl_os_unlock(&cm->lock); mcm_connect_rtu(cm, msg); break; case MCM_CONNECTED: /* active and passive */ /* DREQ, change state and process */ cm->retries = 2; if (ntohs(msg->op) == MCM_DREQ) { cm->state = MCM_DISC_RECV; dapl_os_unlock(&cm->lock); dapli_cm_disconnect(cm); break; } /* active: RTU was dropped, resend */ if (ntohs(msg->op) == MCM_REP) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " RESEND RTU: op %s st %s [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x r_pid %x\n", dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); cm->msg.op = htons(MCM_RTU); mcm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_RTU_RETRY); } dapl_os_unlock(&cm->lock); break; case MCM_DISC_PENDING: /* active and passive */ /* DREQ or DREP, finalize */ dapl_os_unlock(&cm->lock); mcm_disconnect_final(cm); break; case MCM_DISCONNECTED: case MCM_FREE: /* DREQ dropped, resend */ if (ntohs(msg->op) == MCM_DREQ) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " RESEND DREP: op %s st %s [lid, port, qpn]:" " %x %x %x -> %x %x %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->saddr1.qpn), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->daddr1.qpn)); cm->msg.op = htons(MCM_DREP); mcm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_DREP_RETRY); } else if (ntohs(msg->op) != MCM_DREP){ /* DREP ok to ignore, any other print warning */ dapl_log(DAPL_DBG_TYPE_WARN, " mcm_recv: UNEXPECTED MSG on cm %p" " <- op %s, st %s spsp %x sqpn %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_UNEXPECTED); } dapl_os_unlock(&cm->lock); break; case MCM_REJECTED: if (ntohs(msg->op) == MCM_REJ_USER) { DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_USER_REJ_RX); dapl_os_unlock(&cm->lock); break; } default: dapl_log(DAPL_DBG_TYPE_WARN, " mcm_recv: Warning, UNKNOWN state" " <- op %s, %s spsp %x sqpn %x slid %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn), ntohs(msg->saddr1.lid)); dapl_os_unlock(&cm->lock); break; } } /* Find matching CM object for this receive message, return CM reference, timer */ dp_ib_cm_handle_t mcm_cm_find(ib_hca_transport_t *tp, dat_mcm_msg_t *msg) { dp_ib_cm_handle_t cm = NULL, next, found = NULL; struct dapl_llist_entry **list; DAPL_OS_LOCK *lock; int listenq = 0; /* conn list first, duplicate requests for MCM_REQ */ list = &tp->list; lock = &tp->lock; retry_listenq: dapl_os_lock(lock); if (!dapl_llist_is_empty(list)) next = dapl_llist_peek_head(list); else next = NULL; while (next) { cm = next; next = dapl_llist_next_entry(list, (DAPL_LLIST_ENTRY *)&cm->local_entry); if (cm->state == MCM_DESTROY || cm->state == MCM_FREE) continue; /* CM sPORT + QPN, match is good enough for listenq */ if (listenq && cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn) { found = cm; break; } /* connectq, check src and dst plus id's, check duplicate conn_reqs */ if (!listenq && cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && cm->msg.daddr1.lid == msg->saddr1.lid) { if (ntohs(msg->op) != MCM_REQ) { found = cm; break; } else { /* duplicate; bail and throw away */ dapl_log(DAPL_DBG_TYPE_CM_WARN, " DUPLICATE: cm %p op %s (%s) st %s" " [lid, port, cqp, iqp]:" " %x %x %x %x <- (%x %x %x %x :" " %x %x %x %x) -> %x %x %x %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr1.qpn), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr1.qpn), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_DUP); dapl_os_unlock(lock); return NULL; } } } dapl_os_unlock(lock); /* no duplicate request on connq, check listenq for new request */ if (ntohs(msg->op) == MCM_REQ && !listenq && !found) { listenq = 1; list = &tp->llist; lock = &tp->llock; goto retry_listenq; } /* not match on listenq for valid request, send reject */ if (ntohs(msg->op) == MCM_REQ && !found) { dapl_log(DAPL_DBG_TYPE_WARN, " mcm_recv: NO LISTENER for %s %x %x i%x c%x" " < %x %x %x, sending reject\n", dapl_cm_op_str(ntohs(msg->op)), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->daddr1.qpn), ntohl(msg->sqpn), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->saddr1.qpn)); mcm_reject(tp, msg); } if (!found) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " NO MATCH: op %s [lid, port, cqp, iqp, pid]:" " %x %x %x %x %x <- %x %x %x %x l_pid %x r_pid %x\n", dapl_cm_op_str(ntohs(msg->op)), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr1.qpn), ntohl(msg->d_id), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr1.qpn), ntohl(msg->s_id), ntohl(msg->d_id)); if (ntohs(msg->op) == MCM_DREP) { DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_DREP_DUP); } } return found; } /* Get rmsgs from CM completion queue, 10 at a time */ static void mcm_recv(ib_hca_transport_t *tp) { struct ibv_wc wc[10]; dat_mcm_msg_t *msg; dp_ib_cm_handle_t cm; int i, ret, notify = 0; struct ibv_cq *ibv_cq = NULL; DAPL_HCA *hca; /* POLLIN on channel FD */ ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca); if (ret == 0) { ibv_ack_cq_events(ibv_cq, 1); } retry: ret = ibv_poll_cq(tp->rcq, 10, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(tp->rcq, 0); notify = 1; goto retry; } return; } else notify = 0; for (i = 0; i < ret; i++) { msg = (dat_mcm_msg_t*) (uintptr_t) wc[i].wr_id; dapl_dbg_log(DAPL_DBG_TYPE_CM, " mcm_recv: stat=%d op=%s ln=%d id=%p qp2=%x\n", wc[i].status, dapl_cm_op_str(ntohs(msg->op)), wc[i].byte_len, (void*)wc[i].wr_id, wc[i].src_qp); /* validate CM message, version */ if (ntohs(msg->ver) != DAT_MCM_VER) { dapl_log(DAPL_DBG_TYPE_WARN, " mcm_recv: UNKNOWN msg %p, ver %d\n", msg, msg->ver); mcm_post_rmsg(tp, msg); continue; } if (!(cm = mcm_cm_find(tp, msg))) { mcm_post_rmsg(tp, msg); continue; } /* match, process it */ mcm_process_recv(tp, msg, cm); mcm_post_rmsg(tp, msg); } /* finished this batch of WC's, poll and rearm */ goto retry; } /* ACTIVE/PASSIVE: build and send CM message out of CM object */ static int mcm_send(ib_hca_transport_t *tp, dat_mcm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size) { dat_mcm_msg_t *smsg = NULL; struct ibv_send_wr wr, *bad_wr; struct ibv_sge sge; int len, ret = -1; uint16_t dlid = ntohs(msg->daddr1.lid); /* Get message from send queue, copy data, and send */ dapl_os_lock(&tp->slock); if ((smsg = mcm_get_smsg(tp)) == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " mcm_send ERR: get_smsg(hd=%d,tl=%d) \n", tp->s_hd, tp->s_tl); goto bail; } len = sizeof(dat_mcm_msg_t); dapl_os_memcpy(smsg, msg, len); if (p_size) { smsg->p_size = ntohs(p_size); dapl_os_memcpy(&smsg->p_data, p_data, p_size); } else smsg->p_size = 0; wr.next = NULL; wr.sg_list = &sge; wr.num_sge = 1; wr.opcode = IBV_WR_SEND; wr.wr_id = (unsigned long)tp->s_hd; wr.send_flags = (wr.wr_id % tp->burst) ? 0 : IBV_SEND_SIGNALED; if (len <= tp->ib_cm.max_inline) wr.send_flags |= IBV_SEND_INLINE; sge.length = len; sge.lkey = tp->mr_sbuf->lkey; sge.addr = (uintptr_t)smsg; dapl_dbg_log(DAPL_DBG_TYPE_CM, " mcm_send: op %s ln %d lid %x c_qpn %x rport %x\n", dapl_cm_op_str(ntohs(smsg->op)), sge.length, htons(smsg->daddr1.lid), htonl(smsg->dqpn), htons(smsg->dport)); /* empty slot, then create AH */ if (!tp->ah[dlid]) { tp->ah[dlid] = dapls_create_ah(tp->hca, tp->pd, tp->qp, htons(dlid), NULL); if (!tp->ah[dlid]) goto bail; } wr.wr.ud.ah = tp->ah[dlid]; wr.wr.ud.remote_qpn = ntohl(smsg->dqpn); wr.wr.ud.remote_qkey = DAT_MCM_UD_QKEY; ret = ibv_post_send(tp->qp, &wr, &bad_wr); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " mcm_send ERR: post_send() %s\n", strerror(errno) ); } bail: dapl_os_unlock(&tp->slock); return ret; } /* ACTIVE/PASSIVE: CM objects */ static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) { dapl_os_assert(!cm->ref_count); dapl_os_lock_destroy(&cm->lock); dapl_os_wait_object_destroy(&cm->d_event); dapl_os_wait_object_destroy(&cm->f_event); dapl_os_free(cm, sizeof(*cm)); } void dapls_cm_acquire(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); cm->ref_count++; dapl_os_unlock(&cm->lock); } void dapls_cm_release(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); cm->ref_count--; if (cm->ref_count) { if (cm->ref_count == 1) dapl_os_wait_object_wakeup(&cm->f_event); dapl_os_unlock(&cm->lock); return; } /* active, release local conn id port, if exists on client */ if (!cm->sp && cm->msg.sport && cm->tp->sid) mcm_free_port(cm->tp, ntohs(cm->msg.sport)); /* clean up any UD address handles */ if (cm->ah) { ibv_destroy_ah(cm->ah); cm->ah = NULL; } dapl_os_unlock(&cm->lock); dapli_cm_dealloc(cm); } dp_ib_cm_handle_t dapls_cm_create(DAPL_HCA *hca, DAPL_EP *ep) { dp_ib_cm_handle_t cm; /* Allocate CM, init lock, and initialize */ if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL) return NULL; (void)dapl_os_memzero(cm, sizeof(*cm)); if (dapl_os_lock_init(&cm->lock)) goto bail; if (dapl_os_wait_object_init(&cm->f_event)) { dapl_os_lock_destroy(&cm->lock); goto bail; } if (dapl_os_wait_object_init(&cm->d_event)) { dapl_os_lock_destroy(&cm->lock); dapl_os_wait_object_destroy(&cm->f_event); goto bail; } dapls_cm_acquire(cm); cm->hca = hca; cm->tp = &hca->ib_trans; cm->msg.ver = htons(DAT_MCM_VER); cm->msg.s_id = htonl(dapl_os_getpid()); /* process id for src id */ cm->msg.sys_guid = hca->ib_trans.sys_guid; cm->msg.seg_sz = DAT_MCM_SEG_PO2; /* ACTIVE: init source address QP info from local EP */ if (ep) { if (!hca->ib_trans.scif_ep) { /* CM service local and not on MPXYD */ cm->msg.sport = htons(mcm_get_port(&hca->ib_trans, 0)); if (!cm->msg.sport) { dapl_os_wait_object_destroy(&cm->f_event); dapl_os_wait_object_destroy(&cm->d_event); dapl_os_lock_destroy(&cm->lock); goto bail; } cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */ cm->msg.saddr2.qpn = htonl(ep->qp_handle->qp2->qp_num); /* QPt */ cm->msg.saddr2.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr2.lid = hca->ib_trans.addr.lid; cm->msg.saddr2.ep_map = hca->ib_trans.addr.ep_map; dapl_os_memcpy(&cm->msg.saddr2.gid[0], &hca->ib_trans.addr.gid, 16); } /* QPr is on proxy when xsocket from device */ if (!MXS_EP(&hca->ib_trans.addr)) { cm->msg.saddr1.qpn = htonl(ep->qp_handle->qp->qp_num); /* QPr local*/ cm->msg.saddr1.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr1.lid = hca->ib_trans.addr.lid; cm->msg.saddr1.ep_map = hca->ib_trans.addr.ep_map; dapl_os_memcpy(&cm->msg.saddr1.gid[0], &hca->ib_trans.addr.gid, 16); } /* link CM object to EP */ dapl_ep_link_cm(ep, cm); cm->ep = ep; } return cm; bail: dapl_os_free(cm, sizeof(*cm)); return NULL; } /* schedule destruction of CM object */ void dapli_cm_free(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); cm->state = MCM_FREE; dapls_thread_signal(&cm->hca->ib_trans.signal); dapl_os_unlock(&cm->lock); } /* Blocking, ONLY called from dat_ep_free */ void dapls_cm_free(dp_ib_cm_handle_t cm) { /* free from internal workq, wait until EP is last ref */ dapl_os_lock(&cm->lock); cm->state = MCM_FREE; if (cm->ref_count != 1) { dapl_os_unlock(&cm->lock); dapls_thread_signal(&cm->hca->ib_trans.signal); dapl_os_wait_object_wait(&cm->f_event, DAT_TIMEOUT_INFINITE); dapl_os_lock(&cm->lock); } dapl_os_unlock(&cm->lock); /* unlink, dequeue from EP. Final ref so release will destroy */ dapl_ep_unlink_cm(cm->ep, cm); } DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr) { return DAT_NOT_IMPLEMENTED; } /* ACTIVE/PASSIVE: queue up connection object on CM list */ void dapli_queue_conn(dp_ib_cm_handle_t cm) { /* add to work queue, list, for cm thread processing */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry); dapl_os_lock(&cm->hca->ib_trans.lock); dapls_cm_acquire(cm); dapl_llist_add_tail(&cm->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry, cm); dapl_os_unlock(&cm->hca->ib_trans.lock); if (!cm->hca->ib_trans.scif_ep) dapls_thread_signal(&cm->hca->ib_trans.signal); } /* PASSIVE: queue up listen object on listen list */ static void dapli_queue_listen(dp_ib_cm_handle_t cm) { /* add to work queue, llist, for cm thread processing */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry); dapl_os_lock(&cm->hca->ib_trans.llock); dapls_cm_acquire(cm); dapl_llist_add_tail(&cm->hca->ib_trans.llist, (DAPL_LLIST_ENTRY *)&cm->local_entry, cm); dapl_os_unlock(&cm->hca->ib_trans.llock); } static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) { DAPL_HCA *hca = cm->hca; dapl_os_lock(&hca->ib_trans.llock); dapl_llist_remove_entry(&hca->ib_trans.llist, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapls_cm_release(cm); dapl_os_unlock(&hca->ib_trans.llock); } /* called with local LIST and CM object lock */ void dapli_cm_dequeue(dp_ib_cm_handle_t cm) { /* Remove from work queue, cr thread processing */ dapl_llist_remove_entry(&cm->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapls_cm_release(cm); } void mcm_disconnect_final(dp_ib_cm_handle_t cm) { /* no EP attachment or not RC, nothing to process */ if (cm->ep == NULL || cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) return; dapl_os_lock(&cm->lock); if ((cm->state == MCM_DISCONNECTED) || (cm->state == MCM_FREE)) { dapl_os_unlock(&cm->lock); return; } cm->state = MCM_DISCONNECTED; dapl_os_unlock(&cm->lock); if (cm->sp) dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp); else dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep); dapl_os_wait_object_wakeup(&cm->d_event); } /* * called from consumer thread via ep_disconnect/ep_free or * from cm_thread when receiving DREQ */ DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm) { int finalize = 1; int wakeup = 0; dapl_os_lock(&cm->lock); switch (cm->state) { case MCM_CONNECTED: /* CONSUMER: move to err state to flush, if not UD */ if (cm->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_ERR,0,0,0); /* send DREQ, event after DREP or DREQ timeout */ cm->state = MCM_DISC_PENDING; cm->msg.op = htons(MCM_DREQ); finalize = 0; /* wait for DREP, wakeup timer after DREQ sent */ wakeup = 1; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREQ_TX); break; case MCM_DISC_PENDING: /* DREQ timeout, resend until retries exhausted */ cm->msg.op = htons(MCM_DREQ); if (cm->retries >= cm->hca->ib_trans.retries) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_DREQ: RETRIES EXHAUSTED:" " %x %x %x -> %x %x %x\n", htons(cm->msg.saddr1.lid), htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport), htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); finalize = 1; } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_DREQ_RETRY); break; case MCM_DISC_RECV: /* CM_THREAD: move to err state to flush, if not UD */ if (cm->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_ERR,0,0,0); /* DREQ received, send DREP and schedule event, finalize */ cm->msg.op = htons(MCM_DREP); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREP_TX); break; case MCM_DISCONNECTED: dapl_os_unlock(&cm->lock); return DAT_SUCCESS; default: dapl_log(DAPL_DBG_TYPE_EP, " disconnect UNKNOWN state: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, cm->msg.saddr1.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr1.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); dapl_os_unlock(&cm->lock); return DAT_SUCCESS; } dapl_os_get_time(&cm->timer); /* reply expected */ mcm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); dapl_os_unlock(&cm->lock); if (wakeup) dapls_thread_signal(&cm->hca->ib_trans.signal); if (finalize) mcm_disconnect_final(cm); return DAT_SUCCESS; } /* * ACTIVE: get remote CM SID server info from r_addr. * send, or resend CM msg via UD CM QP */ DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm) { dapl_log(DAPL_DBG_TYPE_CM, " MCM connect: lid %x QPr %x QPt %x lport %x p_sz=%d -> " " lid %x c_qpn %x rport %x ep_map %d %s -> %d %s, retries=%d\n", htons(cm->tp->addr.lid), htonl(cm->msg.saddr1.qpn), htonl(cm->msg.saddr2.qpn), htons(cm->msg.sport), htons(cm->msg.p_size), htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport), cm->tp->addr.ep_map, mcm_map_str(cm->tp->addr.ep_map), cm->msg.daddr1.ep_map, mcm_map_str(cm->msg.daddr1.ep_map), cm->tp->retries); dapl_os_lock(&cm->lock); if (cm->state != MCM_INIT && cm->state != MCM_REP_PENDING) { dapl_os_unlock(&cm->lock); return DAT_INVALID_STATE; } if (cm->retries == cm->hca->ib_trans.retries) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_REQ: RETRIES (%d) EXHAUSTED:" " 0x%x %x 0x%x -> 0x%x %x 0x%x\n", cm->retries, htons(cm->msg.saddr1.lid), htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport), htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); dapl_os_unlock(&cm->lock); #ifdef DAPL_COUNTERS /* called from check_timers in cm_thread, cm lock held */ if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) { dapl_os_unlock(&cm->hca->ib_trans.lock); dapls_print_cm_list(ep->header.owner_ia); dapl_os_lock(&cm->hca->ib_trans.lock); } #endif dapl_evd_connection_callback(cm, IB_CME_DESTINATION_UNREACHABLE, NULL, 0, ep); return DAT_ERROR(DAT_INVALID_ADDRESS, DAT_INVALID_ADDRESS_UNREACHABLE); } cm->state = MCM_REP_PENDING; cm->msg.op = htons(MCM_REQ); dapl_os_get_time(&cm->timer); /* reset reply timer */ if (cm->tp->scif_ep) { /* MIC: proxy CR to MPXYD */ if (dapli_mix_cm_req_out(cm, ep->qp_handle)) goto bail; } else { if (mcm_send(&cm->hca->ib_trans, &cm->msg, &cm->msg.p_data, ntohs(cm->msg.p_size))) goto bail; } dapl_os_unlock(&cm->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC ? DCNT_IA_CM_AH_REQ_TX : DCNT_IA_CM_REQ_TX); return DAT_SUCCESS; bail: dapl_os_unlock(&cm->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapl_log(DAPL_DBG_TYPE_WARN, " connect: snd ERR -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n", htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport), htons(cm->msg.p_size)); dapli_cm_free(cm); return DAT_INSUFFICIENT_RESOURCES; } /* * ACTIVE: exchange QP information, called from CR thread */ void mcm_connect_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg) { DAPL_EP *ep = cm->ep; ib_cm_events_t event = IB_CME_CONNECTED; DAT_RETURN ret; dapl_os_lock(&cm->lock); if (cm->state != MCM_REP_PENDING) { dapl_log(DAPL_DBG_TYPE_WARN, " CONN_RTU: UNEXPECTED state:" " op %s, st %s <- lid %x sqpn %x sport %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->saddr1.lid), ntohl(msg->saddr1.qpn), ntohs(msg->sport)); dapl_os_unlock(&cm->lock); return; } /* CM_REP: save remote address information to EP and CM */ if (msg->seg_sz) /* set po2 seg_sz, if provided */ cm->msg.seg_sz = msg->seg_sz; cm->msg.d_id = msg->s_id; dapl_os_memcpy(&ep->remote_ia_address, &msg->saddr2, sizeof(dat_mcm_addr_t)); dapl_os_memcpy(&cm->msg.daddr2, &msg->saddr2, sizeof(dat_mcm_addr_t)); dapl_os_memcpy(&cm->msg.daddr1, &msg->saddr1, sizeof(dat_mcm_addr_t)); dapl_os_memcpy(&cm->msg.p_proxy, &msg->p_proxy, DAT_MCM_PROXY_DATA); /* validate private data size, and copy if necessary */ if (msg->p_size) { if (ntohs(msg->p_size) > DAT_MCM_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_WARN, " CONN_RTU: invalid p_size %d:" " st %s <- lid %x sqpn %x s2qpn %x spsp %x\n", ntohs(msg->p_size), dapl_cm_state_str(cm->state), ntohs(msg->saddr1.lid), ntohl(msg->saddr1.qpn), ntohl(msg->saddr2.qpn), ntohs(msg->sport)); dapl_os_unlock(&cm->lock); goto bail; } dapl_os_memcpy(cm->msg.p_data, msg->p_data, ntohs(msg->p_size)); } dapl_dbg_log(DAPL_DBG_TYPE_CM, " CONN_RTU: DST lid=%x, QPr=%x, QPt=%x qp_type=%d, port=%x psize=%d\n", ntohs(cm->msg.daddr1.lid), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.daddr2.qpn), cm->msg.daddr1.qp_type, ntohs(msg->sport), ntohs(msg->p_size)); if (ntohs(msg->op) == MCM_REP) event = IB_CME_CONNECTED; else if (ntohs(msg->op) == MCM_REJ_USER) event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA; else { dapl_log(DAPL_DBG_TYPE_WARN, " Warning, non-user CR REJECT:" " cm %p op %s, st %s dlid %x iqp %x iqp2 %xport %x <-" " slid %x iqp %x port %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->daddr1.lid), ntohl(msg->daddr1.qpn),ntohl(msg->daddr2.qpn), ntohs(msg->dport), ntohs(msg->saddr1.lid), ntohl(msg->saddr1.qpn), ntohs(msg->sport)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REJ_RX); event = IB_CME_DESTINATION_REJECT; } if (event != IB_CME_CONNECTED) { dapl_log(DAPL_DBG_TYPE_CM, " ACTIVE: CM_REQ REJECTED:" " cm %p op %s, st %s dlid %x iqp %x port %x <-" " slid %x iqp %x port %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->daddr1.lid), ntohl(msg->daddr1.qpn), ntohs(msg->dport), ntohs(msg->saddr1.lid), ntohl(msg->saddr1.qpn), ntohs(msg->sport)); cm->state = MCM_REJECTED; dapl_os_unlock(&cm->lock); goto bail; } dapl_os_unlock(&cm->lock); /* QP to RTR-RTS with remote QPt (daddr2) info */ dapl_os_lock(&cm->ep->header.lock); if (!MXS_EP(&cm->hca->ib_trans.addr)) { ret = dapls_modify_qp_rtu(cm->ep->qp_handle->qp, cm->msg.daddr2.qpn, cm->msg.daddr2.lid, (ib_gid_handle_t)cm->msg.daddr2.gid); if (ret != DAT_SUCCESS) { dapl_os_unlock(&cm->ep->header.lock); event = IB_CME_LOCAL_FAILURE; goto bail; } } /* QP to RTR-RTS with remote QPr (daddr1) info */ if (!cm->tp->scif_ep) { /* NON-MIC, qp2 is local and not on MPXYD */ ret = dapls_modify_qp_rtu( cm->ep->qp_handle->qp2, cm->msg.daddr1.qpn, cm->msg.daddr1.lid, (ib_gid_handle_t)cm->msg.daddr1.gid); if (ret != DAT_SUCCESS) { dapl_os_unlock(&cm->ep->header.lock); event = IB_CME_LOCAL_FAILURE; goto bail; } /* MXS peer: setup PI WC and save peer WR queue info */ if (MXS_EP(&cm->msg.daddr1)) { /* save PI WR info, create local WC_q, send back WC info */ mcm_ntoh_wrc(&ep->qp_handle->wrc_rem, (mcm_wrc_info_t*)cm->msg.p_proxy); mcm_create_wc_q(ep->qp_handle, ep->qp_handle->wrc_rem.wr_end + 1); mcm_hton_wrc((mcm_wrc_info_t*)cm->msg.p_proxy, &ep->qp_handle->wrc); ep->qp_handle->ep_map = cm->msg.daddr1.ep_map; ep->qp_handle->seg_sz = (1 << cm->msg.seg_sz); /* post 0-byte rcv for inbound WC's via RW_imm */ if (mcm_post_rcv_wc(ep->qp_handle, MCM_WRC_QLEN)) goto bail; dapl_log(DAPL_DBG_TYPE_CM, "CONN_RTU: WR_rem %p sz %d, WC %p sz %d, sg %d\n", ep->qp_handle->wrc_rem.wr_addr, ep->qp_handle->wrc_rem.wr_end+1, ep->qp_handle->wrc.wc_addr, ep->qp_handle->wrc.wc_end+1, ep->qp_handle->seg_sz); } } dapl_os_unlock(&cm->ep->header.lock); /* Send RTU, no private data */ cm->msg.op = htons(MCM_RTU); dapl_os_lock(&cm->lock); cm->state = MCM_CONNECTED; if (cm->tp->scif_ep) { /* MPXYD */ dapli_mix_cm_rtu_out(cm); } else { if (mcm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0)) { dapl_os_unlock(&cm->lock); goto bail; } } dapl_os_unlock(&cm->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_RTU_TX); /* init cm_handle and post the event with private data */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n"); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ACTIVE_EST); dapl_evd_connection_callback(cm, IB_CME_CONNECTED, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep); dapl_log(DAPL_DBG_TYPE_CM_EST, " mcm_ACTIVE_CONN %p %d [lid port qpn] %x %x %x -> %x %x %x %s\n", cm->hca, cm->retries, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), mcm_map_str(cm->msg.daddr1.ep_map)); mcm_log_addrs(DAPL_DBG_TYPE_CM_EST, &cm->msg, cm->state, 0); return; bail: dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep); dapli_cm_free(cm); } /* * PASSIVE: Accept on listen CM PSP. * create new CM object for this CR, * receive peer QP information, private data, * and post cr_event */ static void mcm_accept(ib_cm_srvc_handle_t cm, dat_mcm_msg_t *msg) { dp_ib_cm_handle_t acm; /* Allocate accept CM and setup passive references */ if ((acm = dapls_cm_create(cm->hca, NULL)) == NULL) { dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n"); return; } /* dest CM info from CR msg, source CM info from listen */ acm->sp = cm->sp; acm->hca = cm->hca; acm->tp = cm->tp; acm->msg.op = msg->op; acm->msg.dport = msg->sport; acm->msg.dqpn = msg->sqpn; acm->msg.sport = cm->msg.sport; acm->msg.sqpn = cm->msg.sqpn; acm->msg.p_size = msg->p_size; acm->msg.d_id = msg->s_id; acm->msg.rd_in = msg->rd_in; if (msg->seg_sz) /* set po2 seg_sz, if provided */ acm->msg.seg_sz = msg->seg_sz; /* CR saddr1 is CM daddr1 info, need EP for local saddr1 */ dapl_os_memcpy(&acm->msg.daddr1, &msg->saddr1, sizeof(dat_mcm_addr_t)); dapl_os_memcpy(&acm->msg.daddr2, &msg->saddr2, sizeof(dat_mcm_addr_t)); dapl_os_memcpy(&acm->msg.p_proxy, &msg->p_proxy, DAT_MCM_PROXY_DATA); dapl_log(DAPL_DBG_TYPE_CM, " accept: DST port=%x lid=%x, iqp=%x, iqp2=%x, psize=%d\n", ntohs(acm->msg.dport), ntohs(acm->msg.daddr1.lid), htonl(acm->msg.daddr1.qpn), htonl(acm->msg.daddr2.qpn), htons(acm->msg.p_size)); /* validate private data size before reading */ if (ntohs(msg->p_size) > DAT_MCM_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n", ntohs(msg->p_size)); goto bail; } /* read private data into cm_handle if any present */ if (msg->p_size) dapl_os_memcpy(acm->msg.p_data, msg->p_data, ntohs(msg->p_size)); acm->state = MCM_ACCEPTING; dapli_queue_conn(acm); /* trigger CR event and return SUCCESS */ dapls_cr_callback(acm, IB_CME_CONNECTION_REQUEST_PENDING, acm->msg.p_data, ntohs(msg->p_size), acm->sp); return; bail: /* schedule work thread cleanup */ DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapli_cm_free(acm); return; } /* * PASSIVE: read RTU from active peer, post CONN event */ static void mcm_accept_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg) { dapl_os_lock(&cm->lock); if ((ntohs(msg->op) != MCM_RTU) || (cm->state != MCM_RTU_PENDING)) { dapl_log(DAPL_DBG_TYPE_WARN, " accept_rtu: UNEXPECTED op, state:" " op %s, st %s <- lid %x iqp %x iqp2 %x sport %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->saddr1.lid), ntohl(msg->saddr1.qpn), ntohl(msg->saddr1.qpn), ntohs(msg->sport)); dapl_os_unlock(&cm->lock); goto bail; } cm->state = MCM_CONNECTED; dapl_os_unlock(&cm->lock); /* final data exchange if remote QP state is good to go */ dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: connected!\n"); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_PASSIVE_EST); dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp); dapl_log(DAPL_DBG_TYPE_CM_EST, " PASSIVE_CONN %p %d [lid port qpn] %x %x %x <- %x %x %x %s\n", cm->hca, cm->retries, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), mcm_map_str(cm->msg.daddr1.ep_map)); mcm_log_addrs(DAPL_DBG_TYPE_CM_EST, &cm->msg, cm->state, 1); return; bail: DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp); dapli_cm_free(cm); } /* * PASSIVE: user accepted, check and re-send reply message, called from cm_thread. */ static int mcm_reply(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); if (cm->state != MCM_RTU_PENDING) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_REPLY: wrong state ep %p cm %p %s refs=%d" " %x %x i_%x i2 %x -> %x %x i_%x i_2 %x l_pid %x r_pid %x\n", cm->ep, cm, dapl_cm_state_str(cm->state), cm->ref_count, htons(cm->msg.saddr1.lid), htons(cm->msg.sport), htonl(cm->msg.saddr1.qpn), htonl(cm->msg.saddr2.qpn), htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn), htonl(cm->msg.daddr2.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id)); dapl_os_unlock(&cm->lock); return -1; } if (cm->retries == cm->hca->ib_trans.retries) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)" " %x %x %x %x -> %x %x %x %x \n", htons(cm->msg.saddr1.lid), htons(cm->msg.sport), htonl(cm->msg.saddr1.qpn), htonl(cm->msg.saddr2.qpn), htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn), htonl(cm->msg.daddr2.qpn)); dapl_os_unlock(&cm->lock); #ifdef DAPL_COUNTERS if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) { dapl_os_unlock(&cm->hca->ib_trans.lock); dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head)); dapl_os_lock(&cm->hca->ib_trans.lock); } #endif dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp); return -1; } dapl_os_get_time(&cm->timer); /* RTU expected */ if (mcm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size)) { dapl_log(DAPL_DBG_TYPE_ERR," accept ERR: ucm reply send()\n"); dapl_os_unlock(&cm->lock); return -1; } dapl_os_unlock(&cm->lock); return 0; } /* * PASSIVE: consumer accept, send local QP information, private data, * queue on work thread to receive RTU information to avoid blocking * user thread. */ DAT_RETURN dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data) { DAPL_IA *ia = ep->header.owner_ia; dp_ib_cm_handle_t cm = cr->ib_cm_handle; int ret; dapl_log(DAPL_DBG_TYPE_CM, " MCM_ACCEPT_USR: ep %p cm %p QPt %p QPr %p p_data %p p_size %d\n", ep, cm, ep->qp_handle->qp2, ep->qp_handle->qp, p_data, p_size); dapl_log(DAPL_DBG_TYPE_CM, " MCM_ACCEPT_USR: ep %p cm %p %s refs=%d" " %x %x i_%x i2_%x %s <- %x %x i1_%x i2_%x l_pid %x r_pid %x %s\n", ep, cm, dapl_cm_state_str(cm->state), cm->ref_count, htons(cm->hca->ib_trans.addr.lid), htons(cm->msg.sport), ep->qp_handle->qp ? ep->qp_handle->qp->qp_num:0, ep->qp_handle->qp2 ? ep->qp_handle->qp2->qp_num:0, mcm_map_str(cm->hca->ib_trans.addr.ep_map), htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn), htonl(cm->msg.daddr2.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id), mcm_map_str(cm->msg.daddr1.ep_map)); if (p_size > DAT_MCM_PDATA_SIZE) return DAT_LENGTH_ERROR; dapl_os_lock(&cm->lock); if (cm->state != MCM_ACCEPTING) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_ACCEPT_USR: wrong state ep %p cm %p %s refs=%d" " %x %x i_%x i2_ %x <- %x %x i_%x i2_%x l_pid %x r_pid %x\n", cm->ep, cm, dapl_cm_state_str(cm->state), cm->ref_count, htons(cm->hca->ib_trans.addr.lid), htons(cm->msg.sport), ep->qp_handle->qp ? ep->qp_handle->qp->qp_num:0, ep->qp_handle->qp2 ? ep->qp_handle->qp2->qp_num:0, htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn), htonl(cm->msg.daddr2.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id)); dapl_os_unlock(&cm->lock); return DAT_INVALID_STATE; } dapl_os_unlock(&cm->lock); dapl_dbg_log(DAPL_DBG_TYPE_CM," ACCEPT_USR: rlid=%x iqp=%x type %d, psize=%d\n", ntohs(cm->msg.daddr1.lid), ntohl(cm->msg.daddr1.qpn), cm->msg.daddr1.qp_type, p_size); dapl_dbg_log(DAPL_DBG_TYPE_CM, " ACCEPT_USR: remote GID subnet %s\n", inet_ntop(AF_INET6, cm->msg.daddr1.gid, gid_str, sizeof(gid_str))); /* rdma_out, initiator, cannot exceed remote rdma_in max */ ep->param.ep_attr.max_rdma_read_out = DAPL_MIN(ep->param.ep_attr.max_rdma_read_out, cm->msg.rd_in); /* modify QPr to RTR and then to RTS, QPr (qp) to remote QPt (daddr2), !xsocket */ dapl_os_lock(&ep->header.lock); if (!MXS_EP(&cm->hca->ib_trans.addr)) { ret = dapls_modify_qp_rtu(ep->qp_handle->qp, cm->msg.daddr2.qpn, cm->msg.daddr2.lid, (ib_gid_handle_t)cm->msg.daddr2.gid); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n", strerror(errno), ntohs(cm->msg.daddr1.lid), ntohl(cm->msg.daddr1.qpn)); dapl_os_unlock(&ep->header.lock); goto bail; } } /* modify QPt to RTR and then to RTS, QPt (qp2) to remote QPr (daddr1) */ if (!cm->tp->scif_ep) { /* NON-MIC, qp2 is local and not on MPXYD */ ret = dapls_modify_qp_rtu(ep->qp_handle->qp2, cm->msg.daddr1.qpn, cm->msg.daddr1.lid, (ib_gid_handle_t)cm->msg.daddr1.gid); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n", strerror(errno), ntohs(cm->msg.daddr1.lid), ntohl(cm->msg.daddr1.qpn)); dapl_os_unlock(&ep->header.lock); goto bail; } cm->msg.saddr2.qpn = htonl(ep->qp_handle->qp2->qp_num); cm->msg.saddr2.lid = cm->hca->ib_trans.addr.lid; cm->msg.saddr2.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr2.ep_map = cm->hca->ib_trans.addr.ep_map; dapl_os_memcpy(&cm->msg.saddr2.gid[0], &cm->hca->ib_trans.addr.gid, 16); /* MXS peer: setup PI WC and save peer WR queue info */ if (MXS_EP(&cm->msg.daddr1)) { /* save PI WR info, create local WC_q, send back WC info */ mcm_ntoh_wrc(&ep->qp_handle->wrc_rem, (mcm_wrc_info_t*)cm->msg.p_proxy); mcm_create_wc_q(ep->qp_handle, ep->qp_handle->wrc_rem.wr_end + 1); mcm_hton_wrc((mcm_wrc_info_t*)cm->msg.p_proxy, &ep->qp_handle->wrc); ep->qp_handle->ep_map = cm->msg.daddr1.ep_map; ep->qp_handle->seg_sz = (1 << cm->msg.seg_sz); /* post 0-byte rcv for inbound WC's via RW_imm */ if (mcm_post_rcv_wc(ep->qp_handle, MCM_WRC_QLEN)) goto bail; dapl_log(DAPL_DBG_TYPE_CM, "ACCEPT_USR: WR_rem %p rkey %x sz %d, WC %p rkey %x sz %d sg %d\n", ep->qp_handle->wrc_rem.wr_addr, ep->qp_handle->wrc_rem.wr_rkey, ep->qp_handle->wrc_rem.wr_end+1, ep->qp_handle->wrc.wc_addr, ep->qp_handle->wrc.wc_rkey, ep->qp_handle->wrc.wc_end+1, ep->qp_handle->seg_sz); } } dapl_os_unlock(&ep->header.lock); /* save remote address information, QPr */ dapl_os_memcpy(&ep->remote_ia_address, &cm->msg.daddr1, sizeof(dat_mcm_addr_t)); /* setup local QPr info (if !KR) and type from EP, copy pdata, for reply */ cm->msg.op = htons(MCM_REP); cm->msg.rd_in = ep->param.ep_attr.max_rdma_read_in; if (!MXS_EP(&cm->hca->ib_trans.addr)) { cm->msg.saddr1.qpn = htonl(ep->qp_handle->qp->qp_num); cm->msg.saddr1.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr1.lid = cm->hca->ib_trans.addr.lid; cm->msg.saddr1.ep_map = cm->hca->ib_trans.addr.ep_map; dapl_os_memcpy(&cm->msg.saddr1.gid[0], &cm->hca->ib_trans.addr.gid, 16); } /* * UD: deliver p_data with REQ and EST event, keep REQ p_data in * cm->msg.p_data and save REPLY accept data in cm->p_data for retries */ cm->p_size = p_size; dapl_os_memcpy(&cm->p_data, p_data, p_size); if (cm->tp->scif_ep) { dapl_ep_link_cm(ep, cm); cm->ep = ep; return (dapli_mix_cm_rep_out(cm, p_size, p_data)); } /* save state and setup valid reference to EP, HCA. !PSP !RSP */ if (!cm->sp->ep_handle && !cm->sp->psp_flags) dapl_ep_link_cm(ep, cm); cm->ep = ep; cm->hca = ia->hca_ptr; /* Send RTU and change state under CM lock */ dapl_os_lock(&cm->lock); cm->state = MCM_RTU_PENDING; dapl_os_get_time(&cm->timer); /* RTU expected */ if (mcm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size)) { dapl_log(DAPL_DBG_TYPE_ERR," accept ERR: ucm reply send()\n"); dapl_os_unlock(&cm->lock); dapl_ep_unlink_cm(ep, cm); goto bail; } dapl_os_unlock(&cm->lock); DAPL_CNTR(ia, DCNT_IA_CM_REP_TX); dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: accepted!\n"); dapls_thread_signal(&cm->hca->ib_trans.signal); return DAT_SUCCESS; bail: DAPL_CNTR(ia, DCNT_IA_CM_ERR); dapli_cm_free(cm); return DAT_INTERNAL_ERROR; } /* * dapls_ib_connect * * Initiate a connection with the passive listener on another node * * Input: * ep_handle, * remote_ia_address, * remote_conn_qual, * prd_size size of private data and structure * prd_prt pointer to private data structure * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR r_addr, IN DAT_CONN_QUAL r_psp, IN DAT_COUNT p_size, IN void *p_data) { DAPL_EP *ep = (DAPL_EP *)ep_handle; DAPL_HCA *hca = ep->header.owner_ia->hca_ptr; struct dat_mcm_addr *mcm_ia = (struct dat_mcm_addr *)r_addr; dp_ib_cm_handle_t cm; dapl_log(DAPL_DBG_TYPE_CM, " MCM connect -> AF %d LID 0x%x QPN 0x%x GID %s" " port %d ep_map %s sl %d qt %d\n", mcm_ia->family, ntohs(mcm_ia->lid), ntohl(mcm_ia->qpn), inet_ntop(AF_INET6, &mcm_ia->gid, gid_str, sizeof(gid_str)), mcm_ia->port, mcm_map_str(mcm_ia->ep_map), mcm_ia->sl, mcm_ia->qp_type); /* create CM object, initialize SRC info from EP */ cm = dapls_cm_create(hca, ep); if (cm == NULL) return DAT_INSUFFICIENT_RESOURCES; /* remote hca and port: lid, gid, network order */ dapl_os_memcpy(&cm->msg.daddr1, r_addr, sizeof(struct dat_mcm_addr)); dapl_os_memcpy(&cm->msg.daddr2, r_addr, sizeof(struct dat_mcm_addr)); /* validate port and ep_map range */ if ((mcm_ia->port > 2) || (mcm_ia->ep_map > 3)) cm->msg.daddr1.ep_map = 0; /* remote uCM information, comes from consumer provider r_addr */ cm->msg.dport = htons((uint16_t)r_psp); cm->msg.dqpn = cm->msg.daddr1.qpn; cm->msg.daddr1.qpn = 0; /* don't have a remote qpn until reply */ /* set max rdma inbound requests */ cm->msg.rd_in = ep->param.ep_attr.max_rdma_read_in; if (p_size) { cm->msg.p_size = htons(p_size); dapl_os_memcpy(&cm->msg.p_data, p_data, p_size); } cm->state = MCM_INIT; /* link EP and CM, put on work queue */ dapli_queue_conn(cm); /* build connect request, send to remote CM based on r_addr info */ return (dapli_cm_connect(ep, cm)); } /* * dapls_ib_disconnect * * Disconnect an EP * * Input: * ep_handle, * disconnect_flags * * Output: * none * * Returns: * DAT_SUCCESS */ DAT_RETURN dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags) { dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr); dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED || ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC || cm_ptr == NULL) { dapl_os_unlock(&ep_ptr->header.lock); return DAT_SUCCESS; } dapl_os_unlock(&ep_ptr->header.lock); if (cm_ptr->tp->scif_ep) { /* QPt on MPXYD, QPr local or on MPXYD */ dapli_mix_cm_dreq_out(cm_ptr); if (ep_ptr->qp_handle->qp) dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_ERR,0,0,0); } else { /* QPt and QPr local */ dapli_cm_disconnect(cm_ptr); dapls_modify_qp_state(ep_ptr->qp_handle->qp2, IBV_QPS_ERR,0,0,0); } return DAT_SUCCESS; } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. It is also called if dat_ep_connect * times out using the consumer supplied timeout value. * * Input: * ep_ptr DAPL_EP * active Indicates active side of connection * * Output: * none * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP *ep, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { if (ib_cm_event == IB_CME_TIMEOUT) { dp_ib_cm_handle_t cm_ptr; if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL) return; dapl_log(DAPL_DBG_TYPE_WARN, "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n", ep, cm_ptr, dapl_cm_state_str(cm_ptr->state)); /* schedule release of socket and local resources */ dapli_cm_free(cm_ptr); } } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * DAT_CONN_QUAL_UNAVAILBLE * DAT_CONN_QUAL_IN_USE * */ DAT_RETURN dapls_ib_setup_conn_listener(IN DAPL_IA *ia, IN DAT_UINT64 sid, IN DAPL_SP *sp) { dp_ib_cm_handle_t cm = NULL; int ret; dapl_dbg_log(DAPL_DBG_TYPE_EP, " listen(ia %p ServiceID %x sp %p)\n", ia, sid, sp); /* cm_create will setup saddr1 for listen server */ if ((cm = dapls_cm_create(ia->hca_ptr, NULL)) == NULL) return DAT_INSUFFICIENT_RESOURCES; /* LISTEN: init DST address and QP info to local CM server info */ cm->sp = sp; cm->hca = ia->hca_ptr; /* save cm_handle reference in service point */ sp->cm_srvc_handle = cm; /* proxy CM service: send listen over to MPXYD */ if (ia->hca_ptr->ib_trans.scif_ep) { ret = dapli_mix_listen(cm, sid); if (ret) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " listen: MIX_ERROR %d on conn_qual %x\n", ret, sid); dapli_cm_free(cm); if (ret == MIX_EADDRINUSE) return DAT_CONN_QUAL_IN_USE; else return DAT_INSUFFICIENT_RESOURCES; } } else { /* local CM service, reserve local port and setup addr info */ if (!mcm_get_port(&ia->hca_ptr->ib_trans, (uint16_t)sid)) { dapl_dbg_log(DAPL_DBG_TYPE_WARN, " listen: ERROR %s on conn_qual %x\n", strerror(errno), sid); dapli_cm_free(cm); return DAT_CONN_QUAL_IN_USE; } cm->msg.sport = htons((uint16_t)sid); cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num); cm->msg.saddr1.qp_type = IBV_QPT_UD; cm->msg.saddr1.lid = ia->hca_ptr->ib_trans.addr.lid; dapl_os_memcpy(&cm->msg.saddr1.gid[0], &cm->hca->ib_trans.addr.gid, 16); } /* queue up listen socket to process inbound CR's */ cm->state = MCM_LISTEN; dapli_queue_listen(cm); DAPL_CNTR(ia, DCNT_IA_CM_LISTEN); return DAT_SUCCESS; } /* * dapl_ib_remove_conn_listener * * Have the CM remove a connection listener. * * Input: * ia_handle IA handle * ServiceID IB Channel Service ID * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp) { dp_ib_cm_handle_t cm = sp->cm_srvc_handle; /* free cm_srvc_handle and port, and mark CM for cleanup */ if (cm) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " remove_listener(ia %p sp %p cm %p psp=%x)\n", ia, sp, cm, ntohs(cm->msg.sport)); sp->cm_srvc_handle = NULL; dapli_dequeue_listen(cm); /* clean up proxy listen, otherwise local port space */ if (cm->hca->ib_trans.scif_ep) dapli_mix_listen_free(cm); else mcm_free_port(&cm->hca->ib_trans, ntohs(cm->msg.sport)); dapls_cm_release(cm); /* last ref, dealloc */ } return DAT_SUCCESS; } /* * dapls_ib_accept_connection * * Perform necessary steps to accept a connection * * Input: * cr_handle * ep_handle * private_data_size * private_data * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT p_size, IN const DAT_PVOID p_data) { DAPL_CR *cr = (DAPL_CR *)cr_handle; DAPL_EP *ep = (DAPL_EP *)ep_handle; dapl_dbg_log(DAPL_DBG_TYPE_EP, " accept_connection(cr %p cm %p ep %p prd %p,%d)\n", cr, cr->ib_cm_handle, ep, p_data, p_size); /* allocate and attach a QP if necessary */ if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) { DAT_RETURN status; status = dapls_ib_qp_alloc(ep->header.owner_ia, ep, ep); if (status != DAT_SUCCESS) return status; } return (dapli_accept_usr(ep, cr, p_size, p_data)); } /* * dapls_ib_reject_connection * * Reject a connection * * Input: * cr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm, IN int reason, IN DAT_COUNT p_size, IN const DAT_PVOID p_data) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " reject(cm %p reason %x, p_data %p, p_size %d)\n", cm, reason, p_data, p_size); if (p_size > DAT_MCM_PDATA_SIZE) return DAT_LENGTH_ERROR; if (cm->tp->scif_ep) return (dapli_mix_cm_rej_out(cm, p_size, p_data, reason)); /* cr_thread will destroy CR, update saddr1 lid, gid, qp_type info */ dapl_os_lock(&cm->lock); dapl_log(DAPL_DBG_TYPE_CM, " PASSIVE: REJECTING CM_REQ:" " cm %p op %s, st %s slid %x iqp %x port %x ->" " dlid %x iqp %x port %x\n", cm, dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohs(cm->hca->ib_trans.addr.lid), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.sport), ntohs(cm->msg.daddr1.lid), ntohl(cm->msg.daddr1.qpn), ntohs(cm->msg.dport)); cm->state = MCM_REJECTED; cm->msg.saddr1.lid = cm->hca->ib_trans.addr.lid; cm->msg.saddr1.qp_type = cm->msg.daddr1.qp_type; dapl_os_memcpy(&cm->msg.saddr1.gid[0], &cm->hca->ib_trans.addr.gid, 16); if (reason == IB_CM_REJ_REASON_CONSUMER_REJ) cm->msg.op = htons(MCM_REJ_USER); else cm->msg.op = htons(MCM_REJ_CM); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), reason == IB_CM_REJ_REASON_CONSUMER_REJ ? DCNT_IA_CM_USER_REJ_TX : DCNT_IA_CM_ERR_REJ_TX); if (mcm_send(&cm->hca->ib_trans, &cm->msg, p_data, p_size)) { dapl_log(DAPL_DBG_TYPE_WARN, " cm_reject: send ERR: %s\n", strerror(errno)); dapl_os_unlock(&cm->lock); return DAT_INTERNAL_ERROR; } dapl_os_unlock(&cm->lock); dapli_cm_free(cm); return DAT_SUCCESS; } /* * dapls_ib_cm_remote_addr * * Obtain the remote IP address given a connection * * Input: * cr_handle * * Output: * remote_ia_address: where to place the remote address * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * */ DAT_RETURN dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * remote_ia_address) { DAPL_HEADER *header; dp_ib_cm_handle_t cm; dapl_dbg_log(DAPL_DBG_TYPE_EP, "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n", dat_handle); header = (DAPL_HEADER *) dat_handle; if (header->magic == DAPL_MAGIC_EP) cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle); else if (header->magic == DAPL_MAGIC_CR) cm = ((DAPL_CR *) dat_handle)->ib_cm_handle; else return DAT_INVALID_HANDLE; dapl_os_memcpy(remote_ia_address, &cm->msg.daddr1, sizeof(DAT_SOCK_ADDR6)); return DAT_SUCCESS; } int dapls_ib_private_data_size( IN DAPL_HCA *hca_ptr) { return DAT_MCM_PDATA_SIZE; } void cm_thread(void *arg) { struct dapl_hca *hca = arg; dp_ib_cm_handle_t cm, next; ib_cq_handle_t m_cq; struct dapl_fd_set *set; char rbuf[2]; int time_ms, ret; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca); set = dapl_alloc_fd_set(); if (!set) goto out; dapl_os_lock(&hca->ib_trans.lock); hca->ib_trans.cm_state = IB_THREAD_RUN; while (1) { time_ms = -1; /* reset to blocking */ dapl_fd_zero(set); dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ); dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ); dapl_fd_set(hca->ib_trans.rch_fd, set, DAPL_FD_READ); dapl_fd_set(hca->ib_trans.scif_ev_ep, set, DAPL_FD_READ); dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ); dapl_os_lock(&hca->ib_trans.cqlock); /* CQt for HST->MXS */ if (!dapl_llist_is_empty(&hca->ib_trans.cqlist)) m_cq = dapl_llist_peek_head(&hca->ib_trans.cqlist); else m_cq = NULL; while (m_cq) { dapl_fd_set(m_cq->cq->channel->fd, set, DAPL_FD_READ); dapl_log(DAPL_DBG_TYPE_CM, " cm_thread: mcm_pio_event(%p)\n", m_cq); mcm_dto_event(m_cq); m_cq = dapl_llist_next_entry( &hca->ib_trans.cqlist, (DAPL_LLIST_ENTRY *)&m_cq->entry); } dapl_os_unlock(&hca->ib_trans.cqlock); if (!dapl_llist_is_empty(&hca->ib_trans.list)) next = dapl_llist_peek_head(&hca->ib_trans.list); else next = NULL; while (next) { cm = next; next = dapl_llist_next_entry( &hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapls_cm_acquire(cm); /* hold thread ref */ dapl_os_lock(&cm->lock); if (cm->state == MCM_FREE || hca->ib_trans.cm_state != IB_THREAD_RUN) { dapl_os_unlock(&cm->lock); dapl_log(DAPL_DBG_TYPE_CM, " CM destroy: cm %p ep %p st=%s refs=%d\n", cm, cm->ep, mcm_state_str(cm->state), cm->ref_count); dapls_cm_release(cm); /* release alloc ref */ dapli_cm_dequeue(cm); /* release workq ref */ dapls_cm_release(cm); /* release thread ref */ continue; } dapl_os_unlock(&cm->lock); mcm_check_timers(cm, &time_ms); dapls_cm_release(cm); /* release thread ref */ } /* set to exit and all resources destroyed */ if ((hca->ib_trans.cm_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca->ib_trans.list))) break; dapl_os_unlock(&hca->ib_trans.lock); dapl_select(set, time_ms); if (dapl_poll(hca->ib_trans.rch_fd, DAPL_FD_READ) == DAPL_FD_READ) { mcm_recv(&hca->ib_trans); } ret = dapl_poll(hca->ib_trans.scif_ev_ep, DAPL_FD_READ); if (ret == DAPL_FD_READ) dapli_mix_recv(hca, hca->ib_trans.scif_ev_ep); else if (ret == DAPL_FD_ERROR) { struct ibv_async_event event; dapl_log(1, " cm_thread: dev_id %d scif_ev_ep %d ERR\n", hca->ib_trans.dev_id, hca->ib_trans.scif_ev_ep); event.event_type = IBV_EVENT_DEVICE_FATAL; dapl_evd_un_async_error_callback(hca->ib_hca_handle, &event, hca->ib_trans.async_un_ctx); dapl_os_lock(&hca->ib_trans.lock); hca->ib_trans.cm_state = IB_THREAD_CANCEL; continue; } if (dapl_poll(hca->ib_hca_handle->async_fd, DAPL_FD_READ) == DAPL_FD_READ) { dapli_async_event_cb(&hca->ib_trans); } if (dapl_poll(hca->ib_trans.ib_cq->fd, DAPL_FD_READ) == DAPL_FD_READ) { dapli_cq_event_cb(&hca->ib_trans); } while (dapl_poll(hca->ib_trans.signal.scm[0], DAPL_FD_READ) == DAPL_FD_READ) { recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0); } dapl_os_lock(&hca->ib_trans.lock); /* set to exit and all resources destroyed */ if ((hca->ib_trans.cm_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca->ib_trans.list))) break; } dapl_os_unlock(&hca->ib_trans.lock); free(set); out: hca->ib_trans.cm_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca); } static void mcm_log_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in) { if (in) { if (MXS_EP(&msg->daddr1) && MXS_EP(&msg->saddr1)) { dapl_log(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s <- QPt_r addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map)); } else { dapl_log(lvl, " QPr addr1: %s 0x%x %x 0x%x %s <- QPt addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->daddr1.lid), htonl(msg->daddr1.qpn), htons(msg->dport), mcm_map_str(msg->daddr1.ep_map), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map)); dapl_log(lvl, " QPt addr2: %s 0x%x %x 0x%x %s <- QPr addr1: 0x%x %x 0x%x %s\n", mcm_state_str(state),htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map), htons(msg->saddr1.lid), htonl(msg->saddr1.qpn), htons(msg->sport), mcm_map_str(msg->saddr1.ep_map)); } } else { if (MXS_EP(&msg->saddr1) && MXS_EP(&msg->daddr1)) { dapl_log(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s -> QPt_r addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map)); } else { dapl_log(lvl, " QPr addr1: %s 0x%x %x 0x%x %s -> QPt addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr1.lid), htonl(msg->saddr1.qpn), htons(msg->sport), mcm_map_str(msg->saddr1.ep_map), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map)); dapl_log(lvl, " QPt addr2: %s 0x%x %x 0x%x %s -> QPr addr1: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map), htons(msg->daddr1.lid), htonl(msg->daddr1.qpn), htons(msg->dport), mcm_map_str(msg->daddr1.ep_map)); } } } #ifdef DAPL_COUNTERS static char _ctr_host_[128]; /* Debug aid: List all Connections in process and state */ void dapls_print_cm_list(IN DAPL_IA *ia_ptr) { /* Print in process CM's for this IA, if debug type set */ int i = 0; dp_ib_cm_handle_t cm, next_cm; struct dapl_llist_entry **list; DAPL_OS_LOCK *lock; /* LISTEN LIST */ list = &ia_ptr->hca_ptr->ib_trans.llist; lock = &ia_ptr->hca_ptr->ib_trans.llock; dapl_os_lock(lock); if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list)) next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list); else next_cm = NULL; gethostname(_ctr_host_, sizeof(_ctr_host_)); printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", _ctr_host_ , dapl_os_getpid()); while (next_cm) { cm = next_cm; next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list, (DAPL_LLIST_ENTRY*)&cm->local_entry); printf( " LISTEN[%d]: sp %p %s uCM_QP: %x %x c_%x l_pid %x \n", i, cm->sp, dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.s_id)); i++; } dapl_os_unlock(lock); /* CONNECTION LIST */ list = &ia_ptr->hca_ptr->ib_trans.list; lock = &ia_ptr->hca_ptr->ib_trans.lock; dapl_os_lock(lock); if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list)) next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list); else next_cm = NULL; while (next_cm) { cm = next_cm; next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list, (DAPL_LLIST_ENTRY*)&cm->local_entry); printf( " CONN[%d]: ep %p cm %p %s %s" " %x %x c_%x i_%x %s %x %x c_%x i_%x r_pid %x\n", i, cm->ep, cm, cm->msg.saddr1.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); i++; } printf("\n"); dapl_os_unlock(lock); } void dapls_print_cm_free_list(IN DAPL_IA *ia_ptr) { DAPL_EP *ep, *next_ep; dp_ib_cm_handle_t cm, next_cm; int i = 0; gethostname(_ctr_host_, sizeof(_ctr_host_)); printf("\n [%s:%x] DAPL EP CM FREE LIST:\n", _ctr_host_ , dapl_os_getpid()); dapl_os_lock(&ia_ptr->header.lock); ep = (dapl_llist_is_empty(&ia_ptr->ep_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->ep_list_head)); while (ep != NULL) { next_ep = dapl_llist_next_entry(&ia_ptr->ep_list_head, &ep->header.ia_list_entry); dapl_os_lock(&ep->header.lock); cm = (dapl_llist_is_empty(&ep->cm_list_head) ? NULL : dapl_llist_peek_head(&ep->cm_list_head)); while (cm) { dapl_os_lock(&cm->lock); next_cm = dapl_llist_next_entry(&ep->cm_list_head, &cm->list_entry); if (cm->state == DCM_FREE) { printf( " CONN[%d]: ep %p cm %p %s %s" " %x %x c_%x i_%x l_pid %x %s" " %x %x c_%x i_%x r_pid %x\n", i, cm->ep, cm, cm->msg.saddr1.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohl(cm->msg.s_id), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); i++; } dapl_os_unlock(&cm->lock); cm = next_cm; } dapl_os_unlock(&ep->header.lock); ep = next_ep; } dapl_os_unlock(&ia_ptr->header.lock); } #endif dapl-2.1.5/dapl/openib_mcm/dapl_ib_util.h000066400000000000000000000162011255317474200203010ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_IB_UTIL_H_ #define _DAPL_IB_UTIL_H_ #define _OPENIB_MCM_ #include #include #include "openib_osd.h" #include "dapl_mic_common.h" #include "dapl_ib_common.h" #define MCM_RETRY_CNT 10 #define MCM_REP_TIME 4000 /* reply timeout in m_secs */ #define MCM_RTU_TIME 2000 /* rtu timeout in m_secs */ /* DAPL CM objects MUST include list_entry, ref_count, event for EP linking */ struct ib_cm_handle { struct dapl_llist_entry list_entry; struct dapl_llist_entry local_entry; DAPL_OS_WAIT_OBJECT d_event; DAPL_OS_WAIT_OBJECT f_event; DAPL_OS_LOCK lock; DAPL_OS_TIMEVAL timer; uint32_t cm_id; /* local id */ uint32_t scm_id; /* shadow id */ uint64_t cm_ctx; /* local context */ uint64_t scm_ctx; /* shadow context */ int ref_count; int state; int retries; struct _ib_hca_transport *tp; struct dapl_hca *hca; struct dapl_sp *sp; struct dapl_ep *ep; struct ibv_ah *ah; uint16_t p_size; /* accept p_data, for retries */ uint8_t p_data[DAT_MCM_PDATA_SIZE]; dat_mcm_msg_t msg; }; typedef struct ib_cm_handle *dp_ib_cm_handle_t; typedef dp_ib_cm_handle_t ib_cm_srvc_handle_t; /* Definitions */ #define IB_INVALID_HANDLE NULL /* ib_hca_transport_t, specific to this implementation */ typedef struct _ib_hca_transport { struct ibv_device *ib_dev; struct dapl_hca *hca; struct ibv_context *ib_ctx; struct ibv_comp_channel *ib_cq; ib_cq_handle_t ib_cq_empty; int destroy; int cm_state; DAPL_OS_THREAD thread; DAPL_OS_LOCK lock; /* connect list */ struct dapl_llist_entry *list; DAPL_OS_LOCK llock; /* listen list */ struct dapl_llist_entry *llist; DAPL_OS_LOCK cqlock; /* CQ list for PI WC's */ struct dapl_llist_entry *cqlist; ib_async_handler_t async_unafiliated; void *async_un_ctx; ib_async_cq_handler_t async_cq_error; ib_async_dto_handler_t async_cq; ib_async_qp_handler_t async_qp_error; struct dat_mcm_addr addr; /* lid, port, qp_num, gid */ struct dapl_thread_signal signal; ib_cm_attr_t ib_cm; /* dev attr for QP and CM */ int cqe; int qpe; int burst; int retries; int cm_timer; int rep_time; int rtu_time; DAPL_OS_LOCK slock; int s_hd; int s_tl; struct ibv_pd *pd; struct ibv_cq *scq; struct ibv_cq *rcq; struct ibv_qp *qp; struct ibv_mr *mr_rbuf; struct ibv_mr *mr_sbuf; dat_mcm_msg_t *sbuf; dat_mcm_msg_t *rbuf; struct ibv_comp_channel *rch; int rch_fd; struct ibv_ah **ah; DAPL_OS_LOCK plock; uint16_t lid; uint8_t *sid; /* Sevice IDs, port space, bitarray? */ /* SCIF MIC indirect, EP to MPXYD services, if running on MIC */ uint32_t dev_id; /* proxy device id */ struct scif_portID self; scif_epd_t scif_ep; /* FD operation and CM processing */ scif_epd_t scif_ev_ep; /* unsolicited events processing */ scif_epd_t scif_tx_ep; /* FD data path processing */ struct scif_portID peer; /* MPXYD op EP proxy addr info */ struct scif_portID peer_ev; /* MPXYD event EP proxy addr info */ struct scif_portID peer_tx; /* MPXYD data EP proxy addr info */ uint64_t sys_guid; /* system image guid, network order */ uint64_t guid; /* host order */ char guid_str[32]; char fam_str[8]; char mod_str[8]; char ver_str[8]; ib_named_attr_t na; dat_mix_prov_attr_t pr_attr; /* attributes from proxy */ } ib_hca_transport_t; /* prototypes */ void cm_thread(void *arg); void dapli_queue_conn(dp_ib_cm_handle_t cm); void dapli_dequeue_conn(dp_ib_cm_handle_t cm); void mcm_connect_rtu(dp_ib_cm_handle_t cm, dat_mcm_msg_t *msg); void mcm_disconnect_final(dp_ib_cm_handle_t cm); void dapli_async_event_cb(struct _ib_hca_transport *tp); void dapli_cq_event_cb(struct _ib_hca_transport *tp); void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr); void dapls_cm_release(dp_ib_cm_handle_t cm_ptr); void dapls_cm_free(dp_ib_cm_handle_t cm_ptr); DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr); dp_ib_cm_handle_t dapls_cm_create(DAPL_HCA *hca, DAPL_EP *ep); DAT_RETURN dapls_modify_qp_rtu(struct ibv_qp *qp, uint32_t qpn, uint16_t lid, ib_gid_handle_t gid); /* HST->MXS (MIC xsocket) remote PI communication, proxy.c */ int mcm_send_pi(ib_qp_handle_t m_qp, int len, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr); int mcm_post_rcv_wc(struct dcm_ib_qp *m_qp, int cnt); void mcm_dto_event(struct dcm_ib_cq *m_cq); int mcm_create_wc_q(struct dcm_ib_qp *m_qp, int entries); void mcm_destroy_wc_q(struct dcm_ib_qp *m_qp); int mcm_create_pi_cq(struct dcm_ib_qp *m_qp, int len); void mcm_destroy_pi_cq(struct dcm_ib_qp *m_qp); /* MIC eXchange (MIX) operations, mix.c */ int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query); void dapli_mix_close(ib_hca_transport_t *tp); int dapli_mix_get_attr(ib_hca_transport_t *tp, dat_mix_prov_attr_t *pr_attr); int dapli_mix_listen(dp_ib_cm_handle_t cm, uint16_t sid); int dapli_mix_listen_free(dp_ib_cm_handle_t cm); int dapli_mix_qp_create(ib_qp_handle_t m_qp, struct ibv_qp_init_attr *attr, ib_cq_handle_t req_cq, ib_cq_handle_t rcv_cq); int dapli_mix_qp_free(ib_qp_handle_t m_qp); int dapli_mix_cq_create(ib_cq_handle_t m_cq, int cq_len); int dapli_mix_cq_free(ib_cq_handle_t m_cq); int dapli_mix_cq_wait(ib_cq_handle_t m_cq, int time); int dapli_mix_cq_poll(ib_cq_handle_t m_cq, struct ibv_wc *wc); int dapli_mix_cm_req_out(dp_ib_cm_handle_t m_cm, ib_qp_handle_t m_qp); int dapli_mix_cm_rtu_out(dp_ib_cm_handle_t m_cm); void dapli_mix_cm_dreq_out(dp_ib_cm_handle_t m_cm); int dapli_mix_cm_rep_out(dp_ib_cm_handle_t m_cm, int p_size, void *p_data); int dapli_mix_cm_rej_out(dp_ib_cm_handle_t m_cm, int p_size, void *p_data, int reason); int dapli_mix_post_send(ib_qp_handle_t m_qp, int len, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr); int dapli_mix_post_recv(ib_qp_handle_t m_qp, int len, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr); int dapli_mix_recv(DAPL_HCA *hca, int scif_ep); int dapli_mix_mr_create(ib_hca_transport_t *tp, DAPL_LMR * lmr); int dapli_mix_mr_free(ib_hca_transport_t *tp, DAPL_LMR * lmr); #ifdef DAPL_COUNTERS void dapls_print_cm_list(IN DAPL_IA *ia_ptr); #endif #endif /* _DAPL_IB_UTIL_H_ */ dapl-2.1.5/dapl/openib_mcm/device.c000066400000000000000000000422651255317474200171150ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_osd.h" #include char gid_str[INET6_ADDRSTRLEN]; static void mcm_service_destroy(IN DAPL_HCA *hca); static int mcm_service_create(IN DAPL_HCA *hca); static int32_t create_os_signal(IN DAPL_HCA * hca_ptr) { DAPL_SOCKET listen_socket; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int ret; listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_socket == DAPL_INVALID_SOCKET) return 1; memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(0x7f000001); ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof addr); if (ret) goto err1; ret = getsockname(listen_socket, (struct sockaddr *)&addr, &addrlen); if (ret) goto err1; ret = listen(listen_socket, 0); if (ret) goto err1; hca_ptr->ib_trans.signal.scm[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (hca_ptr->ib_trans.signal.scm[1] == DAPL_INVALID_SOCKET) goto err1; ret = connect(hca_ptr->ib_trans.signal.scm[1], (struct sockaddr *)&addr, sizeof(addr)); if (ret) goto err2; hca_ptr->ib_trans.signal.scm[0] = accept(listen_socket, NULL, NULL); if (hca_ptr->ib_trans.signal.scm[0] == DAPL_INVALID_SOCKET) goto err2; closesocket(listen_socket); return 0; err2: closesocket(hca_ptr->ib_trans.signal.scm[1]); err1: closesocket(listen_socket); return 1; } static void destroy_os_signal(IN DAPL_HCA * hca_ptr) { closesocket(hca_ptr->ib_trans.signal.scm[0]); closesocket(hca_ptr->ib_trans.signal.scm[1]); } static int dapls_config_fd(int fd) { int opts; opts = fcntl(fd, F_GETFL); if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on fd %d ERR %d %s\n", fd, opts, strerror(errno)); return errno; } return 0; } static int dapls_config_verbs(struct ibv_context *verbs) { return dapls_config_fd(verbs->async_fd); } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { return dapls_config_fd(channel->fd); } /* Need CQ for shadow QP's with one half usage */ static ib_cq_handle_t dapls_create_empty_cq(struct ibv_context *ib_ctx) { struct dcm_ib_cq *empty_cq; empty_cq = dapl_os_alloc(sizeof(struct dcm_ib_cq)); if (!empty_cq) return NULL; dapl_os_memzero(empty_cq, sizeof(struct dcm_ib_cq)); empty_cq->cq = ibv_create_cq(ib_ctx, 1, NULL, NULL, 0); if (!empty_cq->cq) { dapl_os_free(empty_cq, sizeof(struct dcm_ib_cq)); return NULL; } return empty_cq; } /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ int32_t dapls_ib_init(void) { return 0; } int32_t dapls_ib_release(void) { return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr, IN DAPL_OPEN_FLAGS flags) { struct ibv_device **dev_list; struct dat_mcm_addr *mcm_ia = (struct dat_mcm_addr *) &hca_ptr->hca_address; struct ibv_port_attr port_attr; int i, nd = 0; DAT_RETURN dat_status = DAT_INTERNAL_ERROR; dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":"STD MODE"); /* Get list of all IB devices, find match, open */ dev_list = ibv_get_device_list(&nd); if (!dev_list) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_get_device_list() failed\n", hca_name); return DAT_INTERNAL_ERROR; } dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca %p: %d devices found\n", hca_ptr, nd); hca_ptr->ib_trans.ib_dev = NULL; for (i = 0; i < nd; ++i) { if (!hca_ptr->ib_trans.guid && dev_list[i]->transport_type == IBV_TRANSPORT_IB) hca_ptr->ib_trans.guid = ibv_get_device_guid(dev_list[i]); if (!strcmp(dev_list[i]->name, hca_name)) hca_ptr->ib_trans.ib_dev = dev_list[i]; } if (hca_ptr->ib_trans.ib_dev == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: device %s not found\n", hca_name); dat_status = DAT_PROVIDER_NOT_FOUND; goto err; } hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: dev open failed for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); goto err; } hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle; dapls_config_verbs(hca_ptr->ib_hca_handle); /* get lid for this hca-port, network order */ if (ibv_query_port(hca_ptr->ib_hca_handle, (uint8_t)hca_ptr->port_num, &port_attr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: get lid ERR for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); dat_status = DAT_INVALID_ADDRESS; goto bail; } else { if (port_attr.state != IBV_PORT_ACTIVE) { dat_status = DAT_INVALID_ADDRESS; goto bail; } hca_ptr->ib_trans.addr.lid = htons(port_attr.lid); hca_ptr->ib_trans.lid = htons(port_attr.lid); } /* get gid for this hca-port, network order */ if (ibv_query_gid(hca_ptr->ib_hca_handle, (uint8_t) hca_ptr->port_num, 0, (union ibv_gid *)&hca_ptr->ib_trans.addr.gid)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: query GID ERR for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); dat_status = DAT_INVALID_ADDRESS; goto bail; } /* set RC tunables via enviroment or default */ if (dapl_ib_inline_data(hca_ptr->ib_hca_handle)) { hca_ptr->ib_trans.ib_cm.max_inline = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_IB_DEFAULT); } hca_ptr->ib_trans.ib_cm.ack_retry = dapl_os_get_env_val("DAPL_ACK_RETRY", DCM_ACK_RETRY); hca_ptr->ib_trans.ib_cm.ack_timer = dapl_os_get_env_val("DAPL_ACK_TIMER", DCM_ACK_TIMER); hca_ptr->ib_trans.ib_cm.rnr_retry = dapl_os_get_env_val("DAPL_RNR_RETRY", DCM_RNR_RETRY); hca_ptr->ib_trans.ib_cm.rnr_timer = dapl_os_get_env_val("DAPL_RNR_TIMER", DCM_RNR_TIMER); hca_ptr->ib_trans.ib_cm.global = dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", DCM_GLOBAL); hca_ptr->ib_trans.ib_cm.hop_limit = dapl_os_get_env_val("DAPL_HOP_LIMIT", DCM_HOP_LIMIT); hca_ptr->ib_trans.ib_cm.tclass = dapl_os_get_env_val("DAPL_TCLASS", DCM_TCLASS); hca_ptr->ib_trans.ib_cm.mtu = dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", DCM_IB_MTU)); if (dapli_mix_open(&hca_ptr->ib_trans, hca_name, hca_ptr->port_num, flags & DAPL_OPEN_QUERY)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: SCIF init ERR for %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev)); goto bail; } if (flags & DAPL_OPEN_QUERY) goto done; /* initialize CM list, LISTEN, SND queue, PSP array, locks */ if ((dapl_os_lock_init(&hca_ptr->ib_trans.lock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.llock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.slock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.plock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.cqlock)) != DAT_SUCCESS) goto bail; /* EVD events without direct CQ channels, CNO support */ hca_ptr->ib_trans.ib_cq = ibv_create_comp_channel(hca_ptr->ib_hca_handle); if (hca_ptr->ib_trans.ib_cq == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_create_comp_channel ERR %s\n", strerror(errno)); goto bail; } dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq); /* EVD to indirect CQ's, need empty CQ for half QP that is not used */ hca_ptr->ib_trans.ib_cq_empty = dapls_create_empty_cq(hca_ptr->ib_hca_handle); if (hca_ptr->ib_trans.ib_cq_empty == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ERR: create_empty_cq = %s\n", strerror(errno)); goto bail; } /* initialize CM and listen lists on this HCA uCM QP */ dapl_llist_init_head(&hca_ptr->ib_trans.list); dapl_llist_init_head(&hca_ptr->ib_trans.llist); dapl_llist_init_head(&hca_ptr->ib_trans.cqlist); /* create uCM qp services */ if (mcm_service_create(hca_ptr)) goto bail; if (create_os_signal(hca_ptr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to init cr pipe - %s\n", strerror(errno)); goto bail; } /* create thread to process inbound connect request */ hca_ptr->ib_trans.cm_state = IB_THREAD_INIT; dat_status = dapl_os_thread_create(cm_thread, (void *)hca_ptr, &hca_ptr->ib_trans.thread); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to create thread\n"); goto bail; } dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: MCM devname %s port %d, dev_IP %s ep_map %s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), hca_ptr->port_num, inet_ntoa(((struct sockaddr_in *) &hca_ptr->hca_address)->sin_addr), mcm_map_str(hca_ptr->ib_trans.addr.ep_map)); /* wait for cm_thread */ while (hca_ptr->ib_trans.cm_state != IB_THREAD_RUN) dapl_os_sleep_usec(1000); done: /* save LID, GID, QPN, PORT address information, for ia_queries */ /* Set AF_INET6 to insure callee address storage of 28 bytes */ hca_ptr->ib_trans.hca = hca_ptr; hca_ptr->ib_trans.addr.family = AF_INET6; hca_ptr->ib_trans.addr.qp_type = IBV_QPT_UD; memcpy(&hca_ptr->hca_address, &hca_ptr->ib_trans.addr, sizeof(struct dat_mcm_addr)); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "%s open: dev %s port %d, GID %s, LID %x qpn %x sl %d %s\n", PROVIDER_NAME, hca_name, hca_ptr->port_num, inet_ntop(AF_INET6, &mcm_ia->gid, gid_str, sizeof(gid_str)), ntohs(mcm_ia->lid), ntohl(mcm_ia->qpn), mcm_ia->sl, mcm_map_str(mcm_ia->ep_map)); ibv_free_device_list(dev_list); return DAT_SUCCESS; bail: mcm_service_destroy(hca_ptr); ibv_close_device(hca_ptr->ib_hca_handle); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->ib_trans.ib_ctx = NULL; hca_ptr->ib_trans.ib_dev = NULL; err: ibv_free_device_list(dev_list); return dat_status; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p\n", hca_ptr); if (!hca_ptr->ib_trans.cm_state) /* thread never started */ goto done; if (hca_ptr->ib_trans.cm_state == IB_THREAD_RUN) { hca_ptr->ib_trans.cm_state = IB_THREAD_CANCEL; dapls_thread_signal(&hca_ptr->ib_trans.signal); while (hca_ptr->ib_trans.cm_state != IB_THREAD_EXIT) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: waiting for cr_thread\n"); dapls_thread_signal(&hca_ptr->ib_trans.signal); dapl_os_sleep_usec(1000); } } dapli_mix_close(&hca_ptr->ib_trans); dapl_os_lock_destroy(&hca_ptr->ib_trans.lock); dapl_os_lock_destroy(&hca_ptr->ib_trans.llock); dapl_os_lock_destroy(&hca_ptr->ib_trans.cqlock); destroy_os_signal(hca_ptr); mcm_service_destroy(hca_ptr); done: if (hca_ptr->ib_trans.ib_cq) ibv_destroy_comp_channel(hca_ptr->ib_trans.ib_cq); if (hca_ptr->ib_trans.ib_cq_empty) { struct ibv_comp_channel *channel; channel = hca_ptr->ib_trans.ib_cq_empty->cq->channel; ibv_destroy_cq(hca_ptr->ib_trans.ib_cq_empty->cq); if (channel) ibv_destroy_comp_channel(channel); } if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (ibv_close_device(hca_ptr->ib_hca_handle)) return (dapl_convert_errno(errno, "ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } return (DAT_SUCCESS); } /* Create uCM endpoint services, allocate remote_ah's array */ static void mcm_service_destroy(IN DAPL_HCA *hca) { ib_hca_transport_t *tp = &hca->ib_trans; int msg_size = sizeof(ib_cm_msg_t); if (tp->mr_sbuf) ibv_dereg_mr(tp->mr_sbuf); if (tp->mr_rbuf) ibv_dereg_mr(tp->mr_rbuf); if (tp->qp) ibv_destroy_qp(tp->qp); if (tp->scq) ibv_destroy_cq(tp->scq); if (tp->rcq) ibv_destroy_cq(tp->rcq); if (tp->rch) { tp->rch_fd = 0; ibv_destroy_comp_channel(tp->rch); } if (tp->ah) { int i; for (i = 0;i < 0xffff; i++) { if (tp->ah[i]) ibv_destroy_ah(tp->ah[i]); } dapl_os_free(tp->ah, (sizeof(*tp->ah) * 0xffff)); } if (tp->pd) ibv_dealloc_pd(tp->pd); if (tp->sid) dapl_os_free(tp->sid, (sizeof(*tp->sid) * 0xffff)); if (tp->rbuf) dapl_os_free(tp->rbuf, (msg_size * tp->qpe)); if (tp->sbuf) dapl_os_free(tp->sbuf, (msg_size * tp->qpe)); } static int mcm_service_create(IN DAPL_HCA *hca) { struct ibv_qp_init_attr qp_create; ib_hca_transport_t *tp = &hca->ib_trans; struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; int i, mlen = sizeof(dat_mcm_msg_t); int hlen = sizeof(struct ibv_grh); /* hdr included with UD recv */ char *rbuf; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " mcm_create: \n"); /* setup CM timers and queue sizes */ tp->retries = dapl_os_get_env_val("DAPL_UCM_RETRY", MCM_RETRY_CNT); tp->rep_time = dapl_os_get_env_val("DAPL_UCM_REP_TIME", MCM_REP_TIME); tp->rtu_time = dapl_os_get_env_val("DAPL_UCM_RTU_TIME", MCM_RTU_TIME); tp->cm_timer = DAPL_MIN(tp->rep_time,tp->rtu_time); tp->qpe = dapl_os_get_env_val("DAPL_UCM_QP_SIZE", DCM_QP_SIZE); tp->cqe = dapl_os_get_env_val("DAPL_UCM_CQ_SIZE", DCM_CQ_SIZE); tp->burst = dapl_os_get_env_val("DAPL_UCM_TX_BURST", DCM_TX_BURST); /* CM service via MPXYD, no need for local IB UD CM service */ if (tp->scif_ep) return 0; tp->pd = ibv_alloc_pd(hca->ib_hca_handle); if (!tp->pd) goto bail; dapl_log(DAPL_DBG_TYPE_UTIL, " create_service: pd %p ctx %p handle 0x%x\n", tp->pd, tp->pd->context, tp->pd->handle); tp->rch = ibv_create_comp_channel(hca->ib_hca_handle); if (!tp->rch) goto bail; dapls_config_comp_channel(tp->rch); tp->rch_fd = tp->rch->fd; tp->scq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, NULL, 0); if (!tp->scq) goto bail; tp->rcq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, tp->rch, 0); if (!tp->rcq) goto bail; if(ibv_req_notify_cq(tp->rcq, 0)) goto bail; dapl_os_memzero((void *)&qp_create, sizeof(qp_create)); qp_create.qp_type = IBV_QPT_UD; qp_create.send_cq = tp->scq; qp_create.recv_cq = tp->rcq; qp_create.cap.max_send_wr = qp_create.cap.max_recv_wr = tp->qpe; qp_create.cap.max_send_sge = qp_create.cap.max_recv_sge = 1; qp_create.cap.max_inline_data = tp->ib_cm.max_inline; qp_create.qp_context = (void *)hca; tp->qp = ibv_create_qp(tp->pd, &qp_create); if (!tp->qp) goto bail; tp->ah = (ib_ah_handle_t*) dapl_os_alloc(sizeof(ib_ah_handle_t) * 0xffff); tp->sid = (uint8_t*) dapl_os_alloc(sizeof(uint8_t) * 0xffff); tp->rbuf = (void*) dapl_os_alloc((mlen + hlen) * tp->qpe); tp->sbuf = (void*) dapl_os_alloc(mlen * tp->qpe); tp->s_hd = tp->s_tl = 0; if (!tp->ah || !tp->rbuf || !tp->sbuf || !tp->sid) goto bail; (void)dapl_os_memzero(tp->ah, (sizeof(ib_ah_handle_t) * 0xffff)); (void)dapl_os_memzero(tp->sid, (sizeof(uint8_t) * 0xffff)); tp->sid[0] = 1; /* resv slot 0, 0 == no ports available */ (void)dapl_os_memzero(tp->rbuf, ((mlen + hlen) * tp->qpe)); (void)dapl_os_memzero(tp->sbuf, (mlen * tp->qpe)); tp->mr_sbuf = ibv_reg_mr(tp->pd, tp->sbuf, (mlen * tp->qpe), IBV_ACCESS_LOCAL_WRITE); if (!tp->mr_sbuf) goto bail; tp->mr_rbuf = ibv_reg_mr(tp->pd, tp->rbuf, ((mlen + hlen) * tp->qpe), IBV_ACCESS_LOCAL_WRITE); if (!tp->mr_rbuf) goto bail; /* modify UD QP: init, rtr, rts */ if ((dapls_modify_qp_ud(hca, tp->qp)) != DAT_SUCCESS) goto bail; /* post receive buffers, setup head, tail pointers */ recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; sge.length = mlen + hlen; sge.lkey = tp->mr_rbuf->lkey; rbuf = (char *) tp->rbuf; for (i = 0; i < tp->qpe; i++) { recv_wr.wr_id = (uintptr_t) (rbuf + hlen); sge.addr = (uintptr_t) rbuf; if (ibv_post_recv(tp->qp, &recv_wr, &recv_err)) goto bail; rbuf += sge.length; } /* save qp_num as part of ia_address, network order */ tp->addr.qpn = htonl(tp->qp->qp_num); return 0; bail: dapl_log(DAPL_DBG_TYPE_ERR, " ucm_create_services: ERR %s\n", strerror(errno)); mcm_service_destroy(hca); return -1; } dapl-2.1.5/dapl/openib_mcm/linux/000077500000000000000000000000001255317474200166405ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_mcm/linux/openib_osd.h000066400000000000000000000013051255317474200211310ustar00rootroot00000000000000#ifndef OPENIB_OSD_H #define OPENIB_OSD_H #include #include #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ #endif /* _INLINE_ */ #define DAPL_SOCKET int #define DAPL_INVALID_SOCKET -1 #define DAPL_FD_SETSIZE 8192 #define closesocket close struct dapl_thread_signal { DAPL_SOCKET scm[2]; }; STATIC _INLINE_ void dapls_thread_signal(struct dapl_thread_signal *signal) { send(signal->scm[1], "w", sizeof "w", 0); } #endif // OPENIB_OSD_H dapl-2.1.5/dapl/openib_mcm/mix.c000066400000000000000000001257111255317474200164510ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" #include "dapl_name_service.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_osd.h" /* * CM proxy services, MCM on MIC to MPXYD via SCIF * * MIX_IA_OPEN */ int dapli_mix_open(ib_hca_transport_t *tp, char *name, int port, int query_only) { int ret, len; dat_mix_open_t msg; scif_epd_t listen_ep; int listen_port; int always_proxy; int scif_port_id; /* make MPXY connection even not running on MIC. good for debugging */ always_proxy = dapl_os_get_env_val("DAPL_MCM_ALWAYS_PROXY", 0); scif_port_id = dapl_os_get_env_val("DAPL_MCM_PORT_ID", SCIF_OFED_PORT_8); ret = scif_get_nodeIDs(NULL, 0, &tp->self.node); if (ret < 0) { dapl_log(1, " scif_get_nodeIDs() failed with error %s\n", strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " SCIF node_id: %d client req_id 0x%x\n", (uint16_t)tp->self.node, dapl_os_getpid()); if (tp->self.node == 0) tp->addr.ep_map = HOST_SOCK_DEV; /* non-MIC mapping */ if (query_only || (tp->self.node == 0 && !always_proxy)){ dapl_log(DAPL_DBG_TYPE_EXTENSION," Not running on MIC, no MPXY connect required\n"); tp->scif_ep = 0; return 0; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Running on MIC, MPXY connect required\n"); /* Create an endpoint for MPXYD to connect back */ listen_ep = scif_open(); if (listen_ep < 0) { dapl_log(1, "scif_open() failed with error %s\n", strerror(errno)); return -1; } listen_port = scif_bind(listen_ep, 0); if (listen_port < 0) { dapl_log(1, "scif_listen() failed with error %s\n", strerror(errno)); return -1; } ret = scif_listen(listen_ep, 2); if (ret < 0) { dapl_log(1, "scif_listen() failed with error %s\n", strerror(errno)); return -1; } /* MPXYD is running on node 0 and well-known OFED port */ tp->peer.node = 0; tp->peer.port = scif_port_id; tp->scif_ep = scif_open(); if (tp->scif_ep < 0) { dapl_log(1, "scif_open() failed with error %s\n", strerror(errno)); return -1; } ret = scif_connect(tp->scif_ep, &tp->peer); if (ret < 0) { dapl_log(1, "scif_connect() to port %d, failed with error %s\n", scif_port_id, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION, "Connected to node 0 for operations, ep=%d\n", tp->scif_ep); len = sizeof(listen_port); ret = scif_send(tp->scif_ep, &listen_port, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: OPEN EP's send on %d, ret %d, exp %d, error %s\n", tp->scif_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent listen port number (%d) on SCIF EP\n", listen_port); ret = scif_accept(listen_ep, &tp->peer_ev, &tp->scif_ev_ep, SCIF_ACCEPT_SYNC); if (ret < 0) { dapl_log(1, "scif_accept() for ev_ep failed with error %s\n", strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Accepted Event EP (%d)\n", tp->scif_ev_ep); ret = scif_accept(listen_ep, &tp->peer_tx, &tp->scif_tx_ep, SCIF_ACCEPT_SYNC); if (ret < 0) { dapl_log(1, "scif_accept() for tx_ep failed with error %s\n", strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Accepted TX EP (%d)\n", tp->scif_tx_ep); ret = scif_close(listen_ep); if (ret < 0) { dapl_log(1, "scif_close() failed with error %d\n", strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION, "Connected to node 0 for DATA, tx_ep=%d \n", tp->scif_tx_ep); /* MIX_IA_OPEN: device name and port */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_IA_OPEN; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = dapl_os_getpid(); msg.port = port; strcpy((char*)&msg.name, name); /* send any overridden attributes to proxy */ msg.dev_attr.ack_timer = tp->ib_cm.ack_timer; msg.dev_attr.ack_retry = tp->ib_cm.ack_retry; msg.dev_attr.rnr_timer = tp->ib_cm.rnr_timer; msg.dev_attr.rnr_retry = tp->ib_cm.rnr_retry ; msg.dev_attr.global = tp->ib_cm.global; msg.dev_attr.hop_limit = tp->ib_cm.hop_limit; msg.dev_attr.tclass = tp->ib_cm.tclass; msg.dev_attr.sl = tp->ib_cm.sl; msg.dev_attr.mtu = tp->ib_cm.mtu; msg.dev_attr.rd_atom_in = tp->ib_cm.rd_atom_in; msg.dev_attr.rd_atom_out = tp->ib_cm.rd_atom_out; msg.dev_attr.pkey_idx = tp->ib_cm.pkey_idx; msg.dev_attr.pkey = tp->ib_cm.pkey; msg.dev_attr.max_inline = tp->ib_cm.max_inline; len = sizeof(dat_mix_open_t); ret = scif_send(tp->scif_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op),tp->scif_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP %d, req_id 0x%x\n", mix_op_str(msg.hdr.op), tp->scif_ep, ntohl(msg.hdr.req_id)); /* MIX_IA_OPEN: reply includes addr info */ ret = scif_recv(tp->scif_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: dev_open reply ep %d, ret %d, exp %d, error %s\n", tp->scif_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Recv'd %s reply on SCIF EP %d, dev_id %d\n", mix_op_str(msg.hdr.op), tp->scif_ep, msg.hdr.req_id); if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_IA_OPEN || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " ERR: dev_open ver (exp %d rcv %d), op %s, flgs %d, st %d dev_id %d\n", DAT_MIX_VER, msg.hdr.ver, mix_op_str(msg.hdr.op), msg.hdr.flags, msg.hdr.status, msg.hdr.req_id); return -1; } /* save address to transport object, keeps IA queries local */ memcpy((void*)&tp->addr, (void*)&msg.dev_addr, sizeof(dat_mcm_addr_t)); /* save actual attributes and device ID */ tp->ib_cm.ack_timer = msg.dev_attr.ack_timer; tp->ib_cm.ack_retry = msg.dev_attr.ack_retry; tp->ib_cm.rnr_timer = msg.dev_attr.rnr_timer; tp->ib_cm.rnr_retry = msg.dev_attr.rnr_retry; tp->ib_cm.global = msg.dev_attr.global; tp->ib_cm.hop_limit = msg.dev_attr.hop_limit; tp->ib_cm.tclass = msg.dev_attr.tclass; tp->ib_cm.sl = msg.dev_attr.sl; tp->ib_cm.mtu = msg.dev_attr.mtu; tp->ib_cm.rd_atom_in = msg.dev_attr.rd_atom_in; tp->ib_cm.rd_atom_out = msg.dev_attr.rd_atom_out; tp->ib_cm.pkey_idx = msg.dev_attr.pkey_idx; tp->ib_cm.pkey = msg.dev_attr.pkey; tp->ib_cm.max_inline = msg.dev_attr.max_inline; tp->dev_id = msg.hdr.req_id; dapl_log(DAPL_DBG_TYPE_EXTENSION, " mix_open reply (msg %p, ln %d) EPs %d %d %d - dev_id %d\n", &msg, len, tp->scif_ep, tp->scif_ev_ep, tp->scif_tx_ep, tp->dev_id); return 0; } /* MIX_IA_CLOSE - no operation, just shutdown endpoint(s) */ void dapli_mix_close(ib_hca_transport_t *tp) { dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_IA_CLOSE: tp %p scif EP's %d,%d,%d dev_id %d\n", tp, tp->scif_ep, tp->scif_tx_ep, tp->scif_ev_ep, tp->dev_id); if (tp->scif_ep) { scif_close(tp->scif_ep); tp->scif_ep = 0; } if (tp->scif_tx_ep) { scif_close(tp->scif_tx_ep); tp->scif_tx_ep = 0; } if (tp->scif_ev_ep) { scif_close(tp->scif_ev_ep); tp->scif_ev_ep = 0; } } /* MIX_PROV_ATTR */ int dapli_mix_get_attr(ib_hca_transport_t *tp, dat_mix_prov_attr_t *pr_attr) { dat_mix_attr_t msg; scif_epd_t mix_ep = tp->scif_ep; int ret, len; dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_GET_ATTR tp = %p\n", tp); /* get attr request */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_PROV_ATTR; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; len = sizeof(dat_mix_hdr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s msg %p send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), &msg, mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP %d\n", mix_op_str(msg.hdr.op), mix_ep); /* get attr response */ len = sizeof(dat_mix_attr_t); ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Recv'd %s reply on SCIF EP %d for dev_id %d\n", mix_op_str(msg.hdr.op), mix_ep, msg.hdr.req_id); if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_PROV_ATTR || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " ERR: MIX_PROV_ATTR ver %d, op %s, flgs %d, st %d dev_id %d\n", msg.hdr.ver, mix_op_str(msg.hdr.op), msg.hdr.flags, msg.hdr.status, msg.hdr.req_id); if (msg.hdr.status != MIX_SUCCESS) return msg.hdr.status; else return -1; } memcpy(pr_attr, &msg.attr, sizeof(dat_mix_prov_attr_t)); dapl_log(DAPL_DBG_TYPE_EXTENSION," MIX_PROV_ATTR successful on SCIF EP %d\n", mix_ep); return 0; } /* MIX_LISTEN */ int dapli_mix_listen(dp_ib_cm_handle_t cm, uint16_t sid) { dat_mix_listen_t msg; scif_epd_t mix_ep = cm->hca->ib_trans.scif_ep; int ret, len; dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_LISTEN port 0x%x htons(0x%x), %d - client req_id 0x%x\n", sid, htons(sid), sid, htonl(dapl_os_getpid())); /* listen request: sid and backlog */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_LISTEN; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = cm->hca->ib_trans.dev_id; msg.sp_ctx = (uint64_t)cm->sp; msg.sid = sid; msg.backlog = 64; len = sizeof(dat_mix_listen_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s msg %p send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), &msg, mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP %d\n", mix_op_str(msg.hdr.op), mix_ep); /* listen response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Recv'd %s reply on SCIF EP %d for dev_id %d\n", mix_op_str(msg.hdr.op), mix_ep, msg.hdr.req_id); if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_LISTEN || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " ERR: MIX_LISTEN ver %d, op %s, flgs %d, st %d dev_id %d\n", msg.hdr.ver, mix_op_str(msg.hdr.op), msg.hdr.flags, msg.hdr.status, msg.hdr.req_id); if (msg.hdr.status != MIX_SUCCESS) return msg.hdr.status; else return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," MIX_LISTEN successful on SCIF EP %d\n", mix_ep); return 0; } /* MIX_LISTEN_FREE */ int dapli_mix_listen_free(dp_ib_cm_handle_t cm) { dat_mix_hdr_t msg; scif_epd_t mix_ep = cm->hca->ib_trans.scif_ep; int ret, len; dapl_log(DAPL_DBG_TYPE_EXTENSION," mix_listen_free port 0x%x htons(0x%x), %d\n", (uint16_t)cm->sp->conn_qual, htons((uint16_t)cm->sp->conn_qual), (uint16_t)cm->sp->conn_qual); /* listen free request */ msg.ver = DAT_MIX_VER; msg.op = MIX_LISTEN_FREE; msg.status = 0; msg.flags = MIX_OP_REQ; msg.req_id = (uint16_t)cm->sp->conn_qual; len = sizeof(dat_mix_hdr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.op)); /* listen free response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.ver != DAT_MIX_VER || msg.op != MIX_LISTEN_FREE || msg.flags != MIX_OP_RSP || msg.status != MIX_SUCCESS) { dapl_log(1, " MIX_LISTEN_FREE: sid 0x%x, ver %d, op %d, flags %d, or stat %d ERR \n", (uint16_t)cm->sp->conn_qual, msg.ver, msg.op, msg.flags, msg.status); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," received successful reply on SCIF EP\n"); return 0; } /* MIX_LMR_CREATE */ int dapli_mix_mr_create(ib_hca_transport_t *tp, DAPL_LMR * lmr) { dat_mix_mr_t msg; scif_epd_t mix_ep = tp->scif_ep; int ret, len; dapl_log(DAPL_DBG_TYPE_EXTENSION," lmr create %p, addr %p %p rmr_context %x mr->rkey %x\n", lmr, lmr->mr_handle->addr, lmr->param.registered_address, lmr->param.rmr_context, lmr->mr_handle->rkey ); /* request: */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_MR_CREATE; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = tp->dev_id; msg.mr_id = 0; msg.mr_len = lmr->param.registered_size; msg.sci_addr = lmr->sci_addr; msg.sci_off = lmr->sci_off; msg.ib_addr = (uint64_t) lmr->mr_handle->addr; msg.ib_rkey = lmr->param.rmr_context; msg.ctx = (uint64_t)lmr; len = sizeof(dat_mix_mr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* response, status and mr_id */ len = sizeof(dat_mix_mr_t); ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_MR_CREATE || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " MIX msg ver %d, op %d, flags %d, or stat %d ERR \n", msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status); return -1; } /* save the MPXYD mr_id */ lmr->mr_id = msg.mr_id; dapl_log(DAPL_DBG_TYPE_EXTENSION," lmr_created %p id = %d\n", lmr, lmr->mr_id); return 0; } /* MIX_LMR_FREE */ int dapli_mix_mr_free(ib_hca_transport_t *tp, DAPL_LMR * lmr) { dat_mix_mr_t msg; scif_epd_t mix_ep = tp->scif_ep; int ret, len; dapl_log(DAPL_DBG_TYPE_EXTENSION," lmr free %p, id=%d\n", lmr, lmr->mr_id); /* request */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_MR_FREE; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.mr_id = lmr->mr_id; len = sizeof(dat_mix_mr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* response, status only */ len = sizeof(dat_mix_hdr_t); ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_MR_FREE || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " MIX msg ver %d, op %d, flags %d, or stat %d ERR \n", msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," removed lmr %p, id %d\n", lmr, lmr->mr_id); return 0; } /* MIX_QP_CREATE */ int dapli_mix_qp_create(ib_qp_handle_t m_qp, struct ibv_qp_init_attr *attr, ib_cq_handle_t req_cq, ib_cq_handle_t rcv_cq) { dat_mix_qp_t msg; scif_epd_t mix_ep = m_qp->tp->scif_ep; int ret, len; /* request: QP_r local or shadowed, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_QP_CREATE; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_qp->tp->dev_id; if (m_qp->qp) { /* QP_r local */ msg.qp_r.qp_num = m_qp->qp->qp_num; msg.qp_r.qp_type = m_qp->qp->qp_type; msg.qp_r.state = m_qp->qp->state; } else { /* QP_r shadowed on proxy */ msg.qp_r.qp_num = 0; msg.qp_r.qp_type = 0; msg.qp_r.state = 0; } msg.qp_r.rcq_id = rcv_cq->cq_id; msg.qp_r.ctx = (uint64_t)m_qp; msg.qp_r.qp_id = 0; /* for now */ msg.qp_r.qp_type = attr->qp_type; msg.qp_r.max_recv_wr = attr->cap.max_recv_wr; msg.qp_r.max_recv_sge = attr->cap.max_recv_sge; msg.qp_r.max_send_wr = attr->cap.max_send_wr; msg.qp_r.max_send_sge = attr->cap.max_send_sge; msg.qp_t.qp_type = attr->qp_type; msg.qp_t.max_inline_data = attr->cap.max_inline_data; msg.qp_t.max_send_wr = attr->cap.max_send_wr; msg.qp_t.max_send_sge = attr->cap.max_send_sge; msg.qp_t.max_recv_wr = attr->cap.max_recv_wr; msg.qp_t.max_recv_sge = attr->cap.max_recv_sge; msg.qp_t.scq_id = req_cq->cq_id; /* QP_t always shadowed on proxy */ dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_QP_CREATE: QP_r - qpn 0x%x, ctx %p, rq %d,%d sq %d,%d rcq_id %d,%p\n", msg.qp_r.qp_num, msg.qp_r.ctx, msg.qp_r.max_recv_wr, msg.qp_r.max_recv_sge, msg.qp_r.max_send_wr, msg.qp_r.max_send_sge, msg.qp_r.rcq_id, rcv_cq); dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_QP_CREATE: QP_t - wr %d sge %d inline %d scq_id %d,%p\n", msg.qp_t.max_send_wr, msg.qp_t.max_send_sge, msg.qp_t.max_inline_data, msg.qp_t.scq_id, req_cq); len = sizeof(dat_mix_qp_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); return EFAULT; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* wait for response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return EFAULT; } if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_QP_CREATE || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " MIX msg ver %d, op %d, flags %d, or stat %d ERR \n", msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status); if (msg.hdr.status) return msg.hdr.status; else return EINVAL; } /* save QP_t id, QP is shadowed TX */ m_qp->qp_id = msg.qp_t.qp_id; m_qp->m_inline = msg.m_inline; dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_QP_CREATE: reply, proxy qp_id 0x%x\n", m_qp->qp_id); return 0; } /* MIX_EP_FREE, fits in header */ int dapli_mix_qp_free(ib_qp_handle_t m_qp) { dat_mix_hdr_t msg; scif_epd_t mix_ep = m_qp->tp->scif_ep; int ret, len; /* request */ msg.ver = DAT_MIX_VER; msg.op = MIX_QP_FREE; msg.status = 0; msg.flags = MIX_OP_REQ; msg.req_id = m_qp->qp_id; /* shadowed QP */ len = sizeof(dat_mix_hdr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.op)); /* response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.ver != DAT_MIX_VER || msg.op != MIX_QP_FREE || msg.flags != MIX_OP_RSP || msg.status != MIX_SUCCESS) { dapl_log(1, " MIX_QP_FREE ERR: ver %d, op %d, flags %d, or stat %d len %d\n", msg.ver, msg.op, msg.flags, msg.status, ret); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," received reply on SCIF EP\n"); return 0; } /* MIX_CQ_CREATE */ int dapli_mix_cq_create(ib_cq_handle_t m_cq, int cq_len) { dat_mix_cq_t msg; scif_epd_t mix_ep = m_cq->tp->scif_ep; int ret, len; /* request: QP_r local, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CQ_CREATE; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cq->tp->dev_id; msg.cq_len = cq_len; msg.cq_ctx = (uint64_t)m_cq; msg.cq_id = 0; len = sizeof(dat_mix_cq_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s snd on %d, ret %d, exp %d, err %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* wait for response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on ep %d, ret %d, exp %d, err %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_CQ_CREATE || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " ERR: %s %p ver %d, op %d, flags %d, stat %d\n", mix_op_str(msg.hdr.op), m_cq, msg.hdr.ver, msg.hdr.op, msg.hdr.flags, msg.hdr.status); return -1; } /* save id from proxy CQ create */ m_cq->cq_id = msg.cq_id; dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CQ_CREATE: reply, proxy cq_id 0x%x\n", m_cq->cq_id); return 0; } /* MIX_CQ_FREE, fits in header */ int dapli_mix_cq_free(ib_cq_handle_t m_cq) { dat_mix_hdr_t msg; scif_epd_t mix_ep = m_cq->tp->scif_ep; int ret, len; /* request */ msg.ver = DAT_MIX_VER; msg.op = MIX_CQ_FREE; msg.status = 0; msg.flags = MIX_OP_REQ; msg.req_id = m_cq->cq_id; len = sizeof(dat_mix_hdr_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.op)); /* response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: rcv on new_ep %d, ret %d, exp %d, error %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.ver != DAT_MIX_VER || msg.op != MIX_CQ_FREE || msg.flags != MIX_OP_RSP || msg.status != MIX_SUCCESS) { dapl_log(1, " MIX_CQ_FREE ERR: ver %d, op %d, flags %d, or stat %d ln %d\n", msg.ver, msg.op, msg.flags, msg.status, ret); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CQ_FREE: reply, proxy cq_id 0x%x\n", m_cq->cq_id); return 0; } int dapli_mix_cq_poll(ib_cq_handle_t m_cq, struct ibv_wc *wc) { /* MPXYD will send event and update EVD, return empty to avoid unnecessary SCIF traffic */ return 0; } /* SCIF DMA outbound writes and inbound msg receives; translate to scif_off via LMR */ /* TODO: faster translation for post_send? */ static inline int mix_proxy_data(ib_qp_handle_t m_qp, dat_mix_sr_t *msg, struct ibv_sge *sglist, int txlen, int mix_ep) { off_t l_off; uint64_t addr; struct dapl_lmr *lmr = NULL; int i, len; for (i=0; i < msg->wr.num_sge ; i++) { dapl_log(DAPL_DBG_TYPE_EXTENSION, " mix_proxy_data: post_%s: sge[%d] addr %p, len %d\n", msg->wr.opcode == OP_RECEIVE ? "recv":"send", i, sglist[i].addr, sglist[i].length); /* find LMR with lkey to get scif_off for scif_read_from */ l_off = 0; if (!lmr || (lmr && (lmr->mr_handle->lkey != sglist[i].lkey))) lmr = dapl_llist_peek_head(&m_qp->ep->header.owner_ia->lmr_list_head); while (lmr) { if (lmr->mr_handle->lkey == sglist[i].lkey) { len = sglist[i].length; addr = sglist[i].addr; l_off = lmr->sci_addr + lmr->sci_off + (addr - lmr->param.registered_address); dapl_log(DAPL_DBG_TYPE_EXTENSION, " mix_proxy_data: LMR (%p) lkey %x sci_addr %p off %x l_off %p addr %p len %d\n", lmr, lmr->mr_handle->lkey, lmr->sci_addr, lmr->sci_off, l_off, addr, len); break; } lmr = dapl_llist_next_entry(&lmr->header.owner_ia->lmr_list_head, &lmr->header.ia_list_entry); } if (l_off) { msg->sge[i].length = len; msg->sge[i].addr = l_off; msg->sge[i].lkey = 0; } else return -1; /* no translation */ } dapl_log(DAPL_DBG_TYPE_EXTENSION," mix_proxy_data: return \n"); return 0; } /**** speed path ****/ int dapli_mix_post_send(ib_qp_handle_t m_qp, int txlen, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr) { char cmd[DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX]; dat_mix_sr_t *msg = (dat_mix_sr_t *)cmd; scif_epd_t mix_ep = m_qp->tp->scif_ep; int ret, i, offset = sizeof(dat_mix_sr_t); dapl_log(DAPL_DBG_TYPE_EXTENSION, " mix_post_send: msg=%p sge=%d len=%d op=%d off=%d (%p)raddr %Lx rkey 0x%x, wr_id %LX\n", msg, wr->num_sge, txlen, wr->opcode, offset, &wr->wr.rdma.remote_addr, wr->wr.rdma.remote_addr, wr->wr.rdma.rkey, wr->wr_id); if (wr->opcode != IBV_WR_SEND && wr->opcode != IBV_WR_RDMA_WRITE && wr->opcode != IBV_WR_RDMA_WRITE_WITH_IMM) return EINVAL; msg->hdr.ver = DAT_MIX_VER; msg->hdr.op = MIX_SEND; msg->hdr.status = 0; msg->hdr.flags = MIX_OP_REQ; msg->hdr.req_id = m_qp->tp->dev_id; msg->len = txlen; msg->qp_id = m_qp->qp_id; mcm_const_mix_wr(&msg->wr, wr); if (txlen > m_qp->m_inline) { if (mix_proxy_data(m_qp, msg, wr->sg_list, txlen, mix_ep)) return EINVAL; } else { msg->hdr.flags |= MIX_OP_INLINE; for (i=0; i < wr->num_sge; i++) { memcpy(&cmd[offset], (void*)wr->sg_list[i].addr, wr->sg_list[i].length); offset += wr->sg_list[i].length; } } ret = scif_send(mix_ep, msg, offset, SCIF_SEND_BLOCK); if (ret != offset) { dapl_log(1, " ERR: %s on %d, ret %d, exp %d, error %s\n", mix_op_str(msg->hdr.op), mix_ep, ret, offset, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent MIX_SEND on SCIF EP %d, mlen=%d\n", mix_ep, offset); return 0; } int dapli_mix_post_recv(ib_qp_handle_t m_qp, int len, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr) { char cmd[DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX]; dat_mix_sr_t *msg = (dat_mix_sr_t *)cmd; scif_epd_t mix_ep = m_qp->tp->scif_ep; int ret; dapl_log(DAPL_DBG_TYPE_EXTENSION, " mix_post_recv: msg=%p sge=%d len=%d wr_id %LX, addr %p lkey 0x%x\n", msg, wr->num_sge, len, wr->wr_id, wr->sg_list[0].addr, wr->sg_list[0].lkey); if (wr->num_sge > DAT_MIX_SGE_MAX) return EINVAL; msg->hdr.ver = DAT_MIX_VER; msg->hdr.op = MIX_RECV; msg->hdr.status = 0; msg->hdr.flags = MIX_OP_REQ; msg->hdr.req_id = m_qp->tp->dev_id; msg->len = len; msg->qp_id = m_qp->qp_id; /* shadowed RX */ /* setup work request */ memset((void*)&msg->wr, 0, sizeof(dat_mix_wr_t)); msg->wr.opcode = OP_RECEIVE; msg->wr.wr_id = wr->wr_id; msg->wr.num_sge = wr->num_sge; if (mix_proxy_data(m_qp, msg, wr->sg_list, len, mix_ep)) return EINVAL; ret = scif_send(mix_ep, msg, sizeof(dat_mix_sr_t), SCIF_SEND_BLOCK); if (ret != sizeof(dat_mix_sr_t)) { dapl_log(1, " ERR: %s on %d, ret %d, exp %d, error %s\n", mix_op_str(msg->hdr.op), mix_ep, ret, sizeof(dat_mix_sr_t), strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent MIX_RECV on SCIF EP %d, mlen=%d\n", mix_ep, sizeof(dat_mix_sr_t)); return 0; } /* MIX CM operations: * * Event/CM channel (scif_ev_ep) for events and CM messages * This channel is used via CM Thread context, separate from user thread context for OPs * Separate EP's per thread too avoid locking overhead on SCIF streams */ dp_ib_cm_handle_t dapli_mix_get_cm(ib_hca_transport_t *tp, uint64_t cm_ctx) { dp_ib_cm_handle_t cm = NULL; dapl_os_lock(&tp->lock); if (!dapl_llist_is_empty(&tp->list)) cm = dapl_llist_peek_head(&tp->list); while (cm) { if (cm == (void*)cm_ctx) break; cm = dapl_llist_next_entry(&tp->list, &cm->local_entry); } dapl_os_unlock(&tp->lock); return cm; } /* CM_REP operation, user context, op channel */ int dapli_mix_cm_rep_out(dp_ib_cm_handle_t m_cm, int p_size, void *p_data) { dat_mix_cm_t msg; scif_epd_t mix_ep = m_cm->tp->scif_ep; /* op channel */ int ret, len; /* request: QP_r local, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CM_ACCEPT; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cm->tp->dev_id; msg.qp_id = m_cm->ep->qp_handle->qp_id; /* QP2 shadowed TX */ msg.cm_id = m_cm->cm_id; msg.cm_ctx = (uint64_t)m_cm->cm_ctx; msg.sp_ctx = (uint64_t)m_cm; /* send back my cm_ctx */ memcpy(&msg.msg, &m_cm->msg, sizeof(dat_mcm_msg_t)); memcpy(msg.msg.p_data, p_data, p_size); msg.msg.p_size = htons(p_size); dapl_log(DAPL_DBG_TYPE_EXTENSION, " ACCEPT -> dport %x cqpn %x iqpn %x lid %x, psize %d pdata[0]=%x\n", ntohs(msg.msg.dport), ntohl(msg.msg.dqpn), ntohl(msg.msg.daddr1.qpn), ntohs(msg.msg.daddr1.lid), p_size, msg.msg.p_data[0]); len = sizeof(dat_mix_cm_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* no reply */ return 0; } /* CM_REJ message, user or cm_thread context, locking required */ int dapli_mix_cm_rej_out(dp_ib_cm_handle_t m_cm, int p_size, void *p_data, int reason) { dat_mix_cm_t msg; scif_epd_t mix_ep = m_cm->tp->scif_ev_ep; /* CM,EV channel */ int ret, len; /* request: QP_r local, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CM_REJECT; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cm->tp->dev_id; msg.cm_id = m_cm->cm_id; msg.cm_ctx = (uint64_t)m_cm->cm_ctx; memcpy(&msg.msg, &m_cm->msg, sizeof(dat_mcm_msg_t)); memcpy(msg.msg.p_data, p_data, p_size); msg.msg.p_size = htons(p_size); if (reason == IB_CM_REJ_REASON_CONSUMER_REJ) /* setup op in CM message */ msg.msg.op = htons(MCM_REJ_USER); else msg.msg.op = htons(MCM_REJ_CM); msg.msg.saddr1.lid = m_cm->hca->ib_trans.addr.lid; msg.msg.saddr1.qp_type = m_cm->msg.daddr1.qp_type; dapl_os_memcpy(&msg.msg.saddr1.gid[0], &m_cm->hca->ib_trans.addr.gid, 16); dapl_log(DAPL_DBG_TYPE_EXTENSION," REJECT -> dport 0x%x, dqpn 0x%x dlid 0x%x, reason %d, psize %d\n", ntohs(msg.msg.dport), ntohl(msg.msg.dqpn), ntohs(msg.msg.daddr1.lid), reason, p_size ); len = sizeof(dat_mix_cm_t); dapl_os_lock(&m_cm->tp->lock); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); dapl_os_unlock(&m_cm->tp->lock); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* no reply */ return 0; } /* MIX_CM_REQ operation, user context, op channel */ int dapli_mix_cm_req_out(dp_ib_cm_handle_t m_cm, ib_qp_handle_t m_qp) { dat_mix_cm_t msg; scif_epd_t mix_ep = m_cm->tp->scif_ep; /* use operation channel */ int ret, len; /* request: QP_r local, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CM_REQ; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cm->tp->dev_id; msg.qp_id = m_qp->qp_id; /* shadowed TX */ msg.cm_id = m_cm->cm_id; msg.cm_ctx = (uint64_t)m_cm; memcpy(&msg.msg, &m_cm->msg, sizeof(dat_mcm_msg_t)); dapl_log(DAPL_DBG_TYPE_EXTENSION," -> dport 0x%x, dqpn 0x%x dlid 0x%x ep_map %s\n", ntohs(msg.msg.dport), ntohl(msg.msg.dqpn), ntohs(msg.msg.daddr1.lid), mcm_map_str(msg.msg.daddr1.ep_map)); len = sizeof(dat_mix_cm_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); /* wait for response */ ret = scif_recv(mix_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(1, " ERR: req_out rcv ep %d, ret %d, exp %d, err %s\n", mix_ep, ret, len, strerror(errno)); return -1; } if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_CM_REQ || msg.hdr.flags != MIX_OP_RSP || msg.hdr.status != MIX_SUCCESS) { dapl_log(1, " MIX msg ver %d, op %s, flags %d, or stat %d ERR \n", msg.hdr.ver, mix_op_str(msg.hdr.op), msg.hdr.flags, msg.hdr.status); return -1; } /* CM object linking: MIC to MPXYD */ m_cm->scm_id = msg.cm_id; m_cm->scm_ctx = msg.cm_ctx; dapl_log(DAPL_DBG_TYPE_EXTENSION," reply on SCIF EP -> cm_id 0x%x, ctx %p\n", m_cm->scm_id, (void*)m_cm->scm_ctx ); return 0; } /* MIX_CM_RTU message, cm_thread context, use EV/CM channel, lock snd channel */ int dapli_mix_cm_rtu_out(dp_ib_cm_handle_t m_cm) { dat_mix_cm_t msg; scif_epd_t mix_ep = m_cm->tp->scif_ev_ep; int ret, len; /* connect RTU: QP_r local, QP_t shadowed */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CM_RTU; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cm->tp->dev_id; msg.cm_id = m_cm->scm_id; msg.cm_ctx = (uint64_t)m_cm; dapl_log(DAPL_DBG_TYPE_EXTENSION," RTU -> id 0x%x dport 0x%x, dqpn 0x%x dlid 0x%x\n", msg.cm_id, ntohs(msg.msg.dport), ntohl(msg.msg.dqpn), ntohs(msg.msg.daddr1.lid)); len = sizeof(dat_mix_cm_t); dapl_os_lock(&m_cm->tp->lock); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); dapl_os_unlock(&m_cm->tp->lock); if (ret != len) { dapl_log(1, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); return 0; } /* MIX_CM_DREQ operation, user context, op channel */ void dapli_mix_cm_dreq_out(dp_ib_cm_handle_t m_cm) { dat_mix_cm_t msg; scif_epd_t mix_ep = m_cm->tp->scif_ep; /* operation channel */ int ret, len; /* disconnect request out */ msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_CM_DISC; msg.hdr.status = 0; msg.hdr.flags = MIX_OP_REQ; msg.hdr.req_id = m_cm->tp->dev_id; msg.cm_id = m_cm->scm_id; msg.cm_ctx = (uint64_t)m_cm; dapl_log(DAPL_DBG_TYPE_EXTENSION," DREQ -> id 0x%x dport 0x%x, dqpn 0x%x dlid 0x%x\n", msg.cm_id, ntohs(msg.msg.dport), ntohl(msg.msg.dqpn), ntohs(msg.msg.daddr1.lid) ); len = sizeof(dat_mix_cm_t); ret = scif_send(mix_ep, &msg, len, SCIF_SEND_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " ERR: %s send on %d, ret %d, exp %d, error %s\n", mix_op_str(msg.hdr.op), mix_ep, ret, len, strerror(errno)); } dapl_log(DAPL_DBG_TYPE_EXTENSION," Sent %s request on SCIF EP\n", mix_op_str(msg.hdr.op)); } /* unsolicited CM event, scif_ep channel */ int dapli_mix_cm_event_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_cm_event_t *pmsg) { int len, ret; dp_ib_cm_handle_t cm; /* hdr already read, get operation data */ len = sizeof(dat_mix_cm_event_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: ret %d, exp %d, error %s\n", ret, len, strerror(errno)); return ret; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CM_EVENT <-: id %d ctx %p event 0x%x\n", pmsg->cm_id, pmsg->cm_ctx, pmsg->event); /* Find the CM and EP for event processing */ cm = dapli_mix_get_cm(tp, pmsg->cm_ctx); if (!cm) { dapl_log(DAPL_DBG_TYPE_EXTENSION, " mcm_get_cm, ctx %p, not found\n", pmsg->cm_ctx); return 0; } switch (pmsg->event) { case DAT_CONNECTION_EVENT_TIMED_OUT: if (cm->sp) dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp); else dapl_evd_connection_callback(cm, IB_CME_DESTINATION_UNREACHABLE, NULL, 0, cm->ep); break; case DAT_CONNECTION_EVENT_ESTABLISHED: case DAT_CONNECTION_REQUEST_EVENT: case DAT_DTO_COMPLETION_EVENT: case DAT_CONNECTION_EVENT_PEER_REJECTED: case DAT_CONNECTION_EVENT_NON_PEER_REJECTED: case DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR: case DAT_CONNECTION_EVENT_DISCONNECTED: mcm_disconnect_final(cm); break; case DAT_CONNECTION_EVENT_BROKEN: case DAT_CONNECTION_EVENT_UNREACHABLE: default: break; } return 0; } /* unsolicited DTO event, op channel */ int dapli_mix_dto_event_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_dto_comp_t *pmsg) { int len, ret, i; struct dcm_ib_cq *m_cq; DAPL_COOKIE *cookie; /* hdr already read, get operation data */ len = sizeof(dat_mix_dto_comp_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: ret %d, exp %d, error %s\n", ret, len, strerror(errno)); return ret; } /* Get cq and post DTO event with this WC entry */ m_cq = (void*)pmsg->cq_ctx; for (i=0; iwc_cnt; i++) { struct ibv_wc ib_wc; /* possible segmentation on mpxyd side, update length if success */ if (pmsg->wc[i].status == 0) { cookie = (DAPL_COOKIE *) (uintptr_t) pmsg->wc[i].wr_id; if (!cookie) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: mix_dto_event_in: wr_id=0 wc[%d] cnt %d\n", i, pmsg->wc_cnt); return 0; } pmsg->wc[i].byte_len = cookie->val.dto.size; dapl_log(DAPL_DBG_TYPE_EP, " mix_dto_event: MCM evd %p ep %p wr_id=%Lx ln=%d\n", m_cq->evd, cookie->ep, pmsg->wc[i].wr_id, cookie->val.dto.size); } mcm_const_ib_wc(&ib_wc, &pmsg->wc[i], 1); dapl_os_lock(&m_cq->evd->header.lock); dapls_evd_cqe_to_event(m_cq->evd, &ib_wc); dapl_os_unlock(&m_cq->evd->header.lock); } return 0; } int dapli_mix_cm_rep_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_cm_t *pmsg) { int len, ret; dp_ib_cm_handle_t cm; /* hdr already read, get operation data */ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: ret %d, exp %d, error %s\n", ret, len, strerror(errno)); return ret; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CM_REP_IN <-: id %d ctx %p \n", pmsg->cm_id, pmsg->cm_ctx); /* Find the CM and EP for event processing */ cm = dapli_mix_get_cm(tp, pmsg->cm_ctx); if (!cm) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: mcm_get_cm, ctx %p, not found\n", pmsg->cm_ctx); return -1; } mcm_connect_rtu(cm, &pmsg->msg); return 0; } int dapli_mix_cm_req_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_cm_t *pmsg) { int len, ret; dp_ib_cm_handle_t acm; /* hdr already read, get operation data */ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: ret %d, exp %d, error %s\n", ret, len, strerror(errno)); return ret; } /* Allocate client CM and setup passive references */ if ((acm = dapls_cm_create(tp->hca, NULL)) == NULL) { dapl_log(DAPL_DBG_TYPE_WARN, " mix_cm_req_in: ERR cm_create\n"); return -1; } acm->sp = (DAPL_SP *)pmsg->sp_ctx; acm->cm_id = pmsg->cm_id; acm->cm_ctx = pmsg->cm_ctx; memcpy(&acm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t)); dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CM_REQ_IN <- DST port=%x lid=%x, QPr=%x, QPt=%x, psize=%d r_guid=%Lx\n", ntohs(acm->msg.dport), ntohs(acm->msg.daddr1.lid), htonl(acm->msg.daddr1.qpn), htonl(acm->msg.daddr2.qpn), htons(acm->msg.p_size), htonll(acm->msg.sys_guid)); dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CM_REQ_IN <-: sp %p new_cm %p pxy_id %d pxy_ctx %p psize %d pdata[0]=0x%x\n", acm->sp, acm, pmsg->cm_id, pmsg->cm_ctx, ntohs(acm->msg.p_size), acm->msg.p_data[0]); /* trigger CR event */ acm->state = MCM_ACCEPTING; dapli_queue_conn(acm); dapls_cr_callback(acm, IB_CME_CONNECTION_REQUEST_PENDING, acm->msg.p_data, ntohs(acm->msg.p_size), acm->sp); return 0; } int dapli_mix_cm_rtu_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_cm_t *pmsg) { int len, ret; dp_ib_cm_handle_t cm; /* hdr already read, get operation data */ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: ret %d, exp %d, error %s\n", ret, len, strerror(errno)); return ret; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " MIX_CM_RTU_IN <-: id %d ctx %p \n", pmsg->cm_id, pmsg->cm_ctx); /* Find the CM and EP for event processing */ cm = dapli_mix_get_cm(tp, pmsg->cm_ctx); if (!cm) { dapl_log(DAPL_DBG_TYPE_ERR, " ERR: mcm_get_cm, ctx %p, not found\n", pmsg->cm_ctx); return -1; } dapl_os_lock(&cm->lock); cm->state = MCM_CONNECTED; dapl_os_unlock(&cm->lock); dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp); return 0; } int dapli_mix_cm_rej_in(ib_hca_transport_t *tp, scif_epd_t scif_ep, dat_mix_cm_t *pmsg) { int len, ret, event; dp_ib_cm_handle_t cm; /* hdr already read, get operation data */ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { dapl_log(DAPL_DBG_TYPE_ERR, " MCM_REJ_IN ERR: %d exp %d, scif_recv err %s\n", ret, len, strerror(errno)); return ret; } /* Find the CM and EP for event processing */ cm = dapli_mix_get_cm(tp, pmsg->cm_ctx); if (!cm) { dapl_log(1, " ERR: mcm_get_cm, ctx %p, not found\n", pmsg->cm_ctx); return -1; } memcpy(&cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t)); dapl_log(DAPL_DBG_TYPE_CM_WARN, " MCM_REJ_IN%s <- p_msg %p id %d cm %p (%d) ep %p %s\n", pmsg->hdr.op == MIX_CM_REJECT_USER ? "_USER":"", pmsg, pmsg->cm_id, pmsg->cm_ctx, cm->ref_count, cm->ep, dapl_cm_state_str(cm->state)); if (pmsg->hdr.op == MIX_CM_REJECT_USER) event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA; else event = IB_CME_DESTINATION_REJECT; dapl_os_lock(&cm->lock); cm->state = MCM_REJECTED; dapl_os_unlock(&cm->lock); if (cm->sp) dapls_cr_callback(cm, event, NULL, 0, cm->sp); else dapl_evd_connection_callback(cm, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep); return 0; } /* * MIX recv, unsolicited messages from MPXYD, via scif_ev_ep - CM/EV endpoint * */ int dapli_mix_recv(DAPL_HCA *hca, int scif_ep) { char cmd[DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX]; dat_mix_hdr_t *phdr = (dat_mix_hdr_t *)cmd; ib_hca_transport_t *tp = &hca->ib_trans; int ret, len; len = sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, phdr, len, SCIF_RECV_BLOCK); if ((ret != len) || (phdr->ver != DAT_MIX_VER) || phdr->flags != MIX_OP_REQ) { dapl_log(DAPL_DBG_TYPE_EXCEPTION, " ERR: rcv on scif_ep %d, ret %d, exp %d, VER=%d flgs=%d, error %s\n", scif_ep, ret, len, phdr->ver, phdr->flags, strerror(errno)); return -1; } dapl_log(DAPL_DBG_TYPE_EXTENSION, " ver %d, op %d, flags %d\n", phdr->ver, phdr->op, phdr->flags); switch (phdr->op) { case MIX_DTO_EVENT: ret = dapli_mix_dto_event_in(tp, scif_ep, (dat_mix_dto_comp_t*)phdr); break; case MIX_CM_EVENT: ret = dapli_mix_cm_event_in(tp, scif_ep, (dat_mix_cm_event_t*)phdr); break; case MIX_CM_REQ: ret = dapli_mix_cm_req_in(tp, scif_ep, (dat_mix_cm_t*)phdr); break; case MIX_CM_REP: ret = dapli_mix_cm_rep_in(tp, scif_ep, (dat_mix_cm_t*)phdr); break; case MIX_CM_REJECT: case MIX_CM_REJECT_USER: ret = dapli_mix_cm_rej_in(tp, scif_ep, (dat_mix_cm_t*)phdr); break; case MIX_CM_RTU: ret = dapli_mix_cm_rtu_in(tp, scif_ep, (dat_mix_cm_t*)phdr); break; case MIX_CM_EST: case MIX_CM_DISC: case MIX_CM_DREP: break; default: dapl_log(DAPL_DBG_TYPE_ERR, " ERROR!!! unknown MIX operation: %d\n", phdr->op); return -1; } return ret; } dapl-2.1.5/dapl/openib_mcm/proxy.c000066400000000000000000000443551255317474200170410ustar00rootroot00000000000000/* * Copyright (c) 2009-2015 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_evd_util.h" #include "dapl_ep_util.h" #include "dapl_osd.h" /* * HST -> MXS - proxy-out (PO) to proxy-in (PI) * * non-MIC host to MIC cross socket EP needs to send WR to remote PI service * instead of direct IB send or write. Inbound traffic from remote MXS will still be * be direct so there is no need for PI service on this MCM providers host side. */ #define MCM_MP_SIG_RATE 5 int mcm_send_pi(struct dcm_ib_qp *m_qp, int len, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr) { struct ibv_send_wr wr_imm; struct ibv_sge sge; struct mcm_wr_rx m_wr_rx; int i, l_len, seg_len, ret = 0, wr_idx; struct wrc_idata wrc; uint32_t wr_flags, l_off, r_off = 0; uint64_t l_addr; struct mcm_wr_rx *wr_rx_ptr; dapl_log(DAPL_DBG_TYPE_EP, " mcm_send_pi: ep %p qpn %x ln %d sge %d sg %d" " WR: tl %d hd %d end %d wr_id %Lx\n", m_qp->ep, m_qp->qp2->qp_num, len, wr->num_sge, m_qp->seg_sz, m_qp->wr_tl, m_qp->wr_hd, m_qp->wrc_rem.wr_end, wr->wr_id); if (wr->num_sge > DAT_MIX_SGE_MAX) { ret = EINVAL; goto bail; } /* one WR per IB sge, no additional segmentation */ for (i=0;inum_sge;i++) { l_len = wr->sg_list[i].length; l_addr = wr->sg_list[i].addr; l_off = 0; while (l_len) { wr_flags = M_SEND_DIRECT | M_SEND_PI; if ((i==0) && (l_len == wr->sg_list[i].length)) wr_flags |= M_SEND_FS; if (wr->opcode == IBV_WR_SEND) seg_len = l_len; else seg_len = (l_len > m_qp->seg_sz) ? m_qp->seg_sz : l_len; dapl_os_lock(&m_qp->lock); if (((m_qp->wr_hd + 1) & m_qp->wrc_rem.wr_end) == m_qp->wr_tl) { /* full */ ret = ENOMEM; dapl_os_unlock(&m_qp->lock); goto bail; } m_qp->wr_hd = (m_qp->wr_hd + 1) & m_qp->wrc_rem.wr_end; /* move hd */ wr_idx = m_qp->wr_hd; dapl_os_unlock(&m_qp->lock); /* last WR segment and last proxy data segment */ if ((i==(wr->num_sge-1)) && (seg_len >= l_len)) { wr_flags |= M_SEND_LS; if (wr->send_flags & IBV_SEND_SIGNALED) wr_flags |= M_SEND_CN_SIG; } if (!(wr_idx % MCM_MP_SIG_RATE) || (wr_flags & M_SEND_CN_SIG)) wr_flags |= M_SEND_MP_SIG; if (!m_qp->wr_buf_rx) { wr_rx_ptr = &m_wr_rx; sge.lkey = 0; /* inline doesn't need registered */ } else { wr_rx_ptr = (struct mcm_wr_rx *) (m_qp->wr_buf_rx + (sizeof(struct mcm_wr_rx) * wr_idx)); sge.lkey = m_qp->wr_buf_rx_mr->lkey; } sge.addr = (uint64_t)(uintptr_t) wr_rx_ptr; sge.length = (uint32_t) sizeof(struct mcm_wr_rx); /* 160 byte WR */ dapl_log(DAPL_DBG_TYPE_EP, " mcm_send_pi[%d]: seg_ln %d wr_idx %d, tl %d hd %d\n", i, seg_len, wr_idx, m_qp->wr_tl, m_qp->wr_hd); /* build local m_wr_rx for remote PI */ memset((void*)wr_rx_ptr, 0, sizeof(struct mcm_wr_rx)); wr_rx_ptr->org_id = (uint64_t) htonll((uint64_t)wr->wr_id); wr_rx_ptr->flags = htonl(wr_flags); wr_rx_ptr->w_idx = htonl(m_qp->wc_tl); /* snd back wc tail */ wr_rx_ptr->wr.num_sge = htonl(wr->num_sge); wr_rx_ptr->wr.opcode = htonl(wr->opcode); /* RW_IMM: reset opcode on all segments except last */ if (!(wr_flags & M_SEND_LS) && (wr->opcode == IBV_WR_RDMA_WRITE_WITH_IMM)) wr_rx_ptr->wr.opcode = htonl(IBV_WR_RDMA_WRITE); wr_rx_ptr->wr.send_flags = htonl(wr->send_flags); wr_rx_ptr->wr.imm_data = htonl(wr->imm_data); wr_rx_ptr->sg[0].addr = htonll(l_addr + l_off); wr_rx_ptr->sg[0].lkey = htonl(wr->sg_list[i].lkey); wr_rx_ptr->sg[0].length = htonl(seg_len); if ((wr->opcode == IBV_WR_RDMA_WRITE) || (wr->opcode == IBV_WR_RDMA_WRITE_WITH_IMM)) { wr_rx_ptr->wr.wr.rdma.remote_addr = htonll(wr->wr.rdma.remote_addr + r_off); wr_rx_ptr->wr.wr.rdma.rkey = htonl(wr->wr.rdma.rkey); } /* setup imm_data for PI rcv engine */ wrc.id = (uint16_t)wr_idx; wrc.type = M_WR_TYPE; wrc.flags = 0; /* setup local WR for wr_rx transfer - RW_imm inline */ memset(&wr_imm, 0, sizeof(struct ibv_send_wr)); wr_imm.wr_id = wr->wr_id; /* MUST be original cookie, CQ processing */ wr_imm.sg_list = &sge; wr_imm.num_sge = 1; wr_imm.opcode = IBV_WR_RDMA_WRITE_WITH_IMM; if (wr_flags & M_SEND_MP_SIG) wr_imm.send_flags |= IBV_SEND_SIGNALED; if (!m_qp->wr_buf_rx) wr_imm.send_flags |= IBV_SEND_INLINE; wr_imm.imm_data = htonl(*(uint32_t *)&wrc); wr_imm.wr.rdma.rkey = m_qp->wrc_rem.wr_rkey; wr_imm.wr.rdma.remote_addr = (uint64_t)(uintptr_t) ((struct mcm_wr_rx *) (m_qp->wrc_rem.wr_addr + (m_qp->wrc_rem.wr_sz * wr_idx))); sge.addr = (uint64_t)(uintptr_t) &m_wr_rx; sge.length = (uint32_t) sizeof(struct mcm_wr_rx); /* 160 byte WR */ sge.lkey = 0; /* inline doesn't need registered */ dapl_log(DAPL_DBG_TYPE_EP, " mcm_send_pi[%d]: WR_RX wr_id %Lx qn %x op %d flgs 0x%x" " imm %x laddr %p raddr %p rkey %x wr_ln %d ln %d\n", i, wr_imm.wr_id, m_qp->qp2->qp_num, wr_imm.opcode, wr_flags, ntohl(wr_imm.imm_data), l_addr + l_off, wr_imm.wr.rdma.remote_addr, wr_imm.wr.rdma.rkey, sizeof(struct mcm_wr_rx), l_len); dapl_log(DAPL_DBG_TYPE_EP, " mcm_send_pi[%d]: WR wr_id %Lx qn %x op %d flgs %x" " imm %x raddr %p rkey %x sg_ln %d tl %d me %d hd %d\n", i, wr->wr_id, m_qp->qp2->qp_num, wr->opcode, wr->send_flags, wr->imm_data, wr->wr.rdma.remote_addr + r_off, wr->wr.rdma.rkey, seg_len, m_qp->wr_tl, wr_idx, m_qp->wr_hd); ret = ibv_post_send(m_qp->qp2, &wr_imm, bad_wr); /* QP2: QPtx - QPrx PI */ if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " mcm_send_pi ERR: m_wr %p idx %d laddr=%p ln=%d lkey=%x flgs %x" " tl %d hd %d\n", m_wr_rx, wr_idx, wr->sg_list[0].addr, wr->sg_list[0].length, wr->sg_list[0].lkey, wr_rx_ptr->flags, m_qp->wr_tl, m_qp->wr_hd); dapl_log(DAPL_DBG_TYPE_ERR, " mcm_send_pi ERR: wr_id %Lx %p sglist %p sge %d op %d flgs %x" " idata 0x%x raddr %p rkey %x \n", wr_rx_ptr->wr.wr_id, wr->sg_list, wr_rx_ptr->wr.num_sge, wr_rx_ptr->wr.opcode, wr_rx_ptr->wr.send_flags, wr_rx_ptr->wr.imm_data, wr_rx_ptr->wr.wr.rdma.remote_addr, wr_rx_ptr->wr.wr.rdma.rkey); goto bail; } l_len -= seg_len; l_off += seg_len; r_off += seg_len; } /* wire segmentation of each IOV segment */ } bail: return ret; } /* TX - RW_imm work request data to remote PI or consumer TX data direct to peer */ static inline void mcm_dto_req(struct dcm_ib_cq *m_cq, struct ibv_wc *wc) { DAPL_COOKIE *cookie; struct dcm_ib_qp *m_qp; cookie = (DAPL_COOKIE *)(uintptr_t)wc->wr_id; m_qp = cookie->ep->qp_handle; if (!m_qp->tp->scif_ep && MXS_EP(m_qp) && (wc->opcode == (uint32_t)IBV_WR_RDMA_WRITE_WITH_IMM)) { dapl_log(DAPL_DBG_TYPE_EP, " mcm_dto_req: RW_imm -> WR, wr_id %Lx\n", wc->wr_id); return; /* post_send -> RW_imm to peer PI */ } dapl_log(DAPL_DBG_TYPE_EP, " mcm_dto_req: SIG evd %p ep %p WR tl %d hd %d WC tl %d wr_id %p\n", m_qp->req_cq ? m_qp->req_cq->evd:0, m_qp->ep, m_qp->wr_tl, m_qp->wr_hd, m_qp->wc_tl, cookie); dapl_os_lock(&m_qp->req_cq->evd->header.lock); dapls_evd_cqe_to_event(m_qp->req_cq->evd, wc); dapl_os_unlock(&m_qp->req_cq->evd->header.lock); } /* RX work completion of RW data to remote PI, remote RR completion */ static inline void mcm_dto_rcv(struct dcm_ib_cq *m_cq, struct ibv_wc *wc) { struct mcm_wc_rx *m_wc; struct dcm_ib_qp *m_qp = (struct dcm_ib_qp *)wc->wr_id; struct wrc_idata wrc; wrc.id = WRC_ID_DATA(ntohl(wc->imm_data)); wrc.type = WRC_TYPE_DATA(ntohl(wc->imm_data)); wrc.flags = WRC_FLAGS_DATA(ntohl(wc->imm_data)); if (wrc.type != M_WC_TYPE) { dapl_log(DAPL_DBG_TYPE_ERR, "mcm_dto_rcv: ERR imm WC type ?= 0x%x\n", wrc.type); goto bail; } if (wrc.id > m_qp->wrc.wc_end) { dapl_log(DAPL_DBG_TYPE_ERR, " mcm_dto_rcv: ERR WC id out of range %x > %x \n", wrc.id, m_qp->wrc.wc_end); goto bail; } m_wc = (struct mcm_wc_rx *)(m_qp->wrc.wc_addr + (m_qp->wrc.wc_sz * wrc.id)); mcm_ntoh_wc_rx(m_wc); /* convert WC contents, pushed via wire */ dapl_log(DAPL_DBG_TYPE_EP, " mcm_dto_rcv WC: ep %p wc_id %d wc %p wr_id %Lx wr_tl %d flgs 0x%x %s\n", m_qp->ep, wrc.id, m_wc, m_wc->wc.wr_id, m_wc->wr_tl, m_wc->flags, m_wc->flags & M_SEND_CN_SIG ? "SIG":"NO_SIG"); dapl_os_lock(&m_qp->lock); m_qp->wr_tl = m_wc->wr_tl; m_qp->wc_tl = wrc.id; /* move wc_tl, for wc_tl_rem on peer PI service */ dapl_os_unlock(&m_qp->lock); if (m_wc->flags & M_SEND_CN_SIG) { struct ibv_wc ib_wc; DAPL_COOKIE *cookie = (DAPL_COOKIE *)(uintptr_t) m_wc->wc.wr_id; dapl_log(DAPL_DBG_TYPE_EP, " mcm_dto_rcv: MCM SIG evd %p ep %p WR tl %d hd %d WC tl %d wr_id %p\n", m_qp->req_cq ? m_qp->req_cq->evd:0, m_qp->ep, m_qp->wr_tl, m_qp->wr_hd, m_qp->wc_tl, cookie); mcm_const_ib_wc(&ib_wc, &m_wc->wc, 1); dapl_os_lock(&m_qp->req_cq->evd->header.lock); dapls_evd_cqe_to_event(m_qp->req_cq->evd, &ib_wc); dapl_os_unlock(&m_qp->req_cq->evd->header.lock); } bail: if (mcm_post_rcv_wc(m_qp, 1)) dapl_log(DAPL_DBG_TYPE_ERR,"mcm_dto_rcv: recv wc repost failed\n"); } int mcm_post_rcv_wc(struct dcm_ib_qp *m_qp, int cnt) { struct ibv_recv_wr r_wr, *r_err; int err, i; r_wr.next = NULL; /* re-post message */ r_wr.sg_list = NULL; r_wr.num_sge = 0; r_wr.wr_id = (uint64_t)(uintptr_t) m_qp; errno = 0; for (i=0;iqp2, &r_wr, &r_err); if (err) { dapl_log(DAPL_DBG_TYPE_ERR,"ERR: qp %p (QP2) qpn %x " "ibv_post_recv ret = %d %s\n", m_qp, m_qp->qp2 ? m_qp->qp2->qp_num:0, err, strerror(errno)); return errno; } } dapl_log(DAPL_DBG_TYPE_EP, "mcm_post_rcv_wc: qp %p qpn 0x%x posted %d\n", m_qp, m_qp->qp2->qp_num, cnt); return 0; } /* Proxy-in service - called from CM-RX thread * * This processes both TX and RX events * rcv_cq is PI only service * req_cq is PO-PI RW_imm or HST->Direct RW if CQ shared across QP's * * <- Work completion in (RW_imm - WC idata), local initiated RW * -> RW_imm work requests out PO-PI * -> RW direct from consumer post HST->Direct (remote is HST or MSS) * */ void mcm_dto_event(struct dcm_ib_cq *m_cq) { struct ibv_wc wc[5]; struct ibv_cq *ib_cq; void *cq_ctx = NULL; int i, wc_cnt, ret, err, notify; dapl_log(DAPL_DBG_TYPE_THREAD," PI event: enter\n"); ret = ibv_get_cq_event(m_cq->cq->channel, &ib_cq, (void *)&cq_ctx); if (ret == 0) ibv_ack_cq_events(ib_cq, 1); wc_cnt = err = notify = 0; retry: ret = ibv_poll_cq(m_cq->cq, 5, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(m_cq->cq, 0); notify = 1; goto retry; } dapl_log(DAPL_DBG_TYPE_THREAD," PI event: empty, return\n"); return; } else notify = 0; wc_cnt += ret; for (i=0; iopcode == IBV_WC_RECV_RDMA_WITH_IMM) mcm_dto_rcv(m_cq, &wc[i]); else mcm_dto_req(m_cq, &wc[i]); } goto retry; } void mcm_destroy_wc_q(struct dcm_ib_qp *m_qp) { dapl_log(DAPL_DBG_TYPE_EP, "mcm_destroy_wc_q: QP %p PI WC_q %p\n", m_qp, m_qp->wrc.wc_addr); if (m_qp->wc_mr) { ibv_dereg_mr(m_qp->wc_mr); m_qp->wc_mr = NULL; } if (m_qp->wrc.wc_addr) { free((void*)m_qp->wrc.wc_addr); m_qp->wrc.wc_addr = 0; } if (m_qp->wr_buf_rx_mr) { ibv_dereg_mr(m_qp->wr_buf_rx_mr); m_qp->wr_buf_rx_mr = NULL; } if(m_qp->wr_buf_rx) { free(m_qp->wr_buf_rx); m_qp->wr_buf_rx = NULL; } } int mcm_create_wc_q(struct dcm_ib_qp *m_qp, int entries) { struct ibv_pd *ib_pd = ((DAPL_PZ *)m_qp->ep->param.pz_handle)->pd_handle; dapl_log(DAPL_DBG_TYPE_EP, "mcm_create_wc_q: QP %p entries %d\n", m_qp, entries); /* RDMA proxy WC pool, register with SCIF and IB, set pool and segm size with parameters */ m_qp->wrc.wc_sz = ALIGN_64(sizeof(struct mcm_wc_rx)); m_qp->wrc.wc_len = m_qp->wrc.wc_sz * entries; /* 64 byte aligned for signal_fence */ m_qp->wrc.wc_end = entries - 1; if (posix_memalign((void **)&m_qp->wrc.wc_addr, 4096, ALIGN_PAGE(m_qp->wrc.wc_len))) { dapl_log(DAPL_DBG_TYPE_EP, "failed to allocate wc_rbuf," " m_qp=%p, wc_len=%d, entries=%d\n", m_qp, m_qp->wrc.wc_len, entries); return -1; } memset((void*)m_qp->wrc.wc_addr, 0, ALIGN_PAGE(m_qp->wrc.wc_len)); dapl_log(DAPL_DBG_TYPE_EP, " WC rbuf pool %p, LEN req=%d, act=%d\n", m_qp->wrc.wc_addr, m_qp->wrc.wc_len, ALIGN_PAGE(m_qp->wrc.wc_len)); m_qp->wc_mr = ibv_reg_mr(ib_pd, (void*)m_qp->wrc.wc_addr, m_qp->wrc.wc_len, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wc_mr) { dapl_log(DAPL_DBG_TYPE_ERR, " IB_register addr=%p,%d failed %s\n", m_qp->wrc.wc_addr, ALIGN_PAGE(m_qp->wrc.wc_len), strerror(errno)); return -1; } m_qp->wrc.wc_addr = (uint64_t)(uintptr_t)m_qp->wc_mr->addr; m_qp->wrc.wc_rkey = m_qp->wc_mr->rkey; dapl_log(DAPL_DBG_TYPE_EP, " IB_mr for wc_buf addr %p, mr 0x%llx, len %d, entries %d rkey %x lkey %x\n", m_qp->wrc.wc_addr, m_qp->wc_mr->addr, ALIGN_PAGE(m_qp->wrc.wc_len), entries, m_qp->wc_mr->rkey, m_qp->wc_mr->lkey); if (!m_qp->ep->header.owner_ia->hca_ptr->ib_trans.ib_cm.max_inline) { if (posix_memalign((void **)&m_qp->wr_buf_rx, 4096, entries * sizeof(mcm_wr_rx_t))) { dapl_log(DAPL_DBG_TYPE_ERR, "failed to allocate proxy wr_buf_rx, " "m_qp=%p, wr_rx_len=%d, entries=%d\n", m_qp, entries * sizeof(mcm_wr_rx_t), entries); goto err; } memset(m_qp->wr_buf_rx, 0, entries * sizeof(mcm_wr_rx_t)); m_qp->wr_buf_rx_mr = ibv_reg_mr(m_qp->qp->pd, (void*)m_qp->wr_buf_rx, entries * sizeof(mcm_wr_rx_t), IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wr_buf_rx_mr) { dapl_log(DAPL_DBG_TYPE_ERR, " IB_register addr=%p,%d failed %s\n", m_qp->wr_buf_rx_mr->addr, entries * sizeof(mcm_wr_rx_t), strerror(errno)); goto err; } dapl_log(DAPL_DBG_TYPE_EP, " no inline support: WR_buf_rx pool %p, LEN %d, mr %x\n", m_qp->wr_buf_rx, entries * sizeof(mcm_wr_rx_t), m_qp->wr_buf_rx_mr); } /* Put QP's req and rcv CQ on device PI cqlist, mark CQ for indirect signaling */ dapl_os_lock(&m_qp->tp->cqlock); m_qp->req_cq->flags |= DCM_CQ_TX_INDIRECT; if (!m_qp->req_cq->entry.list_head) dapl_llist_add_tail(&m_qp->tp->cqlist, &m_qp->req_cq->entry, m_qp->req_cq); if (!m_qp->rcv_cq->entry.list_head) dapl_llist_add_tail(&m_qp->tp->cqlist, &m_qp->rcv_cq->entry, m_qp->rcv_cq); dapl_os_unlock(&m_qp->tp->cqlock); dapls_thread_signal(&m_qp->tp->signal); /* CM thread will process PI */ return 0; err: if (m_qp->wr_buf_rx) free(m_qp->wr_buf_rx); if (m_qp->wc_mr) ibv_dereg_mr(m_qp->wc_mr); free((void*)m_qp->wrc.wc_addr); return -1; } void mcm_destroy_pi_cq(struct dcm_ib_qp *m_qp) { if (!m_qp->rcv_cq) return; dapl_log(DAPL_DBG_TYPE_EP, "mcm_destroy_pi_cq: QP %p CQ %p\n", m_qp, m_qp->rcv_cq); /* remove from device PI processing list */ dapl_os_lock(&m_qp->tp->cqlock); if (m_qp->rcv_cq->entry.list_head) dapl_llist_remove_entry(&m_qp->tp->cqlist, &m_qp->rcv_cq->entry); dapl_os_unlock(&m_qp->tp->cqlock); if (m_qp->rcv_cq->cq) { struct ibv_comp_channel *channel = m_qp->rcv_cq->cq->channel; ibv_destroy_cq(m_qp->rcv_cq->cq); m_qp->rcv_cq->cq = NULL; if (channel) ibv_destroy_comp_channel(channel); } dapl_os_free(m_qp->rcv_cq, sizeof(struct dcm_ib_cq)); m_qp->rcv_cq = NULL; } int mcm_create_pi_cq(struct dcm_ib_qp *m_qp, int len) { struct ibv_comp_channel *channel = NULL; int cqlen = len; int opts, ret = ENOMEM; dapl_dbg_log(DAPL_DBG_TYPE_EP, "mcm_create_pi_cq: qp = %p cqlen=%d \n", m_qp, cqlen); /* create CQ object */ m_qp->rcv_cq = dapl_os_alloc(sizeof(struct dcm_ib_cq)); if (!m_qp->rcv_cq) goto err; dapl_os_memzero(m_qp->rcv_cq, sizeof(struct dcm_ib_cq)); m_qp->rcv_cq->tp = m_qp->tp; dapl_llist_init_entry(&m_qp->rcv_cq->entry); errno = 0; channel = ibv_create_comp_channel(m_qp->tp->hca->ib_hca_handle); if (!channel) goto err; /* move channel FD to non-blocking */ opts = fcntl(channel->fd, F_GETFL); if (opts < 0 || fcntl(channel->fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on channel->fd %d ERR %d %s\n", channel->fd, opts, strerror(errno)); goto err; } m_qp->rcv_cq->cq = ibv_create_cq(m_qp->tp->hca->ib_hca_handle, cqlen, m_qp, channel, 0); if (!m_qp->rcv_cq->cq) goto err; /* arm cq for events */ ibv_req_notify_cq(m_qp->rcv_cq->cq, 0); dapl_dbg_log(DAPL_DBG_TYPE_EP, "mcm_create_pi_cq: new_cq %p cqlen=%d \n", m_qp->rcv_cq, cqlen); dapl_log(DAPL_DBG_TYPE_EVD, "mcm_create_pi_cq (%d): new_cq %p ib_cq %p cqlen %d,%d\n", m_qp->rcv_cq, m_qp->rcv_cq->cq, len, cqlen); return 0; err: dapl_log(DAPL_DBG_TYPE_ERR, "mcm_create_pi_cq: ERR new_cq %p cqlen %d,%d ret %s\n", m_qp->rcv_cq, len, cqlen, strerror(errno)); if (m_qp->rcv_cq) { dapl_os_free(m_qp->rcv_cq, sizeof(struct dcm_ib_cq)); m_qp->rcv_cq = NULL; } if (channel) ibv_destroy_comp_channel(channel); return dapl_convert_errno(ret, "create_pi_cq" ); } dapl-2.1.5/dapl/openib_scm/000077500000000000000000000000001255317474200155075ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_scm/cm.c000066400000000000000000001551631255317474200162650ustar00rootroot00000000000000/* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_cm.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - connection management * **************************************************************************** * Source Control System Information * * $Id: $ * * Copyright (c) 2005-2015 Intel Corporation. All rights reserved. * **************************************************************************/ #if defined(_WIN32) #define FD_SETSIZE 1024 #define DAPL_FD_SETSIZE FD_SETSIZE #endif #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" #include "dapl_name_service.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_sp_util.h" #include "dapl_osd.h" extern char *gid_str; /* forward declarations */ static DAT_RETURN dapli_socket_connect(DAPL_EP * ep_ptr, DAT_IA_ADDRESS_PTR r_addr, DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data, int retries); #ifdef DAPL_DBG /* Check for EP linking to IA and proper connect state */ void dapli_ep_check(DAPL_EP *ep) { DAPL_IA *ia_ptr = ep->header.owner_ia; DAPL_EP *ep_ptr, *next_ep_ptr; int found = 0; dapl_os_lock(&ia_ptr->header.lock); ep_ptr = (dapl_llist_is_empty (&ia_ptr->ep_list_head) ? NULL : dapl_llist_peek_head (&ia_ptr->ep_list_head)); while (ep_ptr != NULL) { next_ep_ptr = dapl_llist_next_entry(&ia_ptr->ep_list_head, &ep_ptr->header.ia_list_entry); if (ep == ep_ptr) { found++; if ((ep->cr_ptr && ep->param.ep_state != DAT_EP_STATE_COMPLETION_PENDING) || (!ep->cr_ptr && ep->param.ep_state != DAT_EP_STATE_ACTIVE_CONNECTION_PENDING)) goto err; else goto match; } ep_ptr = next_ep_ptr; } err: dapl_log(DAPL_DBG_TYPE_ERR, " dapli_ep_check ERR: %s %s ep=%p state=%d magic=0x%x\n", ep->cr_ptr ? "PASSIVE":"ACTIVE", found ? "WRONG_STATE":"NOT_FOUND" , ep, ep->param.ep_state, ep->header.magic); match: dapl_os_unlock(&ia_ptr->header.lock); return; } #else #define dapli_ep_check(ep) #endif #if defined(_WIN32) || defined(_WIN64) enum DAPL_FD_EVENTS { DAPL_FD_READ = 0x1, DAPL_FD_WRITE = 0x2, DAPL_FD_ERROR = 0x4 }; static int dapl_config_socket(DAPL_SOCKET s) { unsigned long nonblocking = 1; int ret, opt = 1; ret = ioctlsocket(s, FIONBIO, &nonblocking); /* no delay for small packets */ if (!ret) ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)); return ret; } static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr, int addrlen) { int err; err = connect(s, addr, addrlen); if (err == SOCKET_ERROR) err = WSAGetLastError(); return (err == WSAEWOULDBLOCK) ? EAGAIN : err; } struct dapl_fd_set { struct fd_set set[3]; }; static struct dapl_fd_set *dapl_alloc_fd_set(void) { return dapl_os_alloc(sizeof(struct dapl_fd_set)); } static void dapl_fd_zero(struct dapl_fd_set *set) { FD_ZERO(&set->set[0]); FD_ZERO(&set->set[1]); FD_ZERO(&set->set[2]); } static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set, enum DAPL_FD_EVENTS event) { FD_SET(s, &set->set[(event == DAPL_FD_READ) ? 0 : 1]); FD_SET(s, &set->set[2]); return 0; } static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event) { struct fd_set rw_fds; struct fd_set err_fds; struct timeval tv; int ret; FD_ZERO(&rw_fds); FD_ZERO(&err_fds); FD_SET(s, &rw_fds); FD_SET(s, &err_fds); tv.tv_sec = 0; tv.tv_usec = 0; if (event == DAPL_FD_READ) ret = select(1, &rw_fds, NULL, &err_fds, &tv); else ret = select(1, NULL, &rw_fds, &err_fds, &tv); if (ret == 0) return 0; else if (ret == SOCKET_ERROR) return DAPL_FD_ERROR; else if (FD_ISSET(s, &rw_fds)) return event; else return DAPL_FD_ERROR; } static int dapl_select(struct dapl_fd_set *set) { int ret; dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: sleep\n"); ret = select(0, &set->set[0], &set->set[1], &set->set[2], NULL); dapl_dbg_log(DAPL_DBG_TYPE_CM, " dapl_select: wakeup\n"); if (ret == SOCKET_ERROR) dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: error 0x%x\n", WSAGetLastError()); return ret; } static int dapl_socket_errno(void) { int err; err = WSAGetLastError(); switch (err) { case WSAEACCES: case WSAEADDRINUSE: return EADDRINUSE; case WSAECONNRESET: return ECONNRESET; default: return err; } } #else // _WIN32 || _WIN64 enum DAPL_FD_EVENTS { DAPL_FD_READ = POLLIN, DAPL_FD_WRITE = POLLOUT, DAPL_FD_ERROR = POLLERR }; static int dapl_config_socket(DAPL_SOCKET s) { int ret, opt = 1; /* non-blocking */ ret = fcntl(s, F_GETFL); if (ret >= 0) ret = fcntl(s, F_SETFL, ret | O_NONBLOCK); /* no delay for small packets */ if (!ret) ret = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)); return ret; } static int dapl_connect_socket(DAPL_SOCKET s, struct sockaddr *addr, int addrlen) { int ret; ret = connect(s, addr, addrlen); return (errno == EINPROGRESS) ? EAGAIN : ret; } struct dapl_fd_set { int index; struct pollfd set[DAPL_FD_SETSIZE]; }; static struct dapl_fd_set *dapl_alloc_fd_set(void) { return dapl_os_alloc(sizeof(struct dapl_fd_set)); } static void dapl_fd_zero(struct dapl_fd_set *set) { set->index = 0; } static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set, enum DAPL_FD_EVENTS event) { if (set->index == DAPL_FD_SETSIZE - 1) { dapl_log(DAPL_DBG_TYPE_ERR, "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n", set->index + 1); return -1; } set->set[set->index].fd = s; set->set[set->index].revents = 0; set->set[set->index++].events = event; return 0; } static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event) { struct pollfd fds; int ret; fds.fd = s; fds.events = event; fds.revents = 0; ret = poll(&fds, 1, 0); dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n", s, ret, fds.revents); if (ret == 0) return 0; else if (ret < 0 || (fds.revents & (POLLERR | POLLHUP | POLLNVAL))) return DAPL_FD_ERROR; else return event; } static int dapl_select(struct dapl_fd_set *set) { int ret; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index); ret = poll(set->set, set->index, -1); dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret); return ret; } #define dapl_socket_errno() errno #endif static void dapli_cm_thread_signal(dp_ib_cm_handle_t cm_ptr) { if (cm_ptr->hca) send(cm_ptr->hca->ib_trans.scm[1], "w", sizeof "w", 0); } static void dapli_cm_free(dp_ib_cm_handle_t cm_ptr) { dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_FREE; dapl_os_unlock(&cm_ptr->lock); dapli_cm_thread_signal(cm_ptr); } static void dapli_cm_dealloc(dp_ib_cm_handle_t cm_ptr) { dapl_os_assert(!cm_ptr->ref_count); if (cm_ptr->socket != DAPL_INVALID_SOCKET) { shutdown(cm_ptr->socket, SHUT_RDWR); closesocket(cm_ptr->socket); } if (cm_ptr->ah) ibv_destroy_ah(cm_ptr->ah); dapl_os_lock_destroy(&cm_ptr->lock); dapl_os_wait_object_destroy(&cm_ptr->event); dapl_os_free(cm_ptr, sizeof(*cm_ptr)); } void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr) { dapl_os_lock(&cm_ptr->lock); cm_ptr->ref_count++; dapl_os_unlock(&cm_ptr->lock); } void dapls_cm_release(dp_ib_cm_handle_t cm_ptr) { dapl_os_lock(&cm_ptr->lock); cm_ptr->ref_count--; if (cm_ptr->ref_count) { if (cm_ptr->ref_count == 1) dapl_os_wait_object_wakeup(&cm_ptr->event); dapl_os_unlock(&cm_ptr->lock); return; } dapl_os_unlock(&cm_ptr->lock); dapli_cm_dealloc(cm_ptr); } static dp_ib_cm_handle_t dapli_cm_alloc(DAPL_EP *ep_ptr) { dp_ib_cm_handle_t cm_ptr; /* Allocate CM, init lock, and initialize */ if ((cm_ptr = dapl_os_alloc(sizeof(*cm_ptr))) == NULL) return NULL; (void)dapl_os_memzero(cm_ptr, sizeof(*cm_ptr)); if (dapl_os_lock_init(&cm_ptr->lock)) goto bail; if (dapl_os_wait_object_init(&cm_ptr->event)) { dapl_os_lock_destroy(&cm_ptr->lock); goto bail; } dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->list_entry); dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm_ptr->local_entry); cm_ptr->msg.ver = htons(DCM_VER); cm_ptr->socket = DAPL_INVALID_SOCKET; cm_ptr->retry = SCM_CR_RETRY; dapls_cm_acquire(cm_ptr); /* Link EP and CM */ if (ep_ptr != NULL) { dapl_ep_link_cm(ep_ptr, cm_ptr); /* ref++ */ cm_ptr->ep = ep_ptr; cm_ptr->hca = ((DAPL_IA *)ep_ptr->param.ia_handle)->hca_ptr; } return cm_ptr; bail: dapl_os_free(cm_ptr, sizeof(*cm_ptr)); return NULL; } /* queue socket for processing CM work */ static void dapli_cm_queue(dp_ib_cm_handle_t cm_ptr) { /* add to work queue for cr thread processing */ dapl_os_lock(&cm_ptr->hca->ib_trans.lock); dapls_cm_acquire(cm_ptr); dapl_llist_add_tail(&cm_ptr->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry, cm_ptr); dapl_os_unlock(&cm_ptr->hca->ib_trans.lock); dapli_cm_thread_signal(cm_ptr); } /* called with local LIST lock */ static void dapli_cm_dequeue(dp_ib_cm_handle_t cm_ptr) { /* Remove from work queue, cr thread processing */ dapl_llist_remove_entry(&cm_ptr->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm_ptr->local_entry); dapls_cm_release(cm_ptr); } /* BLOCKING: called from dapl_ep_free, EP link will be last ref, cleanup UD CR */ void dapls_cm_free(dp_ib_cm_handle_t cm_ptr) { DAPL_SP *sp_ptr = cm_ptr->sp; dapl_log(DAPL_DBG_TYPE_CM, " cm_free: cm %p %s ep %p sp %p refs=%d\n", cm_ptr, dapl_cm_state_str(cm_ptr->state), cm_ptr->ep, sp_ptr, cm_ptr->ref_count); dapl_os_lock(&cm_ptr->lock); if (sp_ptr && cm_ptr->state == DCM_CONNECTED && cm_ptr->msg.daddr.ib.qp_type == IBV_QPT_UD) { DAPL_CR *cr_ptr; dapl_os_lock(&sp_ptr->header.lock); cr_ptr = dapl_sp_search_cr(sp_ptr, cm_ptr); if (cr_ptr != NULL) { dapl_sp_remove_cr(sp_ptr, cr_ptr); dapls_cr_free(cr_ptr); } dapl_os_unlock(&sp_ptr->header.lock); } /* free from internal workq, wait until EP is last ref */ cm_ptr->state = DCM_FREE; if (cm_ptr->ref_count != 1) { dapli_cm_thread_signal(cm_ptr); dapl_os_unlock(&cm_ptr->lock); dapl_os_wait_object_wait(&cm_ptr->event, DAT_TIMEOUT_INFINITE); dapl_os_lock(&cm_ptr->lock); } dapl_os_unlock(&cm_ptr->lock); /* unlink, dequeue from EP. Final ref so release will destroy */ dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr); } DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr) { return DAT_NOT_IMPLEMENTED; } /* * ACTIVE/PASSIVE: called from CR thread or consumer via ep_disconnect * or from ep_free. */ DAT_RETURN dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr) { DAT_UINT32 disc_data = htonl(0xdead); dapl_os_lock(&cm_ptr->lock); if (cm_ptr->state != DCM_CONNECTED || cm_ptr->state == DCM_DISCONNECTED) { dapl_os_unlock(&cm_ptr->lock); return DAT_SUCCESS; } cm_ptr->state = DCM_DISCONNECTED; send(cm_ptr->socket, (char *)&disc_data, sizeof(disc_data), 0); dapl_os_unlock(&cm_ptr->lock); /* disconnect events for RC's only */ if (cm_ptr->ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC) { dapl_os_lock(&cm_ptr->ep->header.lock); dapls_modify_qp_state(cm_ptr->ep->qp_handle->qp, IBV_QPS_ERR, 0,0,0); dapl_os_unlock(&cm_ptr->ep->header.lock); if (cm_ptr->ep->cr_ptr) { dapls_cr_callback(cm_ptr, IB_CME_DISCONNECTED, NULL, 0, cm_ptr->sp); } else { dapl_evd_connection_callback(cm_ptr, IB_CME_DISCONNECTED, NULL, 0, cm_ptr->ep); } } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_DREQ_TX); /* release from workq */ dapli_cm_free(cm_ptr); /* scheduled destroy via disconnect clean in callback */ return DAT_SUCCESS; } /* * ACTIVE: socket connected, send QP information to peer */ static void dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err) { int len, exp; struct iovec iov[2]; struct dapl_ep *ep_ptr = cm_ptr->ep; if (err) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CONN_PENDING: %s ERR %s -> %s PORT L-%x R-%x %s cnt=%d\n", err == -1 ? "POLL" : "SOCKOPT", err == -1 ? strerror(dapl_socket_errno()) : strerror(err), inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port), ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port), (err == ETIMEDOUT || err == ECONNREFUSED) ? "RETRYING...":"ABORTING", cm_ptr->retry); /* retry a timeout */ if (((err == ETIMEDOUT) || (err == ECONNREFUSED)) && --cm_ptr->retry) { closesocket(cm_ptr->socket); cm_ptr->socket = DAPL_INVALID_SOCKET; dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000, ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data, cm_ptr->retry); dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr); dapli_cm_free(cm_ptr); return; } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_ERR_TIMEOUT); goto bail; } dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_REP_PENDING; dapl_os_unlock(&cm_ptr->lock); /* set max rdma inbound requests */ cm_ptr->msg.rd_in = ep_ptr->param.ep_attr.max_rdma_read_in; /* send qp info and pdata to remote peer */ exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE; iov[0].iov_base = (void *)&cm_ptr->msg; iov[0].iov_len = exp; if (cm_ptr->msg.p_size) { iov[1].iov_base = cm_ptr->msg.p_data; iov[1].iov_len = ntohs(cm_ptr->msg.p_size); len = writev(cm_ptr->socket, iov, 2); } else { len = writev(cm_ptr->socket, iov, 1); } if (len != (exp + ntohs(cm_ptr->msg.p_size))) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " CONN_PENDING len ERR 0x%x %s, wcnt=%d(%d) -> %s\n", err, strerror(err), len, exp + ntohs(cm_ptr->msg.p_size), inet_ntoa(((struct sockaddr_in *) ep_ptr->param. remote_ia_address_ptr)->sin_addr)); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " CONN_PENDING: sending SRC lid=0x%x," " qpn=0x%x, psize=%d\n", ntohs(cm_ptr->msg.saddr.ib.lid), ntohl(cm_ptr->msg.saddr.ib.qpn), ntohs(cm_ptr->msg.p_size)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " CONN_PENDING: SRC GID %s\n", inet_ntop(AF_INET6, &cm_ptr->hca->ib_trans.gid, gid_str, sizeof(gid_str))); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_REQ_TX); return; bail: DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_ERR); /* mark CM object for cleanup */ dapli_cm_free(cm_ptr); dapl_evd_connection_callback(NULL, IB_CME_DESTINATION_REJECT, NULL, 0, ep_ptr); } /* * ACTIVE: Create socket, connect, defer exchange QP information to CR thread * to avoid blocking. */ static DAT_RETURN dapli_socket_connect(DAPL_EP * ep_ptr, DAT_IA_ADDRESS_PTR r_addr, DAT_CONN_QUAL r_qual, DAT_COUNT p_size, DAT_PVOID p_data, int retries) { dp_ib_cm_handle_t cm_ptr; int ret; socklen_t sl; DAPL_IA *ia_ptr = ep_ptr->header.owner_ia; DAT_RETURN dat_ret = DAT_INSUFFICIENT_RESOURCES; dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: r_qual %d p_size=%d\n", r_qual, p_size); cm_ptr = dapli_cm_alloc(ep_ptr); if (cm_ptr == NULL) return dat_ret; cm_ptr->retry = retries; /* create, connect, sockopt, and exchange QP information */ if ((cm_ptr->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " connect: socket create ERR 0x%x %s\n", err, strerror(err)); goto bail; } ret = dapl_config_socket(cm_ptr->socket); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " connect: config socket %d RET %d ERR 0x%x %s\n", cm_ptr->socket, ret, dapl_socket_errno(), strerror(dapl_socket_errno())); dat_ret = DAT_INTERNAL_ERROR; goto bail; } /* save remote address */ dapl_os_memcpy(&cm_ptr->addr, r_addr, sizeof(*r_addr)); ((struct sockaddr_in *)&cm_ptr->addr)->sin_port = htons(r_qual + 1000); ret = dapl_connect_socket(cm_ptr->socket, (struct sockaddr *)&cm_ptr->addr, sizeof(cm_ptr->addr)); if (ret && ret != EAGAIN) { dapl_log(DAPL_DBG_TYPE_ERR, " connect: dapl_connect_socket RET %d ERR 0x%x %s\n", ret, dapl_socket_errno(), strerror(dapl_socket_errno())); dat_ret = DAT_INVALID_ADDRESS; goto bail; } /* REQ: QP info in msg.saddr, IA address in msg.daddr, and pdata */ cm_ptr->hca = ia_ptr->hca_ptr; cm_ptr->msg.op = ntohs(DCM_REQ); cm_ptr->msg.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp->qp_num); cm_ptr->msg.saddr.ib.qp_type = ep_ptr->qp_handle->qp->qp_type; cm_ptr->msg.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid; dapl_os_memcpy(&cm_ptr->msg.saddr.ib.gid[0], &ia_ptr->hca_ptr->ib_trans.gid, 16); /* get local address information from socket */ sl = sizeof(cm_ptr->msg.daddr.so); if (getsockname(cm_ptr->socket, (struct sockaddr *)&cm_ptr->msg.daddr.so, &sl)) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " connect getsockname ERROR: 0x%x %s -> %s r_qual %d\n", err, strerror(err), inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr), (unsigned int)r_qual);; } if (p_size) { cm_ptr->msg.p_size = htons(p_size); dapl_os_memcpy(cm_ptr->msg.p_data, p_data, p_size); } /* connected or pending, either way results via async event */ if (ret == 0) dapli_socket_connected(cm_ptr, 0); else cm_ptr->state = DCM_CONN_PENDING; dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: p_data=%p %p\n", cm_ptr->msg.p_data, cm_ptr->msg.p_data); dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect: %s r_qual %d pending, p_sz=%d, %d %d ...\n", inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), (unsigned int)r_qual, ntohs(cm_ptr->msg.p_size), cm_ptr->msg.p_data[0], cm_ptr->msg.p_data[1]); /* queue up on work thread */ dapli_cm_queue(cm_ptr); return DAT_SUCCESS; bail: DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_ERR); dapl_log(DAPL_DBG_TYPE_ERR, " connect ERROR: -> %s r_qual %d\n", inet_ntoa(((struct sockaddr_in *)r_addr)->sin_addr), (unsigned int)r_qual); /* Never queued, destroy */ dapls_cm_release(cm_ptr); return dat_ret; } /* * ACTIVE: exchange QP information, called from CR thread */ static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr) { DAPL_EP *ep_ptr = cm_ptr->ep; int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE; ib_cm_events_t event = IB_CME_LOCAL_FAILURE; socklen_t sl; /* read DST information into cm_ptr, overwrite SRC info */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n"); len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0); if (len != exp || ntohs(cm_ptr->msg.ver) < DCM_VER_MIN) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_CM_WARN, " CONN_REP_PENDING: sk %d ERR 0x%x, rcnt=%d, v=%d ->" " %s PORT L-%x R-%x %d\n", cm_ptr->socket, err, len, ntohs(cm_ptr->msg.ver), inet_ntoa(((struct sockaddr_in *)&cm_ptr->addr)->sin_addr), ntohs(((struct sockaddr_in *)&cm_ptr->msg.daddr.so)->sin_port), ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port), cm_ptr->retry); /* Retry; corner case where server tcp stack resets under load */ if (err == ECONNRESET && --cm_ptr->retry) { closesocket(cm_ptr->socket); cm_ptr->socket = DAPL_INVALID_SOCKET; dapli_socket_connect(cm_ptr->ep, (DAT_IA_ADDRESS_PTR)&cm_ptr->addr, ntohs(((struct sockaddr_in *)&cm_ptr->addr)->sin_port) - 1000, ntohs(cm_ptr->msg.p_size), &cm_ptr->msg.p_data, cm_ptr->retry); dapl_ep_unlink_cm(cm_ptr->ep, cm_ptr); dapli_cm_free(cm_ptr); return; } goto bail; } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_REP_RX); /* keep the QP, address info in network order */ /* save remote address information, in msg.daddr */ dapl_os_memcpy(&cm_ptr->addr, &cm_ptr->msg.daddr.so, sizeof(union dcm_addr)); /* save local address information from socket */ sl = sizeof(cm_ptr->addr); getsockname(cm_ptr->socket,(struct sockaddr *)&cm_ptr->addr, &sl); dapl_dbg_log(DAPL_DBG_TYPE_EP, " CONN_RTU: DST %s %d lid=0x%x," " qpn=0x%x, qp_type=%d, psize=%d\n", inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port), ntohs(cm_ptr->msg.saddr.ib.lid), ntohl(cm_ptr->msg.saddr.ib.qpn), cm_ptr->msg.saddr.ib.qp_type, ntohs(cm_ptr->msg.p_size)); /* validate private data size before reading */ if (ntohs(cm_ptr->msg.p_size) > DCM_MAX_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU read: psize (%d) wrong -> %s\n", ntohs(cm_ptr->msg.p_size), inet_ntoa(((struct sockaddr_in *) ep_ptr->param. remote_ia_address_ptr)->sin_addr)); goto bail; } /* read private data into cm_handle if any present */ dapl_dbg_log(DAPL_DBG_TYPE_EP," CONN_RTU: read private data\n"); exp = ntohs(cm_ptr->msg.p_size); if (exp) { len = recv(cm_ptr->socket, cm_ptr->msg.p_data, exp, 0); if (len != exp) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU read pdata: ERR 0x%x %s, rcnt=%d -> %s\n", err, strerror(err), len, inet_ntoa(((struct sockaddr_in *) ep_ptr->param. remote_ia_address_ptr)->sin_addr)); goto bail; } } /* check for consumer or protocol stack reject */ if (ntohs(cm_ptr->msg.op) == DCM_REP) event = IB_CME_CONNECTED; else if (ntohs(cm_ptr->msg.op) == DCM_REJ_USER) event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA; else event = IB_CME_DESTINATION_REJECT; if (event != IB_CME_CONNECTED) { dapl_log(DAPL_DBG_TYPE_CM, " CONN_RTU: reject from %s %x\n", inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)); goto bail; } /* rdma_out, initiator, cannot exceed remote rdma_in max */ if (ntohs(cm_ptr->msg.ver) >= 7) ep_ptr->param.ep_attr.max_rdma_read_out = DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, cm_ptr->msg.rd_in); /* modify QP to RTR and then to RTS with remote info */ dapl_os_lock(&ep_ptr->header.lock); if (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_RTR, cm_ptr->msg.saddr.ib.qpn, cm_ptr->msg.saddr.ib.lid, (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU: QPS_RTR ERR %s (%d,%d,%x,%x,%x) -> %s %x\n", strerror(errno), ep_ptr->qp_handle->qp->qp_type, ep_ptr->qp_state, ep_ptr->qp_handle->qp->qp_num, ntohl(cm_ptr->msg.saddr.ib.qpn), ntohs(cm_ptr->msg.saddr.ib.lid), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)); dapl_os_unlock(&ep_ptr->header.lock); goto bail; } if (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_RTS, cm_ptr->msg.saddr.ib.qpn, cm_ptr->msg.saddr.ib.lid, NULL) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU: QPS_RTS ERR %s (%d,%d,%x,%x,%x) -> %s %x\n", strerror(errno), ep_ptr->qp_handle->qp->qp_type, ep_ptr->qp_state, ep_ptr->qp_handle->qp->qp_num, ntohl(cm_ptr->msg.saddr.ib.qpn), ntohs(cm_ptr->msg.saddr.ib.lid), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)); dapl_os_unlock(&ep_ptr->header.lock); goto bail; } dapl_os_unlock(&ep_ptr->header.lock); dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: send RTU\n"); /* complete handshake after final QP state change, Just ver+op */ dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_CONNECTED; dapl_os_unlock(&cm_ptr->lock); cm_ptr->msg.op = ntohs(DCM_RTU); if (send(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0) == -1) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU: write ERR = 0x%x %s\n", err, strerror(err)); goto bail; } /* post the event with private data */ event = IB_CME_CONNECTED; dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: connected!\n"); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_RTU_TX); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_ACTIVE_EST); #ifdef DAT_EXTENSIONS ud_bail: if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; ib_pd_handle_t pd_handle = ((DAPL_PZ *)ep_ptr->param.pz_handle)->pd_handle; if (event == IB_CME_CONNECTED) { cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle, ep_ptr->qp_handle->qp, cm_ptr->msg.saddr.ib.lid, NULL); if (cm_ptr->ah) { /* post UD extended EVENT */ xevent.status = 0; xevent.type = DAT_IB_UD_REMOTE_AH; xevent.remote_ah.ah = cm_ptr->ah; xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn); dapl_os_memcpy(&xevent.remote_ah.ia_addr, &ep_ptr->remote_ia_address, sizeof(union dcm_addr)); event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED; dapl_log(DAPL_DBG_TYPE_CM, " CONN_RTU: UD AH %p for lid 0x%x" " qpn 0x%x\n", cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid), ntohl(cm_ptr->msg.saddr.ib.qpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_AH_RESOLVED); } else event = DAT_IB_UD_CONNECTION_ERROR_EVENT; } else if (event == IB_CME_LOCAL_FAILURE) { event = DAT_IB_UD_CONNECTION_ERROR_EVENT; } else event = DAT_IB_UD_CONNECTION_REJECT_EVENT; dapls_evd_post_connection_event_ext( (DAPL_EVD *) ep_ptr->param.connect_evd_handle, event, (DAT_EP_HANDLE) ep_ptr, (DAT_COUNT) exp, (DAT_PVOID *) cm_ptr->msg.p_data, (DAT_PVOID *) &xevent); /* cleanup and release from local list */ dapli_cm_free(cm_ptr); } else #endif { dapli_ep_check(cm_ptr->ep); dapl_evd_connection_callback(cm_ptr, event, cm_ptr->msg.p_data, DCM_MAX_PDATA_SIZE, ep_ptr); } dapl_log(DAPL_DBG_TYPE_CM_EST, " SCM ACTIVE CONN: %x -> %s %x\n", ntohs(((struct sockaddr_in *) &cm_ptr->addr)->sin_port), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)-1000); return; bail: #ifdef DAT_EXTENSIONS if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) goto ud_bail; #endif /* close socket, and post error event */ dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_REJECTED; dapl_os_unlock(&cm_ptr->lock); dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data, DCM_MAX_PDATA_SIZE, ep_ptr); dapli_cm_free(cm_ptr); } /* * PASSIVE: Create socket, listen, accept, exchange QP information */ DAT_RETURN dapli_socket_listen(DAPL_IA * ia_ptr, DAT_CONN_QUAL serviceID, DAPL_SP * sp_ptr) { struct sockaddr_in addr; ib_cm_srvc_handle_t cm_ptr = NULL; DAT_RETURN dat_status = DAT_SUCCESS; int opt = 1; dapl_dbg_log(DAPL_DBG_TYPE_CM, " setup listen(ia_ptr %p ServiceID %d sp_ptr %p)\n", ia_ptr, serviceID, sp_ptr); cm_ptr = dapli_cm_alloc(NULL); if (cm_ptr == NULL) return DAT_INSUFFICIENT_RESOURCES; cm_ptr->sp = sp_ptr; cm_ptr->hca = ia_ptr->hca_ptr; /* bind, listen, set sockopt, accept, exchange data */ if ((cm_ptr->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == DAPL_INVALID_SOCKET) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " listen: socket create: ERR 0x%x %s\n", err, strerror(err)); dat_status = DAT_INSUFFICIENT_RESOURCES; goto bail; } setsockopt(cm_ptr->socket, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt)); addr.sin_port = htons(serviceID + 1000); addr.sin_family = AF_INET; addr.sin_addr = ((struct sockaddr_in *) &ia_ptr->hca_ptr->hca_address)->sin_addr; if ((bind(cm_ptr->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) || (listen(cm_ptr->socket, 128) < 0)) { int err = dapl_socket_errno(); if (err == EADDRINUSE) dat_status = DAT_CONN_QUAL_IN_USE; else { dapl_log(DAPL_DBG_TYPE_CM_WARN, " listen: ERROR 0x%x %s on port %d\n", err, strerror(err), serviceID + 1000); dat_status = DAT_INVALID_PARAMETER; } goto bail; } /* set cm_handle for this service point, save listen socket */ sp_ptr->cm_srvc_handle = cm_ptr; dapl_os_memcpy(&cm_ptr->addr, &addr, sizeof(addr)); /* queue up listen socket to process inbound CR's */ cm_ptr->state = DCM_LISTEN; dapli_cm_queue(cm_ptr); dapl_dbg_log(DAPL_DBG_TYPE_CM, " setup listen: port %d cr %p s_fd %d\n", serviceID + 1000, cm_ptr, cm_ptr->socket); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_LISTEN); return dat_status; bail: /* Never queued, destroy here */ dapls_cm_release(cm_ptr); return dat_status; } /* * PASSIVE: accept socket */ static void dapli_socket_accept(ib_cm_srvc_handle_t cm_ptr) { dp_ib_cm_handle_t acm_ptr; int ret, len, opt = 1; socklen_t sl; /* * Accept all CR's on this port to avoid half-connection (SYN_RCV) * stalls with many to one connection storms */ do { /* Allocate accept CM and initialize */ if ((acm_ptr = dapli_cm_alloc(NULL)) == NULL) return; acm_ptr->sp = cm_ptr->sp; acm_ptr->hca = cm_ptr->hca; len = sizeof(union dcm_addr); acm_ptr->socket = accept(cm_ptr->socket, (struct sockaddr *) &acm_ptr->msg.daddr.so, (socklen_t *) &len); if (acm_ptr->socket == DAPL_INVALID_SOCKET) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT: ERR 0x%x %s on FD %d l_cr %p\n", err, strerror(err), cm_ptr->socket, cm_ptr); dapls_cm_release(acm_ptr); return; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " accepting from %s %x\n", inet_ntoa(((struct sockaddr_in *) &acm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &acm_ptr->msg.daddr.so)->sin_port)); /* no delay for small packets */ ret = setsockopt(acm_ptr->socket, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt)); if (ret) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT: NODELAY setsockopt:" " RET %d ERR 0x%x %s\n", ret, err, strerror(err)); } /* get local address information from socket */ sl = sizeof(acm_ptr->addr); getsockname(acm_ptr->socket, (struct sockaddr *)&acm_ptr->addr, &sl); acm_ptr->state = DCM_ACCEPTING; dapli_cm_queue(acm_ptr); } while (dapl_poll(cm_ptr->socket, DAPL_FD_READ) == DAPL_FD_READ); } /* * PASSIVE: receive peer QP information, private data, post cr_event */ static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr) { int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE; void *p_data = NULL; dapl_dbg_log(DAPL_DBG_TYPE_EP, " socket accepted, read QP data\n"); /* read in DST QP info, IA address. check for private data */ len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0); if (len != exp || ntohs(acm_ptr->msg.ver) < DCM_VER_MIN) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n", err, strerror(err), len, ntohs(acm_ptr->msg.ver)); goto bail; } /* keep the QP, address info in network order */ /* validate private data size before reading */ exp = ntohs(acm_ptr->msg.p_size); if (exp > DCM_MAX_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_ERR, " accept read: psize (%d) wrong\n", acm_ptr->msg.p_size); goto bail; } /* read private data into cm_handle if any present */ if (exp) { len = recv(acm_ptr->socket, acm_ptr->msg.p_data, exp, 0); if (len != exp) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " accept read pdata: ERR 0x%x %s, rcnt=%d\n", err, strerror(err), len); goto bail; } p_data = acm_ptr->msg.p_data; } dapl_os_lock(&acm_ptr->lock); acm_ptr->state = DCM_ACCEPTING_DATA; dapl_os_unlock(&acm_ptr->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&acm_ptr->hca->ia_list_head)), DCNT_IA_CM_REQ_RX); dapl_dbg_log(DAPL_DBG_TYPE_CM, " ACCEPT: DST %s %x lid=0x%x, qpn=0x%x, psz=%d\n", inet_ntoa(((struct sockaddr_in *) &acm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &acm_ptr->msg.daddr.so)->sin_port), ntohs(acm_ptr->msg.saddr.ib.lid), ntohl(acm_ptr->msg.saddr.ib.qpn), exp); #ifdef DAT_EXTENSIONS if (acm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; /* post EVENT, modify_qp created ah */ xevent.status = 0; xevent.type = DAT_IB_UD_CONNECT_REQUEST; dapls_evd_post_cr_event_ext(acm_ptr->sp, DAT_IB_UD_CONNECTION_REQUEST_EVENT, acm_ptr, (DAT_COUNT) exp, (DAT_PVOID *) acm_ptr->msg.p_data, (DAT_PVOID *) &xevent); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&acm_ptr->hca->ia_list_head)), DCNT_IA_CM_AH_REQ_RX); } else #endif /* trigger CR event and return SUCCESS */ dapls_cr_callback(acm_ptr, IB_CME_CONNECTION_REQUEST_PENDING, p_data, exp, acm_ptr->sp); return; bail: /* mark for destroy, active will see socket close as rej */ dapli_cm_free(acm_ptr); return; } /* * PASSIVE: consumer accept, send local QP information, private data, * queue on work thread to receive RTU information to avoid blocking * user thread. */ static DAT_RETURN dapli_socket_accept_usr(DAPL_EP * ep_ptr, DAPL_CR * cr_ptr, DAT_COUNT p_size, DAT_PVOID p_data) { DAPL_IA *ia_ptr = ep_ptr->header.owner_ia; dp_ib_cm_handle_t cm_ptr = cr_ptr->ib_cm_handle; ib_cm_msg_t local; struct iovec iov[2]; int len, exp = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE; DAT_RETURN ret = DAT_INTERNAL_ERROR; socklen_t sl; if (p_size > DCM_MAX_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_ERR, " accept_usr: psize(%d) too large\n", p_size); return DAT_LENGTH_ERROR; } /* must have a accepted socket */ if (cm_ptr->socket == DAPL_INVALID_SOCKET) { dapl_log(DAPL_DBG_TYPE_ERR, " accept_usr: cm socket invalid\n"); goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " ACCEPT_USR: remote lid=0x%x" " qpn=0x%x qp_type %d, psize=%d\n", ntohs(cm_ptr->msg.saddr.ib.lid), ntohl(cm_ptr->msg.saddr.ib.qpn), cm_ptr->msg.saddr.ib.qp_type, ntohs(cm_ptr->msg.p_size)); #ifdef DAT_EXTENSIONS if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD && ep_ptr->qp_handle->qp->qp_type != IBV_QPT_UD) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: ERR remote QP is UD," ", but local QP is not\n"); ret = (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP); goto bail; } #endif /* rdma_out, initiator, cannot exceed remote rdma_in max */ if (ntohs(cm_ptr->msg.ver) >= 7) ep_ptr->param.ep_attr.max_rdma_read_out = DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, cm_ptr->msg.rd_in); /* modify QP to RTR and then to RTS with remote info already read */ dapl_os_lock(&ep_ptr->header.lock); if (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_RTR, cm_ptr->msg.saddr.ib.qpn, cm_ptr->msg.saddr.ib.lid, (ib_gid_handle_t)cm_ptr->msg.saddr.ib.gid) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTR ERR %s -> %s\n", strerror(errno), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr)); dapl_os_unlock(&ep_ptr->header.lock); goto bail; } if (dapls_modify_qp_state(ep_ptr->qp_handle->qp, IBV_QPS_RTS, cm_ptr->msg.saddr.ib.qpn, cm_ptr->msg.saddr.ib.lid, NULL) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTS ERR %s -> %s\n", strerror(errno), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr)); dapl_os_unlock(&ep_ptr->header.lock); goto bail; } dapl_os_unlock(&ep_ptr->header.lock); /* save remote address information */ dapl_os_memcpy(&ep_ptr->remote_ia_address, &cm_ptr->msg.daddr.so, sizeof(union dcm_addr)); /* send our QP info, IA address, pdata. Don't overwrite dst data */ local.ver = htons(DCM_VER); local.op = htons(DCM_REP); local.rd_in = ep_ptr->param.ep_attr.max_rdma_read_in; local.saddr.ib.qpn = htonl(ep_ptr->qp_handle->qp->qp_num); local.saddr.ib.qp_type = ep_ptr->qp_handle->qp->qp_type; local.saddr.ib.lid = ia_ptr->hca_ptr->ib_trans.lid; dapl_os_memcpy(&local.saddr.ib.gid[0], &ia_ptr->hca_ptr->ib_trans.gid, 16); /* Get local address information from socket */ sl = sizeof(local.daddr.so); getsockname(cm_ptr->socket, (struct sockaddr *)&local.daddr.so, &sl); cm_ptr->hca = ia_ptr->hca_ptr; dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_ACCEPTED; dapl_os_unlock(&cm_ptr->lock); /* Link CM to EP, already queued on work thread, !PSP !RSP */ if (!cm_ptr->sp->ep_handle && !cm_ptr->sp->psp_flags) dapl_ep_link_cm(ep_ptr, cm_ptr); cm_ptr->ep = ep_ptr; local.p_size = htons(p_size); iov[0].iov_base = (void *)&local; iov[0].iov_len = exp; if (p_size) { iov[1].iov_base = p_data; iov[1].iov_len = p_size; len = writev(cm_ptr->socket, iov, 2); } else len = writev(cm_ptr->socket, iov, 1); if (len != (p_size + exp)) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: ERR 0x%x %s, wcnt=%d -> %s\n", err, strerror(err), len, inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr)); dapl_ep_unlink_cm(ep_ptr, cm_ptr); cm_ptr->ep = NULL; goto bail; } dapl_dbg_log(DAPL_DBG_TYPE_CM, " ACCEPT_USR: local GID %s lid=0x%x qpn=0x%x psz=%d\n", inet_ntop(AF_INET6, &cm_ptr->hca->ib_trans.gid, gid_str, sizeof(gid_str)), ntohs(local.saddr.ib.lid), ntohl(local.saddr.ib.qpn), ntohs(local.p_size)); dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: accepted!\n"); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_REP_TX); return DAT_SUCCESS; bail: /* schedule cleanup from workq */ dapli_cm_free(cm_ptr); return ret; } /* * PASSIVE: read RTU from active peer, post CONN event */ static void dapli_socket_accept_rtu(dp_ib_cm_handle_t cm_ptr) { int len; ib_cm_events_t event = IB_CME_CONNECTED; /* complete handshake after final QP state change, VER and OP */ len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, 4, 0); if (len != 4 || ntohs(cm_ptr->msg.op) != DCM_RTU) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_RTU: rcv ERR, rcnt=%d op=%x <- %s\n", len, ntohs(cm_ptr->msg.op), inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr)); event = IB_CME_DESTINATION_REJECT; goto bail; } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_RTU_RX); /* save state and reference to EP, queue for disc event */ dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_CONNECTED; dapl_os_unlock(&cm_ptr->lock); /* final data exchange if remote QP state is good to go */ dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: connected!\n"); #ifdef DAT_EXTENSIONS ud_bail: if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; ib_pd_handle_t pd_handle = ((DAPL_PZ *)cm_ptr->ep->param.pz_handle)->pd_handle; if (event == IB_CME_CONNECTED) { cm_ptr->ah = dapls_create_ah(cm_ptr->hca, pd_handle, cm_ptr->ep->qp_handle->qp, cm_ptr->msg.saddr.ib.lid, NULL); if (cm_ptr->ah) { /* post EVENT, modify_qp created ah */ xevent.status = 0; xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH; xevent.remote_ah.ah = cm_ptr->ah; xevent.remote_ah.qpn = ntohl(cm_ptr->msg.saddr.ib.qpn); dapl_os_memcpy(&xevent.remote_ah.ia_addr, &cm_ptr->msg.daddr.so, sizeof(union dcm_addr)); event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED; } else event = DAT_IB_UD_CONNECTION_ERROR_EVENT; } else event = DAT_IB_UD_CONNECTION_ERROR_EVENT; dapl_log(DAPL_DBG_TYPE_CM, " CONN_RTU: UD AH %p for lid 0x%x qpn 0x%x\n", cm_ptr->ah, ntohs(cm_ptr->msg.saddr.ib.lid), ntohl(cm_ptr->msg.saddr.ib.qpn)); dapls_evd_post_connection_event_ext( (DAPL_EVD *) cm_ptr->ep->param.connect_evd_handle, event, (DAT_EP_HANDLE) cm_ptr->ep, (DAT_COUNT) ntohs(cm_ptr->msg.p_size), (DAT_PVOID *) cm_ptr->msg.p_data, (DAT_PVOID *) &xevent); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), DCNT_IA_CM_AH_RESOLVED); /* cleanup and release from local list, still on EP list */ dapli_cm_free(cm_ptr); } else #endif { dapli_ep_check(cm_ptr->ep); dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp); } dapl_log(DAPL_DBG_TYPE_CM_EST, " SCM PASSIVE CONN: %x <- %s %x\n", cm_ptr->sp->conn_qual, inet_ntoa(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_addr), ntohs(((struct sockaddr_in *) &cm_ptr->msg.daddr.so)->sin_port)); return; bail: #ifdef DAT_EXTENSIONS if (cm_ptr->msg.saddr.ib.qp_type == IBV_QPT_UD) goto ud_bail; #endif dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_REJECTED; dapl_os_unlock(&cm_ptr->lock); dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp); dapli_cm_free(cm_ptr); } /* * dapls_ib_connect * * Initiate a connection with the passive listener on another node * * Input: * ep_handle, * remote_ia_address, * remote_conn_qual, * prd_size size of private data and structure * prd_prt pointer to private data structure * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR r_address, IN DAT_CONN_QUAL r_qual, IN DAT_COUNT private_data_size, IN void *private_data) { DAPL_EP *ep_ptr = (DAPL_EP *) ep_handle; struct sockaddr_in *scm_ia = (struct sockaddr_in *)r_address; dapl_log(DAPL_DBG_TYPE_CM, " SCM connect -> IP %s port 0x%x,%d)\n", inet_ntoa(scm_ia->sin_addr), r_qual + 1000, r_qual + 1000); return (dapli_socket_connect(ep_ptr, r_address, r_qual, private_data_size, private_data, SCM_CR_RETRY)); } /* * dapls_ib_disconnect * * Disconnect an EP * * Input: * ep_handle, * disconnect_flags * * Output: * none * * Returns: * DAT_SUCCESS */ DAT_RETURN dapls_ib_disconnect(IN DAPL_EP * ep_ptr, IN DAT_CLOSE_FLAGS close_flags) { dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr); dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED || ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC || cm_ptr == NULL) { dapl_os_unlock(&ep_ptr->header.lock); return DAT_SUCCESS; } dapl_os_unlock(&ep_ptr->header.lock); return (dapli_socket_disconnect(cm_ptr)); } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. It is also called if dat_ep_connect * times out using the consumer supplied timeout value. * * Input: * ep_ptr DAPL_EP * active Indicates active side of connection * * Output: * none * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP * ep_ptr, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { if (ib_cm_event == IB_CME_TIMEOUT) { dp_ib_cm_handle_t cm_ptr; if ((cm_ptr = dapl_get_cm_from_ep(ep_ptr)) == NULL) return; dapl_log(DAPL_DBG_TYPE_WARN, "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n", ep_ptr, cm_ptr, dapl_cm_state_str(cm_ptr->state)); /* schedule release of socket and local resources */ dapli_cm_free(cm_ptr); } } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * DAT_CONN_QUAL_UNAVAILBLE * DAT_CONN_QUAL_IN_USE * */ DAT_RETURN dapls_ib_setup_conn_listener(IN DAPL_IA * ia_ptr, IN DAT_UINT64 ServiceID, IN DAPL_SP * sp_ptr) { return (dapli_socket_listen(ia_ptr, ServiceID, sp_ptr)); } /* * dapl_ib_remove_conn_listener * * Have the CM remove a connection listener. * * Input: * ia_handle IA handle * ServiceID IB Channel Service ID * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_remove_conn_listener(IN DAPL_IA * ia_ptr, IN DAPL_SP * sp_ptr) { ib_cm_srvc_handle_t cm_ptr = sp_ptr->cm_srvc_handle; /* free cm_srvc_handle, release will cleanup */ if (cm_ptr != NULL) { /* cr_thread will free */ sp_ptr->cm_srvc_handle = NULL; dapli_cm_free(cm_ptr); } return DAT_SUCCESS; } /* * dapls_ib_accept_connection * * Perform necessary steps to accept a connection * * Input: * cr_handle * ep_handle * private_data_size * private_data * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT p_size, IN const DAT_PVOID p_data) { DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; dapl_dbg_log(DAPL_DBG_TYPE_EP, "dapls_ib_accept_connection(cr %p ep %p prd %p,%d)\n", cr_handle, ep_handle, p_data, p_size); cr_ptr = (DAPL_CR *) cr_handle; ep_ptr = (DAPL_EP *) ep_handle; /* allocate and attach a QP if necessary */ if (ep_ptr->qp_state == DAPL_QP_STATE_UNATTACHED) { DAT_RETURN status; status = dapls_ib_qp_alloc(ep_ptr->header.owner_ia, ep_ptr, ep_ptr); if (status != DAT_SUCCESS) return status; } return (dapli_socket_accept_usr(ep_ptr, cr_ptr, p_size, p_data)); } /* * dapls_ib_reject_connection * * Reject a connection * * Input: * cr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm_ptr, IN int reason, IN DAT_COUNT psize, IN const DAT_PVOID pdata) { struct iovec iov[2]; dapl_dbg_log(DAPL_DBG_TYPE_EP, " reject(cm %p reason %x, pdata %p, psize %d)\n", cm_ptr, reason, pdata, psize); if (psize > DCM_MAX_PDATA_SIZE) return DAT_LENGTH_ERROR; /* write reject data to indicate reject */ if (reason == IB_CM_REJ_REASON_CONSUMER_REJ) cm_ptr->msg.op = htons(DCM_REJ_USER); else cm_ptr->msg.op = htons(DCM_REJ_CM); cm_ptr->msg.p_size = htons(psize); iov[0].iov_base = (void *)&cm_ptr->msg; iov[0].iov_len = sizeof(ib_cm_msg_t) - DCM_MAX_PDATA_SIZE; if (psize) { iov[1].iov_base = pdata; iov[1].iov_len = psize; writev(cm_ptr->socket, iov, 2); } else { writev(cm_ptr->socket, iov, 1); } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm_ptr->hca->ia_list_head)), reason == IB_CM_REJ_REASON_CONSUMER_REJ ? DCNT_IA_CM_USER_REJ_TX : DCNT_IA_CM_ERR_REJ_TX); /* release and cleanup CM object */ dapli_cm_free(cm_ptr); return DAT_SUCCESS; } /* * dapls_ib_cm_remote_addr * * Obtain the remote IP address given a connection * * Input: * cr_handle * * Output: * remote_ia_address: where to place the remote address * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * */ DAT_RETURN dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * remote_ia_address) { DAPL_HEADER *header; dp_ib_cm_handle_t conn; dapl_dbg_log(DAPL_DBG_TYPE_EP, "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n", dat_handle); header = (DAPL_HEADER *) dat_handle; if (header->magic == DAPL_MAGIC_EP) conn = dapl_get_cm_from_ep((DAPL_EP *) dat_handle); else if (header->magic == DAPL_MAGIC_CR) conn = ((DAPL_CR *) dat_handle)->ib_cm_handle; else return DAT_INVALID_HANDLE; dapl_os_memcpy(remote_ia_address, &conn->msg.daddr.so, sizeof(DAT_SOCK_ADDR6)); return DAT_SUCCESS; } int dapls_ib_private_data_size( IN DAPL_HCA *hca_ptr) { return DCM_MAX_PDATA_SIZE; } /* outbound/inbound CR processing thread to avoid blocking applications */ void cr_thread(void *arg) { struct dapl_hca *hca_ptr = arg; dp_ib_cm_handle_t cr, next_cr; int opt, ret; socklen_t opt_len; char rbuf[2]; struct dapl_fd_set *set; enum DAPL_FD_EVENTS event; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cr_thread: ENTER hca %p\n", hca_ptr); set = dapl_alloc_fd_set(); if (!set) goto out; dapl_os_lock(&hca_ptr->ib_trans.lock); hca_ptr->ib_trans.cr_state = IB_THREAD_RUN; while (1) { dapl_fd_zero(set); dapl_fd_set(hca_ptr->ib_trans.scm[0], set, DAPL_FD_READ); if (!dapl_llist_is_empty(&hca_ptr->ib_trans.list)) next_cr = dapl_llist_peek_head(&hca_ptr->ib_trans.list); else next_cr = NULL; while (next_cr) { cr = next_cr; next_cr = dapl_llist_next_entry(&hca_ptr->ib_trans.list, (DAPL_LLIST_ENTRY *) &cr->local_entry); dapls_cm_acquire(cr); /* hold thread ref */ dapl_os_lock(&cr->lock); if (cr->state == DCM_FREE || hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) { dapl_log(DAPL_DBG_TYPE_CM, " CM FREE: %p ep=%p st=%s sck=%d refs=%d\n", cr, cr->ep, dapl_cm_state_str(cr->state), cr->socket, cr->ref_count); if (cr->socket != DAPL_INVALID_SOCKET) { shutdown(cr->socket, SHUT_RDWR); closesocket(cr->socket); cr->socket = DAPL_INVALID_SOCKET; } dapl_os_unlock(&cr->lock); dapls_cm_release(cr); /* release alloc ref */ dapli_cm_dequeue(cr); /* release workq ref */ dapls_cm_release(cr); /* release thread ref */ continue; } event = (cr->state == DCM_CONN_PENDING) ? DAPL_FD_WRITE : DAPL_FD_READ; if (dapl_fd_set(cr->socket, set, event)) { dapl_log(DAPL_DBG_TYPE_ERR, " cr_thread: fd_set ERR st=%d fd %d" " -> %s\n", cr->state, cr->socket, inet_ntoa(((struct sockaddr_in *) &cr->msg.daddr.so)->sin_addr)); dapl_os_unlock(&cr->lock); dapls_cm_release(cr); /* release ref */ continue; } dapl_os_unlock(&cr->lock); dapl_os_unlock(&hca_ptr->ib_trans.lock); ret = dapl_poll(cr->socket, event); dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " poll ret=0x%x %s sck=%d\n", ret, dapl_cm_state_str(cr->state), cr->socket); /* data on listen, qp exchange, and on disc req */ dapl_os_lock(&cr->lock); if ((ret == DAPL_FD_READ) || (cr->state != DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) { if (cr->socket != DAPL_INVALID_SOCKET) { switch (cr->state) { case DCM_LISTEN: dapl_os_unlock(&cr->lock); dapli_socket_accept(cr); break; case DCM_ACCEPTING: dapl_os_unlock(&cr->lock); dapli_socket_accept_data(cr); break; case DCM_ACCEPTED: dapl_os_unlock(&cr->lock); dapli_socket_accept_rtu(cr); break; case DCM_REP_PENDING: dapl_os_unlock(&cr->lock); dapli_socket_connect_rtu(cr); break; case DCM_CONNECTED: dapl_os_unlock(&cr->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cr->hca->ia_list_head)), DCNT_IA_CM_DREQ_RX); dapli_socket_disconnect(cr); break; case DCM_DISCONNECTED: cr->state = DCM_FREE; dapl_os_unlock(&cr->lock); break; default: if (ret == DAPL_FD_ERROR) cr->state = DCM_FREE; dapl_os_unlock(&cr->lock); break; } } else dapl_os_unlock(&cr->lock); /* ASYNC connections, writable, readable, error; check status */ } else if (ret == DAPL_FD_WRITE || (cr->state == DCM_CONN_PENDING && ret == DAPL_FD_ERROR)) { opt = 0; opt_len = sizeof(opt); ret = getsockopt(cr->socket, SOL_SOCKET, SO_ERROR, (char *)&opt, &opt_len); dapl_os_unlock(&cr->lock); if (!ret && !opt) dapli_socket_connected(cr, opt); else dapli_socket_connected(cr, opt ? opt : dapl_socket_errno()); } else dapl_os_unlock(&cr->lock); dapls_cm_release(cr); /* release ref */ dapl_os_lock(&hca_ptr->ib_trans.lock); } /* set to exit and all resources destroyed */ if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca_ptr->ib_trans.list))) break; dapl_os_unlock(&hca_ptr->ib_trans.lock); dapl_select(set); /* if pipe used to wakeup, consume */ while (dapl_poll(hca_ptr->ib_trans.scm[0], DAPL_FD_READ) == DAPL_FD_READ) { if (recv(hca_ptr->ib_trans.scm[0], rbuf, 2, 0) == -1) dapl_log(DAPL_DBG_TYPE_THREAD, " cr_thread: read pipe error = %s\n", strerror(errno)); } dapl_os_lock(&hca_ptr->ib_trans.lock); /* set to exit and all resources destroyed */ if ((hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca_ptr->ib_trans.list))) break; } dapl_os_unlock(&hca_ptr->ib_trans.lock); dapl_os_free(set, sizeof(struct dapl_fd_set)); out: hca_ptr->ib_trans.cr_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " cr_thread(hca %p) exit\n", hca_ptr); } #ifdef DAPL_COUNTERS /* Debug aid: List all Connections in process and state */ void dapls_print_cm_list(IN DAPL_IA *ia_ptr) { /* Print in process CR's for this IA, if debug type set */ int i = 0; dp_ib_cm_handle_t cr, next_cr; dapl_os_lock(&ia_ptr->hca_ptr->ib_trans.lock); if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*) &ia_ptr->hca_ptr->ib_trans.list)) next_cr = dapl_llist_peek_head((DAPL_LLIST_HEAD*) &ia_ptr->hca_ptr->ib_trans.list); else next_cr = NULL; printf("\n DAPL IA CONNECTIONS IN PROCESS:\n"); while (next_cr) { cr = next_cr; next_cr = dapl_llist_next_entry((DAPL_LLIST_HEAD*) &ia_ptr->hca_ptr->ib_trans.list, (DAPL_LLIST_ENTRY*)&cr->local_entry); printf( " CONN[%d]: sp %p ep %p sock %d %s %s %s %s %s %s " " PORT L-%x R-%x \n", i, cr->sp, cr->ep, cr->socket, cr->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cr->state), dapl_cm_op_str(ntohs(cr->msg.op)), ntohs(cr->msg.op) == DCM_REQ ? /* local address */ inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr) : inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr), cr->sp ? "<-" : "->", ntohs(cr->msg.op) == DCM_REQ ? /* remote address */ inet_ntoa(((struct sockaddr_in *)&cr->addr)->sin_addr) : inet_ntoa(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_addr), ntohs(cr->msg.op) == DCM_REQ ? /* local port */ ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) : ntohs(((struct sockaddr_in *)&cr->addr)->sin_port), ntohs(cr->msg.op) == DCM_REQ ? /* remote port */ ntohs(((struct sockaddr_in *)&cr->addr)->sin_port) : ntohs(((struct sockaddr_in *)&cr->msg.daddr.so)->sin_port) ); i++; } printf("\n"); dapl_os_unlock(&ia_ptr->hca_ptr->ib_trans.lock); } #endif dapl-2.1.5/dapl/openib_scm/dapl_ib_util.h000066400000000000000000000102011255317474200203010ustar00rootroot00000000000000/* * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_IB_UTIL_H_ #define _DAPL_IB_UTIL_H_ #define _OPENIB_SCM_ #include #include "openib_osd.h" #include "dapl_ib_common.h" /* DAPL CM objects MUST include list_entry, ref_count, event for EP linking */ struct ib_cm_handle { struct dapl_llist_entry list_entry; struct dapl_llist_entry local_entry; DAPL_OS_WAIT_OBJECT event; DAPL_OS_LOCK lock; int ref_count; int state; int retry; DAPL_SOCKET socket; struct dapl_hca *hca; struct dapl_sp *sp; struct dapl_ep *ep; ib_cm_msg_t msg; struct ibv_ah *ah; DAT_SOCK_ADDR6 addr; }; typedef struct ib_cm_handle *dp_ib_cm_handle_t; typedef dp_ib_cm_handle_t ib_cm_srvc_handle_t; /* Definitions */ #define IB_INVALID_HANDLE NULL /* inline send rdma threshold */ #define INLINE_SEND_DEFAULT 200 /* RC timer - retry count defaults */ #define SCM_ACK_TIMER 20 /* 5 bits, 4.096us*2^ack_timer. 16== 268ms, 20==4.2s */ #define SCM_ACK_RETRY 7 /* 3 bits, 7 * 4.2 == 30 seconds */ #define SCM_RNR_TIMER 12 /* 5 bits, 12 =.64ms, 28 =163ms, 31 =491ms */ #define SCM_RNR_RETRY 7 /* 3 bits, 7 == infinite */ #define SCM_CR_RETRY 5 /* retries for busy server, connect refused */ #define SCM_IB_MTU 2048 /* Global routing defaults */ #define SCM_GLOBAL 0 /* global routing is disabled */ #define SCM_HOP_LIMIT 0xff #define SCM_TCLASS 0 /* ib_hca_transport_t, specific to this implementation */ typedef struct _ib_hca_transport { struct dapl_llist_entry entry; int destroy; union ibv_gid gid; struct ibv_device *ib_dev; struct ibv_context *ib_ctx; ib_cq_handle_t ib_cq_empty; DAPL_OS_LOCK cq_lock; int max_inline_send; ib_thread_state_t cq_state; DAPL_OS_THREAD cq_thread; struct ibv_comp_channel *ib_cq; int cr_state; DAPL_OS_THREAD thread; DAPL_OS_LOCK lock; struct dapl_llist_entry *list; ib_async_handler_t async_unafiliated; void *async_un_ctx; ib_async_cq_handler_t async_cq_error; ib_async_dto_handler_t async_cq; ib_async_qp_handler_t async_qp_error; uint16_t lid; ib_cm_attr_t ib_cm; /* dev attr for QP and CM */ DAPL_SOCKET scm[2]; uint64_t guid; char guid_str[32]; ib_named_attr_t na; #ifdef DAT_IB_COLLECTIVES /* Collective member device and address information */ ib_thread_state_t coll_thread_state; DAPL_OS_THREAD coll_thread; DAPL_OS_LOCK coll_lock; DAPL_OS_WAIT_OBJECT coll_event; struct dapl_llist_entry *grp_list; user_progress_func_t *user_func; int l_sock; struct sockaddr_in m_addr; void *m_ctx; void *m_info; void *f_info; int m_size; int f_size; int t_id; #endif } ib_hca_transport_t; /* prototypes */ void cr_thread(void *arg); int dapli_cq_thread_init(struct dapl_hca *hca_ptr); void dapli_cq_thread_destroy(struct dapl_hca *hca_ptr); void dapli_async_event_cb(struct _ib_hca_transport *tp); void dapli_cq_event_cb(struct _ib_hca_transport *tp); void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr); void dapls_cm_release(dp_ib_cm_handle_t cm_ptr); void dapls_cm_free(dp_ib_cm_handle_t cm_ptr); DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr); #ifdef DAPL_COUNTERS void dapls_print_cm_list(IN DAPL_IA *ia_ptr); #endif #endif /* _DAPL_IB_UTIL_H_ */ dapl-2.1.5/dapl/openib_scm/device.c000066400000000000000000000507461255317474200171260ustar00rootroot00000000000000/* * Copyright (c) 2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************************** * * Module: uDAPL * * Filename: dapl_ib_util.c * * Author: Arlin Davis * * Created: 3/10/2005 * * Description: * * The uDAPL openib provider - init, open, close, utilities * **************************************************************************** * Source Control System Information * * $Id: $ * * Copyright (c) 2005 Intel Corporation. All rights reserved. * **************************************************************************/ #ifdef RCSID static const char rcsid[] = "$Id: $"; #endif #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_osd.h" #include #ifdef DAT_IB_COLLECTIVES #include #endif ib_thread_state_t g_ib_thread_state = 0; DAPL_OS_THREAD g_ib_thread; DAPL_OS_LOCK g_hca_lock; struct dapl_llist_entry *g_hca_list; char gid_str[INET6_ADDRSTRLEN]; void dapli_thread(void *arg); DAT_RETURN dapli_ib_thread_init(void); void dapli_ib_thread_destroy(void); #if defined(_WIN64) || defined(_WIN32) #include static COMP_SET ufds; static int dapls_os_init(void) { return CompSetInit(&ufds); } static void dapls_os_release(void) { CompSetCleanup(&ufds); } static int dapls_config_verbs(struct ibv_context *verbs) { verbs->channel.Milliseconds = 0; return 0; } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { channel->comp_channel.Milliseconds = 0; return 0; } static int dapls_thread_signal(void) { CompSetCancel(&ufds); return 0; } #else // _WIN64 || WIN32 int g_ib_pipe[2]; static int dapls_os_init(void) { /* create pipe for waking up work thread */ return pipe(g_ib_pipe); } static void dapls_os_release(void) { if (g_ib_pipe[0]) close(g_ib_pipe[0]); if (g_ib_pipe[1]) close(g_ib_pipe[1]); } static int dapls_config_fd(int fd) { int opts; opts = fcntl(fd, F_GETFL); if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on fd %d ERR %d %s\n", fd, opts, strerror(errno)); return errno; } return 0; } static int dapls_config_verbs(struct ibv_context *verbs) { return dapls_config_fd(verbs->async_fd); } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { return dapls_config_fd(channel->fd); } static int dapls_thread_signal(void) { return write(g_ib_pipe[1], "w", sizeof "w"); } #endif static int32_t create_cr_pipe(IN DAPL_HCA * hca_ptr) { DAPL_SOCKET listen_socket; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int ret; listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_socket == DAPL_INVALID_SOCKET) return 1; memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(0x7f000001); ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof addr); if (ret) goto err1; ret = getsockname(listen_socket, (struct sockaddr *)&addr, &addrlen); if (ret) goto err1; ret = listen(listen_socket, 0); if (ret) goto err1; hca_ptr->ib_trans.scm[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (hca_ptr->ib_trans.scm[1] == DAPL_INVALID_SOCKET) goto err1; ret = connect(hca_ptr->ib_trans.scm[1], (struct sockaddr *)&addr, sizeof(addr)); if (ret) goto err2; hca_ptr->ib_trans.scm[0] = accept(listen_socket, NULL, NULL); if (hca_ptr->ib_trans.scm[0] == DAPL_INVALID_SOCKET) goto err2; closesocket(listen_socket); return 0; err2: closesocket(hca_ptr->ib_trans.scm[1]); err1: closesocket(listen_socket); return 1; } static void destroy_cr_pipe(IN DAPL_HCA * hca_ptr) { closesocket(hca_ptr->ib_trans.scm[0]); closesocket(hca_ptr->ib_trans.scm[1]); } /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ DAT_UINT32 g_parent = 0; int32_t dapls_ib_init(void) { g_parent = dapl_os_getpid(); /* initialize hca_list */ dapl_os_lock_init(&g_hca_lock); dapl_llist_init_head(&g_hca_list); if (dapls_os_init()) return 1; return 0; } int32_t dapls_ib_release(void) { /* only parent init will cleanup */ if (dapl_os_getpid() != g_parent) return 0; dapli_ib_thread_destroy(); dapls_os_release(); return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr, IN DAPL_OPEN_FLAGS flags) { struct ibv_device **dev_list; struct ibv_port_attr port_attr; int i, nd = 0; DAT_RETURN dat_status = DAT_SUCCESS; dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":"STD MODE"); if (flags & DAPL_OPEN_QUERY) { dapl_log(DAPL_DBG_TYPE_WARN, " WARNING! open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":""); } /* Get list of all IB devices, find match, open */ dev_list = ibv_get_device_list(&nd); if (!dev_list) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_get_device_list() failed\n", hca_name); return DAT_INTERNAL_ERROR; } hca_ptr->ib_trans.ib_dev = NULL; for (i = 0; i < nd; ++i) { if (!hca_ptr->ib_trans.guid && dev_list[i]->transport_type == IBV_TRANSPORT_IB) hca_ptr->ib_trans.guid = ibv_get_device_guid(dev_list[i]); if (!strcmp(dev_list[i]->name, hca_name)) hca_ptr->ib_trans.ib_dev = dev_list[i]; } if (hca_ptr->ib_trans.ib_dev == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: device %s not found\n", hca_name); dat_status = DAT_PROVIDER_NOT_FOUND; goto err; } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " open_hca: Found dev %s %016llx\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), (unsigned long long) ntohll(ibv_get_device_guid(hca_ptr->ib_trans.ib_dev))); hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: dev open failed for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); goto err; } hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle; dapls_config_verbs(hca_ptr->ib_hca_handle); /* get lid for this hca-port, network order */ if (ibv_query_port(hca_ptr->ib_hca_handle, (uint8_t) hca_ptr->port_num, &port_attr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: get lid ERR for %s port=%d, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), hca_ptr->port_num, strerror(errno)); goto err; } else { hca_ptr->ib_trans.lid = htons(port_attr.lid); } /* get gid for this hca-port, network order */ if (ibv_query_gid(hca_ptr->ib_hca_handle, (uint8_t) hca_ptr->port_num, 0, &hca_ptr->ib_trans.gid)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: query GID ERR for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); goto err; } /* set RC tunables via enviroment or default */ if (dapl_ib_inline_data(hca_ptr->ib_hca_handle)) { hca_ptr->ib_trans.ib_cm.max_inline = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_DEFAULT); } hca_ptr->ib_trans.ib_cm.ack_retry = dapl_os_get_env_val("DAPL_ACK_RETRY", SCM_ACK_RETRY); hca_ptr->ib_trans.ib_cm.ack_timer = dapl_os_get_env_val("DAPL_ACK_TIMER", SCM_ACK_TIMER); hca_ptr->ib_trans.ib_cm.rnr_retry = dapl_os_get_env_val("DAPL_RNR_RETRY", SCM_RNR_RETRY); hca_ptr->ib_trans.ib_cm.rnr_timer = dapl_os_get_env_val("DAPL_RNR_TIMER", SCM_RNR_TIMER); hca_ptr->ib_trans.ib_cm.global = dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", SCM_GLOBAL); hca_ptr->ib_trans.ib_cm.hop_limit = dapl_os_get_env_val("DAPL_HOP_LIMIT", SCM_HOP_LIMIT); hca_ptr->ib_trans.ib_cm.tclass = dapl_os_get_env_val("DAPL_TCLASS", SCM_TCLASS); hca_ptr->ib_trans.ib_cm.mtu = dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", SCM_IB_MTU)); if (flags & DAPL_OPEN_QUERY) goto done; /* get the IP address of the device */ dat_status = getlocalipaddr((char *)&hca_ptr->hca_address, sizeof(DAT_SOCK_ADDR6)); if (dat_status != DAT_SUCCESS) return dat_status; /* EVD events without direct CQ channels, CNO support */ hca_ptr->ib_trans.ib_cq = ibv_create_comp_channel(hca_ptr->ib_hca_handle); if (hca_ptr->ib_trans.ib_cq == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_create_comp_channel ERR %s\n", strerror(errno)); goto bail; } dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq); dat_status = dapli_ib_thread_init(); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to init cq thread lock\n"); goto bail; } /* * Put new hca_transport on list for async and CQ event processing * Wakeup work thread to add to polling list */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&hca_ptr->ib_trans.entry); dapl_os_lock(&g_hca_lock); dapl_llist_add_tail(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca_ptr->ib_trans.entry, &hca_ptr->ib_trans.entry); if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: thread wakeup error = %s\n", strerror(errno)); dapl_os_unlock(&g_hca_lock); /* initialize cr_list lock */ dat_status = dapl_os_lock_init(&hca_ptr->ib_trans.lock); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to init cr_list lock\n"); goto bail; } /* initialize CM list for listens on this HCA */ dapl_llist_init_head(&hca_ptr->ib_trans.list); /* initialize pipe, user level wakeup on select */ if (create_cr_pipe(hca_ptr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to init cr pipe - %s\n", strerror(errno)); goto bail; } /* create thread to process inbound connect request */ hca_ptr->ib_trans.cr_state = IB_THREAD_INIT; dat_status = dapl_os_thread_create(cr_thread, (void *)hca_ptr, &hca_ptr->ib_trans.thread); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to create thread\n"); goto bail; } /* wait for thread */ while (hca_ptr->ib_trans.cr_state != IB_THREAD_RUN) { dapl_os_sleep_usec(1000); } #ifdef DAT_IB_COLLECTIVES if (dapli_create_collective_service(hca_ptr)) goto bail; #endif done: dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "%s open: dev %s port %d, GID %s, IP %s\n", PROVIDER_NAME, hca_name, hca_ptr->port_num, inet_ntop(AF_INET6, &hca_ptr->ib_trans.gid, gid_str, sizeof(gid_str)), inet_ntoa(((struct sockaddr_in *) &hca_ptr->hca_address)->sin_addr)); ibv_free_device_list(dev_list); return dat_status; bail: ibv_close_device(hca_ptr->ib_hca_handle); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->ib_trans.ib_dev = NULL; hca_ptr->ib_trans.ib_ctx = NULL; err: ibv_free_device_list(dev_list); return DAT_INTERNAL_ERROR; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr) { dapl_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p thread_state %d\n", hca_ptr, g_ib_thread_state); if (!g_ib_thread_state) /* thread never started */ goto out; #ifdef DAT_IB_COLLECTIVES dapli_free_collective_service(hca_ptr); #endif dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_RUN) { dapl_os_unlock(&g_hca_lock); goto out; } dapl_os_unlock(&g_hca_lock); /* destroy cr_thread and lock */ if (hca_ptr->ib_trans.cr_state == IB_THREAD_RUN) { hca_ptr->ib_trans.cr_state = IB_THREAD_CANCEL; send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0); while (hca_ptr->ib_trans.cr_state != IB_THREAD_EXIT) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: waiting for cr_thread\n"); send(hca_ptr->ib_trans.scm[1], "w", sizeof "w", 0); dapl_os_sleep_usec(1000); } dapl_os_lock_destroy(&hca_ptr->ib_trans.lock); destroy_cr_pipe(hca_ptr); /* no longer need pipe */ } /* HCA on active list: * Remove hca from async event processing list * Wakeup work thread to remove from polling list */ if (hca_ptr->ib_trans.entry.list_head == &g_hca_list) { hca_ptr->ib_trans.destroy = 1; if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); /* wait for thread to remove HCA references */ while (hca_ptr->ib_trans.destroy != 2) { if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); dapl_os_sleep_usec(1000); } } out: if (hca_ptr->ib_trans.ib_cq) ibv_destroy_comp_channel(hca_ptr->ib_trans.ib_cq); if (hca_ptr->ib_trans.ib_cq_empty) { struct ibv_comp_channel *channel; channel = hca_ptr->ib_trans.ib_cq_empty->cq->channel; ibv_destroy_cq(hca_ptr->ib_trans.ib_cq_empty->cq); ibv_destroy_comp_channel(channel); } if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (ibv_close_device(hca_ptr->ib_hca_handle)) return (dapl_convert_errno(errno, "ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } return (DAT_SUCCESS); } DAT_RETURN dapli_ib_thread_init(void) { DAT_RETURN dat_status; dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_INIT) { dapl_os_unlock(&g_hca_lock); return DAT_SUCCESS; } g_ib_thread_state = IB_THREAD_CREATE; dapl_os_unlock(&g_hca_lock); /* create thread to process inbound connect request */ dat_status = dapl_os_thread_create(dapli_thread, NULL, &g_ib_thread); if (dat_status != DAT_SUCCESS) return (dapl_convert_errno(errno, "create_thread ERR:" " check resource limits")); /* wait for thread to start */ dapl_os_lock(&g_hca_lock); while (g_ib_thread_state != IB_THREAD_RUN) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_init: waiting for ib_thread\n"); dapl_os_unlock(&g_hca_lock); dapl_os_sleep_usec(1000); dapl_os_lock(&g_hca_lock); } dapl_os_unlock(&g_hca_lock); return DAT_SUCCESS; } void dapli_ib_thread_destroy(void) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d)\n", dapl_os_getpid()); /* * wait for async thread to terminate. * pthread_join would be the correct method * but some applications have some issues */ /* destroy ib_thread, wait for termination, if not already */ dapl_os_lock(&g_hca_lock); if (g_ib_thread_state != IB_THREAD_RUN) goto bail; g_ib_thread_state = IB_THREAD_CANCEL; while (g_ib_thread_state != IB_THREAD_EXIT) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy: waiting for ib_thread\n"); if (dapls_thread_signal() == -1) dapl_log(DAPL_DBG_TYPE_UTIL, " destroy: thread wakeup error = %s\n", strerror(errno)); dapl_os_unlock(&g_hca_lock); dapl_os_sleep_usec(2000); dapl_os_lock(&g_hca_lock); } bail: dapl_os_unlock(&g_hca_lock); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread_destroy(%d) exit\n", dapl_os_getpid()); } #if defined(_WIN64) || defined(_WIN32) /* work thread for uAT, uCM, CQ, and async events */ void dapli_thread(void *arg) { struct _ib_hca_transport *hca; struct _ib_hca_transport *uhca[8]; int ret, idx, cnt; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d,0x%x): ENTER: \n", dapl_os_getpid(), g_ib_thread); dapl_os_lock(&g_hca_lock); for (g_ib_thread_state = IB_THREAD_RUN; g_ib_thread_state == IB_THREAD_RUN; dapl_os_lock(&g_hca_lock)) { CompSetZero(&ufds); idx = 0; hca = dapl_llist_is_empty(&g_hca_list) ? NULL : dapl_llist_peek_head(&g_hca_list); while (hca) { CompSetAdd(&hca->ib_ctx->channel, &ufds); CompSetAdd(&hca->ib_cq->comp_channel, &ufds); uhca[idx++] = hca; hca = dapl_llist_next_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca->entry); } cnt = idx; dapl_os_unlock(&g_hca_lock); ret = CompSetPoll(&ufds, INFINITE); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) poll_event 0x%x\n", dapl_os_getpid(), ret); /* check and process ASYNC events, per device */ for (idx = 0; idx < cnt; idx++) { if (uhca[idx]->destroy == 1) { dapl_os_lock(&g_hca_lock); dapl_llist_remove_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &uhca[idx]->entry); dapl_os_unlock(&g_hca_lock); uhca[idx]->destroy = 2; } else { dapli_cq_event_cb(uhca[idx]); dapli_async_event_cb(uhca[idx]); } } } dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " ib_thread(%d) EXIT\n", dapl_os_getpid()); g_ib_thread_state = IB_THREAD_EXIT; dapl_os_unlock(&g_hca_lock); } #else // _WIN64 || WIN32 /* work thread for uAT, uCM, CQ, and async events */ void dapli_thread(void *arg) { struct pollfd ufds[__FD_SETSIZE]; struct _ib_hca_transport *uhca[__FD_SETSIZE] = { NULL }; struct _ib_hca_transport *hca; int ret, idx, fds; char rbuf[2]; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d,0x%x): ENTER: pipe %d \n", dapl_os_getpid(), g_ib_thread, g_ib_pipe[0]); /* Poll across pipe, CM, AT never changes */ dapl_os_lock(&g_hca_lock); g_ib_thread_state = IB_THREAD_RUN; ufds[0].fd = g_ib_pipe[0]; /* pipe */ ufds[0].events = POLLIN; while (g_ib_thread_state == IB_THREAD_RUN) { /* build ufds after pipe and uCMA events */ ufds[0].revents = 0; idx = 0; /* Walk HCA list and setup async and CQ events */ if (!dapl_llist_is_empty(&g_hca_list)) hca = dapl_llist_peek_head(&g_hca_list); else hca = NULL; while (hca) { /* uASYNC events */ ufds[++idx].fd = hca->ib_ctx->async_fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; /* CQ events are non-direct with CNO's */ ufds[++idx].fd = hca->ib_cq->fd; ufds[idx].events = POLLIN; ufds[idx].revents = 0; uhca[idx] = hca; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) poll_fd: hca[%d]=%p," " async=%d pipe=%d \n", dapl_os_getpid(), hca, ufds[idx - 1].fd, ufds[0].fd); hca = dapl_llist_next_entry(&g_hca_list, (DAPL_LLIST_ENTRY *) &hca->entry); } /* unlock, and setup poll */ fds = idx + 1; dapl_os_unlock(&g_hca_lock); ret = poll(ufds, fds, -1); if (ret <= 0) { dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d): ERR %s poll\n", dapl_os_getpid(), strerror(errno)); dapl_os_lock(&g_hca_lock); continue; } dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) poll_event: " " async=0x%x pipe=0x%x \n", dapl_os_getpid(), ufds[idx].revents, ufds[0].revents); /* check and process CQ and ASYNC events, per device */ for (idx = 1; idx < fds; idx++) { if (ufds[idx].revents == POLLIN) { dapli_cq_event_cb(uhca[idx]); dapli_async_event_cb(uhca[idx]); } } /* check and process user events, PIPE */ if (ufds[0].revents == POLLIN) { if (read(g_ib_pipe[0], rbuf, 2) == -1) dapl_log(DAPL_DBG_TYPE_THREAD, " cr_thread: pipe rd err= %s\n", strerror(errno)); /* cleanup any device on list marked for destroy */ for (idx = 1; idx < fds; idx++) { if (uhca[idx] && uhca[idx]->destroy == 1) { dapl_os_lock(&g_hca_lock); dapl_llist_remove_entry( &g_hca_list, (DAPL_LLIST_ENTRY*) &uhca[idx]->entry); dapl_os_unlock(&g_hca_lock); uhca[idx]->destroy = 2; } } } dapl_os_lock(&g_hca_lock); } dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " ib_thread(%d) EXIT\n", dapl_os_getpid()); g_ib_thread_state = IB_THREAD_EXIT; dapl_os_unlock(&g_hca_lock); } #endif dapl-2.1.5/dapl/openib_scm/linux/000077500000000000000000000000001255317474200166465ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_scm/linux/openib_osd.h000066400000000000000000000006311255317474200211400ustar00rootroot00000000000000#ifndef OPENIB_OSD_H #define OPENIB_OSD_H #include #include #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #define DAPL_SOCKET int #define DAPL_INVALID_SOCKET -1 #define DAPL_FD_SETSIZE 16384 #define closesocket close #endif // OPENIB_OSD_H dapl-2.1.5/dapl/openib_ucm/000077500000000000000000000000001255317474200155115ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_ucm/cm.c000066400000000000000000002446431255317474200162710ustar00rootroot00000000000000/* * Copyright (c) 2009 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_evd_util.h" #include "dapl_cr_util.h" #include "dapl_name_service.h" #include "dapl_ib_util.h" #include "dapl_ep_util.h" #include "dapl_sp_util.h" #include "dapl_osd.h" #if defined(_WIN32) #include #else // _WIN32 enum DAPL_FD_EVENTS { DAPL_FD_READ = POLLIN, DAPL_FD_WRITE = POLLOUT, DAPL_FD_ERROR = POLLERR }; struct dapl_fd_set { int index; struct pollfd set[DAPL_FD_SETSIZE]; }; static struct dapl_fd_set *dapl_alloc_fd_set(void) { return dapl_os_alloc(sizeof(struct dapl_fd_set)); } static void dapl_fd_zero(struct dapl_fd_set *set) { set->index = 0; } static int dapl_fd_set(DAPL_SOCKET s, struct dapl_fd_set *set, enum DAPL_FD_EVENTS event) { if (set->index == DAPL_FD_SETSIZE - 1) { dapl_log(DAPL_DBG_TYPE_ERR, "SCM ERR: cm_thread exceeded FD_SETSIZE %d\n", set->index + 1); return -1; } set->set[set->index].fd = s; set->set[set->index].revents = 0; set->set[set->index++].events = event; return 0; } static enum DAPL_FD_EVENTS dapl_poll(DAPL_SOCKET s, enum DAPL_FD_EVENTS event) { struct pollfd fds; int ret; fds.fd = s; fds.events = event; fds.revents = 0; ret = poll(&fds, 1, 0); dapl_log(DAPL_DBG_TYPE_THREAD, " dapl_poll: fd=%d ret=%d, evnts=0x%x\n", s, ret, fds.revents); if (ret == 0) return 0; else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) return DAPL_FD_ERROR; else return fds.revents; } static int dapl_select(struct dapl_fd_set *set, int time_ms) { int ret; dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: sleep, fds=%d\n", set->index); ret = poll(set->set, set->index, time_ms); dapl_dbg_log(DAPL_DBG_TYPE_THREAD, " dapl_select: wakeup, ret=0x%x\n", ret); return ret; } #endif /* forward declarations */ static int ucm_reply(dp_ib_cm_handle_t cm); static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg); static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg); static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg); static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size); static void ucm_disconnect_final(dp_ib_cm_handle_t cm); DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm); DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm); static int dapli_queue_listen(dp_ib_cm_handle_t cm, uint16_t sid); static int dapli_queue_conn(dp_ib_cm_handle_t cm); static dp_ib_cm_handle_t dapli_cm_lookup(ib_hca_transport_t *tp, int cm_id); static void ucm_check_timers(dp_ib_cm_handle_t cm, int *timer) { DAPL_OS_TIMEVAL time; dapl_os_lock(&cm->lock); dapl_os_get_time(&time); switch (cm->state) { case DCM_REP_PENDING: *timer = cm->hca->ib_trans.cm_timer; if ((time - cm->timer)/1000 >= (cm->hca->ib_trans.rep_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_REQ %d retry %d:" " %d %x %x %x %x -> %d %x %x %x %x: %d > %d(ms)\n", cm->cm_id, cm->retries+1, ntohl(cm->msg.s_id), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), (time - cm->timer)/1000, cm->hca->ib_trans.rep_time << cm->retries); cm->retries++; cm->msg.rtns = cm->retries; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_RETRY); dapl_os_unlock(&cm->lock); dapli_cm_connect(cm->ep, cm); return; } break; case DCM_RTU_PENDING: *timer = cm->hca->ib_trans.cm_timer; if ((time - cm->timer)/1000 >= (cm->hca->ib_trans.rtu_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_REP %d retry %d %s:" " %d %x %x %x %x -> %d %x %x %x %x: %d > %d(ms)\n", cm->cm_id, cm->retries+1, dapl_cm_op_str(ntohs(cm->msg.op)), ntohl(cm->msg.s_id), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), (time - cm->timer)/1000, cm->hca->ib_trans.rtu_time << cm->retries); cm->retries++; cm->msg.rtns = cm->retries; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REP_RETRY); dapl_os_unlock(&cm->lock); ucm_reply(cm); return; } break; case DCM_DREQ_OUT: *timer = cm->hca->ib_trans.cm_timer; if ((time - cm->timer)/1000 >= (cm->hca->ib_trans.drep_time << cm->retries)) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_DREQ %d retry %d %s:" " %d %x %x %x %x -> %d %x %x %x %x: %d > %d(ms)\n", cm->cm_id, cm->retries+1, dapl_cm_op_str(ntohs(cm->msg.op)), ntohl(cm->msg.s_id),ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), (time - cm->timer)/1000, cm->hca->ib_trans.drep_time << cm->retries); cm->retries++; cm->msg.rtns = cm->retries; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_DREQ_RETRY); dapl_os_unlock(&cm->lock); dapli_cm_disconnect(cm); return; } break; case DCM_TIMEWAIT: *timer = cm->hca->ib_trans.cm_timer; if ((time - cm->timer)/1000 >= cm->hca->ib_trans.wait_time) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " CM_TIMEWAIT EXPIRED %d %p [lid, port, cqp, iqp]:" " %x %x %x %x l_id %d -> %x %x %x %x r_id %d" " Time(ms) %d >= %d\n", cm->retries+1, cm, ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), cm->cm_id, ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), (time - cm->timer)/1000, cm->hca->ib_trans.wait_time); cm->state = DCM_FREE; dapl_os_unlock(&cm->lock); if (cm->ep->qp_handle->qp->qp_type == IBV_QPT_UD) dapl_ep_unlink_cm(cm->ep, cm); /* last CM ref */ return; } break; default: break; } dapl_os_unlock(&cm->lock); } /* SEND CM MESSAGE PROCESSING */ /* Get CM UD message from send queue, called with s_lock held */ static ib_cm_msg_t *ucm_get_smsg(ib_hca_transport_t *tp) { ib_cm_msg_t *msg = NULL; int ret, polled = 1, hd = tp->s_hd; hd++; if (hd == tp->qpe) hd = 0; retry: if (hd == tp->s_tl) { msg = NULL; if (polled % 1000000 == 0) dapl_log(DAPL_DBG_TYPE_WARN, " ucm_get_smsg: FULLq hd %d == tl %d," " completions stalled, polls=%d\n", hd, tp->s_tl, polled); } else { msg = &tp->sbuf[hd]; tp->s_hd = hd; /* new hd */ } /* if empty, process some completions */ if (msg == NULL) { struct ibv_wc wc; /* process completions, based on UCM_TX_BURST */ ret = ibv_poll_cq(tp->scq, 1, &wc); if (ret < 0) { dapl_log(DAPL_DBG_TYPE_WARN, " get_smsg: cq %p %s\n", tp->scq, strerror(errno)); return NULL; } /* free up completed sends, update tail */ if (ret > 0) tp->s_tl = (int)wc.wr_id; polled++; goto retry; } DAPL_CNTR_DATA(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_FULLQ, polled > 1 ? 1:0); DAPL_CNTR_DATA(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_REQ_FULLQ_POLL, polled - 1); return msg; } /* RECEIVE CM MESSAGE PROCESSING */ static int ucm_post_rmsg(ib_hca_transport_t *tp, ib_cm_msg_t *msg) { struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; recv_wr.wr_id = (uint64_t)(uintptr_t) msg; sge.length = sizeof(ib_cm_msg_t) + sizeof(struct ibv_grh); sge.lkey = tp->mr_rbuf->lkey; sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh)); return (ibv_post_recv(tp->qp, &recv_wr, &recv_err)); } static int ucm_reject(ib_hca_transport_t *tp, ib_cm_msg_t *msg) { ib_cm_msg_t smsg; /* setup op, rearrange the src, dst cm and addr info */ (void)dapl_os_memzero(&smsg, sizeof(smsg)); smsg.ver = htons(DCM_VER); smsg.op = htons(DCM_REJ_CM); smsg.dport = msg->sport; smsg.dportx = msg->sportx; smsg.dqpn = msg->sqpn; smsg.sport = msg->dport; smsg.sportx = msg->dportx; smsg.sqpn = msg->dqpn; dapl_os_memcpy(&smsg.daddr, &msg->saddr, sizeof(union dcm_addr)); /* no dst_addr IB info in REQ, init lid, gid, get type from saddr */ smsg.saddr.ib.lid = tp->addr.ib.lid; smsg.saddr.ib.qp_type = msg->saddr.ib.qp_type; dapl_os_memcpy(&smsg.saddr.ib.gid[0], &tp->addr.ib.gid, 16); dapl_os_memcpy(&smsg.saddr, &msg->daddr, sizeof(union dcm_addr)); dapl_dbg_log(DAPL_DBG_TYPE_CM, " CM reject -> LID %x, QPN %x PORT %x\n", ntohs(smsg.daddr.ib.lid), ntohl(smsg.dqpn), UCM_PORT_NTOH(smsg.dportx,smsg.dport)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_REJ_TX); return (ucm_send(tp, &smsg, NULL, 0)); } /* called with cm lock held */ static void ucm_timewait_recv(ib_hca_transport_t *tp, ib_cm_msg_t *msg, dp_ib_cm_handle_t cm) { uint16_t msg_op = ntohs(msg->op); /* REP_IN, re-send RTU */ if (msg_op == DCM_REP) { cm->retries++; cm->msg.rtns = cm->retries; cm->msg.op = htons(DCM_RTU); ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_RTU_RETRY); return; } /* DREQ_IN, send DREP */ if (msg_op == DCM_DREQ) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " DREQ_in: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r %x l %x rtns %d\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id), msg->rtns); cm->msg.op = htons(DCM_DREP); ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREQ_RX); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREP_TX); return; } /* DUPs or unexpected */ if (msg_op == DCM_DREP) { if (msg_op != DCM_DREP) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " DREP_in: ep %p cm %p %s %s %s" " %x %x %x %s %x %x %x rtns %d\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), msg->rtns); DAPL_CNTR(((DAPL_IA *) dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_DREP_DUP); } } else if (msg_op == DCM_RTU) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " RTU_in: DUP on cm %p id %d" " <- %s %s s_port %x s_cqpn %x rtn %d\n", cm, cm->cm_id, dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn), msg->rtns); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_RTU_DUP); } else { dapl_log(DAPL_DBG_TYPE_CM_WARN, " MSG_in: UNEXPECTED on cm %p id %d" " <- %s %s s_port %x s_cqpn %x\n", cm, cm->cm_id, dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_UNEXPECTED); } } static void ucm_process_recv(ib_hca_transport_t *tp, ib_cm_msg_t *msg, dp_ib_cm_handle_t cm) { uint16_t msg_op = ntohs(msg->op); dapl_os_lock(&cm->lock); switch (cm->state) { case DCM_LISTEN: /* passive */ dapl_os_unlock(&cm->lock); ucm_accept(cm, msg); break; case DCM_ACCEPTING: /* passive */ dapl_os_unlock(&cm->lock); /* duplicate CM_REQ */ dapl_log(DAPL_DBG_TYPE_CM_WARN, " REQ_in: DUP cm %p id %d op %s (%s) %s:" " %d %x %x %x %x <- %d %x %x %x %x\n", cm, cm->cm_id, dapl_cm_op_str(msg_op), dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohl(msg->d_id), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr.ib.qpn), ntohl(msg->s_id), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr.ib.qpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REQ_DUP); break; case DCM_RTU_PENDING: /* passive */ dapl_os_unlock(&cm->lock); if (msg_op == DCM_RTU) return ucm_accept_rtu(cm, msg); if (msg_op == DCM_REQ) { /* CM_REP out dropped? */ dapl_log(DAPL_DBG_TYPE_CM_WARN, " REQ_in: RESEND REP cm %p %s %s:" " %d %x %x %x %x -> %d %x %x %x %x\n", cm, dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), ntohl(cm->msg.s_id), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn)); /* resend reply */ cm->retries++; cm->msg.rtns = cm->retries; ucm_reply(cm); } break; case DCM_REP_PENDING: /* active */ dapl_os_unlock(&cm->lock); ucm_connect_rtu(cm, msg); break; case DCM_CONNECTED: /* active and passive */ if (msg_op == DCM_REP) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " REP_in: RESEND RTU cm %p %s %s:" " %d %x %x %x %x -> %d %x %x %x %x\n", cm, dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), ntohl(cm->msg.s_id), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn)); cm->retries++; cm->msg.rtns = cm->retries; cm->msg.op = htons(DCM_RTU); ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_RTU_RETRY); dapl_os_unlock(&cm->lock); } else if (msg_op == DCM_DREQ) { cm->state = DCM_DREQ_IN; dapl_os_unlock(&cm->lock); dapli_cm_disconnect(cm); } else { dapl_log(DAPL_DBG_TYPE_CM_WARN, " MSG_in: UNEXPECTED: cm %p %s %s:" "S %d %x %x %x %x <-> D %d %x %x %x %x\n", cm, dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), ntohl(cm->msg.s_id), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&cm->lock); } break; case DCM_DREQ_OUT: /* active and passive */ /* DREQ return DREP and finalize, DREP finalize */ if (msg_op == DCM_DREQ) { cm->state = DCM_DREQ_IN; dapl_os_unlock(&cm->lock); dapli_cm_disconnect(cm); } else { dapl_log(DAPL_DBG_TYPE_CM, " DREP_in: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); dapl_os_unlock(&cm->lock); ucm_disconnect_final(cm); } break; case DCM_TIMEWAIT: /* active and passive */ case DCM_FREE: ucm_timewait_recv(tp, msg, cm); dapl_os_unlock(&cm->lock); break; case DCM_REJECTED: if (msg_op == DCM_REJ_USER) { DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_USER_REJ_RX); dapl_os_unlock(&cm->lock); break; } break; default: dapl_log(DAPL_DBG_TYPE_CM_WARN, " ucm_recv: Warning, UNKNOWN state" " <- op %s, %s spsp %x sqpn %x slid %x\n", dapl_cm_op_str(msg_op), dapl_cm_state_str(cm->state), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(msg->sqpn), ntohs(msg->saddr.ib.lid)); dapl_os_unlock(&cm->lock); break; } } static inline int ucm_cmp(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg, int listen) { uint32_t l_sport = UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport); uint32_t l_dport = UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport); uint32_t r_sport = UCM_PORT_NTOH(msg->sportx, msg->sport); uint32_t r_dport = UCM_PORT_NTOH(msg->dportx, msg->dport); dapl_log(DAPL_DBG_TYPE_CM, " ucm_cmp: CM %s %s [l_id sqp dqp dlid sprt dprt]:" " %d %x %x %x %x %x\n", listen ? "":dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), cm->cm_id, ntohl(cm->msg.sqpn), ntohl(cm->msg.dqpn), ntohs(cm->msg.daddr.ib.lid), l_sport, l_dport); dapl_log(DAPL_DBG_TYPE_CM, " ucm_cmp: MSG %s %s [d_id dqp sqp slid dport sport]:" " %d %x %x %x %x %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohl(cm->msg.d_id), ntohl(msg->dqpn), ntohl(msg->sqpn), ntohs(msg->saddr.ib.lid), r_dport, r_sport); if (listen) { if (l_sport == r_dport && cm->msg.sqpn == msg->dqpn) return 1; else return 0; } if (l_sport == r_dport && l_dport == r_sport && cm->msg.sqpn == msg->dqpn && cm->msg.dqpn == msg->sqpn && cm->msg.daddr.ib.lid == msg->saddr.ib.lid) { return 1; } return 0; } /* Find matching CM object for this receive message, return CM reference, timer */ dp_ib_cm_handle_t ucm_cm_find(ib_hca_transport_t *tp, ib_cm_msg_t *msg) { dp_ib_cm_handle_t cm = NULL, next, found = NULL; struct dapl_llist_entry **list; DAPL_OS_LOCK *lock; int listenq = 0; uint16_t msg_op = ntohs(msg->op); /* conn list first, duplicate requests for DCM_REQ */ list = &tp->list; lock = &tp->lock; dapl_log(DAPL_DBG_TYPE_CM, " ucm_recv: %s %d %x %x i %x c %x < %d %x %x i %x c %x\n", dapl_cm_op_str(msg_op), ntohl(msg->d_id), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(msg->daddr.ib.qpn), ntohl(msg->dqpn), ntohl(msg->s_id), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(msg->saddr.ib.qpn), ntohl(msg->sqpn)); retry_listenq: dapl_os_lock(lock); /* if new REQ, goto listen list */ if ((msg_op == DCM_REQ) && !listenq && !msg->rtns) goto skip_cqlist; /* connectq: lookup using indexer */ if (!listenq && msg->d_id) { int match; cm = dapli_cm_lookup(tp, ntohl(msg->d_id)); if (cm && (cm->cm_id == ntohl(msg->d_id))) { match = ucm_cmp(cm, msg, 0); if (match) { dapl_log(DAPL_DBG_TYPE_CM, "connect idxr[%d] match! cm %p %s\n", cm->cm_id, cm, dapl_cm_op_str(msg_op)); found = cm; goto skip_cqlist; /* idxr hit */ } } } if (!dapl_llist_is_empty(list)) next = dapl_llist_peek_head(list); else next = NULL; while (next) { cm = next; next = dapl_llist_next_entry(list, (DAPL_LLIST_ENTRY *)&cm->local_entry); if (cm->state == DCM_DESTROY || cm->state == DCM_FREE) continue; if (ucm_cmp(cm, msg, listenq)) { dapl_log(DAPL_DBG_TYPE_CM, "%s list match!\n", listenq ? "listen":"connect"); found = cm; break; } } skip_cqlist: dapl_os_unlock(lock); /* no duplicate request on connq, check listenq for new request */ if ((msg_op == DCM_REQ) && !listenq && !found) { listenq = 1; list = &tp->llist; lock = &tp->llock; goto retry_listenq; } /* not match on listenq for valid request, send reject */ if ((msg_op == DCM_REQ) && !found) { dapl_log(DAPL_DBG_TYPE_WARN, " NO LISTENER for %s %x %x i%x c%x" " < %x %x %x REJECT rtns=%d\n", dapl_cm_op_str(msg_op), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(msg->daddr.ib.qpn), ntohl(msg->sqpn), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(msg->saddr.ib.qpn), msg->rtns); ucm_reject(tp, msg); } else if (!found) { if (msg_op != DCM_DREP) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " NO MATCH: op %s [lid, prt, cqp, iqp]:" " %x %x %x %x %x <- %x %x %x %x L %d R %d rtns=%d\n", dapl_cm_op_str(msg_op), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr.ib.qpn), ntohl(msg->d_id), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr.ib.qpn), ntohl(msg->s_id), ntohl(msg->d_id), msg->rtns); } else if (msg->rtns) { DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&tp->hca->ia_list_head)), DCNT_IA_CM_ERR_DREP_DUP); } } return found; } /* Get rmsgs from CM completion queue, 10 at a time */ static void ucm_recv(ib_hca_transport_t *tp) { struct ibv_wc wc[10]; ib_cm_msg_t *msg; dp_ib_cm_handle_t cm; int i, ret, notify = 0; struct ibv_cq *ibv_cq = NULL; DAPL_HCA *hca; /* POLLIN on channel FD */ ret = ibv_get_cq_event(tp->rch, &ibv_cq, (void *)&hca); if (ret == 0) { ibv_ack_cq_events(ibv_cq, 1); } retry: ret = ibv_poll_cq(tp->rcq, 10, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(tp->rcq, 0); notify = 1; goto retry; } return; } else notify = 0; for (i = 0; i < ret; i++) { msg = (ib_cm_msg_t*) (uintptr_t) wc[i].wr_id; dapl_dbg_log(DAPL_DBG_TYPE_CM, " ucm_recv: stat=%d op=%s ln=%d id=%p sqp=%x\n", wc[i].status, dapl_cm_op_str(ntohs(msg->op)), wc[i].byte_len, (void*)wc[i].wr_id, wc[i].src_qp); /* validate CM message, version */ if (ntohs(msg->ver) < DCM_VER_MIN) { dapl_log(DAPL_DBG_TYPE_WARN, " ucm_recv: UNKNOWN msg %p, ver %d\n", msg, msg->ver); ucm_post_rmsg(tp, msg); continue; } if (ntohs(msg->ver) < DCM_VER_XPS) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " cm_recv: peer (v%d < v%d) doesn't support" " %d-bit xport space, now 16-bit)\n", msg->ver, DCM_VER_XPS, tp->cm_array_bits); tp->cm_array_bits = 16; } if (!(cm = ucm_cm_find(tp, msg))) { ucm_post_rmsg(tp, msg); continue; } /* match, process it */ ucm_process_recv(tp, msg, cm); ucm_post_rmsg(tp, msg); } sched_yield(); /* finished this batch of WC's, poll and rearm */ goto retry; } /* ACTIVE/PASSIVE: build and send CM message out of CM object */ static int ucm_send(ib_hca_transport_t *tp, ib_cm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size) { ib_cm_msg_t *smsg = NULL; struct ibv_send_wr wr, *bad_wr; struct ibv_sge sge; int len, ret = -1; uint16_t dlid = ntohs(msg->daddr.ib.lid); /* Get message from send queue, copy data, and send */ dapl_os_lock(&tp->slock); if ((smsg = ucm_get_smsg(tp)) == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " ucm_send ERR: get_smsg(hd=%d,tl=%d) \n", tp->s_hd, tp->s_tl); goto bail; } len = (sizeof(*msg) - DCM_MAX_PDATA_SIZE); dapl_os_memcpy(smsg, msg, len); if (p_size) { smsg->p_size = ntohs(p_size); dapl_os_memcpy(&smsg->p_data, p_data, p_size); } wr.next = NULL; wr.sg_list = &sge; wr.num_sge = 1; wr.opcode = IBV_WR_SEND; wr.wr_id = (unsigned long)tp->s_hd; wr.send_flags = (wr.wr_id % tp->burst) ? 0 : IBV_SEND_SIGNALED; if (len <= tp->ib_cm.max_inline) wr.send_flags |= IBV_SEND_INLINE; sge.length = len + p_size; sge.lkey = tp->mr_sbuf->lkey; sge.addr = (uintptr_t)smsg; dapl_dbg_log(DAPL_DBG_TYPE_CM, " ucm_send: op %s ln %d lid %x c_qpn %x rport %x\n", dapl_cm_op_str(ntohs(smsg->op)), sge.length, htons(smsg->daddr.ib.lid), htonl(smsg->dqpn), UCM_PORT_NTOH(smsg->dportx, smsg->dport)); /* empty slot, then create AH */ if (!tp->ah[dlid]) { tp->ah[dlid] = dapls_create_ah(tp->hca, tp->pd, tp->qp, htons(dlid), NULL); if (!tp->ah[dlid]) goto bail; } wr.wr.ud.ah = tp->ah[dlid]; wr.wr.ud.remote_qpn = ntohl(smsg->dqpn); wr.wr.ud.remote_qkey = DAT_UD_QKEY; ret = ibv_post_send(tp->qp, &wr, &bad_wr); if (ret) { dapl_log(DAPL_DBG_TYPE_ERR, " ucm_send ERR: post_send() %s\n", strerror(errno) ); } bail: dapl_os_unlock(&tp->slock); return ret; } /* ACTIVE/PASSIVE: CM objects */ static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) { dapl_os_assert(!cm->ref_count); dapl_os_lock_destroy(&cm->lock); dapl_os_free(cm, sizeof(*cm)); } void dapls_cm_acquire(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); cm->ref_count++; dapl_os_unlock(&cm->lock); } void dapls_cm_release(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); cm->ref_count--; if (cm->ref_count) { dapl_os_unlock(&cm->lock); return; } dapl_log(DAPL_DBG_TYPE_CM, " dapls_cm_release: cm %p %s ep %p sp %p refs=%d sz=%d\n", cm, dapl_cm_state_str(cm->state), cm->ep, cm->sp, cm->ref_count, sizeof(*cm)); dapl_os_unlock(&cm->lock); dapli_cm_dealloc(cm); return; } dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_HCA *hca, DAPL_EP *ep, uint16_t *sid) { dp_ib_cm_handle_t cm; int ret; errno = -ENOMEM; /* Allocate CM, init lock, and initialize */ if ((cm = dapl_os_alloc(sizeof(*cm))) == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM cm_create: ERR malloc(%s)\n",strerror(errno)); return NULL; } (void)dapl_os_memzero(cm, sizeof(*cm)); if (dapl_os_lock_init(&cm->lock)) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM cm_create: ERR lock(%s)\n",strerror(errno)); goto err1; } cm->msg.ver = htons(DCM_VER); cm->hca = hca; if (sid) ret = dapli_queue_listen(cm, *sid); else ret = dapli_queue_conn(cm); if (ret) { errno = -EADDRINUSE; goto err2; } dapl_log(DAPL_DBG_TYPE_CM, " cm_create: SRC portx %x port %x = %x\n", cm->msg.sportx, ntohs(cm->msg.sport), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport)); /* ACTIVE: init source address QP info from local EP */ if (ep) { DAPL_HCA *hca = ep->header.owner_ia->hca_ptr; /* link CM object to EP */ dapl_ep_link_cm(ep, cm); cm->ep = ep; /* IB info in network order */ cm->msg.sqpn = htonl(hca->ib_trans.qp->qp_num); /* ucm */ cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp->qp_num); /* ep */ cm->msg.saddr.ib.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr.ib.lid = hca->ib_trans.addr.ib.lid; dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], &hca->ib_trans.addr.ib.gid, 16); } dapl_log(DAPL_DBG_TYPE_CM, " cm_create: cm %p %s ep %p refs=%d sport=0x%x\n", cm, dapl_cm_state_str(cm->state), cm->ep, cm->ref_count, UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport)); dapls_cm_acquire(cm); errno = 0; return cm; err2: dapl_os_lock_destroy(&cm->lock); err1: dapl_os_free(cm, sizeof(*cm)); return NULL; } /* schedule destruction of CM object, clean UD CR */ void dapli_cm_free(dp_ib_cm_handle_t cm) { DAPL_SP *sp_ptr = cm->sp; dapl_log(DAPL_DBG_TYPE_CM, " dapli_cm_free: cm %p %s ep %p sp %p cr_cnt %d refs=%d\n", cm, dapl_cm_state_str(cm->state), cm->ep, sp_ptr, sp_ptr ? sp_ptr->cr_list_count:0, cm->ref_count); dapl_os_lock(&cm->lock); if (sp_ptr && cm->state == DCM_CONNECTED && cm->msg.daddr.ib.qp_type == IBV_QPT_UD) { dapl_os_lock(&sp_ptr->header.lock); cm->cr = dapl_sp_search_cr(sp_ptr, cm); dapl_log(DAPL_DBG_TYPE_CM, " dapli_cm_free: UD CR %p\n", cm->cr); if (cm->cr != NULL) { dapl_sp_remove_cr(sp_ptr, cm->cr); /* free CR at EP destroy */ } dapl_os_unlock(&sp_ptr->header.lock); } cm->state = DCM_FREE; dapl_os_unlock(&cm->lock); dapls_thread_signal(&cm->hca->ib_trans.signal); } /* Blocking, ONLY called from dat_ep_free */ void dapls_cm_free(dp_ib_cm_handle_t cm) { struct dapl_ep *ep = cm->ep; dapl_log(DAPL_DBG_TYPE_CM, " dapl_cm_free: cm %p %s ep %p refs=%d\n", cm, dapl_cm_state_str(cm->state), ep, cm->ref_count); /* free from internal workq, wait until EP is last ref */ dapl_os_lock(&cm->lock); if (cm->state != DCM_FREE) cm->state = DCM_FREE; if (cm->cr) dapls_cr_free(cm->cr); if (cm->ref_count > 1) { dapl_log(DAPL_DBG_TYPE_CM, " cm_free: EP %p CM->ep %p CM %p, refs %d > 1\n", ep, cm->ep, cm, cm->ref_count); dapls_thread_signal(&cm->hca->ib_trans.signal); } cm->ep = NULL; dapl_os_unlock(&cm->lock); /* unlink, dequeue from EP */ dapl_ep_unlink_cm(ep, cm); } DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep, dp_ib_cm_handle_t cm) { dapl_log(DAPL_DBG_TYPE_EXTENSION, " ud_cm_free: EP %p CM->ep %p CM %p refs %d\n", ep, cm->ep, cm, cm->ref_count); if ((cm->ep != ep) || (ep->param.ep_attr.service_type == DAT_SERVICE_TYPE_RC)) { dapl_log(DAPL_DBG_TYPE_WARN, " ud_cm_free: WARN: EP %p != CM->EP %p or !UD type\n", ep, cm->ep); return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } if (cm->sp) { dapli_cm_free(cm); /* PASSIVE side: no need for time-wait */ dapl_ep_unlink_cm(cm->ep, cm); /* last CM ref, free memory */ return DAT_SUCCESS; } dapl_os_lock(&cm->lock); dapl_os_get_time(&cm->timer); /* set timer for TIMEWAIT */ cm->state = DCM_TIMEWAIT; /* schedule UD CM release */ dapl_os_unlock(&cm->lock); dapls_thread_signal(&cm->hca->ib_trans.signal); return DAT_SUCCESS; } static int dapli_cm_insert(ib_hca_transport_t *tp, dp_ib_cm_handle_t cm, uint32_t *port) { int array_sz = UCM_ARRAY_SIZE(tp->cm_array_bits, tp->cm_entry_bits); int entry_sz = UCM_ENTRY_SIZE(tp->cm_entry_bits); int max_idx = ((entry_sz * (tp->cm_idxr_cur+1)) - 1); int idx, entry_idx, array_idx, ret = -1; void **entry; if (*port && (*port > UCM_SID_SPACE)) goto err; dapl_os_lock(&tp->ilock); /* grow index space for CM */ if (tp->cm_cnt >= max_idx-1) { dapl_log(DAPL_DBG_TYPE_CM, " cm_insert: grow cur %d, new %d \n", max_idx, (tp->cm_idxr_cur+1) * entry_sz, array_sz); if (tp->cm_idxr_cur+1 == array_sz) { dapl_log(DAPL_DBG_TYPE_ERR, " cm_insert: ERR max objects (%d)," " increase DAPL_UCM_ARRAY_BITS (cur=%d)\n", max_idx, tp->cm_array_bits); goto err2; } tp->cm_idxr_cur++; tp->cm_idxr[tp->cm_idxr_cur] = dapl_os_alloc(sizeof(void*) * entry_sz); if (!tp->cm_idxr[tp->cm_idxr_cur]) { dapl_log(DAPL_DBG_TYPE_ERR, " cm_insert: ERR (%s) alloc %d\n", strerror(errno), sizeof(void*) * entry_sz); tp->cm_idxr_cur--; goto err2; } (void)dapl_os_memzero(tp->cm_idxr[tp->cm_idxr_cur], sizeof(void*) * entry_sz); max_idx = entry_sz * (tp->cm_idxr_cur+1); } if ((*port == 0) || (*port && *port >= max_idx)) { idx = ++tp->cm_last; /* start from last free slot */ if (idx == max_idx) idx = 1; *port = 0; /* any slot */ } else { idx = *port; /* in range, reserve SID port */ } entry_idx = UCM_ENTRY_IDX(idx, entry_sz); array_idx = UCM_ARRAY_IDX(idx, tp->cm_entry_bits); entry = tp->cm_idxr[array_idx]; if (*port && entry[entry_idx]) /* requested sid taken */ goto err2; while (entry[entry_idx]) { if (++idx == max_idx ) idx = 1; entry_idx = UCM_ENTRY_IDX(idx, entry_sz); array_idx = UCM_ARRAY_IDX(idx, tp->cm_entry_bits); entry = tp->cm_idxr[array_idx]; }; entry[entry_idx] = (void *)cm; tp->cm_cnt++; if (*port == 0) tp->cm_last = idx; *port = idx; ret = 0; err2: dapl_os_unlock(&tp->ilock); err: return ret; } static void dapli_cm_remove(ib_hca_transport_t *tp, dp_ib_cm_handle_t cm) { int idx = cm->cm_id; int entry_idx, array_idx; int entry_sz = UCM_ENTRY_SIZE(tp->cm_entry_bits); int max_idx = UCM_ARRAY_IDX_MAX(tp->cm_array_bits); void **entry; if (!idx || idx > max_idx) { dapl_log(DAPL_DBG_TYPE_WARN, " cm_remove: CM %p idx %d invalid, max %d\n", cm, idx, max_idx); return; } dapl_os_lock(&tp->ilock); entry_idx = UCM_ENTRY_IDX(idx, entry_sz); array_idx = UCM_ARRAY_IDX(idx, tp->cm_entry_bits); entry = tp->cm_idxr[array_idx]; if (cm != entry[entry_idx]) { dapl_log(DAPL_DBG_TYPE_WARN, " cm_remove: CM %p != entry[%d] %p\n", cm, idx, entry[entry_idx]); goto err; } cm->cm_id = 0; entry[entry_idx] = NULL; tp->cm_cnt--; tp->cm_free = idx; /* hint for insert */ dapl_log(DAPL_DBG_TYPE_CM, " cm_remove: CM %p entry %p [%d][%d] cm_id=%d active %d %s\n", cm, entry, array_idx, entry_idx, idx, tp->cm_cnt, dapl_cm_state_str(cm->state)); err: dapl_os_unlock(&tp->ilock); } static dp_ib_cm_handle_t dapli_cm_lookup(ib_hca_transport_t *tp, int cm_id) { int idx = cm_id; int entry_sz = UCM_ENTRY_SIZE(tp->cm_entry_bits); int entry_idx, array_idx, max_idx = UCM_ARRAY_IDX_MAX(tp->cm_array_bits); dp_ib_cm_handle_t cm = NULL; void **entry; if (!idx) return NULL; if (idx >= max_idx) { dapl_log(DAPL_DBG_TYPE_WARN, " cm_lookup: idx %d invalid, max %d\n", cm, idx, max_idx); return NULL; } dapl_os_lock(&tp->ilock); entry_idx = UCM_ENTRY_IDX(idx, entry_sz); array_idx = UCM_ARRAY_IDX(idx, tp->cm_entry_bits); entry = tp->cm_idxr[array_idx]; cm = (dp_ib_cm_handle_t) entry[entry_idx]; if (!cm || (cm && (cm->cm_id != cm_id))) { dapl_log(DAPL_DBG_TYPE_CM, "entry %p[%d][%d] idx %d !=" " cm %p cm_id %d\n", entry, array_idx, entry_idx, idx, cm, cm ? cm->cm_id:0 ); cm = NULL; } dapl_os_unlock(&tp->ilock); return cm; } /* ACTIVE/PASSIVE: queue up connection object on CM list */ static int dapli_queue_conn(dp_ib_cm_handle_t cm) { int ret = -1; uint32_t port; /* don't use reserved SID port */ dapl_os_lock(&cm->hca->ib_trans.llock); do { port = 0; if (dapli_cm_insert(&cm->hca->ib_trans, cm, &port)) goto err; } while (UCM_CHK_SID(cm->hca->ib_trans.sid, port)); dapl_log(DAPL_DBG_TYPE_CM, " qconn: CHK %p port %d sid[%d]=0x%x (lsh=%d)\n", cm, port, port/8, cm->hca->ib_trans.sid[port/8], port%8); /* add to work queue, list, for cm thread processing */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry); cm->state = DCM_INIT; cm->cm_id = port; cm->msg.s_id = htonl(port); cm->msg.sport = (uint16_t)htons(UCM_PORT(port)); cm->msg.sportx = (uint8_t)UCM_PORTX(port); dapls_cm_acquire(cm); dapl_os_lock(&cm->hca->ib_trans.lock); dapl_llist_add_tail(&cm->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry, cm); dapl_os_unlock(&cm->hca->ib_trans.lock); ret = 0; err: dapl_os_unlock(&cm->hca->ib_trans.llock); dapls_thread_signal(&cm->hca->ib_trans.signal); return ret; } /* PASSIVE: queue up listen object on listen list */ static int dapli_queue_listen(dp_ib_cm_handle_t cm, uint16_t sid) { int ret = -1; dapl_os_lock(&cm->hca->ib_trans.llock); if (UCM_CHK_SID(cm->hca->ib_trans.sid, sid)) goto err; cm->cm_id = sid; if (dapli_cm_insert(&cm->hca->ib_trans, cm, &cm->cm_id)) goto err; UCM_SET_SID(cm->hca->ib_trans.sid, sid); /* reserve SID */ dapl_log(DAPL_DBG_TYPE_CM, " qlisten: SET %p port %d sid[%d]=0x%x (lsh=%d)\n", cm, sid, sid/8, cm->hca->ib_trans.sid[sid/8], sid%8); /* add to work queue, llist, for cm thread processing */ dapl_llist_init_entry((DAPL_LLIST_ENTRY *)&cm->local_entry); cm->state = DCM_LISTEN; cm->msg.sport = (uint16_t)htons(UCM_PORT(sid)); cm->msg.sportx = 0; dapls_cm_acquire(cm); dapl_llist_add_tail(&cm->hca->ib_trans.llist, (DAPL_LLIST_ENTRY *)&cm->local_entry, cm); ret = 0; err: dapl_os_unlock(&cm->hca->ib_trans.llock); return ret; } static void dapli_dequeue_listen(dp_ib_cm_handle_t cm) { DAPL_HCA *hca = cm->hca; dapl_os_lock(&hca->ib_trans.llock); UCM_CLR_SID(cm->hca->ib_trans.sid, ntohs(cm->msg.sport)); /* reset SID */ dapl_log(DAPL_DBG_TYPE_CM, " dqlisten: CLR %p port %d sid[%d]=0x%x (lsh=%d)\n", cm, ntohs(cm->msg.sport), ntohs(cm->msg.sport)/8, cm->hca->ib_trans.sid[ntohs(cm->msg.sport)/8], ntohs(cm->msg.sport)%8); dapl_llist_remove_entry(&hca->ib_trans.llist, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapli_cm_remove(&cm->hca->ib_trans, cm); dapls_cm_release(cm); dapl_os_unlock(&hca->ib_trans.llock); } /* called with local LIST and CM object lock */ static void dapli_cm_dequeue(dp_ib_cm_handle_t cm) { /* Remove from work queue, cr thread processing */ dapl_llist_remove_entry(&cm->hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapli_cm_remove(&cm->hca->ib_trans, cm); dapls_cm_release(cm); } static void ucm_disconnect_final(dp_ib_cm_handle_t cm) { /* no EP attachment or not RC, nothing to process */ if (cm->ep == NULL || cm->ep->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC) return; dapl_os_lock(&cm->lock); if ((cm->state == DCM_FREE) || (cm->state == DCM_TIMEWAIT)) { dapl_os_unlock(&cm->lock); return; } dapl_os_get_time(&cm->timer); /* set timer for TIMEWAIT */ cm->state = DCM_TIMEWAIT; dapl_log(DAPL_DBG_TYPE_CM, " DISC_EVENT: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); dapl_os_unlock(&cm->lock); if (cm->sp) dapls_cr_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->sp); else dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep); } /* * called from consumer thread via ep_disconnect/ep_free or * from cm_thread when receiving DREQ */ DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm) { int finalize = 1; int wakeup = 0; dapl_os_lock(&cm->lock); switch (cm->state) { case DCM_CONNECTED: /* CONSUMER: move to err state to flush, if not UD */ if (cm->ep->qp_handle->qp->qp_type != IBV_QPT_UD) dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_ERR,0,0,0); /* send DREQ, event after DREP or DREQ timeout */ dapl_log(DAPL_DBG_TYPE_CM, " DREQ_OUT: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); cm->state = DCM_DREQ_OUT; cm->msg.op = htons(DCM_DREQ); cm->retries = 0; dapl_os_get_time(&cm->timer); /* DREP expected */ if (cm->hca->ib_trans.dreq_cnt) finalize = 0; /* wait for DREP */ wakeup = 1; DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREQ_TX); break; case DCM_DREQ_OUT: if (cm->retries < cm->hca->ib_trans.dreq_cnt) finalize = 0; /* DREQ timeout, re-send and finalize */ cm->msg.op = htons(DCM_DREQ); break; case DCM_DREQ_IN: /* QP to err state to flush then DREP */ if ((cm->ep->qp_handle->qp->qp_type != IBV_QPT_UD) && (cm->ep->qp_state != IBV_QPS_ERR)) dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_ERR,0,0,0); dapl_log(DAPL_DBG_TYPE_CM, " DREQ_IN: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREQ_RX); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_DREP_TX); /* DREQ received, send DREP, finalize */ cm->msg.op = htons(DCM_DREP); break; case DCM_TIMEWAIT: case DCM_FREE: dapl_os_unlock(&cm->lock); return DAT_SUCCESS; default: dapl_log(DAPL_DBG_TYPE_CM_WARN, " DISC unexpected: EP %p %d CM %p %s %s" " %x %x %x %s %x %x %x r %x l %x\n", cm->ep, cm->ep->param.ep_state, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); dapl_os_unlock(&cm->lock); return DAT_SUCCESS; } ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0); dapl_os_unlock(&cm->lock); if (wakeup) dapls_thread_signal(&cm->hca->ib_trans.signal); if (finalize) ucm_disconnect_final(cm); return DAT_SUCCESS; } /* * ACTIVE: get remote CM SID server info from r_addr. * send, or resend CM msg via UD CM QP */ DAT_RETURN dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm) { dapl_log(DAPL_DBG_TYPE_EP, " connect: lid %x i_qpn %x lport %x p_sz=%d -> " " lid %x c_qpn %x rport %x\n", htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn), UCM_PORT_NTOH(cm->msg.sportx,cm->msg.sport), htons(cm->msg.p_size), htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn), UCM_PORT_NTOH(cm->msg.dportx,cm->msg.dport)); dapl_os_lock(&cm->lock); if (cm->state != DCM_INIT && cm->state != DCM_REP_PENDING) { dapl_os_unlock(&cm->lock); dapl_log(DAPL_DBG_TYPE_ERR, "UCM connect: ERR invalid state(%d)\n",cm->state); return DAT_INVALID_STATE; } if (cm->retries == cm->hca->ib_trans.retries) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM connect: REQ RETRIES EXHAUSTED:" " 0x%x %x 0x%x -> 0x%x %x 0x%x\n", htons(cm->msg.saddr.ib.lid), htonl(cm->msg.saddr.ib.qpn), UCM_PORT_NTOH(cm->msg.sportx,cm->msg.sport), htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn), UCM_PORT_NTOH(cm->msg.dportx,cm->msg.dport)); dapl_os_unlock(&cm->lock); #ifdef DAPL_COUNTERS /* called from check_timers in cm_thread, cm lock held */ if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) { dapl_os_unlock(&cm->hca->ib_trans.lock); dapls_print_cm_list(ep->header.owner_ia); dapl_os_lock(&cm->hca->ib_trans.lock); } #endif dapl_evd_connection_callback(cm, IB_CME_DESTINATION_UNREACHABLE, NULL, 0, ep); return DAT_ERROR(DAT_INVALID_ADDRESS, DAT_INVALID_ADDRESS_UNREACHABLE); } cm->state = DCM_REP_PENDING; cm->msg.op = htons(DCM_REQ); if (ucm_send(&cm->hca->ib_trans, &cm->msg, &cm->msg.p_data, ntohs(cm->msg.p_size))) { dapl_os_unlock(&cm->lock); goto bail; } dapl_os_unlock(&cm->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), ep->qp_handle->qp->qp_type == IBV_QPT_UD ? DCNT_IA_CM_AH_REQ_TX : DCNT_IA_CM_REQ_TX); return DAT_SUCCESS; bail: DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapl_log(DAPL_DBG_TYPE_ERR, "UCM connect: snd ERR -> cm_lid %x cm_qpn %x r_psp %x p_sz=%d\n", htons(cm->msg.daddr.ib.lid), htonl(cm->msg.dqpn), UCM_PORT_NTOH(cm->msg.dportx,cm->msg.dport), htons(cm->msg.p_size)); dapli_cm_free(cm); return DAT_INSUFFICIENT_RESOURCES; } /* * ACTIVE: CM_REP_IN: exchange QP information, called from CR thread */ static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg) { DAPL_EP *ep = cm->ep; ib_cm_events_t event = IB_CME_CONNECTED; dapl_os_lock(&cm->lock); if (cm->state != DCM_REP_PENDING) { dapl_log(DAPL_DBG_TYPE_WARN, " CONN_RTU: UNEXPECTED state:" " op %s, st %s <- lid %x sqpn %x sport %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), UCM_PORT_NTOH(msg->sportx, msg->sport)); dapl_os_unlock(&cm->lock); return; } /* save remote address information to EP and CM */ cm->msg.d_id = msg->s_id; dapl_os_memcpy(&ep->remote_ia_address, &msg->saddr, sizeof(union dcm_addr)); dapl_os_memcpy(&cm->msg.daddr, &msg->saddr, sizeof(union dcm_addr)); /* validate private data size, and copy if necessary */ if (msg->p_size) { if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_WARN, " CONN_RTU: invalid p_size %d:" " st %s <- lid %x sqpn %x spsp %x\n", ntohs(msg->p_size), dapl_cm_state_str(cm->state), ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), UCM_PORT_NTOH(msg->sportx, msg->sport)); dapl_os_unlock(&cm->lock); goto bail; } dapl_os_memcpy(cm->msg.p_data, msg->p_data, ntohs(msg->p_size)); } dapl_dbg_log(DAPL_DBG_TYPE_CM, " CONN_RTU: DST lid=%x," " iqp=%x, qp_type=%d, port=%x psize=%d\n", ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, UCM_PORT_NTOH(msg->sportx, msg->sport), ntohs(msg->p_size)); if (ntohs(msg->op) == DCM_REP) event = IB_CME_CONNECTED; else if (ntohs(msg->op) == DCM_REJ_USER) event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA; else { dapl_log(DAPL_DBG_TYPE_WARN, " Warning, non-user CR REJECT:" " cm %p op %s, st %s dlid %x iqp %x port %x <-" " slid %x iqp %x port %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), UCM_PORT_NTOH(msg->sportx, msg->sport)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR_REJ_RX); event = IB_CME_DESTINATION_REJECT; } if (event != IB_CME_CONNECTED) { dapl_log(DAPL_DBG_TYPE_CM, " ACTIVE: CM_REQ REJECTED:" " cm %p op %s, st %s dlid %x iqp %x port %x <-" " slid %x iqp %x port %x\n", cm, dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), UCM_PORT_NTOH(msg->sportx, msg->sport)); cm->state = DCM_REJECTED; dapl_os_unlock(&cm->lock); if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) goto ud_bail; else goto bail; } dapl_os_unlock(&cm->lock); /* rdma_out, initiator, cannot exceed remote rdma_in max */ if (ntohs(cm->msg.ver) >= 7) cm->ep->param.ep_attr.max_rdma_read_out = DAPL_MIN(cm->ep->param.ep_attr.max_rdma_read_out, cm->msg.rd_in); /* modify QP to RTR and then to RTS with remote info */ dapl_os_lock(&cm->ep->header.lock); if (dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_RTR, cm->msg.daddr.ib.qpn, cm->msg.daddr.ib.lid, (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU: QPS_RTR ERR %s <- lid %x iqp %x\n", strerror(errno), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&cm->ep->header.lock); event = IB_CME_LOCAL_FAILURE; goto bail; } if (dapls_modify_qp_state(cm->ep->qp_handle->qp, IBV_QPS_RTS, cm->msg.daddr.ib.qpn, cm->msg.daddr.ib.lid, NULL) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " CONN_RTU: QPS_RTS ERR %s <- lid %x iqp %x\n", strerror(errno), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&cm->ep->header.lock); event = IB_CME_LOCAL_FAILURE; goto bail; } dapl_os_unlock(&cm->ep->header.lock); /* Send RTU, no private data */ cm->msg.op = htons(DCM_RTU); dapl_os_lock(&cm->lock); cm->state = DCM_CONNECTED; if (ucm_send(&cm->hca->ib_trans, &cm->msg, NULL, 0)) { dapl_os_unlock(&cm->lock); goto bail; } dapl_os_unlock(&cm->lock); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_RTU_TX); #ifdef DAT_EXTENSIONS ud_bail: if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; uint16_t lid = ntohs(cm->msg.daddr.ib.lid); if (event == IB_CME_CONNECTED) { struct ibv_ah **r_ah = cm->ep->qp_handle->ah; /* post EVENT, modify_qp, AH already created?, ucm msg */ xevent.status = 0; xevent.context.as_ptr = cm; xevent.type = DAT_IB_UD_REMOTE_AH; xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn); if (!r_ah[lid]) { r_ah[lid] = dapls_create_ah(cm->hca, cm->ep->qp_handle->qp->pd, cm->ep->qp_handle->qp, htons(lid), NULL); if (r_ah[lid] == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " ACTIVE: UD RTU: ERR create_ah" " for qpn 0x%x lid 0x%x\n", xevent.remote_ah.qpn, lid); event = IB_CME_LOCAL_FAILURE; goto bail; } } xevent.remote_ah.ah = r_ah[lid]; dapl_os_memcpy(&xevent.remote_ah.ia_addr, &cm->msg.daddr, sizeof(union dcm_addr)); /* remote ia_addr reference includes ucm qpn, not IB qpn */ ((union dcm_addr*)&xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn; dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: UD xevent ah %p qpn %x lid %x\n", xevent.remote_ah.ah, xevent.remote_ah.qpn, lid); dapl_dbg_log(DAPL_DBG_TYPE_EP, " ACTIVE: UD xevent ia_addr qp_type %d" " lid 0x%x qpn 0x%x\n", ((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.qp_type, ntohs(((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.lid), ntohl(((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.qpn)); event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED; } else { xevent.type = DAT_IB_UD_CONNECT_REJECT; event = DAT_IB_UD_CONNECTION_REJECT_EVENT; } dapls_evd_post_connection_event_ext( (DAPL_EVD *)cm->ep->param.connect_evd_handle, event, (DAT_EP_HANDLE)ep, (DAT_COUNT)ntohs(cm->msg.p_size), (DAT_PVOID *)cm->msg.p_data, (DAT_PVOID *)&xevent); if (event != (ib_cm_events_t)DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED) { dapli_cm_free(cm); return; } DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_AH_RESOLVED); } else #endif { DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ACTIVE_EST); dapl_evd_connection_callback(cm, IB_CME_CONNECTED, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep); } dapl_log(DAPL_DBG_TYPE_CM_EST, " UCM_ACTIVE_CONN %p %d [lid port qpn] %x %x %x -> %x %x %x xevent=%d\n", cm->hca, cm->retries, ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), sizeof(DAT_IB_EXTENSION_EVENT_DATA)); return; bail: if (ntohs(msg->op) != DCM_REJ_USER) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " REP_in ERR: %s %s %x %x %x %x <- %x %x %x %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(cm->msg.dqpn), ntohl(msg->daddr.ib.qpn), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(cm->msg.sqpn), ntohl(msg->saddr.ib.qpn)); } dapl_evd_connection_callback(NULL, event, cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep); dapli_cm_free(cm); } /* * PASSIVE: Accept on listen CM PSP. * create new CM object for this CR, * receive peer QP information, private data, * and post cr_event */ static void ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg) { dp_ib_cm_handle_t acm; /* Allocate accept CM and setup passive references */ if ((acm = dapls_ib_cm_create(cm->hca, NULL, NULL)) == NULL) { dapl_log(DAPL_DBG_TYPE_WARN, " accept: ERR cm_create\n"); return; } /* dest CM info from CR msg, source CM info from listen */ acm->sp = cm->sp; acm->hca = cm->hca; acm->msg.op = msg->op; acm->msg.dport = msg->sport; acm->msg.dportx = msg->sportx; acm->msg.dqpn = msg->sqpn; acm->msg.sport = cm->msg.sport; acm->msg.sportx = cm->msg.sportx; acm->msg.sqpn = cm->msg.sqpn; acm->msg.p_size = msg->p_size; acm->msg.d_id = msg->s_id; acm->msg.rd_in = msg->rd_in; /* CR saddr is CM daddr info, need EP for local saddr */ dapl_os_memcpy(&acm->msg.daddr, &msg->saddr, sizeof(union dcm_addr)); /* validate private data size before reading */ if (ntohs(msg->p_size) > DCM_MAX_PDATA_SIZE) { dapl_log(DAPL_DBG_TYPE_WARN, " accept: psize (%d) wrong\n", ntohs(msg->p_size)); goto bail; } /* read private data into cm_handle if any present */ if (msg->p_size) dapl_os_memcpy(acm->msg.p_data, msg->p_data, ntohs(msg->p_size)); acm->state = DCM_ACCEPTING; dapl_log(DAPL_DBG_TYPE_CM, " accepting: op %s [id lid, port, cqp, iqp]:" " %d %x %x %x %x <- %d %x %x %x %x\n", dapl_cm_op_str(ntohs(msg->op)), ntohl(acm->msg.s_id), ntohs(msg->daddr.ib.lid), UCM_PORT_NTOH(msg->dportx, msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr.ib.qpn), ntohl(msg->s_id), ntohs(msg->saddr.ib.lid), UCM_PORT_NTOH(msg->sportx, msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr.ib.qpn)); #ifdef DAT_EXTENSIONS if (acm->msg.daddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; /* post EVENT, modify_qp created ah */ xevent.status = 0; xevent.type = DAT_IB_UD_CONNECT_REQUEST; dapls_evd_post_cr_event_ext(acm->sp, DAT_IB_UD_CONNECTION_REQUEST_EVENT, acm, (DAT_COUNT)ntohs(acm->msg.p_size), (DAT_PVOID *)acm->msg.p_data, (DAT_PVOID *)&xevent); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_AH_REQ_TX); } else #endif /* trigger CR event and return SUCCESS */ dapls_cr_callback(acm, IB_CME_CONNECTION_REQUEST_PENDING, acm->msg.p_data, ntohs(msg->p_size), acm->sp); return; bail: /* schedule work thread cleanup */ DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapli_cm_free(acm); return; } /* * PASSIVE: read RTU from active peer, post CONN event */ static void ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg) { dapl_os_lock(&cm->lock); if ((ntohs(msg->op) != DCM_RTU) || (cm->state != DCM_RTU_PENDING)) { dapl_log(DAPL_DBG_TYPE_WARN, " accept_rtu: UNEXPECTED op, state:" " op %s, st %s <- lid %x iqp %x sport %x\n", dapl_cm_op_str(ntohs(msg->op)), dapl_cm_state_str(cm->state), ntohs(msg->saddr.ib.lid), ntohl(msg->saddr.ib.qpn), UCM_PORT_NTOH(msg->sportx, msg->sport)); dapl_os_unlock(&cm->lock); goto bail; } cm->state = DCM_CONNECTED; dapl_os_unlock(&cm->lock); /* final data exchange if remote QP state is good to go */ dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: Connected! RTU_in\n"); #ifdef DAT_EXTENSIONS if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; uint16_t lid = ntohs(cm->msg.daddr.ib.lid); struct ibv_ah **r_ah = cm->ep->qp_handle->ah; /* post EVENT, modify_qp, AH already created?, ucm msg */ xevent.status = 0; xevent.context.as_ptr = cm; xevent.type = DAT_IB_UD_PASSIVE_REMOTE_AH; xevent.remote_ah.qpn = ntohl(cm->msg.daddr.ib.qpn); if (!r_ah[lid]) { r_ah[lid] = dapls_create_ah(cm->hca, cm->ep->qp_handle->qp->pd, cm->ep->qp_handle->qp, htons(lid), NULL); if (r_ah[lid] == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " PASSIVE: UD RTU: ERR create_ah" " for qpn 0x%x lid 0x%x\n", xevent.remote_ah.qpn, lid); goto bail; } } xevent.remote_ah.ah = r_ah[lid]; dapl_os_memcpy(&xevent.remote_ah.ia_addr, &cm->msg.daddr, sizeof(union dcm_addr)); /* remote ia_addr reference includes ucm qpn, not IB qpn */ ((union dcm_addr*)&xevent.remote_ah.ia_addr)->ib.qpn = cm->msg.dqpn; dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: UD xevent ah %p qpn %x lid %x\n", xevent.remote_ah.ah, xevent.remote_ah.qpn, lid); dapl_dbg_log(DAPL_DBG_TYPE_EP, " PASSIVE: UD xevent ia_addr qp_type %d" " lid 0x%x qpn 0x%x \n", ((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.qp_type, ntohs(((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.lid), ntohl(((union dcm_addr*) &xevent.remote_ah.ia_addr)->ib.qpn)); dapls_evd_post_connection_event_ext( (DAPL_EVD *)cm->ep->param.connect_evd_handle, DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED, (DAT_EP_HANDLE)cm->ep, (DAT_COUNT)ntohs(cm->msg.p_size), (DAT_PVOID *)cm->msg.p_data, (DAT_PVOID *)&xevent); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_AH_RESOLVED); dapli_cm_free(cm); /* still attached to EP */ } else { #endif DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_PASSIVE_EST); dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, 0, cm->sp); } dapl_log(DAPL_DBG_TYPE_CM_EST, " UCM_PASSIVE_CONN %p %d [lid port qpn] %x %x %x <- %x %x %x\n", cm->hca, cm->retries, ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn)); return; bail: dapl_log(DAPL_DBG_TYPE_CM_WARN, " RTU_in: ERR %d ms: %x %x %x <- %x %x %x\n", ntohs(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ntohl(cm->msg.saddr.ib.qpn), ntohs(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), ntohl(cm->msg.dqpn)); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), DCNT_IA_CM_ERR); dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp); dapli_cm_free(cm); } /* * PASSIVE: user accepted, check and re-send reply message, called from cm_thread. */ static int ucm_reply(dp_ib_cm_handle_t cm) { dapl_os_lock(&cm->lock); if (cm->state != DCM_RTU_PENDING) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_REPLY: wrong state ep %p cm %p %s refs=%d" " %x %x i_%x -> %x %x i_%x l_pid %x r_pid %x\n", cm->ep, cm, dapl_cm_state_str(cm->state), cm->ref_count, htons(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), htonl(cm->msg.saddr.ib.qpn), htons(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), htonl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id)); dapl_os_unlock(&cm->lock); return -1; } if (cm->retries == cm->hca->ib_trans.retries) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_REPLY: RETRIES EXHAUSTED (lid port qpn)" " %x %x %x -> %x %x %x\n", htons(cm->msg.saddr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), htonl(cm->msg.saddr.ib.qpn), htons(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), htonl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&cm->lock); #ifdef DAPL_COUNTERS if (g_dapl_dbg_type & DAPL_DBG_TYPE_CM_LIST) { dapl_os_unlock(&cm->hca->ib_trans.lock); dapls_print_cm_list(dapl_llist_peek_head(&cm->hca->ia_list_head)); dapl_os_lock(&cm->hca->ib_trans.lock); } #endif #ifdef DAT_EXTENSIONS if (cm->msg.saddr.ib.qp_type == IBV_QPT_UD) { DAT_IB_EXTENSION_EVENT_DATA xevent; /* post REJECT event with CONN_REQ p_data */ xevent.status = 0; xevent.type = DAT_IB_UD_CONNECT_ERROR; dapls_evd_post_connection_event_ext( (DAPL_EVD *)cm->ep->param.connect_evd_handle, DAT_IB_UD_CONNECTION_ERROR_EVENT, (DAT_EP_HANDLE)cm->ep, (DAT_COUNT)ntohs(cm->msg.p_size), (DAT_PVOID *)cm->msg.p_data, (DAT_PVOID *)&xevent); } else #endif dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp); return -1; } if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size)) { dapl_log(DAPL_DBG_TYPE_ERR," accept ERR: ucm reply send()\n"); dapl_os_unlock(&cm->lock); return -1; } dapl_os_unlock(&cm->lock); return 0; } /* * PASSIVE: consumer accept, send local QP information, private data, * queue on work thread to receive RTU information to avoid blocking * user thread. */ DAT_RETURN dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data) { DAPL_IA *ia = ep->header.owner_ia; dp_ib_cm_handle_t cm = cr->ib_cm_handle; if (p_size > DCM_MAX_PDATA_SIZE) return DAT_LENGTH_ERROR; dapl_os_lock(&cm->lock); if (cm->state != DCM_ACCEPTING) { dapl_log(DAPL_DBG_TYPE_ERR, " CM_ACCEPT_USR: wrong state ep %p cm %p %s refs=%d" " %x %x i_%x -> %x %x i_%x l_pid %x r_pid %x\n", cm->ep, cm, dapl_cm_state_str(cm->state), cm->ref_count, htons(cm->hca->ib_trans.addr.ib.lid), UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), htonl(ep->qp_handle->qp->qp_num), htons(cm->msg.daddr.ib.lid), UCM_PORT_NTOH(cm->msg.dportx, cm->msg.dport), htonl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id)); dapl_os_unlock(&cm->lock); return DAT_INVALID_STATE; } dapl_os_unlock(&cm->lock); dapl_dbg_log(DAPL_DBG_TYPE_CM, " ACCEPT_USR: s_id %d r_id %d lid=%x" " iqp=%x qp_type %d, psize=%d\n", ntohl(cm->msg.s_id), ntohl(cm->msg.d_id), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn), cm->msg.daddr.ib.qp_type, p_size); #ifdef DAT_EXTENSIONS if (cm->msg.daddr.ib.qp_type == IBV_QPT_UD && ep->qp_handle->qp->qp_type != IBV_QPT_UD) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: ERR remote QP is UD," ", but local QP is not\n"); return (DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_EP); } #endif /* rdma_out, initiator, cannot exceed remote rdma_in max */ if (ntohs(cm->msg.ver) >= 7) ep->param.ep_attr.max_rdma_read_out = DAPL_MIN(ep->param.ep_attr.max_rdma_read_out, cm->msg.rd_in); /* modify QP to RTR and then to RTS with remote info already read */ dapl_os_lock(&ep->header.lock); if (dapls_modify_qp_state(ep->qp_handle->qp, IBV_QPS_RTR, cm->msg.daddr.ib.qpn, cm->msg.daddr.ib.lid, (ib_gid_handle_t)cm->msg.daddr.ib.gid) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTR ERR %s -> lid %x qpn %x\n", strerror(errno), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&ep->header.lock); goto bail; } if (dapls_modify_qp_state(ep->qp_handle->qp, IBV_QPS_RTS, cm->msg.daddr.ib.qpn, cm->msg.daddr.ib.lid, NULL) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT_USR: QPS_RTS ERR %s -> lid %x qpn %x\n", strerror(errno), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn)); dapl_os_unlock(&ep->header.lock); goto bail; } dapl_os_unlock(&ep->header.lock); /* save remote address information */ dapl_os_memcpy(&ep->remote_ia_address, &cm->msg.saddr, sizeof(union dcm_addr)); /* setup local QP info and type from EP, copy pdata, for reply */ cm->msg.op = htons(DCM_REP); cm->msg.rd_in = ep->param.ep_attr.max_rdma_read_in; cm->msg.saddr.ib.qpn = htonl(ep->qp_handle->qp->qp_num); cm->msg.saddr.ib.qp_type = ep->qp_handle->qp->qp_type; cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], &cm->hca->ib_trans.addr.ib.gid, 16); /* * UD: deliver p_data with REQ and EST event, keep REQ p_data in * cm->msg.p_data and save REPLY accept data in cm->p_data for retries */ cm->p_size = p_size; dapl_os_memcpy(&cm->p_data, p_data, p_size); /* save state and setup valid reference to EP, HCA. !PSP !RSP */ if (!cm->sp->ep_handle && !cm->sp->psp_flags) dapl_ep_link_cm(ep, cm); cm->ep = ep; cm->hca = ia->hca_ptr; /* Send RTU and change state under CM lock */ dapl_os_lock(&cm->lock); cm->state = DCM_RTU_PENDING; dapl_os_get_time(&cm->timer); /* RTU expected */ if (ucm_send(&cm->hca->ib_trans, &cm->msg, cm->p_data, cm->p_size)) { dapl_log(DAPL_DBG_TYPE_ERR," accept ERR: ucm reply send()\n"); dapl_os_unlock(&cm->lock); dapl_ep_unlink_cm(ep, cm); goto bail; } dapl_os_unlock(&cm->lock); DAPL_CNTR(ia, DCNT_IA_CM_REP_TX); dapl_dbg_log(DAPL_DBG_TYPE_CM, " PASSIVE: Accepted - REP_out\n"); dapls_thread_signal(&cm->hca->ib_trans.signal); return DAT_SUCCESS; bail: DAPL_CNTR(ia, DCNT_IA_CM_ERR); dapli_cm_free(cm); return DAT_INTERNAL_ERROR; } /* * dapls_ib_connect * * Initiate a connection with the passive listener on another node * * Input: * ep_handle, * remote_ia_address, * remote_conn_qual, * prd_size size of private data and structure * prd_prt pointer to private data structure * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * */ DAT_RETURN dapls_ib_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR r_addr, IN DAT_CONN_QUAL r_psp, IN DAT_COUNT p_size, IN void *p_data) { DAPL_EP *ep = (DAPL_EP *)ep_handle; dp_ib_cm_handle_t cm; union dcm_addr *ucm_ia = (union dcm_addr *) r_addr; uint16_t sid = (uint16_t)(r_psp & UCM_SID_MASK); if (sid == 0) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " connect: ERR port_map, AF %d LID 0x%x QPN 0x%x" " sl %d qpt %d r_psp %"PRIx64"-> r_port %x\n", ucm_ia->ib.family, ntohs(ucm_ia->ib.lid), ntohl(ucm_ia->ib.qpn), ucm_ia->ib.sl, ucm_ia->ib.qp_type, r_psp, sid); return DAT_INVALID_ADDRESS; } /* create CM object, initialize SRC info from EP, get sport, link to ep */ cm = dapls_ib_cm_create(ep->header.owner_ia->hca_ptr, ep, NULL); if (cm == NULL) return DAT_INSUFFICIENT_RESOURCES; /* remote hca and port: lid, gid, network order */ dapl_os_memcpy(&cm->msg.daddr, r_addr, sizeof(union dcm_addr)); /* remote uCM information, comes from consumer provider r_addr */ cm->msg.dport = (uint16_t)htons(UCM_PORT(sid)); cm->msg.dportx = 0; cm->msg.dqpn = cm->msg.daddr.ib.qpn; cm->msg.daddr.ib.qpn = 0; /* don't have a remote qpn until reply */ /* set max rdma inbound requests */ cm->msg.rd_in = ep->param.ep_attr.max_rdma_read_in; if (p_size) { cm->msg.p_size = htons(p_size); dapl_os_memcpy(&cm->msg.p_data, p_data, p_size); } dapl_log(DAPL_DBG_TYPE_CM, " connect: l_port %d -> AF %d LID 0x%x QPN 0x%x" " sl %d qpt %d r_psp %"PRIx64"-> r_port %x\n", UCM_PORT_NTOH(cm->msg.sportx, cm->msg.sport), ucm_ia->ib.family, ntohs(ucm_ia->ib.lid), ntohl(ucm_ia->ib.qpn), ucm_ia->ib.sl, ucm_ia->ib.qp_type, r_psp, sid); dapl_os_get_time(&cm->timer); /* REP expected */ /* build connect request, send to remote CM based on r_addr info */ return (dapli_cm_connect(ep, cm)); } /* * dapls_ib_disconnect * * Disconnect an EP * * Input: * ep_handle, * disconnect_flags * * Output: * none * * Returns: * DAT_SUCCESS */ DAT_RETURN dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags) { dp_ib_cm_handle_t cm_ptr = dapl_get_cm_from_ep(ep_ptr); dapl_os_lock(&ep_ptr->header.lock); if (ep_ptr->param.ep_state == DAT_EP_STATE_DISCONNECTED || ep_ptr->param.ep_attr.service_type != DAT_SERVICE_TYPE_RC || cm_ptr == NULL) { dapl_os_unlock(&ep_ptr->header.lock); return DAT_SUCCESS; } dapl_os_unlock(&ep_ptr->header.lock); dapli_cm_disconnect(cm_ptr); return DAT_SUCCESS; } /* * dapls_ib_disconnect_clean * * Clean up outstanding connection data. This routine is invoked * after the final disconnect callback has occurred. Only on the * ACTIVE side of a connection. It is also called if dat_ep_connect * times out using the consumer supplied timeout value. * * Input: * ep_ptr DAPL_EP * active Indicates active side of connection * * Output: * none * * Returns: * void * */ void dapls_ib_disconnect_clean(IN DAPL_EP *ep, IN DAT_BOOLEAN active, IN const ib_cm_events_t ib_cm_event) { if (ib_cm_event == IB_CME_TIMEOUT) { dp_ib_cm_handle_t cm_ptr; if ((cm_ptr = dapl_get_cm_from_ep(ep)) == NULL) return; dapl_log(DAPL_DBG_TYPE_WARN, "dapls_ib_disc_clean: CONN_TIMEOUT ep %p cm %p %s\n", ep, cm_ptr, dapl_cm_state_str(cm_ptr->state)); /* schedule release of socket and local resources */ dapli_cm_free(cm_ptr); } } /* * dapl_ib_setup_conn_listener * * Have the CM set up a connection listener. * * Input: * ibm_hca_handle HCA handle * qp_handle QP handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * DAT_CONN_QUAL_UNAVAILBLE * DAT_CONN_QUAL_IN_USE * */ DAT_RETURN dapls_ib_setup_conn_listener(IN DAPL_IA *ia, IN DAT_CONN_QUAL r_psp, IN DAPL_SP *sp) { ib_cm_srvc_handle_t cm = NULL; uint16_t sid = (uint16_t)(r_psp & UCM_SID_MASK); if (sid == 0) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " listen ERR: port_map: qpn %x psp %"PRIx64"-> sid %x)\n", ia->hca_ptr->ib_trans.qp->qp_num, r_psp, sid); return DAT_INVALID_PARAMETER; } /* cm_create will setup saddr for listen server and reserve port */ if ((cm = dapls_ib_cm_create(ia->hca_ptr, NULL, &sid)) == NULL) { dapl_log(DAPL_DBG_TYPE_CM_WARN, " listen: ERROR %s on conn_qual %"PRIx64"-> sid %x\n", strerror(errno), r_psp, sid); if (errno == -EADDRINUSE) return DAT_CONN_QUAL_IN_USE; else return DAT_INSUFFICIENT_RESOURCES; } /* LISTEN: init DST address and QP info to local CM server info */ cm->hca = ia->hca_ptr; cm->sp = sp; cm->msg.sqpn = htonl(ia->hca_ptr->ib_trans.qp->qp_num); cm->msg.saddr.ib.qp_type = IBV_QPT_UD; cm->msg.saddr.ib.lid = ia->hca_ptr->ib_trans.addr.ib.lid; dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], &cm->hca->ib_trans.addr.ib.gid, 16); dapl_log(DAPL_DBG_TYPE_CM, " listen(ia %p sp %p qpn %x - psp %"PRIx64"-> sid %x)\n", ia, sp, ia->hca_ptr->ib_trans.qp->qp_num, r_psp, sid); /* save cm_handle reference in service point */ sp->cm_srvc_handle = cm; DAPL_CNTR(ia, DCNT_IA_CM_LISTEN); return DAT_SUCCESS; } /* * dapl_ib_remove_conn_listener * * Have the CM remove a connection listener. * * Input: * ia_handle IA handle * ServiceID IB Channel Service ID * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_STATE * */ DAT_RETURN dapls_ib_remove_conn_listener(IN DAPL_IA *ia, IN DAPL_SP *sp) { ib_cm_srvc_handle_t cm = sp->cm_srvc_handle; /* free cm_srvc_handle and port, and mark CM for cleanup */ if (cm) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " remove_listener(ia %p sp %p cm %p psp=0x%02x%x)\n", ia, sp, cm, cm->msg.sportx, ntohs(cm->msg.sport)); sp->cm_srvc_handle = NULL; dapli_dequeue_listen(cm); /* dequeue and free port */ dapls_cm_release(cm); /* last ref, dealloc */ } return DAT_SUCCESS; } /* * dapls_ib_accept_connection * * Perform necessary steps to accept a connection * * Input: * cr_handle * ep_handle * private_data_size * private_data * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_accept_connection(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT p_size, IN const DAT_PVOID p_data) { DAPL_CR *cr = (DAPL_CR *)cr_handle; DAPL_EP *ep = (DAPL_EP *)ep_handle; dapl_dbg_log(DAPL_DBG_TYPE_EP, " accept_connection(cr %p ep %p prd %p,%d)\n", cr, ep, p_data, p_size); /* allocate and attach a QP if necessary */ if (ep->qp_state == DAPL_QP_STATE_UNATTACHED) { DAT_RETURN status; status = dapls_ib_qp_alloc(ep->header.owner_ia, ep, ep); if (status != DAT_SUCCESS) return status; } return (dapli_accept_usr(ep, cr, p_size, p_data)); } /* * dapls_ib_reject_connection * * Reject a connection * * Input: * cr_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR * */ DAT_RETURN dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm, IN int reason, IN DAT_COUNT psize, IN const DAT_PVOID pdata) { dapl_dbg_log(DAPL_DBG_TYPE_EP, " reject(cm %p reason %x, pdata %p, psize %d)\n", cm, reason, pdata, psize); if (psize > DCM_MAX_PDATA_SIZE) return DAT_LENGTH_ERROR; /* cr_thread will destroy CR, update saddr lid, gid, qp_type info */ dapl_os_lock(&cm->lock); dapl_log(DAPL_DBG_TYPE_CM, " PASSIVE: REJECTING CM_REQ:" " cm %p op %s, st %s slid %x iqp %x port %x%x ->" " dlid %x iqp %x port %x%x\n", cm, dapl_cm_op_str(ntohs(cm->msg.op)), dapl_cm_state_str(cm->state), ntohs(cm->hca->ib_trans.addr.ib.lid), ntohl(cm->msg.saddr.ib.qpn), cm->msg.sportx, ntohs(cm->msg.sport), ntohs(cm->msg.daddr.ib.lid), ntohl(cm->msg.daddr.ib.qpn), cm->msg.dportx, ntohs(cm->msg.dport)); cm->state = DCM_REJECTED; cm->msg.saddr.ib.lid = cm->hca->ib_trans.addr.ib.lid; cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type; dapl_os_memcpy(&cm->msg.saddr.ib.gid[0], &cm->hca->ib_trans.addr.ib.gid, 16); if (reason == IB_CM_REJ_REASON_CONSUMER_REJ) cm->msg.op = htons(DCM_REJ_USER); else cm->msg.op = htons(DCM_REJ_CM); DAPL_CNTR(((DAPL_IA *)dapl_llist_peek_head(&cm->hca->ia_list_head)), reason == IB_CM_REJ_REASON_CONSUMER_REJ ? DCNT_IA_CM_USER_REJ_TX : DCNT_IA_CM_ERR_REJ_TX); if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) { dapl_log(DAPL_DBG_TYPE_WARN, " cm_reject: send ERR: %s\n", strerror(errno)); dapl_os_unlock(&cm->lock); return DAT_INTERNAL_ERROR; } dapl_os_unlock(&cm->lock); dapli_cm_free(cm); return DAT_SUCCESS; } /* * dapls_ib_cm_remote_addr * * Obtain the remote IP address given a connection * * Input: * cr_handle * * Output: * remote_ia_address: where to place the remote address * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * */ DAT_RETURN dapls_ib_cm_remote_addr(IN DAT_HANDLE dat_handle, OUT DAT_SOCK_ADDR6 * remote_ia_address) { DAPL_HEADER *header; dp_ib_cm_handle_t cm; dapl_dbg_log(DAPL_DBG_TYPE_EP, "dapls_ib_cm_remote_addr(dat_handle %p, ....)\n", dat_handle); header = (DAPL_HEADER *) dat_handle; if (header->magic == DAPL_MAGIC_EP) cm = dapl_get_cm_from_ep((DAPL_EP *) dat_handle); else if (header->magic == DAPL_MAGIC_CR) cm = ((DAPL_CR *) dat_handle)->ib_cm_handle; else return DAT_INVALID_HANDLE; dapl_os_memcpy(remote_ia_address, &cm->msg.daddr, sizeof(DAT_SOCK_ADDR6)); return DAT_SUCCESS; } int dapls_ib_private_data_size( IN DAPL_HCA *hca_ptr) { return DCM_MAX_PDATA_SIZE; } #if defined(_WIN32) || defined(_WIN64) void cm_thread(void *arg) { struct dapl_hca *hca = arg; dp_ib_cm_handle_t cm, next; DWORD time_ms; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca); dapl_os_lock(&hca->ib_trans.lock); for (hca->ib_trans.cm_state = IB_THREAD_RUN; hca->ib_trans.cm_state == IB_THREAD_RUN || !dapl_llist_is_empty(&hca->ib_trans.list); dapl_os_lock(&hca->ib_trans.lock)) { time_ms = INFINITE; CompSetZero(&hca->ib_trans.signal.set); CompSetAdd(&hca->ib_hca_handle->channel, &hca->ib_trans.signal.set); CompSetAdd(&hca->ib_trans.rch->comp_channel, &hca->ib_trans.signal.set); CompSetAdd(&hca->ib_trans.ib_cq->comp_channel, &hca->ib_trans.signal.set); next = dapl_llist_is_empty(&hca->ib_trans.list) ? NULL : dapl_llist_peek_head(&hca->ib_trans.list); while (next) { cm = next; next = dapl_llist_next_entry(&hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapls_cm_acquire(cm); /* hold thread ref */ dapl_os_lock(&cm->lock); if (cm->state == DCM_FREE || hca->ib_trans.cm_state != IB_THREAD_RUN) { dapl_os_unlock(&cm->lock); dapl_log(DAPL_DBG_TYPE_CM, " CM FREE: %p ep=%p st=%s refs=%d\n", cm, cm->ep, dapl_cm_state_str(cm->state), cm->ref_count); dapls_cm_release(cm); /* release alloc ref */ dapli_cm_dequeue(cm); /* release workq ref */ dapls_cm_release(cm); /* release thread ref */ continue; } dapl_os_unlock(&cm->lock); ucm_check_timers(cm, &time_ms); dapls_cm_release(cm); /* release thread ref */ } dapl_os_unlock(&hca->ib_trans.lock); hca->ib_hca_handle->channel.Milliseconds = time_ms; hca->ib_trans.rch->comp_channel.Milliseconds = time_ms; hca->ib_trans.ib_cq->comp_channel.Milliseconds = time_ms; CompSetPoll(&hca->ib_trans.signal.set, time_ms); hca->ib_hca_handle->channel.Milliseconds = 0; hca->ib_trans.rch->comp_channel.Milliseconds = 0; hca->ib_trans.ib_cq->comp_channel.Milliseconds = 0; ucm_recv(&hca->ib_trans); ucm_async_event(hca); dapli_cq_event_cb(&hca->ib_trans); } dapl_os_unlock(&hca->ib_trans.lock); hca->ib_trans.cm_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca); } #else // _WIN32 || _WIN64 void cm_thread(void *arg) { struct dapl_hca *hca = arg; dp_ib_cm_handle_t cm, next; struct dapl_fd_set *set; char rbuf[2]; int time_ms; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread: ENTER hca %p\n", hca); set = dapl_alloc_fd_set(); if (!set) goto out; dapl_os_lock(&hca->ib_trans.lock); hca->ib_trans.cm_state = IB_THREAD_RUN; while (1) { time_ms = -1; /* reset to blocking */ dapl_fd_zero(set); dapl_fd_set(hca->ib_trans.signal.scm[0], set, DAPL_FD_READ); dapl_fd_set(hca->ib_hca_handle->async_fd, set, DAPL_FD_READ); dapl_fd_set(hca->ib_trans.rch->fd, set, DAPL_FD_READ); dapl_fd_set(hca->ib_trans.ib_cq->fd, set, DAPL_FD_READ); if (!dapl_llist_is_empty(&hca->ib_trans.list)) next = dapl_llist_peek_head(&hca->ib_trans.list); else next = NULL; while (next) { cm = next; next = dapl_llist_next_entry( &hca->ib_trans.list, (DAPL_LLIST_ENTRY *)&cm->local_entry); dapls_cm_acquire(cm); /* hold thread ref */ dapl_os_lock(&cm->lock); if (cm->state == DCM_FREE || hca->ib_trans.cm_state != IB_THREAD_RUN) { dapl_os_unlock(&cm->lock); dapl_log(DAPL_DBG_TYPE_CM, " CM FREE: %p ep=%p st=%s refs=%d\n", cm, cm->ep, dapl_cm_state_str(cm->state), cm->ref_count); dapls_cm_release(cm); /* alloc ref */ dapli_cm_dequeue(cm); /* workq ref */ dapls_cm_release(cm); /* thread ref */ continue; } dapl_os_unlock(&cm->lock); ucm_check_timers(cm, &time_ms); dapls_cm_release(cm); /* thread ref */ } /* set to exit and all resources destroyed */ if ((hca->ib_trans.cm_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca->ib_trans.list))) break; dapl_os_unlock(&hca->ib_trans.lock); sched_yield(); dapl_select(set, time_ms); /* Process events: CM, ASYNC, NOTIFY THREAD */ if (dapl_poll(hca->ib_trans.rch->fd, DAPL_FD_READ) == DAPL_FD_READ) { ucm_recv(&hca->ib_trans); } if (dapl_poll(hca->ib_hca_handle->async_fd, DAPL_FD_READ) == DAPL_FD_READ) { dapli_async_event_cb(&hca->ib_trans); } if (dapl_poll(hca->ib_trans.ib_cq->fd, DAPL_FD_READ) == DAPL_FD_READ) { dapli_cq_event_cb(&hca->ib_trans); } while (dapl_poll(hca->ib_trans.signal.scm[0], DAPL_FD_READ) == DAPL_FD_READ) { recv(hca->ib_trans.signal.scm[0], rbuf, 2, 0); } dapl_os_lock(&hca->ib_trans.lock); /* set to exit and all resources destroyed */ if ((hca->ib_trans.cm_state != IB_THREAD_RUN) && (dapl_llist_is_empty(&hca->ib_trans.list))) break; } dapl_os_unlock(&hca->ib_trans.lock); free(set); out: hca->ib_trans.cm_state = IB_THREAD_EXIT; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " cm_thread(hca %p) exit\n", hca); } #endif #ifdef DAPL_COUNTERS static char _ctr_host_[128]; /* Debug aid: List all Connections in process and state */ void dapls_print_cm_list(IN DAPL_IA *ia_ptr) { /* Print in process CM's for this IA, if debug type set */ int i = 0; dp_ib_cm_handle_t cm, next_cm; struct dapl_llist_entry **list; DAPL_OS_LOCK *lock; /* LISTEN LIST */ list = &ia_ptr->hca_ptr->ib_trans.llist; lock = &ia_ptr->hca_ptr->ib_trans.llock; dapl_os_lock(lock); if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list)) next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list); else next_cm = NULL; gethostname(_ctr_host_, sizeof(_ctr_host_)); printf("\n [%s:%x] DAPL IA LISTEN/CONNECTIONS IN PROCESS:\n", _ctr_host_ , dapl_os_getpid()); while (next_cm) { cm = next_cm; next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list, (DAPL_LLIST_ENTRY*)&cm->local_entry); printf( " LISTEN[%d]: sp %p %s uCM_QP: %x %x c_%x l_pid %x \n", i, cm->sp, dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.s_id)); i++; } dapl_os_unlock(lock); /* CONNECTION LIST */ list = &ia_ptr->hca_ptr->ib_trans.list; lock = &ia_ptr->hca_ptr->ib_trans.lock; dapl_os_lock(lock); if (!dapl_llist_is_empty((DAPL_LLIST_HEAD*)list)) next_cm = dapl_llist_peek_head((DAPL_LLIST_HEAD*)list); else next_cm = NULL; while (next_cm) { cm = next_cm; next_cm = dapl_llist_next_entry((DAPL_LLIST_HEAD*)list, (DAPL_LLIST_ENTRY*)&cm->local_entry); printf( " CONN[%d]: ep %p cm %p %s %s" " %x %x c_%x i_%x %s %x %x c_%x i_%x r_pid %x\n", i, cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id)); i++; } printf("\n"); dapl_os_unlock(lock); } void dapls_print_cm_free_list(IN DAPL_IA *ia_ptr) { DAPL_EP *ep, *next_ep; dp_ib_cm_handle_t cm, next_cm; int i = 0; gethostname(_ctr_host_, sizeof(_ctr_host_)); printf("\n [%s:%x] DAPL EP CM FREE LIST:\n", _ctr_host_ , dapl_os_getpid()); dapl_os_lock(&ia_ptr->header.lock); ep = (dapl_llist_is_empty(&ia_ptr->ep_list_head) ? NULL : dapl_llist_peek_head(&ia_ptr->ep_list_head)); while (ep != NULL) { next_ep = dapl_llist_next_entry(&ia_ptr->ep_list_head, &ep->header.ia_list_entry); dapl_os_lock(&ep->header.lock); cm = (dapl_llist_is_empty(&ep->cm_list_head) ? NULL : dapl_llist_peek_head(&ep->cm_list_head)); while (cm) { dapl_os_lock(&cm->lock); next_cm = dapl_llist_next_entry(&ep->cm_list_head, &cm->list_entry); if (cm->state == DCM_FREE) { printf( " CONN[%d]: ep %p cm %p %s %s" " %x %x c_%x i_%x l_pid %x %s" " %x %x c_%x i_%x r_pid %x\n", i, cm->ep, cm, cm->msg.saddr.ib.qp_type == IBV_QPT_RC ? "RC" : "UD", dapl_cm_state_str(cm->state), ntohs(cm->msg.saddr.ib.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr.ib.qpn), ntohl(cm->msg.s_id), cm->sp ? "<-" : "->", ntohs(cm->msg.daddr.ib.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr.ib.qpn), ntohl(cm->msg.d_id)); i++; } dapl_os_unlock(&cm->lock); cm = next_cm; } dapl_os_unlock(&ep->header.lock); ep = next_ep; } dapl_os_unlock(&ia_ptr->header.lock); } #endif dapl-2.1.5/dapl/openib_ucm/dapl_ib_util.h000066400000000000000000000125741255317474200203220ustar00rootroot00000000000000/* * Copyright (c) 2009 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_IB_UTIL_H_ #define _DAPL_IB_UTIL_H_ #define _OPENIB_UCM_ #include #include "openib_osd.h" #include "dapl_ib_common.h" #define UCM_SID_BITS 16 /* 64K */ #define UCM_SID_SPACE (1 << UCM_SID_BITS) #define UCM_SID_MASK (UCM_SID_SPACE-1) #define UCM_SID_ENTRY 8 /* 8 bit entry */ #define UCM_CHK_SID(a,p) (a[p/UCM_SID_ENTRY] & (1 << (p%UCM_SID_ENTRY))) #define UCM_SET_SID(a,p) (a[p/UCM_SID_ENTRY] = (a[p/UCM_SID_ENTRY] | (1 << (p%UCM_SID_ENTRY)))) #define UCM_CLR_SID(a,p) (a[p/UCM_SID_ENTRY] = (a[p/UCM_SID_ENTRY] & ~(1 << (p%UCM_SID_ENTRY)))) #define UCM_PORT_BITS 24 /* 16M total, wire protocol max */ #define UCM_PORT_SPACE (1 << UCM_SID_BITS) #define UCM_PORT_MASK (UCM_PORT_SPACE-1) #define UCM_PORT_NTOH(hi,lo) ((((hi & 0xff) << 16) | (ntohs(lo) & 0xffff)) & (UCM_PORT_MASK)) #define UCM_PORT(p) (p & 0xffff) #define UCM_PORTX(p) ((p >> 16) & 0xff) #define UCM_ENTRY_BITS 11 /* 2K entries, default */ #define UCM_ARRAY_BITS 18 /* 256K total ports, default */ #define UCM_ENTRY_SIZE(ebits) (1 << ebits) #define UCM_ARRAY_SIZE(abits, ebits) (1 << (abits - ebits)) #define UCM_ARRAY_IDX_MAX(abits) ((1 << abits) - 1) #define UCM_ARRAY_IDX(idx, abits) (idx >> abits) #define UCM_ENTRY_IDX(idx, abits) (idx & (abits - 1)) /* DAPL CM objects MUST include list_entry, ref_count, event for EP linking */ struct ib_cm_handle { struct dapl_llist_entry list_entry; struct dapl_llist_entry local_entry; DAPL_OS_LOCK lock; DAPL_OS_TIMEVAL timer; uint32_t cm_id; int ref_count; int state; int retries; struct dapl_hca *hca; struct dapl_sp *sp; struct dapl_ep *ep; struct dapl_cr *cr; uint16_t p_size; /* accept p_data, for retries */ uint8_t p_data[DCM_MAX_PDATA_SIZE]; ib_cm_msg_t msg; }; typedef struct ib_cm_handle *dp_ib_cm_handle_t; typedef dp_ib_cm_handle_t ib_cm_srvc_handle_t; /* Definitions */ #define IB_INVALID_HANDLE NULL /* ib_hca_transport_t, specific to this implementation */ typedef struct _ib_hca_transport { struct ibv_device *ib_dev; struct dapl_hca *hca; struct ibv_context *ib_ctx; struct ibv_comp_channel *ib_cq; ib_cq_handle_t ib_cq_empty; DAPL_OS_LOCK ilock; /* idxr list */ void **cm_idxr; int destroy; int cm_state; int cm_array_bits; int cm_entry_bits; int cm_idxr_cur; int cm_last; int cm_free; int cm_cnt; DAPL_OS_THREAD thread; DAPL_OS_LOCK lock; /* connect list */ struct dapl_llist_entry *list; DAPL_OS_LOCK llock; /* listen list */ struct dapl_llist_entry *llist; ib_async_handler_t async_unafiliated; void *async_un_ctx; ib_async_cq_handler_t async_cq_error; ib_async_dto_handler_t async_cq; ib_async_qp_handler_t async_qp_error; union dcm_addr addr; /* lid, port, qp_num, gid */ ib_cm_attr_t ib_cm; /* dev attr for QP and CM */ struct dapl_thread_signal signal; int cqe; int qpe; int burst; int retries; int cm_timer; int rep_time; int rtu_time; int wait_time; int dreq_cnt; int drep_time; DAPL_OS_LOCK slock; int s_hd; int s_tl; struct ibv_pd *pd; struct ibv_cq *scq; struct ibv_cq *rcq; struct ibv_qp *qp; struct ibv_mr *mr_rbuf; struct ibv_mr *mr_sbuf; ib_cm_msg_t *sbuf; ib_cm_msg_t *rbuf; struct ibv_comp_channel *rch; struct ibv_ah **ah; DAPL_OS_LOCK plock; uint16_t lid; uint8_t *sid; /* Sevice IDs, port space, bitarray? */ uint64_t guid; char guid_str[32]; ib_named_attr_t na; #ifdef DAT_IB_COLLECTIVES /* Collective member device and address information */ ib_thread_state_t coll_thread_state; DAPL_OS_THREAD coll_thread; DAPL_OS_LOCK coll_lock; DAPL_OS_WAIT_OBJECT coll_event; struct dapl_llist_entry *grp_list; user_progress_func_t *user_func; int l_sock; struct sockaddr_in m_addr; void *m_ctx; void *m_info; void *f_info; int m_size; int f_size; int t_id; #endif } ib_hca_transport_t; /* prototypes */ void cm_thread(void *arg); void dapli_async_event_cb(struct _ib_hca_transport *tp); void dapli_cq_event_cb(struct _ib_hca_transport *tp); void dapls_cm_acquire(dp_ib_cm_handle_t cm_ptr); void dapls_cm_release(dp_ib_cm_handle_t cm_ptr); void dapls_cm_free(dp_ib_cm_handle_t cm_ptr); DAT_RETURN dapls_ud_cm_free(DAPL_EP *ep_ptr, dp_ib_cm_handle_t cm_ptr); #ifdef DAPL_COUNTERS void dapls_print_cm_list(IN DAPL_IA *ia_ptr); #endif #endif /* _DAPL_IB_UTIL_H_ */ dapl-2.1.5/dapl/openib_ucm/device.c000066400000000000000000000462561255317474200171310ustar00rootroot00000000000000/* * Copyright (c) 2009-2014 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "openib_osd.h" #include "dapl.h" #include "dapl_adapter_util.h" #include "dapl_ib_util.h" #include "dapl_osd.h" #include #include char gid_str[INET6_ADDRSTRLEN]; #ifdef DAT_IB_COLLECTIVES #include #endif static void ucm_service_destroy(IN DAPL_HCA *hca); static int ucm_service_create(IN DAPL_HCA *hca); #if defined (_WIN32) #include static int32_t create_os_signal(IN DAPL_HCA * hca_ptr) { return CompSetInit(&hca_ptr->ib_trans.signal.set); } static void destroy_os_signal(IN DAPL_HCA * hca_ptr) { CompSetCleanup(&hca_ptr->ib_trans.signal.set); } static int dapls_config_verbs(struct ibv_context *verbs) { verbs->channel.Milliseconds = 0; return 0; } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { channel->comp_channel.Milliseconds = 0; return 0; } #else // _WIN32 static int32_t create_os_signal(IN DAPL_HCA * hca_ptr) { DAPL_SOCKET listen_socket; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int ret; listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listen_socket == DAPL_INVALID_SOCKET) return 1; memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(0x7f000001); ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof addr); if (ret) goto err1; ret = getsockname(listen_socket, (struct sockaddr *)&addr, &addrlen); if (ret) goto err1; ret = listen(listen_socket, 0); if (ret) goto err1; hca_ptr->ib_trans.signal.scm[1] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (hca_ptr->ib_trans.signal.scm[1] == DAPL_INVALID_SOCKET) goto err1; ret = connect(hca_ptr->ib_trans.signal.scm[1], (struct sockaddr *)&addr, sizeof(addr)); if (ret) goto err2; hca_ptr->ib_trans.signal.scm[0] = accept(listen_socket, NULL, NULL); if (hca_ptr->ib_trans.signal.scm[0] == DAPL_INVALID_SOCKET) goto err2; closesocket(listen_socket); return 0; err2: closesocket(hca_ptr->ib_trans.signal.scm[1]); err1: closesocket(listen_socket); return 1; } static void destroy_os_signal(IN DAPL_HCA * hca_ptr) { closesocket(hca_ptr->ib_trans.signal.scm[0]); closesocket(hca_ptr->ib_trans.signal.scm[1]); } static int dapls_config_fd(int fd) { int opts; opts = fcntl(fd, F_GETFL); if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) { dapl_log(DAPL_DBG_TYPE_ERR, " dapls_config_fd: fcntl on fd %d ERR %d %s\n", fd, opts, strerror(errno)); return errno; } return 0; } static int dapls_config_verbs(struct ibv_context *verbs) { return dapls_config_fd(verbs->async_fd); } static int dapls_config_comp_channel(struct ibv_comp_channel *channel) { return dapls_config_fd(channel->fd); } #endif /* * dapls_ib_init, dapls_ib_release * * Initialize Verb related items for device open * * Input: * none * * Output: * none * * Returns: * 0 success, -1 error * */ int32_t dapls_ib_init(void) { return 0; } int32_t dapls_ib_release(void) { return 0; } /* * dapls_ib_open_hca * * Open HCA * * Input: * *hca_name pointer to provider device name * *ib_hca_handle_p pointer to provide HCA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_open_hca(IN IB_HCA_NAME hca_name, IN DAPL_HCA * hca_ptr, IN DAPL_OPEN_FLAGS flags) { struct ibv_device **dev_list; union dcm_addr *ucm_ia = (union dcm_addr *) &hca_ptr->hca_address; struct ibv_port_attr port_attr; int i, nd = 0; DAT_RETURN dat_status = DAT_INTERNAL_ERROR; dapl_log(DAPL_DBG_TYPE_UTIL, " open_hca: %s %s - %p in %s\n", PROVIDER_NAME, hca_name, hca_ptr, flags & DAPL_OPEN_QUERY ? "QUERY MODE":"STD MODE"); /* Get list of all IB devices, find match, open */ dev_list = ibv_get_device_list(&nd); if (!dev_list) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_get_device_list() failed\n", hca_name); return DAT_INTERNAL_ERROR; } hca_ptr->ib_trans.ib_dev = NULL; for (i = 0; i < nd; ++i) { if (!hca_ptr->ib_trans.guid && dev_list[i]->transport_type == IBV_TRANSPORT_IB) hca_ptr->ib_trans.guid = ibv_get_device_guid(dev_list[i]); if (!strcmp(dev_list[i]->name, hca_name)) hca_ptr->ib_trans.ib_dev = dev_list[i]; } if (hca_ptr->ib_trans.ib_dev == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: device %s not found\n", hca_name); dat_status = DAT_PROVIDER_NOT_FOUND; goto err; } hca_ptr->ib_hca_handle = ibv_open_device(hca_ptr->ib_trans.ib_dev); if (!hca_ptr->ib_hca_handle) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: dev open failed for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); goto err; } hca_ptr->ib_trans.ib_ctx = hca_ptr->ib_hca_handle; dapls_config_verbs(hca_ptr->ib_hca_handle); /* get lid for this hca-port, network order */ if (ibv_query_port(hca_ptr->ib_hca_handle, (uint8_t)hca_ptr->port_num, &port_attr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: get lid ERR for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); dat_status = DAT_INVALID_ADDRESS; goto bail; } else { if (port_attr.state != IBV_PORT_ACTIVE) { dat_status = DAT_INVALID_ADDRESS; goto bail; } hca_ptr->ib_trans.addr.ib.lid = htons(port_attr.lid); hca_ptr->ib_trans.lid = htons(port_attr.lid); } /* get gid for this hca-port, network order */ if (ibv_query_gid(hca_ptr->ib_hca_handle, (uint8_t) hca_ptr->port_num, 0, (union ibv_gid *)&hca_ptr->ib_trans.addr.ib.gid)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: query GID ERR for %s, err=%s\n", ibv_get_device_name(hca_ptr->ib_trans.ib_dev), strerror(errno)); dat_status = DAT_INVALID_ADDRESS; goto bail; } /* set RC tunables via enviroment or default */ if (dapl_ib_inline_data(hca_ptr->ib_hca_handle)) { hca_ptr->ib_trans.ib_cm.max_inline = dapl_os_get_env_val("DAPL_MAX_INLINE", INLINE_SEND_IB_DEFAULT); } hca_ptr->ib_trans.ib_cm.ack_retry = dapl_os_get_env_val("DAPL_ACK_RETRY", DCM_ACK_RETRY); hca_ptr->ib_trans.ib_cm.ack_timer = dapl_os_get_env_val("DAPL_ACK_TIMER", DCM_ACK_TIMER); hca_ptr->ib_trans.ib_cm.rnr_retry = dapl_os_get_env_val("DAPL_RNR_RETRY", DCM_RNR_RETRY); hca_ptr->ib_trans.ib_cm.rnr_timer = dapl_os_get_env_val("DAPL_RNR_TIMER", DCM_RNR_TIMER); hca_ptr->ib_trans.ib_cm.global = dapl_os_get_env_val("DAPL_GLOBAL_ROUTING", DCM_GLOBAL); hca_ptr->ib_trans.ib_cm.hop_limit = dapl_os_get_env_val("DAPL_HOP_LIMIT", DCM_HOP_LIMIT); hca_ptr->ib_trans.ib_cm.tclass = dapl_os_get_env_val("DAPL_TCLASS", DCM_TCLASS); hca_ptr->ib_trans.ib_cm.mtu = dapl_ib_mtu(dapl_os_get_env_val("DAPL_IB_MTU", DCM_IB_MTU)); if (flags & DAPL_OPEN_QUERY) goto done; /* initialize CM list, LISTEN, SND queue, PSP array, locks */ if ((dapl_os_lock_init(&hca_ptr->ib_trans.lock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.llock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.slock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.plock)) != DAT_SUCCESS) goto bail; if ((dapl_os_lock_init(&hca_ptr->ib_trans.ilock)) != DAT_SUCCESS) goto bail; /* EVD events without direct CQ channels, CNO support */ hca_ptr->ib_trans.ib_cq = ibv_create_comp_channel(hca_ptr->ib_hca_handle); if (hca_ptr->ib_trans.ib_cq == NULL) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: ibv_create_comp_channel ERR %s\n", strerror(errno)); goto bail; } dapls_config_comp_channel(hca_ptr->ib_trans.ib_cq); /* initialize CM and listen lists on this HCA uCM QP */ dapl_llist_init_head(&hca_ptr->ib_trans.list); dapl_llist_init_head(&hca_ptr->ib_trans.llist); /* create uCM qp services */ if (ucm_service_create(hca_ptr)) goto bail; if (create_os_signal(hca_ptr)) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to init cr pipe - %s\n", strerror(errno)); goto bail; } /* create thread to process inbound connect request */ hca_ptr->ib_trans.cm_state = IB_THREAD_INIT; dat_status = dapl_os_thread_create(cm_thread, (void *)hca_ptr, &hca_ptr->ib_trans.thread); if (dat_status != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, " open_hca: failed to create thread\n"); goto bail; } #ifdef DAT_IB_COLLECTIVES if (dapli_create_collective_service(hca_ptr)) goto bail; #endif /* wait for cm_thread */ while (hca_ptr->ib_trans.cm_state != IB_THREAD_RUN) dapl_os_sleep_usec(1000); done: /* save LID, GID, QPN, PORT address information, for ia_queries */ /* Set AF_INET6 to insure callee address storage of 28 bytes */ hca_ptr->ib_trans.hca = hca_ptr; hca_ptr->ib_trans.addr.ib.family = AF_INET6; hca_ptr->ib_trans.addr.ib.qp_type = IBV_QPT_UD; memcpy(&hca_ptr->hca_address, &hca_ptr->ib_trans.addr, sizeof(union dcm_addr)); dapl_log(DAPL_DBG_TYPE_UTIL, "%s open: dev %s port %d, GID %s, LID %x qpn %x sl %d\n", PROVIDER_NAME, hca_name, hca_ptr->port_num, inet_ntop(AF_INET6, &hca_ptr->ib_trans.addr.ib.gid, gid_str, sizeof(gid_str)), ntohs(ucm_ia->ib.lid), ntohl(ucm_ia->ib.qpn), ucm_ia->ib.sl, ucm_ia->ib.qp_type); ibv_free_device_list(dev_list); return DAT_SUCCESS; bail: ucm_service_destroy(hca_ptr); ibv_close_device(hca_ptr->ib_hca_handle); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; hca_ptr->ib_trans.ib_ctx = NULL; hca_ptr->ib_trans.ib_dev = NULL; err: ibv_free_device_list(dev_list); return dat_status; } /* * dapls_ib_close_hca * * Open HCA * * Input: * DAPL_HCA provide CA handle * * Output: * none * * Return: * DAT_SUCCESS * dapl_convert_errno * */ DAT_RETURN dapls_ib_close_hca(IN DAPL_HCA * hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: %p\n", hca_ptr); if (!hca_ptr->ib_trans.cm_state) /* thread never started */ goto done; #ifdef DAT_IB_COLLECTIVES dapli_free_collective_service(hca_ptr); #endif if (hca_ptr->ib_trans.cm_state == IB_THREAD_RUN) { hca_ptr->ib_trans.cm_state = IB_THREAD_CANCEL; dapls_thread_signal(&hca_ptr->ib_trans.signal); while (hca_ptr->ib_trans.cm_state != IB_THREAD_EXIT) { dapl_dbg_log(DAPL_DBG_TYPE_UTIL, " close_hca: waiting for cr_thread\n"); dapls_thread_signal(&hca_ptr->ib_trans.signal); dapl_os_sleep_usec(1000); } } dapl_os_lock_destroy(&hca_ptr->ib_trans.lock); dapl_os_lock_destroy(&hca_ptr->ib_trans.llock); dapl_os_lock_destroy(&hca_ptr->ib_trans.ilock); destroy_os_signal(hca_ptr); ucm_service_destroy(hca_ptr); done: if (hca_ptr->ib_trans.ib_cq) ibv_destroy_comp_channel(hca_ptr->ib_trans.ib_cq); if (hca_ptr->ib_trans.ib_cq_empty) { struct ibv_comp_channel *channel; channel = hca_ptr->ib_trans.ib_cq_empty->cq->channel; ibv_destroy_cq(hca_ptr->ib_trans.ib_cq_empty->cq); ibv_destroy_comp_channel(channel); } if (hca_ptr->ib_hca_handle != IB_INVALID_HANDLE) { if (ibv_close_device(hca_ptr->ib_hca_handle)) return (dapl_convert_errno(errno, "ib_close_device")); hca_ptr->ib_hca_handle = IB_INVALID_HANDLE; } return (DAT_SUCCESS); } /* Create uCM endpoint services, allocate remote_ah's array */ static void ucm_service_destroy(IN DAPL_HCA *hca) { ib_hca_transport_t *tp = &hca->ib_trans; int i, msg_size = sizeof(ib_cm_msg_t); if (tp->mr_sbuf) ibv_dereg_mr(tp->mr_sbuf); if (tp->mr_rbuf) ibv_dereg_mr(tp->mr_rbuf); if (tp->qp) ibv_destroy_qp(tp->qp); if (tp->scq) ibv_destroy_cq(tp->scq); if (tp->rcq) ibv_destroy_cq(tp->rcq); if (tp->rch) ibv_destroy_comp_channel(tp->rch); if (tp->ah) { for (i=0; iah[i]) ibv_destroy_ah(tp->ah[i]); } dapl_os_free(tp->ah, (sizeof(*tp->ah) * DCM_AH_SPACE)); } if (tp->pd) ibv_dealloc_pd(tp->pd); if (tp->sid) dapl_os_free(tp->sid, UCM_SID_SPACE/UCM_SID_ENTRY); if (tp->rbuf) dapl_os_free(tp->rbuf, (msg_size * tp->qpe)); if (tp->sbuf) dapl_os_free(tp->sbuf, (msg_size * tp->qpe)); if (tp->cm_idxr) { for (i=0; i<=tp->cm_idxr_cur; i++) { dapl_os_free(tp->cm_idxr[i], UCM_ENTRY_SIZE(tp->cm_entry_bits)); tp->cm_idxr[i] = 0; } } } static int ucm_service_create(IN DAPL_HCA *hca) { struct ibv_qp_init_attr qp_create; ib_hca_transport_t *tp = &hca->ib_trans; struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; int i, array_sz, entry_sz, mlen = sizeof(ib_cm_msg_t); int hlen = sizeof(struct ibv_grh); /* hdr included with UD recv */ char *rbuf; /* setup CM timers and queue sizes */ tp->retries = dapl_os_get_env_val("DAPL_UCM_RETRY", DCM_RETRY_CNT); tp->rep_time = dapl_os_get_env_val("DAPL_UCM_REP_TIME", DCM_REP_TIME); tp->rtu_time = dapl_os_get_env_val("DAPL_UCM_RTU_TIME", DCM_RTU_TIME); tp->wait_time = dapl_os_get_env_val("DAPL_UCM_WAIT_TIME", DCM_WAIT_TIME); tp->qpe = dapl_os_get_env_val("DAPL_UCM_QP_SIZE", DCM_QP_SIZE); tp->cqe = dapl_os_get_env_val("DAPL_UCM_CQ_SIZE", DCM_CQ_SIZE); tp->burst = dapl_os_get_env_val("DAPL_UCM_TX_BURST", DCM_TX_BURST); tp->dreq_cnt = dapl_os_get_env_val("DAPL_UCM_DREQ_RETRY", DCM_DREQ_CNT); tp->drep_time = dapl_os_get_env_val("DAPL_UCM_DREP_TIME", DCM_DREP_TIME); tp->cm_timer = dapl_os_get_env_val("DAPL_UCM_TIMER", DCM_CM_TIMER); /* default = 11-bit, 2KB entries; 18 bit, 256KB total */ tp->cm_entry_bits = dapl_os_get_env_val("DAPL_UCM_ENTRY_BITS", UCM_ENTRY_BITS); tp->cm_array_bits = DAPL_MAX(dapl_os_get_env_val("DAPL_UCM_ARRAY_BITS", UCM_ARRAY_BITS), tp->cm_entry_bits); array_sz = UCM_ARRAY_SIZE(tp->cm_array_bits, tp->cm_entry_bits); entry_sz = UCM_ENTRY_SIZE(tp->cm_entry_bits); tp->pd = ibv_alloc_pd(hca->ib_hca_handle); if (!tp->pd) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_pd (%s)\n", strerror(errno)); goto bail; } dapl_log(DAPL_DBG_TYPE_CM, "CM (%d+%d)- pd %p Timers(s): req %d rtu %d wait %d -" " idx(%d,%d): Array %d Entry %d = %d\n", hlen, mlen, tp->pd, tp->rep_time/1000, tp->rtu_time/1000, tp->wait_time/1000, tp->cm_array_bits, tp->cm_entry_bits, array_sz, entry_sz, array_sz * entry_sz); /* default == 2K idx size, grow to 256K total CM slots */ tp->cm_idxr = dapl_os_alloc(sizeof(void*) * array_sz); if (!tp->cm_idxr) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR (%s) idx_array alloc %d\n", strerror(errno), sizeof(void*) * array_sz); goto bail; } (void)dapl_os_memzero(tp->cm_idxr, sizeof(void*) * array_sz); /* allocate first index array for cm entries, 2K by default */ tp->cm_idxr[0] = dapl_os_alloc(sizeof(void*) * entry_sz); if (!tp->cm_idxr[0]) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR (%s) idx_entry alloc %d\n", strerror(errno), sizeof(void*) * entry_sz); goto bail; } (void)dapl_os_memzero(tp->cm_idxr[0], sizeof(void*) * entry_sz); tp->rch = ibv_create_comp_channel(hca->ib_hca_handle); if (!tp->rch) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_comp_channel (%s)\n", strerror(errno)); goto bail; } dapls_config_comp_channel(tp->rch); tp->scq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, NULL, 0); if (!tp->scq) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_cq_s (%s)\n", strerror(errno)); goto bail; } tp->rcq = ibv_create_cq(hca->ib_hca_handle, tp->cqe, hca, tp->rch, 0); if (!tp->rcq) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_cq_r (%s)\n", strerror(errno)); goto bail; } if(ibv_req_notify_cq(tp->rcq, 0)) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_notify (%s)\n", strerror(errno)); goto bail; } dapl_os_memzero((void *)&qp_create, sizeof(qp_create)); qp_create.qp_type = IBV_QPT_UD; qp_create.send_cq = tp->scq; qp_create.recv_cq = tp->rcq; qp_create.cap.max_send_wr = qp_create.cap.max_recv_wr = tp->qpe; qp_create.cap.max_send_sge = qp_create.cap.max_recv_sge = 1; qp_create.cap.max_inline_data = tp->ib_cm.max_inline; qp_create.qp_context = (void *)hca; tp->qp = ibv_create_qp(tp->pd, &qp_create); if (!tp->qp) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_qp (%s)\n", strerror(errno)); goto bail; } tp->ah = (ib_ah_handle_t*) dapl_os_alloc(sizeof(ib_ah_handle_t) * DCM_AH_SPACE); tp->sid = (uint8_t*) dapl_os_alloc(UCM_SID_SPACE/UCM_SID_ENTRY); tp->rbuf = (void*) dapl_os_alloc((mlen + hlen) * tp->qpe); tp->sbuf = (void*) dapl_os_alloc(mlen * tp->qpe); tp->s_hd = tp->s_tl = 0; if (!tp->ah || !tp->rbuf || !tp->sbuf) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR malloc ah,bufs(%s)\n", strerror(errno)); goto bail; } (void)dapl_os_memzero(tp->ah, (sizeof(ib_ah_handle_t) * DCM_AH_SPACE)); (void)dapl_os_memzero(tp->sid, UCM_SID_SPACE/UCM_SID_ENTRY); tp->sid[0] = 0x1; /* resv slot 0 */ (void)dapl_os_memzero(tp->rbuf, ((mlen + hlen) * tp->qpe)); (void)dapl_os_memzero(tp->sbuf, (mlen * tp->qpe)); tp->mr_sbuf = ibv_reg_mr(tp->pd, tp->sbuf, (mlen * tp->qpe), IBV_ACCESS_LOCAL_WRITE); if (!tp->mr_sbuf) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_mr sbuf (%s)\n", strerror(errno)); goto bail; } tp->mr_rbuf = ibv_reg_mr(tp->pd, tp->rbuf, ((mlen + hlen) * tp->qpe), IBV_ACCESS_LOCAL_WRITE); if (!tp->mr_rbuf) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_mr rbuf (%s)\n", strerror(errno)); goto bail; } /* modify UD QP: init, rtr, rts */ if ((dapls_modify_qp_ud(hca, tp->qp)) != DAT_SUCCESS) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR modify_qp_ud (%s)\n", strerror(errno)); goto bail; } /* post receive buffers, setup head, tail pointers */ recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; sge.length = mlen + hlen; sge.lkey = tp->mr_rbuf->lkey; rbuf = (char *) tp->rbuf; for (i = 0; i < tp->qpe; i++) { recv_wr.wr_id = (uintptr_t) (rbuf + hlen); sge.addr = (uintptr_t) rbuf; if (ibv_post_recv(tp->qp, &recv_wr, &recv_err)) { dapl_log(DAPL_DBG_TYPE_ERR, "UCM: CM service: ERR ibv_post_rcv (%s)\n", strerror(errno)); goto bail; } rbuf += sge.length; } /* save qp_num as part of ia_address, network order */ tp->addr.ib.qpn = htonl(tp->qp->qp_num); return 0; bail: dapl_log(DAPL_DBG_TYPE_ERR, " ucm_create_services: ERR %s\n", strerror(errno)); ucm_service_destroy(hca); return -1; } dapl-2.1.5/dapl/openib_ucm/linux/000077500000000000000000000000001255317474200166505ustar00rootroot00000000000000dapl-2.1.5/dapl/openib_ucm/linux/openib_osd.h000066400000000000000000000013031255317474200211370ustar00rootroot00000000000000#ifndef OPENIB_OSD_H #define OPENIB_OSD_H #include #include #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ #endif /* _INLINE_ */ #define DAPL_SOCKET int #define DAPL_INVALID_SOCKET -1 #define DAPL_FD_SETSIZE 16 #define closesocket close struct dapl_thread_signal { DAPL_SOCKET scm[2]; }; STATIC _INLINE_ void dapls_thread_signal(struct dapl_thread_signal *signal) { send(signal->scm[1], "w", sizeof "w", 0); } #endif // OPENIB_OSD_H dapl-2.1.5/dapl/svc/000077500000000000000000000000001255317474200141645ustar00rootroot00000000000000dapl-2.1.5/dapl/svc/mcm.c000066400000000000000000001341211255317474200151060ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mpxyd service - cm.c * * Communication Management for mpxyd * MIC is local endpoint via MIX protocol on Intel SCI * MIC/HOST is remote endpoint via MCM protocol on InfiniBand * * CM protocol, CM thread, resource management * */ #include "mpxyd.h" /* cm parameters, setup defaults */ int mcm_depth = 500; int mcm_size = 256; int mcm_signal = 100; int mcm_max_rcv = 20; int mcm_retry = 10; int mcm_disc_retry = 5; int mcm_rep_ms = 4000; int mcm_rtu_ms = 2000; int mcm_dreq_ms = 1000; int mcm_proxy_in = 1; extern int mix_buffer_sg_po2; extern int mcm_rx_entries; extern uint64_t system_guid; extern char gid_str[INET6_ADDRSTRLEN]; void mcm_get_attr(dat_mix_prov_attr_t *pr_attr) { pr_attr->cm_retry = mcm_retry; pr_attr->cm_disc_retry = mcm_disc_retry; pr_attr->cm_rep_time_ms = mcm_rep_ms; pr_attr->cm_rtu_time_ms = mcm_rtu_ms; pr_attr->cm_drep_time_ms = mcm_dreq_ms; } /* Create address handle for remote QP, info in network order */ struct ibv_ah *mcm_create_ah(mcm_ib_dev_t *md, struct ibv_pd *pd, struct ibv_qp *qp, uint16_t lid, union ibv_gid *gid) { struct ibv_qp_attr qp_attr; struct ibv_ah *ah; memset((void *)&qp_attr, 0, sizeof(qp_attr)); qp_attr.qp_state = IBV_QP_STATE; qp_attr.ah_attr.dlid = lid; if (gid != NULL) { mlog(8, "create_ah: with GID\n"); qp_attr.ah_attr.is_global = 1; qp_attr.ah_attr.grh.dgid.global.subnet_prefix = ntohll(gid->global.subnet_prefix); qp_attr.ah_attr.grh.dgid.global.interface_id = ntohll(gid->global.interface_id); qp_attr.ah_attr.grh.hop_limit = md->dev_attr.hop_limit; qp_attr.ah_attr.grh.traffic_class = md->dev_attr.tclass; } qp_attr.ah_attr.sl = md->dev_attr.sl; qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = md->port; mlog(8, "create_ah: port %x lid %x pd %p ctx %p handle 0x%x\n", md->port, qp_attr.ah_attr.dlid, pd, pd->context, pd->handle); /* UD: create AH for remote side */ ah = ibv_create_ah(pd, &qp_attr.ah_attr); if (!ah) { mlog(0, " create_ah: ERR %s\n", strerror(errno)); return NULL; } mlog(8, "create_ah: AH %p for lid %x\n", ah, qp_attr.ah_attr.dlid); return ah; } /* Modify UD-QP from init, rtr, rts, info network order */ int modify_ud_qp(mcm_ib_dev_t *md, struct ibv_qp *qp) { struct ibv_qp_attr qp_attr; /* modify QP, setup and prepost buffers */ memset((void *)&qp_attr, 0, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = md->dev_attr.pkey_idx; qp_attr.port_num = md->port; qp_attr.qkey = DAT_MCM_UD_QKEY; if (ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_QKEY)) { mlog(0, "INIT: ERR %s\n", strerror(errno)); return 1; } memset((void *)&qp_attr, 0, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_RTR; if (ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE)) { mlog(0, "RTR: ERR %s\n", strerror(errno)); return 1; } memset((void *)&qp_attr, 0, sizeof(qp_attr)); qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 1; if (ibv_modify_qp(qp, &qp_attr, IBV_QP_STATE | IBV_QP_SQ_PSN)) { mlog(0, "RTS: ERR %s\n", strerror(errno)); return 1; } return 0; } int mcm_init_cm_service(mcm_ib_dev_t *md) { struct ibv_qp_init_attr qp_create; struct ibv_port_attr port_attr; struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; int i, mlen = sizeof(dat_mcm_msg_t); char *rbuf; mlog(8, " create CM services.. %p, max pkt_sz %d + %d\n", md, mlen, sizeof(struct ibv_grh)); /* setup CM msg attributes and timers */ md->retries = mcm_retry; md->rep_time = mcm_rep_ms; md->rtu_time = mcm_rtu_ms; md->cm_timer = min(md->rep_time, md->rtu_time); md->qpe = mcm_depth; md->cqe = mcm_depth; md->signal = mcm_signal; /* Save addr information */ /* get lid for this hca-port, convert to network order */ if (ibv_query_port(md->ibctx, md->port, &port_attr)) { mlog(0, " ERR: get lid for %s, err=%s\n", ibv_get_device_name(md->ibdev), strerror(errno)); return -1; } else md->lid = md->addr.lid = htons(port_attr.lid); if (md->lid == 0) { mlog(0, " device %s, port %d not active\n", ibv_get_device_name(md->ibdev), md->port); return -1; } /* get gid for this hca-port, in network order */ if (ibv_query_gid(md->ibctx, md->port, 0, (union ibv_gid *)&md->addr.gid)) { mlog(0, " ERR: query GID for %s, err=%s\n", ibv_get_device_name(md->ibdev), strerror(errno)); return -1; } /* EP mapping hint for MIC to HCA, set MSS if compat or PI disabled */ if (((md->numa_node != -1) && (md->numa_node == md->mc->numa_node)) || md->mc->ver == MIX_COMP || mcm_proxy_in == 0) md->addr.ep_map = MIC_SSOCK_DEV; else md->addr.ep_map = MIC_XSOCK_DEV; /* setup CM timers and queue sizes */ md->pd = ibv_alloc_pd(md->ibctx); if (!md->pd) goto bail; md->rch = ibv_create_comp_channel(md->ibctx); if (!md->rch) goto bail; mcm_config_fd(md->rch->fd); md->scq = ibv_create_cq(md->ibctx, md->cqe, md, NULL, 0); if (!md->scq) goto bail; md->rcq = ibv_create_cq(md->ibctx, md->cqe, md, md->rch, 0); if (!md->rcq) goto bail; if(ibv_req_notify_cq(md->rcq, 0)) goto bail; memset((void *)&qp_create, 0, sizeof(qp_create)); qp_create.qp_type = IBV_QPT_UD; qp_create.send_cq = md->scq; qp_create.recv_cq = md->rcq; qp_create.cap.max_send_wr = qp_create.cap.max_recv_wr = md->qpe; qp_create.cap.max_send_sge = qp_create.cap.max_recv_sge = 1; if (md->indata) qp_create.cap.max_inline_data = mlen + sizeof(struct ibv_grh); qp_create.qp_context = (void *)md; md->qp = ibv_create_qp(md->pd, &qp_create); if (!md->qp) goto bail; /* local addr info in network order */ md->addr.port = htons(md->port); md->addr.qpn = htonl(md->qp->qp_num); md->addr.qp_type = md->qp->qp_type; md->ah = (struct ibv_ah **) malloc(sizeof(struct ibv_ah *) * 0xffff); md->ports = (uint64_t*) malloc(sizeof(uint64_t) * MCM_PORT_SPACE); md->rbuf = malloc((mlen + sizeof(struct ibv_grh)) * md->qpe); md->sbuf = malloc(mlen * md->qpe); md->s_hd = md->s_tl = 0; if (!md->ah || !md->rbuf || !md->sbuf || !md->ports) goto bail; (void)memset(md->ah, 0, (sizeof(struct ibv_ah *) * 0xffff)); (void)memset(md->ports, 0, (sizeof(uint64_t) * MCM_PORT_SPACE)); md->ports[0] = 1; /* resv slot 0, 0 == no ports available */ (void)memset(md->rbuf, 0, ((mlen + sizeof(struct ibv_grh)) * md->qpe)); (void)memset(md->sbuf, 0, (mlen * md->qpe)); md->mr_sbuf = ibv_reg_mr(md->pd, md->sbuf, (mlen * md->qpe), IBV_ACCESS_LOCAL_WRITE); if (!md->mr_sbuf) goto bail; md->mr_rbuf = ibv_reg_mr(md->pd, md->rbuf, (mlen + sizeof(struct ibv_grh)) * md->qpe, IBV_ACCESS_LOCAL_WRITE); if (!md->mr_rbuf) goto bail; /* modify UD QP: init, rtr, rts */ if ((modify_ud_qp(md, md->qp)) != DAT_SUCCESS) goto bail; /* post receive buffers, setup head, tail pointers */ recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; sge.length = mlen + sizeof(struct ibv_grh); sge.lkey = md->mr_rbuf->lkey; rbuf = (char*)md->rbuf; for (i = 0; i < md->qpe; i++) { recv_wr.wr_id = (uintptr_t) (rbuf + sizeof(struct ibv_grh)); sge.addr = (uintptr_t) rbuf; errno = 0; if (ibv_post_recv(md->qp, &recv_wr, &recv_err)) goto bail; rbuf += (mlen + sizeof(struct ibv_grh)); } /* save qp_num as part of ia_address, network order */ md->addr.qpn = htonl(md->qp->qp_num); mlog(0, " IB LID 0x%x PORT %d GID %s QPN 0x%x: mic%d -> %s - %s, mic_ver %d %s\n", ntohs(md->addr.lid), md->port, inet_ntop(AF_INET6, md->addr.gid, gid_str, sizeof(gid_str)), md->qp->qp_num, md->mc->scif_id - 1, md->ibdev->name, md->addr.ep_map == MIC_SSOCK_DEV ? "MSS":"MXS", md->mc->ver, md->mc->ver == MIX_COMP ? "WARN: OLD MPSS -> RUN COMP MODE":""); return 0; bail: mlog(0, " ERR: MCM UD-CM services: %s\n",strerror(errno)); return -1; } int mcm_modify_qp(struct ibv_qp *qp_handle, enum ibv_qp_state qp_state, uint32_t qpn, uint16_t lid, union ibv_gid *gid) { struct ibv_qp_attr qp_attr; enum ibv_qp_attr_mask mask = IBV_QP_STATE; mcm_qp_t *m_qp; int ret; if (!qp_handle) { mlog(1, "WARNING: qp_handle==NULL\n"); return EINVAL; } m_qp = (mcm_qp_t *)qp_handle->qp_context; memset((void *)&qp_attr, 0, sizeof(qp_attr)); qp_attr.qp_state = qp_state; switch (qp_state) { case IBV_QPS_RTR: mask |= IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN | IBV_QP_RQ_PSN | IBV_QP_MIN_RNR_TIMER | IBV_QP_MAX_DEST_RD_ATOMIC; qp_attr.dest_qp_num = ntohl(qpn); qp_attr.rq_psn = 1; qp_attr.path_mtu = m_qp->smd->md->dev_attr.mtu; qp_attr.max_dest_rd_atomic = 16; qp_attr.min_rnr_timer = m_qp->smd->md->dev_attr.rnr_timer; qp_attr.ah_attr.dlid = ntohs(lid); if (gid && m_qp->smd->md->dev_attr.global) { mlog(1," Global Routing: GID %s \n", inet_ntop(AF_INET6, gid, gid_str, sizeof(gid_str))); qp_attr.ah_attr.is_global = 1; qp_attr.ah_attr.grh.dgid.global.subnet_prefix = gid->global.subnet_prefix; qp_attr.ah_attr.grh.dgid.global.interface_id = gid->global.interface_id; qp_attr.ah_attr.grh.hop_limit = m_qp->smd->md->dev_attr.hop_limit; qp_attr.ah_attr.grh.traffic_class = m_qp->smd->md->dev_attr.tclass; } qp_attr.ah_attr.sl = m_qp->smd->md->dev_attr.sl; qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = m_qp->smd->md->port; mlog(8, " QPS_RTR: l_qpn %x type %d r_qpn 0x%x gid %p (%d) lid 0x%x" " port %d qp %p qp_state %d rd_atomic %d rnr_timer %d\n", qp_handle->qp_num, qp_handle->qp_type, ntohl(qpn), gid, m_qp->smd->md->dev_attr.global, ntohs(lid), m_qp->smd->md->port, qp_handle, qp_handle->state, qp_attr.max_dest_rd_atomic, qp_attr.min_rnr_timer); break; case IBV_QPS_RTS: mask |= IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.sq_psn = 1; qp_attr.timeout = m_qp->smd->md->dev_attr.ack_timer; qp_attr.retry_cnt = m_qp->smd->md->dev_attr.ack_retry; qp_attr.rnr_retry = m_qp->smd->md->dev_attr.rnr_retry; qp_attr.max_rd_atomic = 16; mlog(8, " QPS_RTS: psn %x rd_atomic %d ack %d " " retry %d rnr_retry %d qpn %x qp_state %d\n", qp_attr.sq_psn, qp_attr.max_rd_atomic, qp_attr.timeout, qp_attr.retry_cnt, qp_attr.rnr_retry, qp_handle->qp_num, qp_handle->state); break; case IBV_QPS_INIT: mask |= IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_ATOMIC | IBV_ACCESS_MW_BIND; qp_attr.pkey_index = m_qp->smd->md->dev_attr.pkey_idx; qp_attr.port_num = m_qp->smd->md->port; qp_attr.qkey = 0; mlog(8, " QPS_INIT: pi %x port %x acc %x qkey 0x%x\n", qp_attr.pkey_index, qp_attr.port_num, qp_attr.qp_access_flags, qp_attr.qkey); break; default: break; } ret = ibv_modify_qp(qp_handle, &qp_attr, mask); if (ret == 0) { m_qp->qp_attr2.cur_state = m_qp->qp_attr2.state = qp_state; } else { switch (qp_state) { case IBV_QPS_RTR: mlog(0, " QPS_RTR: ERR %s l_qpn %x type %d r_qpn 0x%x gid %p (%d) lid 0x%x" " port %d ep %p qp_state %d \n", strerror(ret), qp_handle->qp_num, qp_handle->qp_type, ntohl(qpn), gid, m_qp->smd->md->dev_attr.global, ntohs(lid), m_qp->smd->md->port, m_qp, m_qp->qp_attr2.cur_state); break; case IBV_QPS_RTS: mlog(0, " QPS_RTS: ERR %s psn %x rd_atomic %d ack %d " " retry %d rnr_retry %d qpn %x qp_state %d\n", strerror(ret), qp_attr.sq_psn, qp_attr.max_rd_atomic, qp_attr.timeout, qp_attr.retry_cnt, qp_attr.rnr_retry, m_qp->ib_qp2->qp_num, m_qp->qp_attr2.cur_state); break; case IBV_QPS_INIT: mlog(0, " QPS_INIT: ERR %s pi %x port %x acc %x qkey 0x%x\n", strerror(ret), qp_attr.pkey_index, qp_attr.port_num, qp_attr.qp_access_flags, qp_attr.qkey); break; default: mlog(0, " ERR (%s): l_qpn %x type %d qpn 0x%x lid 0x%x" " port %d state %s->%s mtu %d rd %d rnr %d sl %d\n", strerror(ret), qp_handle->qp_num, qp_handle->qp_type, ntohl(qpn), ntohs(lid), m_qp->smd->md->port, mcm_qp_state_str(m_qp->qp_attr2.cur_state), mcm_qp_state_str(qp_state), qp_attr.path_mtu, qp_attr.max_dest_rd_atomic, qp_attr.min_rnr_timer, qp_attr.ah_attr.sl); break; } } return ret; } /* move QP's to error state and destroy. Flush the proxy SR queue is exists */ void mcm_flush_qp(struct mcm_qp *m_qp) { struct mcm_sr *m_sr; struct dat_mix_wc wc; if (m_qp->ib_qp1) { mcm_modify_qp(m_qp->ib_qp1, IBV_QPS_ERR, 0, 0, NULL); ibv_destroy_qp(m_qp->ib_qp1); m_qp->ib_qp1 = NULL; } if (m_qp->ib_qp2) { mcm_modify_qp(m_qp->ib_qp2, IBV_QPS_ERR, 0, 0, NULL); ibv_destroy_qp(m_qp->ib_qp2); m_qp->ib_qp2 = NULL; } mpxy_lock(&m_qp->rxlock); while (m_qp->sr_tl != m_qp->sr_hd) { m_sr = (struct mcm_sr *)(m_qp->sr_buf + (m_qp->sr_sz * m_qp->sr_tl)); if (m_sr->wr_id) { mlog(1, " QP %p SR[%d] %p wr_id %Lx dto_event -> IBV_WC_FLUSH_ERR\n", m_qp, m_sr->s_idx, m_sr, m_sr->wr_id); wc.wr_id = m_sr->wr_id; wc.imm_data = 0; wc.byte_len = 0; wc.status = IBV_WC_WR_FLUSH_ERR; wc.opcode = IBV_WC_RECV; wc.vendor_err = 0; mix_dto_event(m_qp->m_cq_rx, &wc, 1); m_sr->wr_id = 0; /* free posted SR slot */ } if (++m_qp->sr_tl == m_qp->sr_end) /* move tail */ m_qp->sr_tl = 0; } mpxy_unlock(&m_qp->rxlock); } /* MCM Endpoint CM objects */ void m_cm_free(mcm_cm_t *cm) { mlog(2, "CM %p free: qp %p ref_cnt %d state %s sid %x\n", cm, cm->m_qp, cm->ref_cnt, mcm_state_str(cm->state), cm->sid); mpxy_lock(&cm->lock); if (cm->state != MCM_DESTROY) { cm->ref_cnt--; /* alloc ref */ cm->state = MCM_DESTROY; } /* client, release local conn id port */ if (!cm->l_ep && cm->sid) { mpxy_lock(&cm->md->plock); mcm_free_port(cm->md->ports, cm->sid); cm->sid = 0; mpxy_unlock(&cm->md->plock); } /* last reference, destroy */ if (!cm->ref_cnt) { mpxy_unlock(&cm->lock); mpxy_lock_destroy(&cm->lock); cm->smd->ref_cnt--; free(cm); } else mpxy_unlock(&cm->lock); } mcm_cm_t *m_cm_create(mcm_scif_dev_t *smd, mcm_qp_t *m_qp, dat_mcm_addr_t *r_addr) { mcm_cm_t *cm; dat_mcm_addr_t *l_addr = &smd->md->addr; /* Allocate CM, init lock, and initialize */ if ((cm = malloc(sizeof(*cm))) == NULL) { mlog(0, "failed to allocate cm: %s\n", strerror(errno)); return NULL; } memset(cm, 0, sizeof(*cm)); init_list(&cm->entry); if (mpxy_lock_init(&cm->lock, NULL)) goto bail; cm->ref_cnt++; /* alloc ref */ cm->state = MCM_INIT; cm->smd = smd; cm->md = smd->md; cm->msg.ver = htons(DAT_MCM_VER); cm->msg.sqpn = smd->md->addr.qpn; /* ucm, in network order */ cm->msg.seg_sz = mix_buffer_sg_po2; #ifdef MPXYD_LOCAL_SUPPORT cm->msg.sys_guid = system_guid; /* network order */ #else cm->msg.sys_guid = rand(); /* send local guid */ #endif /* ACTIVE: init source address QP info from MPXYD and MIC client */ if (m_qp) { mpxy_lock(&smd->md->plock); cm->sid = mcm_get_port(smd->md->ports, 0, (uint64_t)cm); mpxy_unlock(&smd->md->plock); cm->msg.sport = htons(cm->sid); if (!cm->msg.sport) { mpxy_lock_destroy(&cm->lock); goto bail; } cm->ref_cnt++; /* Active: QP ref */ cm->m_qp = m_qp; m_qp->cm = cm; /* MPXYD SRC IB info, QP2t = saddr2 all cases */ cm->msg.saddr2.qpn = htonl(m_qp->ib_qp2->qp_num); cm->msg.saddr2.qp_type = m_qp->qp_attr2.qp_type; cm->msg.saddr2.lid = smd->md->addr.lid; cm->msg.saddr2.ep_map = smd->md->addr.ep_map; memcpy(&cm->msg.saddr2.gid[0], &smd->md->addr.gid, 16); /* MPXYD RCV IB info */ cm->msg.saddr1.lid = smd->md->addr.lid; cm->msg.saddr1.ep_map = smd->md->addr.ep_map; memcpy(&cm->msg.saddr1.gid[0], &smd->md->addr.gid, 16); /* MSS, QPr is on MIC, QP1r == saddr1 */ if (MSS_EP(l_addr)) { cm->msg.saddr1.qpn = htonl(cm->m_qp->qp_attr1.qp_num); cm->msg.saddr1.qp_type = cm->m_qp->qp_attr1.qp_type; /* MSS_EP -> (MXS or unknown) WC queue for MXS peer PI service */ if (MXS_EP(r_addr) || UND_EP(r_addr)) { if (m_pi_create_wc_q(m_qp, mcm_rx_entries)) goto bail; } } /* MXS -> (MSS, HOST, or unknown), need a QPr on mpxyd, QP1r == saddr1 */ if (MXS_EP(l_addr) && !MXS_EP(r_addr)) { /* note: pi_wr_q and pi_wc_q created via MXS create_qp */ if (m_qp_create_pi(smd, m_qp)) goto bail; cm->msg.saddr1.qpn = htonl(m_qp->ib_qp1->qp_num); cm->msg.saddr1.qp_type = m_qp->qp_attr1.qp_type; } /* MXS -> MXS, QPs and QPr is QP2 on mpxyd, saddr 1 == saddr2 */ if (MXS_EP(l_addr) && MXS_EP(r_addr)) memcpy(&cm->msg.saddr1, &cm->msg.saddr2, sizeof(dat_mcm_addr_t)); mlog(8, " SRC: QPt qpn 0x%x lid 0x%x, QPr qpn 0x%x lid 0x%x" " CM: qpn 0x%x port=0x%x %s\n", cm->m_qp->qp_attr2.qp_num, ntohs(cm->msg.saddr2.lid), cm->msg.saddr1.qpn ? cm->m_qp->qp_attr1.qp_num:cm->m_qp->qp_attr2.qp_num, cm->msg.saddr1.qpn ? ntohs(cm->msg.saddr1.lid):ntohs(cm->msg.saddr2.lid), ntohl(cm->msg.sqpn), ntohs(cm->msg.sport), mcm_map_str(cm->msg.saddr2.ep_map)); } cm->smd->ref_cnt++; return cm; bail: free(cm); return NULL; } /* queue up connection object on CM list */ void mcm_qconn(mcm_scif_dev_t *smd, mcm_cm_t *cm) { mpxy_lock(&cm->lock); cm->ref_cnt++; /* clist ref */ mpxy_unlock(&cm->lock); /* add to CONN work queue, list, for mcm fabric CM */ mpxy_lock(&smd->clock); insert_tail(&cm->entry, &smd->clist, (void *)cm); mpxy_unlock(&smd->clock); } /* dequeue connection object from CM list */ void mcm_dqconn_free(mcm_scif_dev_t *smd, mcm_cm_t *cm) { /* Remove from work queue, cr thread processing */ if (cm->entry.tid) { mpxy_lock(&smd->clock); remove_entry(&cm->entry); mpxy_unlock(&smd->clock); mpxy_lock(&cm->lock); cm->ref_cnt--; /* clist ref */ mpxy_unlock(&cm->lock); } m_cm_free(cm); } /* queue listen object on listen list */ void mcm_qlisten(mcm_scif_dev_t *smd, mcm_cm_t *cm) { mpxy_lock(&cm->lock); cm->ref_cnt++; /* llist ref */ mpxy_unlock(&cm->lock); /* add to LISTEN work queue, list, for mcm fabric CM */ mpxy_lock(&smd->llock); insert_tail(&cm->entry, &smd->llist, (void *)cm); mpxy_unlock(&smd->llock); } /* dequeue listen object from listen list */ void mcm_dqlisten_free(mcm_scif_dev_t *smd, mcm_cm_t *cm) { if (cm->entry.tid) { mpxy_lock(&smd->llock); remove_entry(&cm->entry); mpxy_unlock(&smd->llock); mpxy_lock(&smd->md->plock); mcm_free_port(smd->md->ports, cm->sid); cm->sid = 0; mpxy_unlock(&smd->md->plock); mpxy_lock(&cm->lock); cm->ref_cnt--; /* llist ref */ mpxy_unlock(&cm->lock); } m_cm_free(cm); } /* * * Fabric side MCM messages, IB UD QP * */ /* IB async device event */ int mcm_ib_async_event(struct mcm_ib_dev *md) { struct ibv_async_event event; int status = 0; if (!ibv_get_async_event(md->ibctx, &event)) { switch (event.event_type) { case IBV_EVENT_CQ_ERR: mlog(0, "IBV_EVENT_CQ_ERR: ctx(%p) \n", event.element.cq->cq_context); break; case IBV_EVENT_COMM_EST: mlog(0, "IBV_EVENT_COMM_EST ERR: (QP=%p) rdata beat RTU\n", event.element.qp); break; case IBV_EVENT_QP_FATAL: case IBV_EVENT_QP_REQ_ERR: case IBV_EVENT_QP_ACCESS_ERR: case IBV_EVENT_QP_LAST_WQE_REACHED: case IBV_EVENT_SRQ_ERR: case IBV_EVENT_SRQ_LIMIT_REACHED: case IBV_EVENT_SQ_DRAINED: mlog(0, "%s ERR: QP (%p)\n", mcm_ib_async_str(event.event_type), event.element.qp->qp_context); break; case IBV_EVENT_PATH_MIG: case IBV_EVENT_PATH_MIG_ERR: case IBV_EVENT_DEVICE_FATAL: case IBV_EVENT_PORT_ERR: case IBV_EVENT_LID_CHANGE: case IBV_EVENT_PKEY_CHANGE: case IBV_EVENT_SM_CHANGE: mlog(0, "%s ERR: shutting down device %s, closing all active clients\n", mcm_ib_async_str(event.event_type), md->ibdev->name); status = -1; break; case IBV_EVENT_PORT_ACTIVE: mlog(0, "%s\n", mcm_ib_async_str(event.event_type)); break; case IBV_EVENT_CLIENT_REREGISTER: mlog(0, "%s\n", mcm_ib_async_str(event.event_type)); break; default: mlog(0, "ERR: IBV async event %d UNKNOWN\n", event.event_type); break; } ibv_ack_async_event(&event); } /* no need to send event to MIX client, it has same IB device opened */ return status; } /* Get CM UD message from send queue, called with s_lock held */ static dat_mcm_msg_t *mcm_get_smsg(mcm_ib_dev_t *md) { dat_mcm_msg_t *msg = NULL; int ret, polled = 1, hd = md->s_hd; hd++; if (hd == md->qpe) hd = 0; retry: if (hd == md->s_tl) { msg = NULL; if (polled % 1000000 == 0) mlog(1, " ucm_get_smsg: FULLq hd %d == tl %d," " completions stalled, polls=%d\n", hd, md->s_tl, polled); } else { msg = &md->sbuf[hd]; md->s_hd = hd; /* new hd */ } /* if empty, process some completions */ if (msg == NULL) { struct ibv_wc wc; /* process completions, based on UCM_TX_BURST */ ret = ibv_poll_cq(md->scq, 1, &wc); if (ret < 0) { mlog(8, " get_smsg: cq %p %s\n", md->scq, strerror(errno)); return NULL; } /* free up completed sends, update tail */ if (ret > 0) md->s_tl = (int)wc.wr_id; polled++; MCNTR(md, MCM_CM_TX_POLL); goto retry; } return msg; } /* ACTIVE/PASSIVE: build and send CM message out of CM object */ static int mcm_send(mcm_ib_dev_t *md, dat_mcm_msg_t *msg, DAT_PVOID p_data, DAT_COUNT p_size) { dat_mcm_msg_t *smsg = NULL; struct ibv_send_wr wr, *bad_wr; struct ibv_sge sge; int len, ret = -1; uint16_t dlid = ntohs(msg->daddr1.lid); /* Get message from send queue, copy data, and send */ mpxy_lock(&md->txlock); if ((smsg = mcm_get_smsg(md)) == NULL) { mlog(0, " mcm_send ERR: get_smsg(hd=%d,tl=%d) \n", md->s_hd, md->s_tl); goto bail; } len = sizeof(dat_mcm_msg_t); memcpy(smsg, msg, len); if (p_size) { smsg->p_size = ntohs(p_size); memcpy(&smsg->p_data, p_data, p_size); } else smsg->p_size = 0; wr.next = NULL; wr.sg_list = &sge; wr.num_sge = 1; wr.opcode = IBV_WR_SEND; wr.wr_id = (unsigned long)md->s_hd; wr.send_flags = (wr.wr_id % md->signal) ? 0 : IBV_SEND_SIGNALED; if (md->indata) wr.send_flags |= IBV_SEND_INLINE; sge.length = len; sge.lkey = md->mr_sbuf->lkey; sge.addr = (uintptr_t)smsg; if (sge.length > (sizeof(dat_mcm_msg_t) + sizeof(struct ibv_grh))) { mlog(0, " ERR: cm_msg too large - %d bytes\n", sge.length); ret = -1; goto bail; } mlog(8," cm_send: op %s ln %d lid %x c_qpn %x rport %x, p_size %d\n", mcm_op_str(ntohs(smsg->op)), sge.length, ntohs(smsg->daddr1.lid), ntohl(smsg->dqpn), ntohs(smsg->dport), p_size); /* empty slot, then create AH */ if (!md->ah[dlid]) { md->ah[dlid] = mcm_create_ah(md, md->pd, md->qp, dlid, NULL); if (!md->ah[dlid]) { mlog(0, " ERR: create_ah %s\n", strerror(errno)); goto bail; } } wr.wr.ud.ah = md->ah[dlid]; wr.wr.ud.remote_qpn = ntohl(smsg->dqpn); wr.wr.ud.remote_qkey = DAT_MCM_UD_QKEY; errno = 0; ret = ibv_post_send(md->qp, &wr, &bad_wr); bail: if (ret) mlog(0, " ERR: ibv_post_send() %s\n", strerror(errno)); MCNTR(md, MCM_CM_MSG_OUT); mpxy_unlock(&md->txlock); return ret; } static int mcm_post_rmsg(mcm_ib_dev_t *md, dat_mcm_msg_t *msg) { struct ibv_recv_wr recv_wr, *recv_err; struct ibv_sge sge; msg->ver = 0; recv_wr.next = NULL; recv_wr.sg_list = &sge; recv_wr.num_sge = 1; recv_wr.wr_id = (uint64_t)(uintptr_t) msg; sge.length = sizeof(dat_mcm_msg_t) + sizeof(struct ibv_grh); sge.lkey = md->mr_rbuf->lkey; sge.addr = (uintptr_t)((char *)msg - sizeof(struct ibv_grh)); MCNTR(md, MCM_CM_MSG_POST); errno = 0; return (ibv_post_recv(md->qp, &recv_wr, &recv_err)); } int mcm_cm_rej_out(mcm_ib_dev_t *md, dat_mcm_msg_t *msg, DAT_MCM_OP type, int swap) { dat_mcm_msg_t smsg; memset(&smsg, 0, sizeof(smsg)); smsg.ver = htons(DAT_MCM_VER); smsg.op = htons(type); if (swap) { smsg.dport = msg->sport; smsg.dqpn = msg->sqpn; smsg.sport = msg->dport; smsg.sqpn = msg->dqpn; memcpy(&smsg.saddr1, &msg->daddr1, sizeof(dat_mcm_addr_t)); memcpy(&smsg.daddr1, &msg->saddr1, sizeof(dat_mcm_addr_t)); memcpy(&smsg.saddr2, &msg->daddr2, sizeof(dat_mcm_addr_t)); memcpy(&smsg.daddr2, &msg->saddr2, sizeof(dat_mcm_addr_t)); } else { smsg.dport = msg->dport; smsg.dqpn = msg->dqpn; smsg.sport = msg->sport; smsg.sqpn = msg->sqpn; memcpy(&smsg.daddr1, &msg->daddr1, sizeof(dat_mcm_addr_t)); memcpy(&smsg.saddr1, &msg->saddr1, sizeof(dat_mcm_addr_t)); memcpy(&smsg.daddr2, &msg->daddr2, sizeof(dat_mcm_addr_t)); memcpy(&smsg.saddr2, &msg->saddr2, sizeof(dat_mcm_addr_t)); } mlog(2," sLID %x, sQPN %x sPORT %x -> dLID %x, dQPN %x dPORT %x\n", ntohs(smsg.saddr1.lid), ntohl(smsg.sqpn), ntohs(smsg.sport), ntohs(smsg.daddr1.lid), ntohl(smsg.dqpn), ntohs(smsg.dport)); if (type == MCM_REJ_USER) MCNTR(md, MCM_CM_REJ_USER_OUT); else MCNTR(md, MCM_CM_REJ_OUT); return (mcm_send(md, &smsg, NULL, 0)); } void mcm_cm_disc(mcm_cm_t *cm) { int finalize = 1; mpxy_lock(&cm->lock); mlog(2," enter: state = %s \n", mcm_state_str(cm->state)); switch (cm->state) { case MCM_CONNECTED: /* CONSUMER: move to err state to flush */ if (cm->m_qp) mcm_flush_qp(cm->m_qp); /* send DREQ, event after DREP or DREQ timeout */ cm->state = MCM_DISC_PENDING; cm->msg.op = htons(MCM_DREQ); cm->retries = 0; finalize = 0; /* wait for DREP */ mlog(2, " DREQ_out (%d): cm_id %d %x %x %x -> %x %x %x\n", cm->retries+1, cm->entry.tid, htons(cm->msg.saddr1.lid),htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport),htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); MCNTR(cm->md, MCM_CM_DREQ_OUT); break; case MCM_DISC_PENDING: /* DREQ timeout, retry */ if (cm->retries > mcm_disc_retry) { mlog(0, " DISC: RETRIES EXHAUSTED:" " %x %x %x -> %x %x %x\n", htons(cm->msg.saddr1.lid), htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport), htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); cm->state = MCM_DISCONNECTED; goto final; } cm->msg.op = htons(MCM_DREQ); finalize = 0; /* wait for DREP */ mlog(2, " DREQ_out (%d): cm_id %d %x %x %x -> %x %x %x\n", cm->retries+1, cm->entry.tid, htons(cm->msg.saddr1.lid),htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport),htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); MCNTR(cm->md, MCM_CM_DREQ_OUT); break; case MCM_DISC_RECV: MCNTR(cm->md, MCM_CM_DREQ_IN); /* CM_THREAD: move to err state to flush */ if (cm->m_qp) mcm_flush_qp(cm->m_qp); /* DREQ received, send DREP and schedule event, finalize */ cm->msg.op = htons(MCM_DREP); cm->state = MCM_DISCONNECTED; mlog(2, " DREQ_in: cm_id %d send DREP %x %x %x -> %x %x %x\n", cm->entry.tid, htons(cm->msg.saddr1.lid),htonl(cm->msg.saddr1.qpn), htons(cm->msg.sport),htons(cm->msg.daddr1.lid), htonl(cm->msg.dqpn), htons(cm->msg.dport)); MCNTR(cm->md, MCM_CM_DREP_OUT); break; case MCM_DISCONNECTED: mlog(2," state = %s already disconnected\n", mcm_state_str(cm->state) ); mpxy_unlock(&cm->lock); MCNTR(cm->md, MCM_CM_DREQ_DUP); return; default: MCNTR(cm->md, MCM_CM_ERR_UNEXPECTED_STATE); mlog(1, " disconnect UNKNOWN state: qp %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->m_qp, cm, cm->msg.saddr1.qp_type == IBV_QPT_RC ? "RC" : "UD", mcm_state_str(cm->state),ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr1.qpn), cm->l_ep ? "<-" : "->", ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), ntohl(cm->msg.s_id)); mpxy_unlock(&cm->lock); return; } cm->timer = mcm_time_us(); /* DREQ, expect reply */ mcm_send(cm->md, &cm->msg, NULL, 0); final: mpxy_unlock(&cm->lock); if (finalize) { MCNTR(cm->md, MCM_CM_DISC_EVENT); mix_cm_event(cm, DAT_CONNECTION_EVENT_DISCONNECTED); } } int mcm_cm_rep_out(mcm_cm_t *cm) { mpxy_lock(&cm->lock); if (cm->state != MCM_RTU_PENDING) { mlog(1, " CM_REPLY: wrong state qp %p cm %p %s refs=%d" " %x %x i_%x -> %x %x i_%x l_pid %x r_pid %x\n", cm->m_qp, cm, mcm_state_str(cm->state), cm->ref_cnt, htons(cm->msg.saddr1.lid), htons(cm->msg.sport), htonl(cm->msg.saddr1.qpn), htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn), ntohl(cm->msg.s_id), ntohl(cm->msg.d_id)); mpxy_unlock(&cm->lock); return -1; } if (cm->retries == cm->md->retries) { mlog(0, " CM_REPLY: RETRIES (%d) EXHAUSTED (lid port qpn)" " %x %x %x -> %x %x %x\n", cm->retries, htons(cm->msg.saddr1.lid), htons(cm->msg.sport), htonl(cm->msg.saddr1.qpn), htons(cm->msg.daddr1.lid), htons(cm->msg.dport), htonl(cm->msg.daddr1.qpn)); mpxy_unlock(&cm->lock); MCNTR(cm->md, MCM_CM_TIMEOUT_EVENT); mix_cm_event(cm, DAT_CONNECTION_EVENT_TIMED_OUT); return -1; } MCNTR(cm->md, MCM_CM_REP_OUT); cm->timer = mcm_time_us(); /* RTU expected */ if (mcm_send(cm->md, &cm->msg, cm->p_data, cm->p_size)) { mlog(0," accept ERR: mcm reply send()\n"); mpxy_unlock(&cm->lock); return -1; } mpxy_unlock(&cm->lock); return 0; } static void mcm_process_recv(mcm_ib_dev_t *md, dat_mcm_msg_t *msg, mcm_cm_t *cm, int len) { mlog(2, " cm %p cm_id %d state %s cm->m_qp %p\n", cm, cm->entry.tid, mcm_state_str(cm->state), cm->m_qp); mpxy_lock(&cm->lock); switch (cm->state) { case MCM_LISTEN: /* passive */ mlog(2, "LISTEN: req_in: dev_id %d l_cm %p, sid %d,0x%x\n", cm->smd->entry.tid, cm, cm->sid, cm->sid); mpxy_unlock(&cm->lock); MCNTR(md, MCM_CM_REQ_IN); mix_cm_req_in(cm, msg, len); break; case MCM_RTU_PENDING: /* passive */ mlog(2, "RTU_PENDING: cm %p, my_id %d, cm_id %d\n", cm, cm->entry.tid, cm->cm_id); cm->state = MCM_CONNECTED; mpxy_unlock(&cm->lock); MCNTR(md, MCM_CM_RTU_IN); mix_cm_rtu_in(cm, msg, len); break; case MCM_REP_PENDING: /* active */ mlog(2, "REP_PENDING: cm %p, my_id %d, cm_id %d\n", cm, cm->entry.tid, cm->cm_id); mpxy_unlock(&cm->lock); if (ntohs(msg->op) == MCM_REP) mix_cm_rep_in(cm, msg, len); else mix_cm_rej_in(cm, msg, len); break; case MCM_REP_RCV: /* active */ if (ntohs(msg->op) == MCM_REP) { mlog(2, "REP_RCV: DUPLICATE cm %p, my_id %d, cm_id %d\n", cm, cm->entry.tid, cm->cm_id); MCNTR(md, MCM_CM_ERR_REP_DUP); } mpxy_unlock(&cm->lock); break; case MCM_CONNECTED: /* active and passive */ /* DREQ, change state and process */ if (ntohs(msg->op) == MCM_DREQ) { mlog(2, "DREQ_in: cm %p, cm_id %d\n", cm, cm->entry.tid); cm->state = MCM_DISC_RECV; mpxy_unlock(&cm->lock); mcm_cm_disc(cm); break; } /* active: RTU was dropped, resend */ if (ntohs(msg->op) == MCM_REP) { mlog(2, " REP_in resend RTU: op %s st %s [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x r_pid %x\n", mcm_op_str(ntohs(cm->msg.op)), mcm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); MCNTR(md, MCM_CM_REP_IN); cm->msg.op = htons(MCM_RTU); mcm_send(cm->smd->md, &cm->msg, NULL, 0); } mpxy_unlock(&cm->lock); break; case MCM_DISC_PENDING: /* active and passive */ MCNTR(md, MCM_CM_DREP_IN); MCNTR(md, MCM_CM_DISC_EVENT); cm->state = MCM_DISCONNECTED; mpxy_unlock(&cm->lock); mix_cm_event(cm, DAT_CONNECTION_EVENT_DISCONNECTED); break; case MCM_DISCONNECTED: case MCM_FREE: case MCM_DESTROY: /* DREQ dropped, resend */ if (ntohs(msg->op) == MCM_DREQ) { MCNTR(md, MCM_CM_DREQ_DUP); mlog(2, " DREQ_in resend DREP: cm_id %d op %s st %s [lid, port, qpn]:" " %x %x %x -> %x %x %x\n", cm->entry.tid, mcm_op_str(ntohs(msg->op)), mcm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.daddr1.qpn)); MCNTR(md, MCM_CM_DREP_OUT); cm->msg.op = htons(MCM_DREP); mcm_send(cm->smd->md, &cm->msg, NULL, 0); } else if (ntohs(msg->op) != MCM_DREP){ /* DREP ok to ignore, any other print warning */ mlog(2, " mcm_recv: UNEXPECTED MSG on cm %p" " <- op %s, st %s spsp %x sqpn %x\n", cm, mcm_op_str(ntohs(msg->op)), mcm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn)); MCNTR(cm->md, MCM_CM_ERR_UNEXPECTED_MSG); } mpxy_unlock(&cm->lock); break; case MCM_REJECTED: if (ntohs(msg->op) == MCM_REJ_USER) { mpxy_unlock(&cm->lock); MCNTR(md, MCM_CM_REJ_USER_IN); break; } default: mlog(2, " mcm_recv: Warning, UNKNOWN state" " <- op %s, %s spsp %x sqpn %x slid %x\n", mcm_op_str(ntohs(msg->op)), mcm_state_str(cm->state), ntohs(msg->sport), ntohl(msg->sqpn), ntohs(msg->saddr1.lid)); MCNTR(md, MCM_CM_ERR_UNEXPECTED_STATE); mpxy_unlock(&cm->lock); break; } } void mcm_dump_cm_lists(mcm_scif_dev_t *smd) { mcm_cm_t *cm = NULL, *next; LLIST_ENTRY *list; mpxy_lock_t *lock; mlog(0, " SMD %p : \n"); /* listen list*/ list = &smd->llist; lock = &smd->llock; mpxy_lock(lock); next = get_head_entry(list); while (next) { cm = next; next = get_next_entry(&cm->entry, list); mlog(0, " CM_LIST %s [lid, port, cqp, iqp, pid]: SRC %x %x %x %x %x DST %x %x %x %x %x\n", mcm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohl(cm->msg.s_id), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); } mpxy_unlock(lock); /* conn list */ list = &smd->clist; lock = &smd->clock; mpxy_lock(lock); next = get_head_entry(list); while (next) { cm = next; next = get_next_entry(&cm->entry, list); mlog(0, " CM_CONN %s [lid, port, cqp, iqp, pid]: SRC %x %x %x %x %x DST %x %x %x %x %x\n", mcm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohl(cm->msg.s_id), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); } mpxy_unlock(lock); } /* Find matching CM object for this receive message, return CM reference, timer */ mcm_cm_t *mcm_get_smd_cm(mcm_scif_dev_t *smd, dat_mcm_msg_t *msg, int *dup) { mcm_cm_t *cm = NULL, *next, *found = NULL; LLIST_ENTRY *list; mpxy_lock_t *lock; int listenq = 0; mlog(8, " <- SMD %p rmsg(%p): op %s [lid, sid, cQP, QPr, QPt, pid]: " "%x %x %x %x %x <- %x %x %x %x %x l_pid %x r_pid %x\n", smd, msg, mcm_op_str(ntohs(msg->op)), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr1.qpn), ntohl(msg->daddr2.qpn), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr1.qpn), ntohl(msg->saddr2.qpn), ntohl(msg->s_id), ntohl(msg->d_id)); /* conn list first, duplicate requests for MCM_REQ */ list = &smd->clist; lock = &smd->clock; *dup = 0; retry_listenq: mpxy_lock(lock); next = get_head_entry(list); while (next) { cm = next; next = get_next_entry(&cm->entry, list); if (cm->state == MCM_DESTROY || cm->state == MCM_FREE) continue; mlog(8, " CM %s [lid, port, cqp, iqp, pid]: SRC %x %x %x %x %x DST %x %x %x %x %x\n", mcm_state_str(cm->state), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohl(cm->msg.s_id), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id)); /* CM sPORT + QPN, match is good enough for listenq */ if (listenq && cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn) { found = cm; break; } /* connectq, check src and dst plus id's, check duplicate conn_reqs */ if (!listenq && cm->msg.sport == msg->dport && cm->msg.sqpn == msg->dqpn && cm->msg.dport == msg->sport && cm->msg.dqpn == msg->sqpn && cm->msg.daddr1.lid == msg->saddr1.lid) { if (ntohs(msg->op) != MCM_REQ) { found = cm; break; } else { /* duplicate; bail and throw away */ mpxy_unlock(lock); mlog(1, " DUPLICATE: cm %p op %s (%s) st %s" " [lid, port, cqp, iqp]:" " %x %x %x %x <- (%x %x %x %x :" " %x %x %x %x) -> %x %x %x %x\n", cm, mcm_op_str(ntohs(msg->op)), mcm_op_str(ntohs(cm->msg.op)), mcm_state_str(cm->state), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr1.qpn), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr1.qpn), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn)); *dup = 1; MCNTR(cm->md, MCM_CM_ERR_REQ_DUP); if (cm->state == MCM_REJECTED) { /* REJ dropped, resend REJ*/ mlog(1," DUPLICATE: CM_REQ in: REJECT state, resend CM_REJ %d\n", ntohs(cm->msg.op)); mcm_cm_rej_out(cm->md, &cm->msg, ntohs(cm->msg.op), 1); } return NULL; } } } mpxy_unlock(lock); /* no duplicate request on connq, check listenq for new request */ if (ntohs(msg->op) == MCM_REQ && !listenq && !found) { listenq = 1; list = &smd->llist; lock = &smd->llock; goto retry_listenq; } return found; } /* locate CM object for msg, walk all SCIF clients for MD */ mcm_cm_t *mcm_get_cm(mcm_ib_dev_t *md, dat_mcm_msg_t *msg) { mcm_cm_t *cm = NULL; mcm_scif_dev_t *smd; int dup = 0; /* Walk scif device client list */ mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { cm = mcm_get_smd_cm(smd, msg, &dup); if (cm || dup) break; smd = get_next_entry(&smd->entry, &md->smd_list); } mpxy_unlock(&md->slock); if (!cm && !dup) { mlog(2, " %s - op %s [lid, port, cqp, iqp]:" " %x %x %x %x <- %x %x %x %x lpid %x rpid %x\n", ntohs(msg->op) == MCM_REQ ? "NO LISTENER":"NO MATCH", mcm_op_str(ntohs(msg->op)), ntohs(msg->daddr1.lid), ntohs(msg->dport), ntohl(msg->dqpn), ntohl(msg->daddr1.qpn), ntohs(msg->saddr1.lid), ntohs(msg->sport), ntohl(msg->sqpn), ntohl(msg->saddr1.qpn), ntohl(msg->s_id), ntohl(msg->d_id)); if (ntohs(msg->op) == MCM_REQ) mcm_cm_rej_out(md, msg, MCM_REJ_CM, 1); if (ntohs(msg->op) == MCM_DREP) MCNTR(md, MCM_CM_ERR_DREP_DUP); #ifdef MCM_DEBUG mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd) { mcm_dump_cm_lists(smd); smd = get_next_entry(&smd->entry, &md->smd_list); } mpxy_unlock(&md->slock); #endif } return cm; } /* Get rmsgs from CM completion queue, 10 at a time */ void mcm_ib_recv(mcm_ib_dev_t *md) { struct ibv_wc wc[10]; dat_mcm_msg_t *msg; mcm_cm_t *cm; int i, ret, notify = 0; struct ibv_cq *ibv_cq = NULL; /* POLLIN on channel FD */ ret = ibv_get_cq_event(md->rch, &ibv_cq, (void *)&md); if (ret == 0) { ibv_ack_cq_events(ibv_cq, 1); } retry: ret = ibv_poll_cq(md->rcq, 10, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(md->rcq, 0); notify = 1; goto retry; } return; } else notify = 0; MCNTR(md, MCM_CM_RX_POLL); for (i = 0; i < ret; i++) { msg = (dat_mcm_msg_t*) (uintptr_t) wc[i].wr_id; mlog(2, " mcm_recv[%d]: stat=%d op=%s ln=%d id=%p sqp=%x\n", i, wc[i].status, mcm_op_str(ntohs(msg->op)), wc[i].byte_len, (void*)wc[i].wr_id, wc[i].src_qp); MCNTR(md, MCM_CM_MSG_IN); /* validate CM message, version */ if (ntohs(msg->ver) != DAT_MCM_VER) { mlog(1, " UNKNOWN cm_msg %p, op %s ver %d st %x ln %d\n", msg, mcm_op_str(ntohs(msg->op)), ntohs(msg->ver), wc[i].status, wc[i].byte_len); mcm_post_rmsg(md, msg); continue; } if (!(cm = mcm_get_cm(md, msg))) { mlog(2, " NO_MATCH or DUP: post_rmsg %p op %s ver %d st %x ln %d\n", msg, mcm_op_str(ntohs(msg->op)), ntohs(msg->ver), wc[i].status, wc[i].byte_len); mcm_post_rmsg(md, msg); continue; } /* match, process it */ mcm_process_recv(md, msg, cm, wc[i].byte_len - sizeof(struct ibv_grh)); mcm_post_rmsg(md, msg); } /* finished this batch of WC's, poll and rearm */ goto retry; } int mcm_cm_req_out(mcm_cm_t *m_cm) { mcm_pr_addrs(2, &m_cm->msg, m_cm->state, 0); mpxy_lock(&m_cm->lock); if (m_cm->state != MCM_INIT && m_cm->state != MCM_REP_PENDING) goto bail; if (m_cm->retries == m_cm->md->retries) { mlog(0, " CM_REQ: RETRIES EXHAUSTED: 0x%x %x 0x%x -> 0x%x %x 0x%x\n", htons(m_cm->msg.saddr1.lid), htonl(m_cm->msg.saddr1.qpn), htons(m_cm->msg.sport), htons(m_cm->msg.daddr1.lid), htonl(m_cm->msg.dqpn), htons(m_cm->msg.dport)); m_cm->state = MCM_FREE; mpxy_unlock(&m_cm->lock); MCNTR(m_cm->md, MCM_CM_TIMEOUT_EVENT); mix_cm_event(m_cm, DAT_CONNECTION_EVENT_TIMED_OUT); return -1; } mlog(8, " m_cm %p guid %Lx state %d, retries %d \n", m_cm, ntohll(m_cm->msg.sys_guid), m_cm->state,m_cm->md->retries); MCNTR(m_cm->md, MCM_CM_REQ_OUT); m_cm->state = MCM_REP_PENDING; m_cm->msg.op = htons(MCM_REQ); m_cm->timer = mcm_time_us(); /* reset reply timer */ if (mcm_send(m_cm->md, &m_cm->msg, &m_cm->msg.p_data, ntohs(m_cm->msg.p_size))) return -1; mpxy_unlock(&m_cm->lock); return 0; bail: mpxy_unlock(&m_cm->lock); return -1; } int mcm_cm_rtu_out(mcm_cm_t *m_cm) { uint64_t r_guid = m_cm->msg.sys_guid; MCNTR(m_cm->md, MCM_CM_RTU_OUT); mlog(1, "[%d:%d] CONN_EST[%d]: %p 0x%x %x 0x%x %Lx %s -> 0x%x %x 0x%x %Lx %s\n", m_cm->md->mc->scif_id, m_cm->smd->entry.tid, m_cm->md->cntrs ? (uint32_t)((uint64_t *)m_cm->md->cntrs)[MCM_CM_RTU_OUT]:0, m_cm, htons(m_cm->msg.saddr2.lid), htonl(m_cm->msg.saddr2.qpn), htons(m_cm->msg.sport), system_guid, mcm_map_str(m_cm->msg.saddr2.ep_map), htons(m_cm->msg.daddr1.lid), MXS_EP(&m_cm->msg.saddr1) && MXS_EP(&m_cm->msg.daddr1) ? htonl(m_cm->msg.daddr2.qpn):htonl(m_cm->msg.daddr1.qpn), htons(m_cm->msg.dport), ntohll(r_guid), mcm_map_str(m_cm->msg.daddr1.ep_map)); mpxy_lock(&m_cm->lock); if (m_cm->state != MCM_REP_RCV) { mlog(0, " state %s wrong, s/be REP_RCV\n", mcm_state_str(m_cm->state)); goto bail; } m_cm->state = MCM_CONNECTED; m_cm->msg.op = htons(MCM_RTU); m_cm->timer = mcm_time_us(); /* reset reply timer */ #ifdef MPXYD_LOCAL_SUPPORT m_cm->msg.sys_guid = system_guid; /* send local guid */ #else m_cm->msg.sys_guid = rand(); /* send local guid */ #endif if (mcm_send(m_cm->md, &m_cm->msg, NULL, 0)) { m_cm->msg.sys_guid = r_guid; goto bail; } m_cm->msg.sys_guid = r_guid; /* reset to remote guid */ mpxy_unlock(&m_cm->lock); return 0; bail: /* send CM event */ mpxy_unlock(&m_cm->lock); return -1; } /* SMD device lock held */ void mcm_check_timers(mcm_scif_dev_t *smd, int *timer) { uint64_t time; mcm_cm_t *cm; mpxy_lock(&smd->clock); cm = get_head_entry(&smd->clist); while (cm) { mpxy_lock(&cm->lock); time = mcm_time_us(); switch (cm->state) { case MCM_REP_PENDING: *timer = cm->md->cm_timer; /* wait longer each retry */ if ((time - cm->timer)/1000 > (cm->md->rep_time << cm->retries)) { mlog(1, " CM_REQ retry %p %d [lid, port, cqp, iqp]:" " %x %x %x %x %s -> %s %x %x %x %x Time %d > %d\n", cm, cm->retries+1, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), mcm_map_str(cm->msg.saddr1.ep_map), mcm_map_str(cm->msg.daddr1.ep_map), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), (time - cm->timer)/1000, cm->md->rep_time << cm->retries); cm->retries++; MCNTR(cm->md, MCM_CM_ERR_REQ_RETRY); mpxy_unlock(&cm->lock); mcm_cm_req_out(cm); mpxy_lock(&cm->lock); break; } break; case MCM_RTU_PENDING: *timer = cm->md->cm_timer; if ((time - cm->timer)/1000 > (cm->md->rtu_time << cm->retries)) { mlog(1, " CM_REPLY retry %d %s [lid, port, cqp, iqp]:" " %x %x %x %x %s -> %s %x %x %x %x r_pid %x Time %d > %d\n", cm->retries+1, mcm_op_str(ntohs(cm->msg.op)), ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), mcm_map_str(cm->msg.saddr1.ep_map), mcm_map_str(cm->msg.daddr1.ep_map), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), (time - cm->timer)/1000, cm->md->rtu_time << cm->retries); cm->retries++; MCNTR(cm->md, MCM_CM_ERR_REP_RETRY); mpxy_unlock(&cm->lock); mcm_cm_rep_out(cm); mpxy_lock(&cm->lock); break; } break; case MCM_DISC_PENDING: *timer = cm->md->cm_timer; if ((time - cm->timer)/1000 > (mcm_dreq_ms << cm->retries)) { mlog(1, " CM_DREQ retry %d [lid, port, cqp, iqp]:" " %x %x %x %x -> %x %x %x %x r_pid %x Time %d > %d\n", cm->retries+1, ntohs(cm->msg.saddr1.lid), ntohs(cm->msg.sport), ntohl(cm->msg.sqpn), ntohl(cm->msg.saddr1.qpn), ntohs(cm->msg.daddr1.lid), ntohs(cm->msg.dport), ntohl(cm->msg.dqpn), ntohl(cm->msg.daddr1.qpn), ntohl(cm->msg.d_id), (time - cm->timer)/1000, cm->md->rtu_time << cm->retries); cm->retries++; MCNTR(cm->md, MCM_CM_ERR_DREQ_RETRY); mpxy_unlock(&cm->lock); mcm_cm_disc(cm); mpxy_lock(&cm->lock); break; } break; default: break; } mpxy_unlock(&cm->lock); cm = get_next_entry(&cm->entry, &smd->clist); } mpxy_unlock(&smd->clock); } dapl-2.1.5/dapl/svc/mix.c000066400000000000000000002070651255317474200151370ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mpxyd service - mix.c * * MIC message exchange (MIX) services via Intel SCI * operations, resource management * */ #include "mpxyd.h" /* scif-rdma cmd and data channel parameters */ int mix_align = 64; int mix_buffer_sg_cnt = 300; int mix_cmd_depth = 50; int mix_cmd_size = 256; int mix_shared_buffer = 1; int mix_max_msg_mb = 16; int mix_inline_threshold = 256; int mix_eager_completion = 1; int mcm_ib_inline = MCM_IB_INLINE; int mcm_rw_signal = 1; int mcm_rr_signal = 1; int mcm_rr_max = 40; /* PO rdma read in-process limit */ int mcm_wr_max = 10; /* PO WR batch processing limit */ int mcm_wc_max = 10; /* PO-PI poll_cq WC processing limit */ int mcm_tx_entries = MCM_WRC_QLEN; /* power of 2, default = 512 */ int mcm_rx_entries = MCM_WRC_QLEN; int mcm_rx_cq_size = MCM_WRC_QLEN; int mcm_tx_cq_size = MCM_WRC_QLEN; int mcm_buf_wc_size = MCM_WRC_QLEN; extern int mix_buffer_mb; extern int mix_buffer_sg_po2; extern uint64_t system_guid; extern int mcm_profile; extern int log_level; extern int mcm_cpu_family; extern int mcm_cpu_model; static void mix_get_prov_attr(mcm_scif_dev_t *smd, dat_mix_prov_attr_t *pr_attr) { memset(pr_attr, 0, sizeof(dat_mix_prov_attr_t)); memcpy(&pr_attr->dev_attr, &smd->md->dev_attr, sizeof(dat_mix_dev_attr_t)); mcm_get_attr(pr_attr); /* CM attributes */ pr_attr->max_msg_sz = mix_max_msg_mb * 1024 * 1024; pr_attr->max_tx_dtos = mcm_tx_entries; pr_attr->max_rx_dtos = mcm_rx_entries; pr_attr->max_tx_pool = mix_buffer_mb * 1024 * 1024; pr_attr->max_rx_pool = mix_buffer_mb * 1024 * 1024; pr_attr->tx_segment_sz = (mix_buffer_sg_po2 << 1); pr_attr->rx_segment_sz = (mix_buffer_sg_po2 << 1); pr_attr->system_guid = system_guid; pr_attr->cpu_model = mcm_cpu_model; pr_attr->cpu_family = mcm_cpu_family; } /* close MCM device, MIC client, md->slock held */ void mix_close_device(mcm_ib_dev_t *md, mcm_scif_dev_t *smd) { int op, tx, ev; MCNTR(md, MCM_IA_CLOSE); mlog(8, " MIC client: close mdev %p smd %p mic%d -> %s port %d - %s socket IO\n", md, smd, md->mc->scif_id-1, md->ibdev->name, md->port, md->numa_node == md->mc->numa_node ? "local":"cross" ); smd->destroy = 1; op = smd->scif_op_ep; tx = smd->scif_tx_ep; ev = smd->scif_ev_ep; mpxy_unlock(&md->slock); write(smd->md->mc->cm_pipe[1], "w", sizeof("w")); write(smd->md->mc->op_pipe[1], "w", sizeof("w")); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); mpxy_lock(&md->slock); while (smd->th_ref_cnt) { mlog(1, " waiting for SMD %p ref_cnt (%d) = 0\n", smd, smd->th_ref_cnt); mpxy_unlock(&md->slock); sched_yield(); mpxy_lock(&md->slock); } mpxy_destroy_smd(smd); /* close and remove scif MIX client, leave parent mcm_ib_dev open */ if (op) scif_close(op); if (tx) scif_close(tx); if (ev) scif_close(ev); mlog(8, " All SCIF EP's closed for smd %p\n", smd); return; } /* accept SCIF endpoint connect request */ void mix_scif_accept(scif_epd_t listen_ep) { struct scif_portID peer, peer_cm; scif_epd_t tx_ep, ev_ep, op_ep; int peer_listen; int ret, len; dat_mix_open_t msg; mcm_scif_dev_t *smd = NULL; /* 2 channels created with clients, OP and TX processing */ ret = scif_accept(listen_ep, &peer, &op_ep, SCIF_ACCEPT_SYNC); if (ret) { mlog(0, " ERR: scif_accept on OP ep %d, ret = %s\n", listen_ep, strerror(errno)); return; } mlog(8, " SCIF op_ep %d connected to local_listen %d\n", op_ep, listen_ep); len = sizeof(peer_listen); ret = scif_recv(op_ep, &peer_listen, len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: rcv on new_ep %d, actual %d, expected %d, ret = %s\n", op_ep, ret, len, strerror(errno)); goto out_close_op_ep; } peer_cm = peer; peer_cm.port = peer_listen; /* TX and EV connections */ ev_ep = scif_open(); if (ev_ep < 0) { mlog(0, " ERR: scif_open failed for EV ep, ret = %s\n", strerror(errno)); goto out_close_op_ep; } ret = scif_connect(ev_ep, &peer_cm); if (ret < 0) { mlog(0, " ERR: scif_connect EV ep %d port %d on node %d, ret = %s\n", ev_ep, peer.node, peer_listen, strerror(errno)); goto out_close_ev_ep; } mlog(8, " SCIF ev_ep %d connected to peer_listen %d\n", ev_ep, peer_listen); tx_ep = scif_open(); if (tx_ep < 0) { mlog(0, " ERR: scif_open failed for TX ep, ret = %s\n", strerror(errno)); goto out_close_ev_ep; } ret = scif_connect(tx_ep, &peer_cm); if (ret < 0) { mlog(0, " ERR: scif_connect TX ep %d on node %d, ret = %s\n", tx_ep, peer.node, strerror(errno)); goto out_close_tx_ep; } mlog(8, " SCIF tx_ep %d connected to peer_listen %d \n", tx_ep, peer_listen); /* connect is followed immediately by MIX open command on OP channel */ len = sizeof(dat_mix_open_t); ret = scif_recv(op_ep, &msg, len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: rcv on new_ep %d, actual %d, expected %d, ret = %s\n", op_ep, ret, len, strerror(errno)); goto out_close_tx_ep; } mlog(8, " SCIF client: device open client_pid 0x%x - mlen %d - ep %d\n", ntohl(msg.hdr.req_id), len, op_ep); msg.hdr.flags = MIX_OP_RSP; if (msg.hdr.ver < MIX_MIN || msg.hdr.ver > MIX_MAX || msg.hdr.op != MIX_IA_OPEN) { mlog(0, " ERR: MIC client incompatible with MPXYD (exp %d,rcvd %d) or OP (exp %d,rcvd %d)\n", DAT_MIX_VER, msg.hdr.ver, msg.hdr.op, MIX_IA_OPEN); msg.hdr.ver = DAT_MIX_VER; msg.hdr.status = MIX_EINVAL; goto err; } if (peer.node > MCM_CLIENT_MAX) { mlog(0, " ERR: too many MIC clients (%d)\n", peer.node); msg.hdr.status = MIX_EOVERFLOW; goto err; } /* open new device with hca name and port info, send response with addr info */ smd = mix_open_device(&msg, op_ep, ev_ep, tx_ep, peer.node); if (smd) return; err: mlog(0, " ERR: open_device -> closing SCIF client EPs %d %d %d \n", op_ep, tx_ep, ev_ep); out_close_tx_ep: scif_close(tx_ep); out_close_ev_ep: scif_close(ev_ep); out_close_op_ep: scif_close(op_ep); } static int mix_prov_attr(mcm_scif_dev_t *smd, dat_mix_attr_t *pmsg) { int len, ret; if (pmsg->hdr.flags & MIX_OP_SET) { len = sizeof(dat_mix_attr_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } /* SET not supported */ len = sizeof(dat_mix_hdr_t); pmsg->hdr.flags = MIX_OP_RSP; pmsg->hdr.status = MIX_EINVAL; /* send back response */ return (scif_send_msg(smd->scif_op_ep, pmsg, len)); } else { dat_mix_attr_t msg; /* GET attributes and send back response and data */ mix_get_prov_attr(smd, &msg.attr); len = sizeof(dat_mix_attr_t); msg.hdr.ver = DAT_MIX_VER; msg.hdr.op = MIX_PROV_ATTR; msg.hdr.flags = MIX_OP_RSP; msg.hdr.status = MIX_SUCCESS; return (scif_send_msg(smd->scif_op_ep, &msg, len)); } } static int mix_listen_free(mcm_scif_dev_t *smd, dat_mix_hdr_t *pmsg) { int len; mcm_cm_t *cm; mlog(8, " MIX_LISTEN_FREE: sid 0x%x \n", pmsg->req_id); mpxy_lock(&smd->llock); cm = get_head_entry(&smd->llist); while (cm) { if (cm->sid == (uint16_t)pmsg->req_id) break; cm = get_next_entry(&cm->entry, &smd->llist); } mpxy_unlock(&smd->llock); if (cm) { mcm_dqlisten_free(smd, cm); pmsg->status = MIX_SUCCESS; } else { mlog(0, " MIX_LISTEN_FREE: ERR: sid 0x%x not found\n", pmsg->req_id); pmsg->status = MIX_EINVAL; } /* send back response */ pmsg->flags = MIX_OP_RSP; len = sizeof(dat_mix_hdr_t); return (scif_send_msg(smd->scif_op_ep, pmsg, len)); } static int mix_listen(mcm_scif_dev_t *smd, dat_mix_listen_t *pmsg) { int len, ret; uint16_t lport; mcm_cm_t *cm; /* hdr already read, get operation data */ len = sizeof(dat_mix_listen_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } /* create listen EP for provided SID */ mpxy_lock(&smd->md->plock); lport = mcm_get_port(smd->md->ports, pmsg->sid, (uint64_t)smd); mpxy_unlock(&smd->md->plock); if (lport == pmsg->sid) { cm = m_cm_create(smd, NULL, NULL); if (cm == NULL) { pmsg->hdr.status = MIX_ENOMEM; mpxy_lock(&smd->md->plock); mcm_free_port(smd->md->ports, lport); mpxy_unlock(&smd->md->plock); } else { cm->state = MCM_LISTEN; cm->sid = lport; cm->sp_ctx = pmsg->sp_ctx; cm->msg.sport = htons((uint16_t)lport); cm->msg.sqpn = htonl(smd->md->qp->qp_num); cm->msg.saddr1.qp_type = IBV_QPT_UD; cm->msg.saddr1.lid = smd->md->lid; cm->msg.saddr1.port = smd->md->port; cm->msg.saddr1.ep_map = smd->md->addr.ep_map; #ifdef MPXYD_LOCAL_SUPPORT cm->msg.sys_guid = system_guid; /* network order */ #else cm->msg.sys_guid = rand(); #endif memcpy(&cm->msg.saddr1.gid[0], &smd->md->addr.gid, 16); mcm_qlisten(smd, cm); pmsg->hdr.status = MIX_SUCCESS; } mlog(2, " [%d:%d] cm %p sPORT 0x%x cm_qp 0x%x %s \n", smd->md->mc->scif_id, smd->entry.tid, cm, ntohs(cm->msg.sport), smd->md->qp->qp_num, mcm_map_str(cm->md->addr.ep_map)); } else { mlog(1, " MIX_LISTEN: WARN smd %p sid 0x%x port->ctx %p, backlog %d, qpn 0x%x lid 0x%x EADDRINUSE\n", smd, pmsg->sid, mcm_get_port_ctx(smd->md->ports, pmsg->sid), pmsg->backlog, smd->md->qp->qp_num, ntohs(smd->md->lid)); pmsg->hdr.status = MIX_EADDRINUSE; } /* send back response */ pmsg->hdr.flags = MIX_OP_RSP; len = sizeof(dat_mix_listen_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } /* locate MR object */ mcm_mr_t *mix_get_mr(mcm_scif_dev_t *smd, uint32_t tid) { mcm_mr_t *mr = NULL; mpxy_lock(&smd->mrlock); mr = get_head_entry(&smd->mrlist); while (mr) { if (mr->entry.tid == tid) break; mr = get_next_entry(&mr->entry, &smd->mrlist); } mpxy_unlock(&smd->mrlock); return mr; } /* locate CQ object */ mcm_cq_t *mix_get_cq(mcm_scif_dev_t *smd, uint32_t tid) { mcm_cq_t *cq = NULL; mpxy_lock(&smd->cqlock); cq = get_head_entry(&smd->cqlist); while (cq) { if (cq->entry.tid == tid) break; cq = get_next_entry(&cq->entry, &smd->cqlist); } mpxy_unlock(&smd->cqlock); return cq; } /* locate QP object, qpt list */ mcm_qp_t *mix_get_qp(mcm_scif_dev_t *smd, uint32_t tid) { mcm_qp_t *qp = NULL; mpxy_lock(&smd->qptlock); qp = get_head_entry(&smd->qptlist); while (qp) { if (qp->t_entry.tid == tid) break; qp = get_next_entry(&qp->t_entry, &smd->qptlist); } mpxy_unlock(&smd->qptlock); return qp; } /* locate CM object */ mcm_cm_t *mix_get_cm(mcm_scif_dev_t *smd, uint32_t tid) { mcm_cm_t *cm = NULL; mpxy_lock(&smd->clock); cm = get_head_entry(&smd->clist); while (cm) { if (cm->entry.tid == tid) break; cm = get_next_entry(&cm->entry, &smd->clist); } mpxy_unlock(&smd->clock); return cm; } /* smd->cqlock held */ void m_cq_free(struct mcm_cq *m_cq) { ibv_destroy_cq(m_cq->ib_cq); ibv_destroy_comp_channel(m_cq->ib_ch); remove_entry(&m_cq->entry); m_cq->entry.tid = 0; m_cq->ref_cnt--; free(m_cq); } /* destroy proxy CQ, fits in header */ static int mix_cq_destroy(mcm_scif_dev_t *smd, dat_mix_hdr_t *pmsg) { int len; struct mcm_cq *m_cq; mlog(8, " MIX_CQ_DESTROY: cq_id 0x%x\n", pmsg->req_id); MCNTR(smd->md, MCM_CQ_FREE); /* Find the CQ */ m_cq = mix_get_cq(smd, pmsg->req_id); if (!m_cq) { mlog(0, " ERR: mix_get_cq, id %d, not found\n", pmsg->req_id); goto err; } mpxy_lock(&smd->cqlock); m_cq_free(m_cq); mpxy_unlock(&smd->cqlock); pmsg->status = MIX_SUCCESS; goto resp; err: mlog(0, " ERR: %s\n", strerror(errno)); if (m_cq) free(m_cq); pmsg->status = MIX_EINVAL; resp: /* send back response */ pmsg->flags = MIX_OP_RSP; len = sizeof(dat_mix_hdr_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } #define MCM_CQ_TX 1 #define MCM_CQ_RX 2 /* Create CQ object, IB channel and CQ, insert on list, update object tid */ static int m_cq_create(mcm_scif_dev_t *smd, int cq_len, struct mcm_cq **m_cq_out, int type) { struct mcm_cq *m_cq; int ret = 0; m_cq = malloc(sizeof(mcm_cq_t)); if (!m_cq) goto err; memset(m_cq, 0, sizeof(mcm_cq_t)); init_list(&m_cq->entry); m_cq->smd = smd; m_cq->ib_ch = ibv_create_comp_channel(smd->md->ibctx); if (!m_cq->ib_ch) goto err; if (mcm_config_fd(m_cq->ib_ch->fd)) goto err; m_cq->ib_cq = ibv_create_cq(smd->md->ibctx, cq_len, m_cq, m_cq->ib_ch, 0); if (!m_cq->ib_cq) goto err; ret = ibv_req_notify_cq(m_cq->ib_cq, 0); if (ret) goto err; if (type == MCM_CQ_TX) { mpxy_lock(&smd->cqlock); insert_tail(&m_cq->entry, &smd->cqlist, m_cq); m_cq->cq_id = m_cq->entry.tid; mpxy_unlock(&smd->cqlock); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); mlog(8, " cq %p id %d on TX cqlist\n", m_cq, m_cq->cq_id); } else { mpxy_lock(&smd->cqrlock); insert_tail(&m_cq->entry, &smd->cqrlist, m_cq); m_cq->cq_id = m_cq->entry.tid; mpxy_unlock(&smd->cqrlock); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); mlog(8, " cq %p id %d on RX cqlist\n", m_cq, m_cq->cq_id); } m_cq->ref_cnt++; *m_cq_out = m_cq; return 0; err: mlog(0, " ERR: m_cq %p ib_ch %p, ib_cq %p ret %d %s\n", m_cq, m_cq ? m_cq->ib_ch:NULL, m_cq ? m_cq->ib_cq:NULL, ret, strerror(errno)); if (m_cq) free(m_cq); return -1; } /* create new proxy-out CQ */ static int mix_cq_create(mcm_scif_dev_t *smd, dat_mix_cq_t *pmsg) { int len, ret, cq_len; struct mcm_cq *new_mcq; /* hdr already read, get operation data */ len = sizeof(dat_mix_cq_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } cq_len = max(pmsg->cq_len, mcm_tx_cq_size); mlog(8, " MIX_CQ_CREATE: cq_len = %d,%d mic_ctx = %Lx, dev_id %d\n", pmsg->cq_len, cq_len, pmsg->cq_ctx, smd->entry.tid); if (m_cq_create(smd, cq_len, &new_mcq, MCM_CQ_TX)) goto err; new_mcq->cq_ctx = pmsg->cq_ctx; pmsg->cq_len = cq_len; pmsg->cq_id = new_mcq->cq_id; pmsg->cq_ctx = (uint64_t)new_mcq; pmsg->hdr.status = MIX_SUCCESS; mlog(8, " new cq_id %d, mpxyd_ctx %p, mcm_ctx %p\n", pmsg->cq_id, pmsg->cq_ctx, new_mcq->cq_ctx); MCNTR(smd->md, MCM_CQ_CREATE); goto resp; err: mlog(0, " ERR: %s\n", strerror(errno)); pmsg->hdr.status = MIX_EINVAL; resp: /* send back response */ pmsg->hdr.flags = MIX_OP_RSP; len = sizeof(dat_mix_cq_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } /* called with smd->qptlist lock held */ void m_qp_free(struct mcm_qp *m_qp) { if (m_qp->t_entry.tid) remove_entry(&m_qp->t_entry); if (m_qp->r_entry.tid) { /* MXS - MXS, also qprlist */ mpxy_lock(&m_qp->smd->qprlock); remove_entry(&m_qp->r_entry); mpxy_unlock(&m_qp->smd->qprlock); } mlog(8, " m_qp %p m_cm %p cm_id %d\n", m_qp, m_qp->cm, m_qp->cm ? m_qp->cm->entry.tid:0); if (m_qp->cm) { /* unlink CM, serialized */ struct mcm_cm *cm = m_qp->cm; mpxy_lock(&cm->lock); m_qp->cm->ref_cnt--; /* QP ref */ m_qp->cm->m_qp = NULL; m_qp->cm = NULL; mpxy_unlock(&cm->lock); mcm_dqconn_free(m_qp->smd, cm); } mcm_flush_qp(m_qp); /* move QP to error, flush & destroy */ #ifdef MCM_PROFILE if (mcm_profile) mcm_qp_prof_pr(m_qp, MCM_QP_ALL); #endif /* resource pools, proxy_in CQ, and qp object */ m_po_destroy_bpool(m_qp); m_pi_destroy_bpool(m_qp); if (m_qp->m_cq_rx) { mpxy_lock(&m_qp->smd->cqrlock); m_cq_free(m_qp->m_cq_rx); mpxy_unlock(&m_qp->smd->cqrlock); } mpxy_lock_destroy(&m_qp->txlock); /* proxy out */ mpxy_lock_destroy(&m_qp->rxlock); /* proxy in */ m_qp->smd->ref_cnt--; free(m_qp); } /* destroy proxy QP, fits in hdr */ static int mix_qp_destroy(mcm_scif_dev_t *smd, dat_mix_hdr_t *pmsg) { int len; struct mcm_qp *m_qp; MCNTR(smd->md, MCM_QP_FREE); /* Find the QP */ m_qp = mix_get_qp(smd, pmsg->req_id); if (!m_qp) { mlog(0, " ERR: mix_get_qp, id %d, not found\n", pmsg->req_id); goto err; } mlog(8, " QP_t - id 0x%x m_qp = %p\n", pmsg->req_id, m_qp); mpxy_lock(&smd->qptlock); m_qp_free(m_qp); mpxy_unlock(&smd->qptlock); pmsg->status = MIX_SUCCESS; goto resp; err: mlog(0, " ERR: %s\n", strerror(errno)); if (m_qp) free(m_qp); pmsg->status = MIX_EINVAL; resp: /* send back response */ pmsg->flags = MIX_OP_RSP; len = sizeof(dat_mix_hdr_t); if (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)) return -1; mlog(8, " QP_t %p response sent to MIC client\n", m_qp); return 0; } static int mix_qp_modify(mcm_scif_dev_t *smd, dat_mix_qp_t *pmsg) { return 0; } void m_qp_destroy_pi(struct mcm_qp *m_qp) { mlog(2, " Destroying PI QP1r %p\n", m_qp); if (m_qp->ib_qp1) { ibv_destroy_qp(m_qp->ib_qp1); m_qp->ib_qp1 = NULL; } } /* create 2nd qp for proxy-in service, remote is not proxy-in so we need 2 QPs */ int m_qp_create_pi(mcm_scif_dev_t *smd, struct mcm_qp *m_qp) { struct ibv_qp_init_attr qp_create; /* Setup attributes and create 2nd qp, for proxy_in TX/RX services */ memset((void *)&qp_create, 0, sizeof(qp_create)); qp_create.cap.max_recv_wr = mcm_rx_entries; /* proxy_in, inbound 0 byte RW's with immed data, WR's */ qp_create.cap.max_recv_sge = 1; qp_create.cap.max_send_wr = mcm_tx_entries; qp_create.cap.max_send_sge = 1; if (smd->md->indata) qp_create.cap.max_inline_data = mcm_ib_inline; qp_create.qp_type = IBV_QPT_RC; qp_create.send_cq = m_qp->m_cq_tx->ib_cq; /* signal rate adjusted to avoid CQ overrun */ qp_create.recv_cq = m_qp->m_cq_rx->ib_cq; qp_create.qp_context = (void *)m_qp; m_qp->ib_qp1 = ibv_create_qp(smd->md->pd, &qp_create); if (!m_qp->ib_qp1) { mlog(0, " ERR: ibv_create_qp, %s\n", strerror(errno)); return -1; } /* set to INIT state */ if (mcm_modify_qp(m_qp->ib_qp1, IBV_QPS_INIT, 0, 0, NULL)) { ibv_destroy_qp(m_qp->ib_qp1); m_qp->ib_qp1 = NULL; return -1; } /* init proxy-in QP1 attributes, to be exhanged with peer */ m_qp->qp_attr1.ctx = (uint64_t)m_qp; m_qp->qp_attr1.qp_type = IBV_QPT_RC; m_qp->qp_attr1.qp_num = m_qp->ib_qp1->qp_num; m_qp->qp_attr1.state = m_qp->ib_qp1->state; m_qp->qp_attr1.max_recv_wr = mcm_rx_entries; m_qp->qp_attr1.max_recv_sge = 1; m_qp->qp_attr1.max_send_wr = mcm_tx_entries; m_qp->qp_attr1.max_send_sge = 1; m_qp->qp_attr1.max_inline_data = mcm_ib_inline; return 0; } static int m_qp_create(mcm_scif_dev_t *smd, struct ibv_qp_init_attr *attr, uint32_t scq_id, uint32_t rcq_id, struct mcm_qp **new_mqp) { struct mcm_qp *m_qp; struct mcm_cq *m_cq_tx; int ret; /* Create QP object, save QPr info from MIC client */ m_qp = malloc(sizeof(mcm_qp_t)); if (!m_qp) goto err; memset(m_qp, 0, sizeof(mcm_qp_t)); init_list(&m_qp->t_entry); init_list(&m_qp->r_entry); mpxy_lock_init(&m_qp->txlock, NULL); mpxy_lock_init(&m_qp->rxlock, NULL); m_qp->smd = smd; /* proxy-out WR pool */ if (m_po_create_bpool(m_qp, attr->cap.max_send_wr)) goto err; /* Find the CQ's for this QP for transmitting */ m_cq_tx = mix_get_cq(smd, scq_id); if (!m_cq_tx) { mlog(0, " ERR: mix_get_cq_tx, id %d, not found\n", scq_id); goto err; } m_qp->m_cq_tx = m_cq_tx; /* always need rx_cq, WC traffic in from PI service even when no PI local (MSS) */ if (m_cq_create(smd, mcm_rx_cq_size, &m_qp->m_cq_rx, MCM_CQ_RX)) goto err; /* plus proxy-in: create WR and WC pools, rx_cq */ if (smd->md->addr.ep_map == MIC_XSOCK_DEV) { if (m_pi_create_bpool(m_qp, attr->cap.max_recv_wr)) goto err; /* get client CQ context for proxy-in receive messages if client rcq exists */ if (scq_id == rcq_id) m_qp->m_cq_rx->cq_ctx = m_cq_tx->cq_ctx; else if (rcq_id) { struct mcm_cq *m_cq_rx; m_cq_rx = mix_get_cq(smd, rcq_id); if (!m_cq_rx) { mlog(0, " ERR: mix_get_cq_rx, rcq_id %d, not found\n", rcq_id); goto err; } m_qp->m_cq_rx->cq_ctx = m_cq_rx->cq_ctx; } attr->recv_cq = m_qp->m_cq_rx->ib_cq; /* proxy for MIC client */ } else attr->recv_cq = m_qp->m_cq_rx->ib_cq; /* * NOTE: Proxy-in mode we may need another QP if remote ep_map is not the same. * Default to single QP, assuming both proxy-out and proxy-in services. Create the * other if needed at CM request time when we know remote side mappings differ and * require separate QP's for RX and TX services. * * QP2 is proxy-out TX always. * QP2 is also proxy-in RX if local and remote is MIC_XSOCK_DEV. * QP1 is proxy-in TX and RX if local is MIC_XSOCK_DEV and remote is not. * QP1 is not needed if both sides are not MIC_XSOCK_DEV, QP1 on MIC. */ attr->send_cq = m_cq_tx->ib_cq; attr->qp_context = (void *)m_qp; m_qp->ib_qp2 = ibv_create_qp(smd->md->pd, attr); if (!m_qp->ib_qp2) { mlog(0, " ERR: ibv_create_qp, %s\n", strerror(errno)); goto err; } /* set to INIT state */ ret = mcm_modify_qp(m_qp->ib_qp2, IBV_QPS_INIT, 0, 0, NULL); if (ret) { ibv_destroy_qp(m_qp->ib_qp2); m_qp->ib_qp2 = NULL; goto err; } /* init QPt with ib qp info, QPr included for proxy-in option */ m_qp->qp_attr2.ctx = (uint64_t)m_qp; m_qp->qp_attr2.qp_type = m_qp->ib_qp2->qp_type; m_qp->qp_attr2.qp_num = m_qp->ib_qp2->qp_num; m_qp->qp_attr2.state = m_qp->ib_qp2->state; m_qp->qp_attr2.max_recv_wr = attr->cap.max_recv_wr; m_qp->qp_attr2.max_recv_sge = attr->cap.max_recv_sge; m_qp->qp_attr2.max_send_wr = attr->cap.max_send_wr; m_qp->qp_attr2.max_send_sge = attr->cap.max_send_sge; if (smd->md->indata) m_qp->qp_attr2.max_inline_data = attr->cap.max_inline_data; /* don't post recv msgs until RTU, if local MXS or local MSS to remote MXS */ if (smd->md->addr.ep_map == MIC_XSOCK_DEV) memcpy(&m_qp->qp_attr1, &m_qp->qp_attr2, sizeof(dat_mix_qp_attr_t)); /* TX proxy-out thread queue */ mpxy_lock(&smd->qptlock); insert_tail(&m_qp->t_entry, &smd->qptlist, m_qp); mpxy_unlock(&smd->qptlock); m_qp->qp_attr2.qp_id = m_qp->t_entry.tid; m_qp->smd->ref_cnt++; *new_mqp = m_qp; return 0; err: ret = errno ? errno:EINVAL; m_po_destroy_bpool(m_qp); m_pi_destroy_bpool(m_qp); if (m_qp->m_cq_rx) { mpxy_lock(&smd->cqrlock); m_cq_free(m_qp->m_cq_rx); mpxy_unlock(&smd->cqrlock); } if (m_qp) free(m_qp); return ret; } /* create new proxy QP */ static int mix_qp_create(mcm_scif_dev_t *smd, dat_mix_qp_t *pmsg) { int len, ret; struct ibv_qp_init_attr qp_create; struct mcm_qp *new_mqp = NULL; /* hdr already read, get operation data */ len = sizeof(dat_mix_qp_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return -1; } mlog(8, " Client QP_r - dev_id %d qpn 0x%x, ctx %p, rq %d,%d rcq_id %d\n", smd->entry.tid, pmsg->qp_r.qp_num, pmsg->qp_r.ctx, pmsg->qp_r.max_recv_wr, pmsg->qp_r.max_recv_sge, pmsg->qp_r.rcq_id); mlog(8, " Client QP_t - wr %d sge %d inline %d sq %d,%d scq_id %d\n", pmsg->qp_t.max_send_wr, pmsg->qp_t.max_send_sge, pmsg->qp_t.max_inline_data, pmsg->qp_t.max_send_wr, pmsg->qp_t.max_send_sge, pmsg->qp_t.scq_id); /* Setup attributes and create qp, for TX services */ memset((void *)&qp_create, 0, sizeof(qp_create)); qp_create.cap.max_recv_wr = mcm_rx_entries; /* proxy_in, 0 byte RW's with idata */ qp_create.cap.max_recv_sge = 1; qp_create.cap.max_send_wr = mcm_tx_entries; /* proxy-out WR separate from client WR */ qp_create.cap.max_send_sge = min(pmsg->qp_t.max_send_sge, DAT_MIX_SGE_MAX); if (smd->md->indata) qp_create.cap.max_inline_data = mcm_ib_inline; qp_create.qp_type = IBV_QPT_RC; mlog(8, " QP_t - client max_wr %d, proxy_out max_wr %d\n", pmsg->qp_t.max_send_wr, qp_create.cap.max_send_wr); pmsg->hdr.status = m_qp_create(smd, &qp_create, pmsg->qp_t.scq_id, pmsg->qp_r.rcq_id, &new_mqp); if (pmsg->hdr.status) { mlog(0, " ERR: QP_t - wr req %d act %d, sge %d, inline %d, QP's %d\n", pmsg->qp_t.max_send_wr, qp_create.cap.max_send_wr, pmsg->qp_t.max_send_sge, pmsg->qp_t.max_inline_data, ((uint64_t *)smd->md->cntrs)[MCM_QP_CREATE] - ((uint64_t *)smd->md->cntrs)[MCM_QP_FREE]); goto resp; } /* return QPt, QPr info to MIC client, insert on QP list */ memcpy(&pmsg->qp_t, &new_mqp->qp_attr2, sizeof(dat_mix_qp_attr_t)); if (smd->md->addr.ep_map == MIC_XSOCK_DEV) memcpy(&pmsg->qp_r, &new_mqp->qp_attr1, sizeof(dat_mix_qp_attr_t)); else { new_mqp->qp_attr1.qp_num = pmsg->qp_r.qp_num; /* QP1 == MIC QPr */ new_mqp->qp_attr1.qp_type = pmsg->qp_r.qp_type; } /* return qp_id, proxy buffer, and wr pool info */ pmsg->hdr.status = MIX_SUCCESS; pmsg->wr_off = new_mqp->wr_off; pmsg->wr_len = new_mqp->wr_end; pmsg->m_inline = mix_inline_threshold; MCNTR(smd->md, MCM_QP_CREATE); mlog(8, " Proxy QP_t - qpn %x q_id %d ctx %p sq %d,%d rq %d,%d, il %d\n", pmsg->qp_t.qp_num, pmsg->qp_t.qp_id, new_mqp, qp_create.cap.max_send_wr, qp_create.cap.max_send_sge, qp_create.cap.max_recv_wr, qp_create.cap.max_recv_sge, qp_create.cap.max_inline_data); mlog(8, " Proxy QP_r - qpn %x q_id %d ctx %p sq %d,%d rq %d,%d rcq_id %d\n", pmsg->qp_r.qp_num, pmsg->qp_t.qp_id, pmsg->qp_r.ctx, pmsg->qp_r.max_send_wr, pmsg->qp_r.max_send_sge, pmsg->qp_r.max_recv_wr, pmsg->qp_r.max_recv_sge, pmsg->qp_r.rcq_id); resp: /* send back response */ pmsg->hdr.flags = MIX_OP_RSP; len = sizeof(dat_mix_qp_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } typedef struct dat_mix_mr_v4 { dat_mix_hdr_t hdr; uint32_t mr_id; uint32_t len; uint64_t off; uint64_t ctx; } dat_mix_mr_v4_t; /* MIX_MR_CREATE: new proxy mr, insert on mr_list */ static int mix_mr_create(mcm_scif_dev_t *smd, dat_mix_mr_t *pmsg) { int len, ret; struct mcm_mr *m_mr = NULL; /* hdr already read, get operation data */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_mr_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_mr_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return -1; } /* create MR object, save mr info, add to mrlist, return mr_id */ m_mr = malloc(sizeof(mcm_mr_t)); if (!m_mr) { pmsg->hdr.status = MIX_ENOMEM; goto resp; } memset(m_mr, 0, sizeof(mcm_mr_t)); init_list(&m_mr->entry); m_mr->smd = smd; memcpy(&m_mr->mre, pmsg, sizeof(dat_mix_mr_t)); mpxy_lock(&smd->mrlock); insert_tail(&m_mr->entry, &smd->mrlist, m_mr); mpxy_unlock(&smd->mrlock); pmsg->mr_id = m_mr->entry.tid; smd->ref_cnt++; pmsg->hdr.status = MIX_SUCCESS; mlog(8, " mr[%d] - len %d lmr_ctx %p, scif_addr %Lx, scif_off 0x%x, ib addr %Lx ib_rkey 0x%x\n", pmsg->mr_id, pmsg->mr_len, pmsg->ctx, pmsg->sci_addr, pmsg->sci_off, pmsg->ib_addr, pmsg->ib_rkey); resp: /* send back response */ pmsg->hdr.flags = MIX_OP_RSP; if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_mr_compat_t); else len = sizeof(dat_mix_mr_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } /* called with smd->mrlist lock held */ void m_mr_free(struct mcm_mr *m_mr) { remove_entry(&m_mr->entry); m_mr->smd->ref_cnt--; free(m_mr); } /* proxy mr object cleanup */ static int m_mr_destroy(mcm_scif_dev_t *smd, int mr_id) { struct mcm_mr *m_mr = NULL; int ret = MIX_EAGAIN; /* get entry and remove, if xfer not in progress */ m_mr = mix_get_mr(smd, mr_id); if (m_mr) { mpxy_lock(&smd->mrlock); if (m_mr->busy) goto done; m_mr_free(m_mr); ret = MIX_SUCCESS; } else ret = MIX_EINVAL; done: mpxy_unlock(&smd->mrlock); return ret; } /* MIX_MR_FREE */ static int mix_mr_free(mcm_scif_dev_t *smd, dat_mix_mr_t *pmsg) { int len, ret; /* hdr already read, get operation data */ len = sizeof(dat_mix_mr_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return -1; } mlog(8, " mr[%d] - len %d lmr_ctx %p, scif_addr 0x%p, scif_off 0x%x\n", pmsg->mr_id, pmsg->mr_len, pmsg->ctx, pmsg->sci_addr, pmsg->sci_addr); /* status only, hdr */ pmsg->hdr.status = m_mr_destroy(smd, pmsg->mr_id); pmsg->hdr.flags = MIX_OP_RSP; len = sizeof(dat_mix_hdr_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } void mix_dto_event(struct mcm_cq *m_cq, struct dat_mix_wc *wc, int nc) { dat_mix_dto_comp_t msg; int i; /* send DTO events to MIC client */ msg.hdr.ver = m_cq->smd->md->mc->ver; msg.hdr.op = MIX_DTO_EVENT; msg.hdr.flags = MIX_OP_REQ; msg.cq_id = m_cq->cq_id; msg.cq_ctx = m_cq->cq_ctx; msg.wc_cnt = nc; if (!m_cq->smd->scif_op_ep) return; for (i=0; i < nc; i++) { memcpy(&msg.wc[i], &wc[i], sizeof(*wc)); if (msg.wc[i].status != IBV_WC_SUCCESS) { if (msg.wc[i].status != IBV_WC_WR_FLUSH_ERR) { mlog(0, " ERROR (ep=%d): cq %p id %d ctx %p stat %d" " [%d:%d] op 0x%x ln %d wr_id %p wc's %d verr 0x%x errno=%d,%s\n", m_cq->smd->md->mc->scif_id, m_cq->smd->entry.tid, m_cq->smd->scif_op_ep, m_cq, msg.cq_id, msg.cq_ctx, msg.wc[i].status, msg.wc[i].opcode, msg.wc[i].byte_len, msg.wc[i].wr_id, msg.wc_cnt, msg.wc[i].vendor_err, errno, strerror(errno)); } } else { mlog(0x10, " SUCCESS (ep=%d): cq %p id %d ctx %p stat %d" " op 0x%x ln %d wr_id %p wc's %d verr 0x%x\n", m_cq->smd->scif_op_ep, m_cq, msg.cq_id, msg.cq_ctx, msg.wc[i].status, msg.wc[i].opcode, msg.wc[i].byte_len, msg.wc[i].wr_id, msg.wc_cnt, msg.wc[i].vendor_err); } } /* multi-thread sync */ mpxy_lock(&m_cq->smd->evlock); scif_send_msg(m_cq->smd->scif_ev_ep, (void*)&msg, sizeof(msg)); mpxy_unlock(&m_cq->smd->evlock); } void mix_cm_event(mcm_cm_t *m_cm, uint32_t event) { dat_mix_cm_event_t msg; int len; /* send event to MIC client */ msg.hdr.ver = m_cm->md->mc->ver; msg.hdr.op = MIX_CM_EVENT; msg.hdr.flags = MIX_OP_REQ; msg.cm_id = m_cm->cm_id; msg.cm_ctx = m_cm->cm_ctx; msg.event = event; if (event == DAT_CONNECTION_EVENT_DISCONNECTED) { mpxy_lock(&m_cm->lock); m_cm->state = MCM_FREE; mpxy_unlock(&m_cm->lock); } mlog(2, " MIX_CM_EVENT: cm %p cm_id %d, ctx %p, event 0x%x dev_id %d\n", m_cm, m_cm->entry.tid, msg.cm_ctx, event, m_cm->smd->entry.tid); len = sizeof(dat_mix_cm_event_t); mpxy_lock(&m_cm->smd->evlock); if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) { mlog(0, " Warning: cm %p cm_id %d, ctx %p, event 0x%x -> no MIC client\n", m_cm, m_cm->entry.tid, msg.cm_ctx, event); } mpxy_unlock(&m_cm->smd->evlock); } /* Active: new connection request operation, consumer context, create CM object */ static int mix_cm_req_out(mcm_scif_dev_t *smd, dat_mix_cm_t *pmsg, scif_epd_t scif_ep) { int len, ret; struct mcm_qp *m_qp = NULL; struct mcm_cm *m_cm = NULL; /* hdr already read, get operation data, support compat mode */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d ver %d\n", ret, len, smd->md->mc->ver); return ret; } /* Find the QP for linking */ m_qp = mix_get_qp(smd, pmsg->qp_id); if (!m_qp) { mlog(0, " ERR: mix_get_qp, id %d, not found\n", pmsg->qp_id); goto err; } /* Create CM, init saddr1 and saddr2 info for QPt and QPr */ m_cm = m_cm_create(smd, m_qp, &pmsg->msg.daddr1); if (!m_cm) goto err; /* * MIC client CM id, ctx, daddr1 = remote CM (lid,ep_map) * * MSS Proxy-out -> Host, MSS Direct-in, or MXS Proxy-in via fabric (2 QPs) * saddr1 = IB QPr from MIC, setup with cm_create, QP1->QP2, * saddr2 = IB QPt from MPXYD, setup with cm_create, QP2->QP1 * * MXS Proxy-out/in -> MXS Proxy-in/out via fabric (1 QPs) * saddr1 = N/A * saddr2 = IB QPt/QPr from MPXYD, setup with cm_create * * MXS Proxy-out/in -> MXS Proxy-in/out inter-platform (0 QPs) * saddr1 = N/A * saddr2 = N/A * */ m_cm->cm_id = pmsg->cm_id; m_cm->cm_ctx = pmsg->cm_ctx; m_cm->msg.dqpn = pmsg->msg.dqpn; m_cm->msg.dport = pmsg->msg.dport; m_cm->msg.p_size = pmsg->msg.p_size; if (m_cm->msg.p_size) memcpy(m_cm->msg.p_data, pmsg->msg.p_data, ntohs(m_cm->msg.p_size)); memcpy(&m_cm->msg.daddr1, &pmsg->msg.daddr1, sizeof(dat_mcm_addr_t)); memcpy(&m_cm->msg.daddr2, &pmsg->msg.daddr1, sizeof(dat_mcm_addr_t)); mcm_hton_wrc((mcm_wrc_info_t *)m_cm->msg.p_proxy, &m_qp->wrc); /* PI WR/WC raddr,rkey info */ m_cm->msg.seg_sz = mix_buffer_sg_po2; mlog(2," QP2 0x%x QP1 0x%x:" " CM sPORT 0x%x sQPN 0x%x sLID 0x%x - dPORT 0x%x dQPN 0x%x dLID 0x%x, psz %d %s\n", m_cm->msg.saddr2.qpn, m_cm->msg.saddr1.qpn, ntohs(m_cm->msg.sport), ntohl(m_cm->msg.sqpn), ntohs(m_cm->msg.saddr1.lid), ntohs(m_cm->msg.dport), ntohl(m_cm->msg.dqpn), ntohs(m_cm->msg.daddr1.lid), ntohs(m_cm->msg.p_size), mcm_map_str(m_cm->msg.daddr1.ep_map)); /* send request on wire */ if (mcm_cm_req_out(m_cm)) goto err; /* insert on cm list, update proxy CM object tid */ mcm_qconn(smd, m_cm); pmsg->cm_id = m_cm->entry.tid; pmsg->cm_ctx = (uint64_t)m_cm; pmsg->hdr.status = MIX_SUCCESS; goto resp; err: mlog(0, " ERR: %s\n", strerror(errno)); if (m_cm) free(m_cm); pmsg->hdr.status = MIX_EINVAL; resp: mlog(8, " MPXYD id 0x%x, ctx %p - MIC id 0x%x, ctx %p dev_id %d\n", pmsg->cm_id, pmsg->cm_ctx, m_cm->cm_id, m_cm->cm_ctx, smd->entry.tid); /* send back response */ pmsg->hdr.flags = MIX_OP_RSP; /* support compat mode */ if (m_cm->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t); else len = sizeof(dat_mix_cm_t); return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len)); } /* disconnect request out */ static int mix_cm_disc_out(mcm_scif_dev_t *smd, dat_mix_cm_t *pmsg, scif_epd_t scif_ep) { int len, ret; struct mcm_cm *m_cm; /* hdr already read, get operation data, support compat mode */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } mlog(8, " cm_id %d, cm_ctx %p, qp_id %d \n", pmsg->cm_id, (void*)pmsg->cm_ctx, pmsg->qp_id); /* Find the CM for linking */ m_cm = mix_get_cm(smd, pmsg->cm_id); if (!m_cm) { mlog(2, " CM_DREQ mix_get_cm, id %d, not found\n", pmsg->cm_id); return 0; } /* process DREQ */ mcm_cm_disc(m_cm); return 0; } /* Active, reply received, send RTU, unsolicited channel */ static int mix_cm_rtu_out(mcm_scif_dev_t *smd, dat_mix_cm_t *pmsg, scif_epd_t scif_ep) { int len, ret; struct mcm_cm *m_cm; /* hdr already read, get operation data, support compat mode */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } mlog(8, " cm_id %d, cm_ctx %p, qp_id %d dev_id\n", pmsg->cm_id, (void*)pmsg->cm_ctx, pmsg->qp_id, smd->entry.tid); /* Find the CM for linking */ m_cm = mix_get_cm(smd, pmsg->cm_id); if (!m_cm) { mlog(0, " ERR: mix_get_cm, id %d, not found\n", pmsg->cm_id); return -1; } mlog(2," QPt 0x%x QPr 0x%x -> dport 0x%x, dqpn 0x%x dlid 0x%x %Lx\n", m_cm->m_qp?m_cm->m_qp->qp_attr2.qp_num:0, m_cm->m_qp?m_cm->m_qp->qp_attr1.qp_num:0, ntohs(m_cm->msg.dport), ntohl(m_cm->msg.dqpn), ntohs(m_cm->msg.daddr1.lid), ntohll(m_cm->msg.sys_guid)); /* send RTU on wire */ mcm_cm_rtu_out(m_cm); return 0; } /* ACTIVE: CR reject from server, unsolicited channel */ int mix_cm_rej_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len) { dat_mix_cm_t msg; int len; mlog(2, " dev_id %d cm_id %d, ctx %p, m_cm %p pkt %p pln %d psz %d r_guid %Lx\n", m_cm->smd->entry.tid, m_cm->cm_id, m_cm->cm_ctx, m_cm, pkt, pkt_len, ntohs(pkt->p_size), ntohll(pkt->sys_guid)); /* Forward appropriate reject message to MIC client */ if (ntohs(pkt->op) == MCM_REJ_USER) { MCNTR(m_cm->md, MCM_CM_REJ_USER_IN); msg.hdr.op = MIX_CM_REJECT_USER; } else { MCNTR(m_cm->md, MCM_CM_REJ_IN); msg.hdr.op = MIX_CM_REJECT; } msg.hdr.ver = m_cm->md->mc->ver; msg.hdr.flags = MIX_OP_REQ; msg.cm_id = m_cm->cm_id; msg.cm_ctx = m_cm->cm_ctx; memcpy(&msg.msg, pkt, pkt_len); mcm_pr_addrs(2, pkt, m_cm->state, 1); /* save dst id, daddr1 and daddr2 info, remote guid, pdata, proxy data */ m_cm->msg.d_id = pkt->s_id; m_cm->msg.sys_guid = pkt->sys_guid; memcpy(m_cm->msg.p_data, &pkt->p_data, ntohs(pkt->p_size)); memcpy(m_cm->msg.p_proxy, pkt->p_proxy, DAT_MCM_PROXY_DATA); memcpy(&m_cm->msg.daddr1, &pkt->saddr1, sizeof(dat_mcm_addr_t)); memcpy(&m_cm->msg.daddr2, &pkt->saddr2, sizeof(dat_mcm_addr_t)); mpxy_lock(&m_cm->lock); m_cm->state = MCM_REJECTED; mpxy_unlock(&m_cm->lock); /* clean up proxy QP, CQ resources here ??? */ /* support compat mode */ if (m_cm->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t); else len = sizeof(dat_mix_cm_t); mpxy_lock(&m_cm->smd->evlock); if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) { mpxy_unlock(&m_cm->smd->evlock); goto err; } mpxy_unlock(&m_cm->smd->evlock); return 0; err: mlog(0, " ERR %s: my_id %d, mic_id %d, %p\n", strerror(errno), m_cm->entry.tid, m_cm->cm_id, m_cm->cm_ctx); return -1; } /* ACTIVE: CR reply from server, unsolicited channel */ int mix_cm_rep_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len) { dat_mix_cm_t msg; int len; struct ibv_qp *qp; union ibv_gid *dgid; uint32_t dqpn; uint16_t dlid; MCNTR(m_cm->md, MCM_CM_REP_IN); mlog(2, " [%d:%d] %s cm_id %d m_cm %p pkt %p pln %d psz %d Guids l=%Lx r=%Lx\n", m_cm->md->mc->scif_id, m_cm->smd->entry.tid, mcm_map_str(m_cm->md->addr.ep_map), m_cm->cm_id, m_cm, pkt, pkt_len, ntohs(pkt->p_size), ntohll(system_guid), ntohll(pkt->sys_guid)); /* Forward, as is, conn_reply message to MIC client, with remote QP info */ msg.hdr.ver = m_cm->md->mc->ver; msg.hdr.flags = MIX_OP_REQ; msg.hdr.op = MIX_CM_REP; msg.cm_id = m_cm->cm_id; msg.cm_ctx = m_cm->cm_ctx; memcpy(&msg.msg, pkt, pkt_len); mcm_pr_addrs(2, pkt, m_cm->state, 1); /* save dst id, daddr1 and daddr2 info, remote guid, pdata, proxy data */ m_cm->msg.d_id = pkt->s_id; m_cm->msg.sys_guid = pkt->sys_guid; memcpy(m_cm->msg.p_data, &pkt->p_data, ntohs(pkt->p_size)); memcpy(m_cm->msg.p_proxy, pkt->p_proxy, DAT_MCM_PROXY_DATA); memcpy(&m_cm->msg.daddr1, &pkt->saddr1, sizeof(dat_mcm_addr_t)); memcpy(&m_cm->msg.daddr2, &pkt->saddr2, sizeof(dat_mcm_addr_t)); mcm_ntoh_wrc(&m_cm->m_qp->wrc_rem, (mcm_wrc_info_t *)m_cm->msg.p_proxy); /* peer RI WRC info */ mlog(2, " WRC: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d" " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n", m_cm->m_qp, m_cm->m_qp->wrc.wr_addr, m_cm->m_qp->wrc.wr_rkey, m_cm->m_qp->wrc.wr_len, m_cm->m_qp->wrc.wr_sz, m_cm->m_qp->wrc.wr_end, m_cm->m_qp->wrc.wc_addr, m_cm->m_qp->wrc.wc_rkey, m_cm->m_qp->wrc.wc_len, m_cm->m_qp->wrc.wc_sz, m_cm->m_qp->wrc.wc_end); mlog(2, " WRC_rem: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d" " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n", m_cm->m_qp, m_cm->m_qp->wrc_rem.wr_addr, m_cm->m_qp->wrc_rem.wr_rkey, m_cm->m_qp->wrc_rem.wr_len, m_cm->m_qp->wrc_rem.wr_sz, m_cm->m_qp->wrc_rem.wr_end, m_cm->m_qp->wrc_rem.wc_addr, m_cm->m_qp->wrc_rem.wc_rkey, m_cm->m_qp->wrc_rem.wc_len, m_cm->m_qp->wrc_rem.wc_sz, m_cm->m_qp->wrc_rem.wc_end); /* MXS <- MSS or HOST, fabric: TX: QP2->QP1 direct, RX: QP1<-QP2 proxy */ if ((MXS_EP(&m_cm->md->addr) && !MXS_EP(&m_cm->msg.daddr1)) && system_guid != m_cm->msg.sys_guid) { mlog(2, " MXS <- %s remote \n", mcm_map_str(m_cm->msg.daddr1.ep_map)); if (m_pi_prep_rcv_q(m_cm->m_qp)) goto err; /* RX proxy-in QP */ qp = m_cm->m_qp->ib_qp1; dgid = (union ibv_gid *)m_cm->msg.daddr2.gid; dqpn = m_cm->msg.daddr2.qpn; dlid = m_cm->msg.daddr2.lid; if (mcm_modify_qp(qp, IBV_QPS_RTR, dqpn, dlid, dgid)) goto err; if (mcm_modify_qp(qp, IBV_QPS_RTS, dqpn, dlid, NULL)) goto err; /* TX proxy-out QP */ qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr1.gid; dqpn = m_cm->msg.daddr1.qpn; dlid = m_cm->msg.daddr1.lid; /* QP1r onto RX PI thread queue */ mpxy_lock(&m_cm->smd->qprlock); insert_tail(&m_cm->m_qp->r_entry, &m_cm->smd->qprlist, m_cm->m_qp); mpxy_unlock(&m_cm->smd->qprlock); /* MXS <- MXS, proxy-in both sides, fabric, 1 QP only */ } else if ((MXS_EP(&m_cm->md->addr) && MXS_EP(&m_cm->msg.daddr1)) && system_guid != m_cm->msg.sys_guid) { mlog(2, " MXS <- MXS remote \n"); if (m_pi_prep_rcv_q(m_cm->m_qp)) return -1; qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr2.gid; dqpn = m_cm->msg.daddr2.qpn; dlid = m_cm->msg.daddr2.lid; /* QP2r onto RX PI thread queue */ mpxy_lock(&m_cm->smd->qprlock); insert_tail(&m_cm->m_qp->r_entry, &m_cm->smd->qprlist, m_cm->m_qp); mpxy_unlock(&m_cm->smd->qprlock); /* destroy QP1, created if remote ep_map unknown */ m_qp_destroy_pi(m_cm->m_qp); /* MXS <- MXS, proxy-in both sides, inside system, no QP's, SCIF services only */ } else if ((MXS_EP(&m_cm->md->addr) && MXS_EP(&m_cm->msg.daddr1)) && system_guid == m_cm->msg.sys_guid) { mlog(0, " MXS <- MXS local NOT SUPPORTED \n"); qp = NULL; /* MSS <- MSS,MXS,HOST - fabric, TX: QP2->QP1 on mpxyd and RX: QP1->QP2 on MIC */ } else { mlog(2, " MSS <- %s remote \n", mcm_map_str(m_cm->msg.daddr1.ep_map)); if (MXS_EP(&m_cm->msg.daddr1) && m_pi_prep_rcv_q(m_cm->m_qp)) goto err; if (!MXS_EP(&m_cm->msg.daddr1)) m_pi_destroy_wc_q(m_cm->m_qp); /* created if ep_map was unknown */ qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr1.gid; dqpn = m_cm->msg.daddr1.qpn; dlid = m_cm->msg.daddr1.lid; } if (qp) { if (mcm_modify_qp(qp, IBV_QPS_RTR, dqpn, dlid, dgid)) goto err; if (mcm_modify_qp(qp, IBV_QPS_RTS, dqpn, dlid, NULL)) goto err; } /* support compat mode */ if (m_cm->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t); else len = sizeof(dat_mix_cm_t); mpxy_lock(&m_cm->smd->evlock); if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) { mpxy_unlock(&m_cm->smd->evlock); goto err; } mpxy_unlock(&m_cm->smd->evlock); mpxy_lock(&m_cm->lock); m_cm->state = MCM_REP_RCV; mpxy_unlock(&m_cm->lock); return 0; err: mlog(0, " ERR %s: my_id %d, mic_id %d, %p\n", strerror(errno), m_cm->entry.tid, m_cm->cm_id, m_cm->cm_ctx); mcm_pr_addrs(0, pkt, m_cm->state, 1); m_cm->state = MCM_REJECTED; mcm_cm_rej_out(m_cm->md, &m_cm->msg, MCM_REJ_CM, 0); return -1; } /* PASSIVE, connect request in on listen_cm object, create new cm */ int mix_cm_req_in(mcm_cm_t *cm, dat_mcm_msg_t *pkt, int pkt_len) { dat_mix_cm_t msg; mcm_cm_t *acm; int len; acm = m_cm_create(cm->smd, NULL, NULL); if (!acm) return -1; mcm_pr_addrs(2, pkt, acm->state, 1); msg.hdr.ver = cm->md->mc->ver; msg.hdr.flags = MIX_OP_REQ; msg.hdr.op = MIX_CM_REQ; msg.hdr.status = MIX_SUCCESS; /* dest CM info from CR msg, source CM info from listen */ acm->sid = cm->sid; acm->sp_ctx = cm->sp_ctx; acm->l_ep = cm->l_ep; acm->msg.op = pkt->op; acm->msg.dport = pkt->sport; acm->msg.dqpn = pkt->sqpn; acm->msg.sport = cm->msg.sport; acm->msg.sqpn = cm->msg.sqpn; acm->msg.p_size = pkt->p_size; acm->msg.d_id = pkt->s_id; acm->msg.rd_in = pkt->rd_in; #ifdef MPXYD_LOCAL_SUPPORT acm->msg.sys_guid = pkt->sys_guid; /* remote system guid */; #else acm->msg.sys_guid = rand(); #endif memcpy(acm->msg.p_proxy, pkt->p_proxy, DAT_MCM_PROXY_DATA); /* CR saddr1 is CM daddr1 info, need EP for local saddr1, saddr2 for MXS */ memcpy(&acm->msg.daddr1, &pkt->saddr1, sizeof(dat_mcm_addr_t)); memcpy(&acm->msg.daddr2, &pkt->saddr2, sizeof(dat_mcm_addr_t)); mlog(2, " [%d:%d] cm %p ep %d sPORT %x %s <- dPORT %x lid=%x psz=%d %s %s %Lx (msg %p %d)\n", cm->md->mc->scif_id, cm->smd->entry.tid, acm, acm->smd->scif_ev_ep, ntohs(acm->msg.sport), mcm_map_str(acm->md->addr.ep_map), ntohs(acm->msg.dport), ntohs(acm->msg.daddr1.lid), htons(acm->msg.p_size), mcm_map_str(acm->msg.daddr2.ep_map), acm->md->addr.lid == acm->msg.daddr1.lid ? "platform":"fabric", ntohll(acm->msg.sys_guid), &msg, sizeof(dat_mcm_msg_t)); if (pkt->p_size) memcpy(acm->msg.p_data, pkt->p_data, ntohs(pkt->p_size)); /* forward reformated CM message info to MIX client, support compat mode */ if (cm->md->mc->ver == MIX_COMP) { len = sizeof(dat_mix_cm_compat_t); memcpy(&msg.msg, &acm->msg, sizeof(dat_mcm_msg_compat_t)); } else { len = sizeof(dat_mix_cm_t); memcpy(&msg.msg, &acm->msg, sizeof(dat_mcm_msg_t)); } acm->state = MCM_ACCEPTING; mcm_qconn(acm->smd, acm); msg.cm_id = acm->entry.tid; msg.cm_ctx = (uint64_t)acm; msg.sp_ctx = cm->sp_ctx; mpxy_lock(&acm->smd->evlock); if (scif_send_msg(acm->smd->scif_ev_ep, (void*)&msg, len)) { mpxy_unlock(&acm->smd->evlock); return -1; } mpxy_unlock(&acm->smd->evlock); return 0; } /* PASSIVE: rtu from client */ int mix_cm_rtu_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len) { dat_mix_cm_t msg; int len; mlog(1, "[%d:%d] CONN_EST[%d]: %p 0x%x %x 0x%x %Lx %s <- 0x%x %x 0x%x %Lx %s\n", m_cm->md->mc->scif_id, m_cm->smd->entry.tid, m_cm->md->cntrs ? (uint32_t)((uint64_t *)m_cm->md->cntrs)[MCM_CM_RTU_IN]:0, m_cm, htons(pkt->daddr1.lid), MXS_EP(&m_cm->msg.daddr1) && MXS_EP(&m_cm->msg.saddr1) ? htonl(m_cm->msg.daddr2.qpn):htonl(m_cm->msg.daddr1.qpn), htons(pkt->dport), system_guid, mcm_map_str(pkt->daddr1.ep_map), htons(pkt->saddr2.lid), htonl(pkt->saddr2.qpn), htons(pkt->sport), ntohll(pkt->sys_guid), mcm_map_str(pkt->saddr2.ep_map)); /* MXS_EP <- HST_EP, host sends WC on RTU, save WRC info */ if (MXS_EP(&pkt->daddr1) && HST_EP(&pkt->saddr2)) { mcm_ntoh_wrc(&m_cm->m_qp->wrc_rem, (mcm_wrc_info_t *)pkt->p_proxy); mlog(2, " WRC_rem: m_qp %p - addr 0x%Lx rkey 0x%x len %d, sz %d end %d\n", m_cm->m_qp, m_cm->m_qp->wrc_rem.wc_addr, m_cm->m_qp->wrc_rem.wc_rkey, m_cm->m_qp->wrc_rem.wc_len, m_cm->m_qp->wrc_rem.wc_sz, m_cm->m_qp->wrc_rem.wc_end); } /* Forward, as is, conn_reply message to MIC client, with remote QP info */ msg.hdr.ver = m_cm->md->mc->ver; msg.hdr.flags = MIX_OP_REQ; msg.hdr.op = MIX_CM_RTU; msg.cm_id = m_cm->cm_id; msg.cm_ctx = m_cm->cm_ctx; m_cm->msg.sys_guid = pkt->sys_guid; /* save remote quid */ /* support compat mode */ if (m_cm->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t); else len = sizeof(dat_mix_cm_t); mpxy_lock(&m_cm->smd->evlock); if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) { mpxy_unlock(&m_cm->smd->evlock); mcm_cm_disc(m_cm); return -1; } mpxy_unlock(&m_cm->smd->evlock); return 0; } /* PASSIVE, accept connect request from client, cr_reply */ static int mix_cm_rep_out(mcm_scif_dev_t *smd, dat_mix_cm_t *pmsg, scif_epd_t scif_ep) { int len, ret; struct mcm_cm *m_cm; struct ibv_qp *qp, *qp2 = NULL; union ibv_gid *dgid = NULL, *dgid2 = NULL; uint32_t dqpn = 0, dqpn2 = 0; uint16_t dlid = 0, dlid2 = 0; /* hdr already read, get operation data, support compat mode */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } mlog(8, "dev_id %d mic_ctx %p my_id %d, my_ctx %p, qp_id %d, pmsg_sz=%d \n", smd->entry.tid, pmsg->sp_ctx, pmsg->cm_id, (void*)pmsg->cm_ctx, pmsg->qp_id, sizeof(dat_mix_cm_t)); /* Find the CM for this reply */ m_cm = mix_get_cm(smd, pmsg->cm_id); if (!m_cm) { mlog(0, " ERR: mix_get_cm, id %d, not found\n", pmsg->cm_id); return -1; } mpxy_lock(&m_cm->lock); /* update CM message from MIX client, save clients id,ctx */ m_cm->cm_id = 0; /* no client id for now, just ctx */ m_cm->cm_ctx = pmsg->sp_ctx; m_cm->p_size = ntohs(pmsg->msg.p_size); memcpy(&m_cm->p_data, &pmsg->msg.p_data, m_cm->p_size); if (smd->md->mc->ver == MIX_COMP) memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_compat_t)); else memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t)); /* Attach the QP for this CR */ m_cm->m_qp = mix_get_qp(smd, pmsg->qp_id); if (!m_cm->m_qp) { mlog(0, " ERR: mix_get_qp, id %d, not found\n", pmsg->qp_id); mpxy_unlock(&m_cm->lock); return -1; } m_cm->ref_cnt++; /* Passive: QP ref */ m_cm->m_qp->cm = m_cm; mcm_ntoh_wrc(&m_cm->m_qp->wrc_rem, (mcm_wrc_info_t *)m_cm->msg.p_proxy); /* save peer PI WRC info */ mlog(2, " WRC: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d" " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d sg_po2 %d\n", m_cm->m_qp, m_cm->m_qp->wrc.wr_addr, m_cm->m_qp->wrc.wr_rkey, m_cm->m_qp->wrc.wr_len, m_cm->m_qp->wrc.wr_sz, m_cm->m_qp->wrc.wr_end, m_cm->m_qp->wrc.wc_addr, m_cm->m_qp->wrc.wc_rkey, m_cm->m_qp->wrc.wc_len, m_cm->m_qp->wrc.wc_sz, m_cm->m_qp->wrc.wc_end, m_cm->msg.seg_sz); mlog(2, " WRC_rem: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d" " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n", m_cm->m_qp, m_cm->m_qp->wrc_rem.wr_addr, m_cm->m_qp->wrc_rem.wr_rkey, m_cm->m_qp->wrc_rem.wr_len, m_cm->m_qp->wrc_rem.wr_sz, m_cm->m_qp->wrc_rem.wr_end, m_cm->m_qp->wrc_rem.wc_addr, m_cm->m_qp->wrc_rem.wc_rkey, m_cm->m_qp->wrc_rem.wc_len, m_cm->m_qp->wrc_rem.wc_sz, m_cm->m_qp->wrc_rem.wc_end); /* MXS -> MSS or HOST, remote: need QPr1, saddr1 on mpxyd */ if ((MXS_EP(&m_cm->md->addr) && !MXS_EP(&m_cm->msg.daddr1)) && (system_guid != m_cm->msg.sys_guid) ) { mlog(2, " MXS -> %s remote \n", mcm_map_str(m_cm->msg.daddr1.ep_map)); if (m_qp_create_pi(smd, m_cm->m_qp)) goto err; if (m_pi_prep_rcv_q(m_cm->m_qp)) goto err; /* KR to KL or XEON, QP1<-QP2 and QP2->QP1 */ /* update the src information in CM msg */ m_cm->msg.saddr1.ep_map = MIC_XSOCK_DEV; m_cm->msg.saddr1.qpn = htonl(m_cm->m_qp->ib_qp1->qp_num); m_cm->msg.saddr1.qp_type = m_cm->m_qp->qp_attr1.qp_type; m_cm->msg.saddr1.lid = m_cm->smd->md->addr.lid; memcpy(&m_cm->msg.saddr1.gid[0], &m_cm->smd->md->addr.gid, 16); m_cm->msg.saddr2.ep_map = MIC_XSOCK_DEV; m_cm->msg.saddr2.qpn = htonl(m_cm->m_qp->ib_qp2->qp_num); m_cm->msg.saddr2.qp_type = m_cm->m_qp->qp_attr2.qp_type; m_cm->msg.saddr2.lid = m_cm->smd->md->addr.lid; memcpy(&m_cm->msg.saddr2.gid[0], &m_cm->smd->md->addr.gid, 16); /* local QPr to remote QPt */ qp = m_cm->m_qp->ib_qp1; dgid = (union ibv_gid *)m_cm->msg.daddr2.gid; dqpn = m_cm->msg.daddr2.qpn; dlid = m_cm->msg.daddr2.lid; /* local QPt to remote QPr */ qp2 = m_cm->m_qp->ib_qp2; dgid2 = (union ibv_gid *)m_cm->msg.daddr1.gid; dqpn2 = m_cm->msg.daddr1.qpn; dlid2 = m_cm->msg.daddr1.lid; /* QP1r onto RX PI thread queue */ mpxy_lock(&smd->qprlock); insert_tail(&m_cm->m_qp->r_entry, &smd->qprlist, m_cm->m_qp); mpxy_unlock(&smd->qprlock); /* MXS -> MXS, proxy-in both sides, remote, 1 QP - already setup */ } else if ((MXS_EP(&m_cm->md->addr) && MXS_EP(&m_cm->msg.daddr1)) && (system_guid != m_cm->msg.sys_guid)) { mlog(2, " MXS -> MXS remote \n"); if (m_pi_prep_rcv_q(m_cm->m_qp)) goto err; /* update the QPt src information in CM msg */ m_cm->msg.saddr1.ep_map = MIC_XSOCK_DEV; m_cm->msg.saddr2.ep_map = MIC_XSOCK_DEV; m_cm->msg.saddr2.qpn = htonl(m_cm->m_qp->ib_qp2->qp_num); m_cm->msg.saddr2.qp_type = m_cm->m_qp->qp_attr2.qp_type; m_cm->msg.saddr2.lid = m_cm->smd->md->addr.lid; m_cm->msg.saddr1.lid = m_cm->smd->md->addr.lid; /* for cm rcv engine */ memcpy(&m_cm->msg.saddr2.gid[0], &m_cm->smd->md->addr.gid, 16); qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr2.gid; dqpn = m_cm->msg.daddr2.qpn; dlid = m_cm->msg.daddr2.lid; /* QP2r onto RX PI thread queue */ mpxy_lock(&smd->qprlock); insert_tail(&m_cm->m_qp->r_entry, &smd->qprlist, m_cm->m_qp); mpxy_unlock(&smd->qprlock); /* MXS -> MXS, proxy-in both sides, local, no QP's, SCIF services only */ } else if ((MXS_EP(&m_cm->md->addr) && MXS_EP(&m_cm->msg.daddr1)) && (system_guid == m_cm->msg.sys_guid)) { mlog(2, " MXS -> MXS local - MODE NOT SUPPORTED, running MXS -> MXS remote mode\n"); qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr2.gid; dqpn = m_cm->msg.daddr2.qpn; dlid = m_cm->msg.daddr2.lid; m_cm->msg.saddr1.ep_map = MIC_XSOCK_DEV; m_cm->msg.saddr2.ep_map = MIC_XSOCK_DEV; /* MSS -> MSS,MXS,HOST - fabric, TX: QP2->QP1 on mpxyd and RX: QP1->QP2 on MIC */ } else { mlog(2, " MSS -> %s remote \n", mcm_map_str(m_cm->msg.daddr1.ep_map)); /* KL to KL, QP1->QP2 and QP1<-QP2 */ /* update the QPt src information in CM msg, QPr updated on MIC */ m_cm->msg.saddr1.ep_map = MIC_SSOCK_DEV; m_cm->msg.saddr2.ep_map = MIC_SSOCK_DEV; m_cm->msg.saddr2.qpn = htonl(m_cm->m_qp->ib_qp2->qp_num); m_cm->msg.saddr2.qp_type = m_cm->m_qp->qp_attr2.qp_type; m_cm->msg.saddr2.lid = m_cm->smd->md->addr.lid; memcpy(&m_cm->msg.saddr2.gid[0], &m_cm->smd->md->addr.gid, 16); qp = m_cm->m_qp->ib_qp2; dgid = (union ibv_gid *)m_cm->msg.daddr1.gid; dqpn = m_cm->msg.daddr1.qpn; dlid = m_cm->msg.daddr1.lid; if (MXS_EP(&m_cm->msg.daddr1)) { if (m_pi_create_wc_q(m_cm->m_qp, mcm_rx_entries)) goto err; if (m_pi_prep_rcv_q(m_cm->m_qp)) goto err; } } mcm_hton_wrc((mcm_wrc_info_t *)m_cm->msg.p_proxy, &m_cm->m_qp->wrc); /* send PI WRC info */ m_cm->msg.seg_sz = mix_buffer_sg_po2; mcm_pr_addrs(2, &m_cm->msg, m_cm->state, 0); /* return sys_guid */ #ifdef MPXYD_LOCAL_SUPPORT m_cm->msg.sys_guid = system_guid; #else m_cm->msg.sys_guid = rand(); #endif if (qp) { if (mcm_modify_qp(qp, IBV_QPS_RTR, dqpn, dlid, dgid)) goto err; if (mcm_modify_qp(qp, IBV_QPS_RTS, dqpn, dlid, NULL)) goto err; } if (qp2) { if (mcm_modify_qp(qp2, IBV_QPS_RTR, dqpn2, dlid2, dgid2)) goto err; if (mcm_modify_qp(qp2, IBV_QPS_RTS, dqpn2, dlid2, NULL)) goto err; } /* send RTU on wire, monitor for retries */ m_cm->state = MCM_RTU_PENDING; mpxy_unlock(&m_cm->lock); mcm_cm_rep_out(m_cm); return 0; err: mlog(0," ERR: QPt 0x%x -> d_port 0x%x, cqpn %x QPr %x lid 0x%x psize %d\n", m_cm->m_qp->qp_attr2.qp_num, ntohs(m_cm->msg.dport), ntohl(m_cm->msg.dqpn), ntohl(dqpn), ntohs(dlid), ntohs(m_cm->msg.p_size)); mlog(0," ERR: QPr 0x%x -> d_port 0x%x, cqpn %x QPt %x lid 0x%x\n", m_cm->m_qp->qp_attr1.qp_num, ntohs(m_cm->msg.dport), ntohl(m_cm->msg.dqpn), ntohl(dqpn), ntohs(dlid)); mcm_pr_addrs(0, &m_cm->msg, m_cm->state, 0); mpxy_unlock(&m_cm->lock); return -1; } /* PASSIVE, user reject from MIX client */ static int mix_cm_rej_out(mcm_scif_dev_t *smd, dat_mix_cm_t *pmsg, scif_epd_t scif_ep) { int len, ret; struct mcm_cm *m_cm; /* hdr already read, get operation data, support compat mode */ if (smd->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t); else len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: ret %d, exp %d\n", ret, len); return ret; } /* Find the CM for linking */ m_cm = mix_get_cm(smd, pmsg->cm_id); if (!m_cm) { mlog(0, " ERR: mix_get_cm, id %d, not found\n", pmsg->cm_id); return -1; } mlog(2, " MIX_CM_REJ_OUT: dev_id %d cm_id %d, cm_ctx %p, qp_id %d m_cm %p\n", smd->entry.tid, pmsg->cm_id, (void*)pmsg->cm_ctx, pmsg->qp_id, m_cm); /* update CM message from MIX client, send back guid */ if (smd->md->mc->ver == MIX_COMP) memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_compat_t)); else memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t)); #ifdef MPXYD_LOCAL_SUPPORT m_cm->msg.sys_guid = system_guid; #else m_cm->msg.sys_guid = rand(); #endif /* send rej on wire */ m_cm->state = MCM_REJECTED; mcm_cm_rej_out(smd->md, &m_cm->msg, MCM_REJ_USER, 0); mcm_dqconn_free(smd, m_cm); /* dequeue and free */ return 0; } /* disconnect request from peer, unsolicited channel */ int mix_cm_disc_in(mcm_cm_t *m_cm) { dat_mix_hdr_t msg; int len; /* send disconnect to MIC client */ msg.ver = m_cm->md->mc->ver; msg.flags = MIX_OP_REQ; msg.op = MIX_CM_DISC; msg.req_id = m_cm->cm_id; /* support compat mode */ if (m_cm->md->mc->ver == MIX_COMP) len = sizeof(dat_mix_cm_compat_t); else len = sizeof(dat_mix_cm_t); mpxy_lock(&m_cm->smd->evlock); if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) { return -1; mpxy_unlock(&m_cm->smd->evlock); } mpxy_unlock(&m_cm->smd->evlock); return 0; } /* Post SEND message request, IB send or rdma write, proxy out to remote direct endpoint */ static int mix_proxy_out(mcm_scif_dev_t *smd, dat_mix_sr_t *pmsg, mcm_qp_t *m_qp) { int len, ret = 0, l_start, l_end, retries, wc_err = IBV_WC_GENERAL_ERR; struct mcm_wr *m_wr; if (!(pmsg->hdr.flags & MIX_OP_INLINE)) return (m_po_proxy_data(smd, pmsg, m_qp)); if (pmsg->wr.opcode == IBV_WR_SEND) MCNTR(smd->md, MCM_MX_SEND_INLINE); else MCNTR(smd->md, MCM_MX_WRITE_INLINE); len = pmsg->len; mpxy_lock(&m_qp->txlock); if (((m_qp->wr_hd + 1) & m_qp->wr_end) == m_qp->wr_tl) { /* full */ ret = ENOMEM; goto bail; } m_qp->wr_hd = (m_qp->wr_hd + 1) & m_qp->wr_end; /* move hd */ m_wr = (struct mcm_wr *)(m_qp->wr_buf + (m_qp->wr_sz * m_qp->wr_hd)); mlog(4, " inline, m_wr %p m_sge %p len %d hd %d tl %d\n", m_wr, m_wr->sg, len, m_qp->wr_hd, m_qp->wr_tl); /* IB rdma write WR */ const_ib_rw(&m_wr->wr, &pmsg->wr, m_wr->sg); m_wr->wr.sg_list = m_wr->sg; m_wr->wr.num_sge = len ? 1:0; mlog(4, " INLINE m_wr (%p)raddr %p rkey 0x%llx, ib_wr raddr %p rkey 0x%llx \n", &pmsg->wr.wr.rdma.remote_addr, pmsg->wr.wr.rdma.remote_addr, pmsg->wr.wr.rdma.rkey, &m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); /* M_WR */ m_wr->org_id = pmsg->wr.wr_id; m_wr->m_idx = 0; m_wr->w_idx = m_qp->wr_hd; m_wr->flags = (M_SEND_INLINE | M_SEND_FS | M_SEND_LS); m_wr->context = (uint64_t)m_qp; mpxy_lock(&smd->tblock); retries = 0; retry_mr: l_start = ALIGN_64(smd->m_hd); if ((l_start + len) > smd->m_len) l_start = 64; l_end = l_start + len; if (pb_full(l_start, l_end, smd->m_hd, smd->m_tl, len, smd->m_len)) { if (!retries) { MCNTR(smd->md, MCM_MX_MR_STALL); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); } if (!(++retries % 100)) { mlog(1, " [%d:%d:%d] WARN: inline DTO delay, no memory," " %x hd 0x%x tl 0x%x %x need 0x%x-0x%x ln %d," " retries = %d -> %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, smd->m_buf, smd->m_hd, smd->m_tl, smd->m_buf + smd->m_len, l_start, l_end, len, retries, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mlog(1," [%d:%d:%d] WR tl %d idx %d hd %d QP pst %d,%d cmp %d - %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp->wr_tl, m_wr->w_idx, m_qp->wr_hd, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mcm_pr_addrs(1, &m_qp->cm->msg, m_qp->cm->state, 0); } if (retries == 2000) { mlog(0, " ERR: send inline stalled, no bufs, hd %d tl %d ln %d\n", smd->m_hd, smd->m_tl, len); ret = ENOMEM; wc_err = IBV_WC_RETRY_EXC_ERR; mpxy_unlock(&smd->tblock); goto bail; } mpxy_unlock(&smd->tblock); mpxy_unlock(&m_qp->txlock); sched_yield(); mpxy_lock(&m_qp->txlock); mpxy_lock(&smd->tblock); goto retry_mr; } if (retries) { mlog(1, " MEM stalled: %x hd 0x%x tl 0x%x %x got 0x%x-0x%x" " ln %d retried %d\n", smd->m_buf, smd->m_hd, smd->m_tl, smd->m_buf + smd->m_len, l_start, len, retries); } #ifdef MCM_PROFILE if (l_end < smd->m_hd) smd->m_hd_ro++; #endif m_wr->sg->addr = (uint64_t)(smd->m_buf + l_start); m_wr->sg->lkey = smd->m_mr->lkey; m_wr->sg->length = len; smd->m_hd = l_end; /* move proxy buffer hd */ if (m_wr->wr.send_flags & IBV_SEND_SIGNALED) m_wr->flags |= M_SEND_CN_SIG; /* MP service signaling, set PO mbuf tail adjustment */ if (!((m_wr->w_idx) % mcm_rw_signal) || m_wr->flags & M_SEND_LS) { char *sbuf = (char*)m_wr->wr.sg_list->addr; m_wr->flags |= M_SEND_MP_SIG; m_wr->wr.send_flags |= IBV_SEND_SIGNALED; m_wr->m_idx = (sbuf + (len - 1)) - smd->m_buf; if (m_po_buf_hd(smd, m_wr->m_idx, m_wr)) { mpxy_unlock(&smd->tblock); goto bail; } mlog(0x10, "[%d:%d:%d] %s_INLINE_post_sig: qp %p wr %p wr_id %p flgs 0x%x," " pcnt %d sg_rate %d hd %d tl %d sz %d m_idx %x\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, (MXS_EP(&m_qp->cm->msg.daddr1)) ? "po_pi":"po_direct", m_qp, m_wr, m_wr->wr.wr_id, m_wr->wr.send_flags, m_qp->post_cnt, mcm_rw_signal, m_qp->wr_hd, m_qp->wr_tl, m_wr->wr.sg_list->length, m_wr->m_idx); } mpxy_unlock(&smd->tblock); if (len) { /* copy data into proxy buffer, signal TX thread via wr_id */ ret = scif_recv(smd->scif_op_ep, (void*)m_wr->sg->addr, len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: scif_recv inline DATA, ret %d, exp %d\n", ret, len); ret = errno; len = 0; goto bail; } } mlog(4, " inline data rcv'ed %d bytes\n", len); if ((smd->md->indata) && (len <= mcm_ib_inline)) m_wr->wr.send_flags |= IBV_SEND_INLINE; /* signal TX, CQ thread, this WR data ready, post pending */ m_qp->wr_pp++; m_wr->wr.wr_id = pmsg->wr.wr_id; ret = 0; bail: mpxy_unlock(&m_qp->txlock); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); /* signal tx_thread */ if (ret) { struct dat_mix_wc wc; char dbuf[DAT_MIX_INLINE_MAX]; if (len) /* drain inline data */ scif_recv(smd->scif_op_ep, dbuf, len, SCIF_RECV_BLOCK); wc.wr_id = pmsg->wr.wr_id; wc.byte_len = len; wc.status = wc_err; wc.opcode = pmsg->wr.opcode == IBV_WR_SEND ? IBV_WC_SEND:IBV_WC_RDMA_WRITE; wc.vendor_err = ret; mix_dto_event(m_qp->ib_qp2->send_cq->cq_context, &wc, 1); } sched_yield(); return ret; } /* Post SEND message request, IB send or rdma write, operation channel */ static int mix_post_send(mcm_scif_dev_t *smd, dat_mix_sr_t *pmsg) { int len, ret; struct mcm_qp *m_qp; /* hdr already read, get operation data */ len = sizeof(dat_mix_sr_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: scif_recv WR, ret %d, exp %d\n", ret, len); return POLLERR; } /* get QP by ID */ m_qp = mix_get_qp(smd, pmsg->qp_id); if (!m_qp || !m_qp->ib_qp2) { mlog(0, " ERR: mix_get_qp, id %d, not found\n", pmsg->qp_id); if ((pmsg->hdr.flags & MIX_OP_INLINE) && pmsg->len) { /* purge data, send event */ char dbuf[DAT_MIX_INLINE_MAX]; ret = scif_recv(smd->scif_op_ep, (void*)dbuf, pmsg->len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: scif_recv inline DATA, ret %d, exp %d\n", ret, len); return -1; } } return POLLERR; /* device async err, cannot report event with no QP */ } mlog(4, " [%d:%d:%d] id %d qpn %x data %d pkt %d wr_id %p, sge %d," " op %x flgs %x pst %d,%d cmp %d, inl %d, %s %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid,pmsg->qp_id, m_qp->ib_qp2->qp_num, pmsg->len, pmsg->hdr.flags & MIX_OP_INLINE ? sizeof(dat_mix_sr_t) + pmsg->len : sizeof(dat_mix_sr_t), pmsg->wr.wr_id, pmsg->wr.num_sge, pmsg->wr.opcode, pmsg->wr.send_flags, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, pmsg->hdr.flags & MIX_OP_INLINE ? 1:0, pmsg->wr.opcode == IBV_WR_SEND ? "SND":"RW", m_qp->wrc_rem.wr_len ? "PROXY_OUT_IN":"PROXY_OUT"); return (mix_proxy_out(smd, pmsg, m_qp)); } /* Post RECV message request on Proxy-RX channel */ static int mix_post_recv(mcm_scif_dev_t *smd, dat_mix_sr_t *pmsg) { int i, len, ret; struct mcm_qp *m_qp; struct mcm_sr *m_sr; struct dat_mix_wc wc; /* hdr already read, get operation data */ ret = -1; len = sizeof(dat_mix_sr_t) - sizeof(dat_mix_hdr_t); ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK); if (ret != len) { mlog(0, " ERR: scif_recv WR, ret %d, exp %d\n", ret, len); return -1; } /* get QP by ID */ m_qp = mix_get_qp(smd, pmsg->qp_id); if (!m_qp) { mlog(0, " ERR: mix_get_qp, id %d, not found\n", pmsg->qp_id); goto err; } mlog(4, " q_id %d, q_num %x data %d pkt %d wr_id %p, sge %d\n", pmsg->qp_id, m_qp->ib_qp2->qp_num, pmsg->len, sizeof(dat_mix_sr_t) + pmsg->len, pmsg->wr.wr_id, pmsg->wr.num_sge, m_qp->post_sr); /* Post WR on Rx Queue and let RX thread process */ mpxy_lock(&m_qp->rxlock); m_sr = (struct mcm_sr *)(m_qp->sr_buf + (m_qp->sr_sz * m_qp->sr_hd)); m_sr->wr_id = pmsg->wr.wr_id; m_sr->s_idx = m_qp->sr_hd; m_sr->w_idx = m_sr->m_idx = 0; /* no WR proxy data bindings */ m_sr->num_sge = pmsg->wr.num_sge; memcpy(m_sr->sg, pmsg->sge, sizeof(struct dat_mix_sge) * m_sr->num_sge); for (i=0; i< m_sr->num_sge; i++) { mlog(4, " m_sr[%d] %p -> sg[%d] scif l_off %Lx len %d lkey %x\n", m_qp->sr_hd, m_sr, i, m_sr->sg[i].addr, m_sr->sg[i].length, m_sr->sg[i].lkey); } /* took SR slot */ if (++m_qp->sr_hd == m_qp->sr_end) m_qp->sr_hd = 0; mpxy_unlock(&m_qp->rxlock); return 0; err: wc.wr_id = pmsg->wr.wr_id; wc.byte_len = 0; wc.status = IBV_WC_GENERAL_ERR; wc.opcode = pmsg->wr.opcode == IBV_WC_RECV; wc.vendor_err = EINVAL; mix_dto_event(m_qp->ib_qp2->recv_cq->cq_context, &wc, 1); return 0; } /* receive data on connected SCIF endpoints, operation and unsolicited channels, */ int mix_scif_recv(mcm_scif_dev_t *smd, scif_epd_t scif_ep) { dat_mix_hdr_t *phdr = (dat_mix_hdr_t *)smd->cmd_buf; int ret, len; len = sizeof(*phdr); phdr->ver = 0; phdr->op = 0; ret = scif_recv(scif_ep, phdr, len, SCIF_RECV_BLOCK); if ((ret != len) || (phdr->ver < MIX_MIN) || (phdr->ver > MIX_MAX)) { mlog(0, " ERR: smd %p ep %d ret %d exp %d ver %d op %s flgs %d\n", smd, scif_ep, ret, len, phdr->ver, mix_op_str(phdr->op), phdr->flags); return -1; } mlog(8, " dev_id %d scif_ep %d, %d bytes: ver %d, op %s, flgs %d id %d\n", smd->entry.tid, scif_ep, len, phdr->ver, mix_op_str(phdr->op), phdr->flags, phdr->req_id); switch (phdr->op) { case MIX_MR_CREATE: ret = mix_mr_create(smd, (dat_mix_mr_t *)phdr); break; case MIX_MR_FREE: ret = mix_mr_free(smd, (dat_mix_mr_t *)phdr); break; case MIX_QP_CREATE: ret = mix_qp_create(smd, (dat_mix_qp_t *)phdr); break; case MIX_QP_MODIFY: ret = mix_qp_modify(smd, (dat_mix_qp_t *)phdr); break; case MIX_QP_FREE: ret = mix_qp_destroy(smd, phdr); break; case MIX_CQ_CREATE: ret = mix_cq_create(smd, (dat_mix_cq_t *)phdr); break; case MIX_CQ_FREE: ret = mix_cq_destroy(smd, phdr); break; case MIX_CQ_POLL: ret = 0; /* no-op */ break; case MIX_SEND: ret = mix_post_send(smd, (dat_mix_sr_t *)phdr); break; case MIX_RECV: ret = mix_post_recv(smd, (dat_mix_sr_t *)phdr); break; case MIX_LISTEN: ret = mix_listen(smd, (dat_mix_listen_t *)phdr); break; case MIX_LISTEN_FREE: ret = mix_listen_free(smd, phdr); break; case MIX_PROV_ATTR: ret = mix_prov_attr(smd, (dat_mix_attr_t *)phdr); break; case MIX_CM_REQ: ret = mix_cm_req_out(smd, (dat_mix_cm_t *)phdr, scif_ep); break; case MIX_CM_REP: case MIX_CM_ACCEPT: ret = mix_cm_rep_out(smd, (dat_mix_cm_t *)phdr, scif_ep); break; case MIX_CM_REJECT: ret = mix_cm_rej_out(smd, (dat_mix_cm_t *)phdr, scif_ep); break; case MIX_CM_RTU: case MIX_CM_EST: ret = mix_cm_rtu_out(smd, (dat_mix_cm_t *)phdr, scif_ep); break; case MIX_CM_DISC: ret = mix_cm_disc_out(smd, (dat_mix_cm_t *)phdr, scif_ep); break; case MIX_CM_DREP: default: mlog(0, " ERR: smd %p unknown msg->op: %d, close dev_id %d\n", smd, phdr->op, smd->entry.tid); return -1; } MCNTR(smd->md, MCM_SCIF_RECV); return ret; } dapl-2.1.5/dapl/svc/mpxy_in.c000066400000000000000000001236201255317474200160170ustar00rootroot00000000000000/* * Copyright (c) 2012-2015 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mpxyd service - mpxy_in.c * * Proxy-out resources/services * */ #include "mpxyd.h" extern int log_level; extern int mcm_wc_max; extern int mcm_rr_signal; extern int mcm_rr_max; extern int mcm_wr_max; extern int mcm_rx_entries; extern int mcm_ib_signal_rate; extern uint64_t system_guid; void m_pi_destroy_wc_q(struct mcm_qp *m_qp) { mlog(2, " Destroying QP %p PI WC_q %p\n", m_qp, m_qp->wrc.wc_addr); if (m_qp->wc_rbuf_mr) { ibv_dereg_mr(m_qp->wc_rbuf_mr); m_qp->wc_rbuf_mr = NULL; } if (m_qp->wrc.wc_addr) { free((void*)m_qp->wrc.wc_addr); m_qp->wrc.wc_addr = 0; } } /* buffer pools for proxy inbound RDMA work request, RX queue, and completion entries, IB registration for RDMA writes */ void m_pi_destroy_bpool(struct mcm_qp *m_qp) { if (m_qp->wr_rbuf_mr) { ibv_dereg_mr(m_qp->wr_rbuf_mr); m_qp->wr_rbuf_mr = NULL; } if (m_qp->wrc.wr_addr) { free((void*)m_qp->wrc.wr_addr); m_qp->wrc.wr_addr = 0; } m_pi_destroy_wc_q(m_qp); if (m_qp->sr_buf) { free(m_qp->sr_buf); m_qp->sr_buf = 0; } if (m_qp->wc_buf_rx_mr) { ibv_dereg_mr(m_qp->wc_buf_rx_mr); m_qp->wc_buf_rx_mr = NULL; } if (m_qp->wc_buf_rx) { free(m_qp->wc_buf_rx); m_qp->wc_buf_rx = 0; } } int m_pi_create_wr_q(struct mcm_qp *m_qp, int entries) { /* RDMA proxy WR pool, register with SCIF and IB, set pool and segm size with parameters */ m_qp->wrc.wr_sz = ALIGN_64(sizeof(struct mcm_wr_rx)); m_qp->wrc.wr_len = m_qp->wrc.wr_sz * entries; /* 64 byte aligned for signal_fence */ m_qp->wrc.wr_end = entries - 1; m_qp->wr_hd_r = 0; m_qp->wr_tl_r = 0; m_qp->wr_tl_r_wt = 1; /* start at tl+1 */ if (posix_memalign((void **)&m_qp->wrc.wr_addr, 4096, ALIGN_PAGE(m_qp->wrc.wr_len))) { mlog(0, "failed to allocate wr_rbuf, m_qp=%p, wr_len=%d, entries=%d\n", m_qp, m_qp->wrc.wr_len, entries); return -1; } memset((void*)m_qp->wrc.wr_addr, 0, ALIGN_PAGE(m_qp->wrc.wr_len)); mlog(4, " WR rbuf pool %p, LEN req=%d, act=%d\n", m_qp->wrc.wr_addr, m_qp->wrc.wr_len, ALIGN_PAGE(m_qp->wrc.wr_len) ); m_qp->wr_rbuf_mr = ibv_reg_mr(m_qp->smd->md->pd, (void*)m_qp->wrc.wr_addr, m_qp->wrc.wr_len, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wr_rbuf_mr) { mlog(0, " IB_register addr=%p,%d failed %s\n", m_qp->wrc.wr_addr, ALIGN_PAGE(m_qp->wrc.wr_len), strerror(errno)); return -1;; } m_qp->wrc.wr_addr = (uint64_t)(uintptr_t)m_qp->wr_rbuf_mr->addr; m_qp->wrc.wr_rkey = m_qp->wr_rbuf_mr->rkey; mlog(4, " IB_mr for wr_buf addr %p, off 0x%llx, len %d, entries %d, rkey %x lkey %x\n", m_qp->wrc.wr_addr, m_qp->wr_rbuf_mr->addr, ALIGN_PAGE(m_qp->wrc.wr_len), entries, m_qp->wr_rbuf_mr->rkey, m_qp->wr_rbuf_mr->rkey); m_qp->wr_off_r = scif_register(m_qp->smd->scif_tx_ep, (void*)m_qp->wrc.wr_addr, ALIGN_PAGE(m_qp->wrc.wr_len), (off_t)0, SCIF_PROT_READ | SCIF_PROT_WRITE, 0); if (m_qp->wr_off_r == (off_t)(-1)) { mlog(0, " SCIF_register addr=%p,%d failed %s\n", m_qp->wrc.wr_addr, ALIGN_PAGE(m_qp->wrc.wr_len), strerror(errno)); return -1; } mlog(4, " WR rbuf pool %p, LEN req=%d, act=%d\n", m_qp->wr_buf, m_qp->wr_len, ALIGN_PAGE(m_qp->wrc.wr_len)); mlog(4, " SCIF_mr for wr_rbuf addr %p, off 0x%llx, len %d, entries %d\n", m_qp->wrc.wr_addr, m_qp->wr_off_r, ALIGN_PAGE(m_qp->wrc.wr_len), entries); if (!m_qp->smd->md->indata) { if (posix_memalign((void **)&m_qp->wc_buf_rx, 4096, entries * sizeof(mcm_wc_rx_t))) { mlog(0, "failed to allocate wc_buf_rx, m_qp=%p, wr_rx_len=%d, entries=%d\n", m_qp, entries * sizeof(mcm_wc_rx_t), entries); goto err; } memset(m_qp->wc_buf_rx, 0, entries * sizeof(mcm_wc_rx_t)); m_qp->wc_buf_rx_mr = ibv_reg_mr(m_qp->smd->md->pd, (void*)m_qp->wc_buf_rx, entries * sizeof(mcm_wc_rx_t), IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wc_buf_rx_mr) { mlog(0, " IB_register addr=%p,%d failed %s\n", m_qp->wc_buf_rx_mr->addr, entries * sizeof(mcm_wc_rx_t), strerror(errno)); goto err; } mlog(4, " no inline support: WC_buf_rx pool %p, LEN %d\n", m_qp->wc_buf_rx, entries * sizeof(mcm_wc_rx_t) ); mlog(4, " no inline support: WC_buf_rx_mr = %x\n", m_qp->wc_buf_rx_mr); } return 0; err: m_pi_destroy_bpool(m_qp); return -1; } int m_pi_create_wc_q(struct mcm_qp *m_qp, int entries) { /* RDMA proxy WC pool, register with SCIF and IB, set pool and segm size with parameters */ m_qp->wrc.wc_sz = ALIGN_64(sizeof(struct mcm_wc_rx)); m_qp->wrc.wc_len = m_qp->wrc.wc_sz * entries; /* 64 byte aligned for signal_fence */ m_qp->wrc.wc_end = entries - 1; m_qp->wc_hd_rem = 0; m_qp->wc_tl_rem = 0; if (posix_memalign((void **)&m_qp->wrc.wc_addr, 4096, ALIGN_PAGE(m_qp->wrc.wc_len))) { mlog(0, "failed to allocate wc_rbuf, m_qp=%p, wc_len=%d, entries=%d\n", m_qp, m_qp->wrc.wc_len, entries); return -1; } memset((void*)m_qp->wrc.wc_addr, 0, ALIGN_PAGE(m_qp->wrc.wc_len)); mlog(4, " WC rbuf pool %p, LEN req=%d, act=%d\n", m_qp->wrc.wc_addr, m_qp->wrc.wc_len, ALIGN_PAGE(m_qp->wrc.wc_len)); m_qp->wc_rbuf_mr = ibv_reg_mr(m_qp->smd->md->pd, (void*)m_qp->wrc.wc_addr, m_qp->wrc.wc_len, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wc_rbuf_mr) { mlog(0, " IB_register addr=%p,%d failed %s\n", m_qp->wrc.wc_addr, ALIGN_PAGE(m_qp->wrc.wc_len), strerror(errno)); return -1; } m_qp->wrc.wc_addr = (uint64_t)(uintptr_t)m_qp->wc_rbuf_mr->addr; m_qp->wrc.wc_rkey = m_qp->wc_rbuf_mr->rkey; mlog(4, " IB_mr for wc_buf addr %p, mr 0x%llx, len %d, entries %d rkey %x lkey %x\n", m_qp->wrc.wc_addr, m_qp->wc_rbuf_mr->addr, ALIGN_PAGE(m_qp->wrc.wc_len), entries, m_qp->wc_rbuf_mr->rkey, m_qp->wc_rbuf_mr->lkey); return 0; } int m_pi_create_sr_q(struct mcm_qp *m_qp, int entries) { /* create SR queue for messages */ m_qp->sr_sz = sizeof(dat_mix_sr_t); m_qp->sr_len = m_qp->sr_sz * entries; m_qp->sr_end = entries; m_qp->sr_hd = 0; m_qp->sr_tl = 0; if (posix_memalign((void **)&m_qp->sr_buf, 4096, ALIGN_PAGE(m_qp->sr_len))) { mlog(0, "failed to allocate sr_buf, m_qp=%p, sr_len=%d, entries=%d\n", m_qp, m_qp->sr_len, entries); return -1; } memset(m_qp->sr_buf, 0, m_qp->sr_len); mlog(4, " SR rx queue - %p, qlen %d, entries %d, entry_sz %d\n", m_qp->sr_buf, m_qp->sr_len, entries, sizeof(dat_mix_sr_t)); return 0; } /* called with m_qp->rxlock */ static inline void m_pi_free_sr(struct mcm_qp *m_qp, struct mcm_sr *sr) { struct mcm_sr *sr_tail = (struct mcm_sr *)(m_qp->sr_buf + (m_qp->sr_sz * m_qp->sr_tl)); if (sr_tail != sr) { mlog(0, " ERR: SR free - %p [%d] != tl %p [%d], tl %d hd %d\n", sr, sr->s_idx, sr_tail, sr_tail->s_idx, m_qp->sr_tl, m_qp->sr_hd); } sr->wr_id = 0; sr->w_idx = 0; sr->s_idx = 0; if (++m_qp->sr_tl == m_qp->sr_end) m_qp->sr_tl = 0; } /* called with m_qp->rxlock */ static inline struct mcm_sr *m_pi_get_sr(struct mcm_qp *m_qp, int wr_idx) { int idx = m_qp->sr_tl; struct mcm_sr *sr; while (idx != m_qp->sr_hd) { sr = (struct mcm_sr *)(m_qp->sr_buf + (m_qp->sr_sz * idx)); if (sr->wr_id && !sr->w_idx) { /* first SR slot not taken with WR_rx */ sr->w_idx = wr_idx; return sr; } if (++idx == m_qp->sr_end) idx = 0; } return NULL; } int m_pi_create_bpool(struct mcm_qp *m_qp, int max_recv_wr) { /* PI work request queue, updated from peer PO service via RW_imm */ if (m_pi_create_wr_q(m_qp, max_recv_wr)) goto err; /* PO work completion queue, updated from peer PI service via RW_imm */ if (m_pi_create_wc_q(m_qp, max_recv_wr)) goto err; /* PI SR recv queue, updated via RR's for inbound send operations */ if (m_pi_create_sr_q(m_qp, max_recv_wr)) goto err; return 0; err: m_pi_destroy_bpool(m_qp); return -1; } /* called with smd->rblock */ static int m_pi_buf_ordered(mcm_scif_dev_t *smd, int next) { int idx; if (smd->m_buf_hd_r == 0) /* previous m_idx */ idx = smd->m_buf_end_r; else idx = smd->m_buf_hd_r - 1; mlog(8," smd %p - m_buf_wc_r %p: tl %d hd %d buf_wc_hd[%d].m_idx=0x%x next=0x%x\n", smd, smd->m_buf_wc_r, smd->m_buf_tl_r, smd->m_buf_hd_r, idx, smd->m_buf_wc_r[idx].m_idx, next); if (smd->m_buf_wc_r[idx].done || ALIGN_64(smd->m_buf_wc_r[idx].m_idx + 1) == next) return 1; else return 0; } /* called with smd->rblock */ static int m_pi_buf_hd(mcm_scif_dev_t *smd, int m_idx, struct mcm_wr_rx *m_wr_rx) { mlog(4," [%d:%d] m_buf_wc_r %p: tl %d hd %d buf_wc_hd[%d].m_idx=0x%x\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_buf_wc_r, smd->m_buf_tl_r, (smd->m_buf_hd_r + 1) & smd->m_buf_end_r, (smd->m_buf_hd_r + 1) & smd->m_buf_end_r, m_idx); if (((smd->m_buf_hd_r + 1) & smd->m_buf_end_r) == smd->m_buf_tl_r) { mlog(0," ERR: PI Buf WC full (%d) m_buf_wc_r %p:" "tl %d hd %d buf_wc_hd_r[%d].m_idx=0x%x\n", smd->m_buf_end_r, smd->m_buf_wc_r, smd->m_buf_tl_r + 1, smd->m_buf_hd_r, smd->m_buf_hd_r, m_idx); return 1; } smd->m_buf_hd_r = (smd->m_buf_hd_r + 1) & smd->m_buf_end_r; /* move hd */ smd->m_buf_wc_r[smd->m_buf_hd_r].m_idx = m_idx; smd->m_buf_wc_r[smd->m_buf_hd_r].done = 0; #ifdef MCM_PROFILE smd->m_buf_wc_r[smd->m_buf_hd_r].hd = smd->m_hd_r; smd->m_buf_wc_r[smd->m_buf_hd_r].tl = smd->m_tl_r; smd->m_buf_wc_r[smd->m_buf_hd_r].ref++; smd->m_buf_wc_r[smd->m_buf_hd_r].ts = mcm_ts_us(); smd->m_buf_wc_r[smd->m_buf_hd_r].wr = (void *) m_wr_rx; if ((smd->m_hd_ro_r != smd->m_tl_ro_r) && (smd->m_hd_r >= smd->m_tl_r)) { struct mcm_qp *m_qp = (struct mcm_qp*)m_wr_rx->context; mlog(0, " ERR: [%d:%d:%d] PI_buf HD(%d) passed TL(%d): w_tl %d w_hd %d:" " wc_r[%d].m_idx=%x, m_tl %x m_hd %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, smd->m_hd_ro_r, smd->m_tl_ro_r, smd->m_buf_tl_r + 1, smd->m_buf_hd_r, smd->m_buf_hd_r, m_idx, smd->m_tl_r, smd->m_hd_r); mcm_check_io(); } #endif return 0; } /* called with smd->rblock */ static void m_pi_buf_tl(mcm_scif_dev_t *smd, int m_idx, struct mcm_wr_rx *m_wr_rx) { int idx; int busy = 0, match = 0; #ifdef MCM_PROFILE off_t tl_sav = smd->m_tl_r; uint32_t now = mcm_ts_us(); #endif idx = (smd->m_buf_tl_r + 1) & smd->m_buf_end_r; /* tl == hd is empty */ /* mark m_idx complete, move proxy buffer tail until busy slot */ while ((!match || !busy) && smd->m_buf_tl_r != smd->m_buf_hd_r) { if (smd->m_buf_wc_r[idx].m_idx == m_idx) { smd->m_buf_wc_r[idx].done = 1; match = 1; #ifdef MCM_PROFILE smd->m_buf_wc_r[idx].ref--; smd->m_buf_wc_r[idx].ts = now - smd->m_buf_wc_r[idx].ts; #endif } if (smd->m_buf_wc_r[idx].done && !busy) { smd->m_tl_r = smd->m_buf_wc_r[idx].m_idx; smd->m_buf_wc_r[idx].m_idx = 0; smd->m_buf_tl_r = (smd->m_buf_tl_r + 1) & smd->m_buf_end_r; } if (!smd->m_buf_wc_r[idx].done) busy = 1; if (idx == smd->m_buf_hd_r) break; idx = (idx + 1) & smd->m_buf_end_r; } #ifdef MCM_PROFILE if (tl_sav > smd->m_tl_r) smd->m_tl_ro_r++; if (!match) { mlog(0, " [%d:%d] ERR: m_tl 0x%x m_hd 0x%x" "- m_wc: tl %d hd %d - m_idx=0x%x NO MATCH\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_tl_r, smd->m_hd_r, smd->m_buf_tl_r, (smd->m_buf_hd_r + 1) & smd->m_buf_end_r, m_idx); mcm_check_io(); } #endif } static off_t m_pi_mr_trans(mcm_scif_dev_t *smd, uint64_t raddr, uint32_t rkey, int len) { struct mcm_mr *m_mr; uint64_t mr_start, mr_end, scif_off = 0; uint32_t offset; mlog(8,"LOCATE: 0x%Lx to 0x%Lx, rkey 0x%x len %d\n", raddr, raddr+len, rkey, len); mpxy_lock(&smd->mrlock); m_mr = get_head_entry(&smd->mrlist); while (m_mr) { mlog(8, "mr %p: ib_addr 0x%Lx ib_rkey 0x%x len %d\n", m_mr, m_mr->mre.ib_addr, m_mr->mre.ib_rkey, m_mr->mre.mr_len); if (m_mr->mre.ib_rkey == rkey) { mr_start = m_mr->mre.ib_addr; mr_end = m_mr->mre.ib_addr + m_mr->mre.mr_len; mlog(8, "rkey match: start %Lx end %Lx\n", mr_start, mr_end); if ((raddr >= mr_start) && ((raddr+len) <= mr_end)) { mlog(8, " FOUND: mr %p: ib_addr 0x%Lx ib_rkey 0x%x len %d sci_addr %Lx sci_off %x\n", m_mr, m_mr->mre.ib_addr, m_mr->mre.ib_rkey, m_mr->mre.mr_len, m_mr->mre.sci_addr, m_mr->mre.sci_off); offset = raddr - mr_start; scif_off = m_mr->mre.sci_addr + m_mr->mre.sci_off + offset; goto done; } } m_mr = get_next_entry(&m_mr->entry, &smd->mrlist); } done: mpxy_unlock(&smd->mrlock); mlog(8,"LOCATE: return scif_off == 0x%Lx \n", scif_off); return scif_off; } int m_pi_prep_rcv_q(struct mcm_qp *m_qp) { struct ibv_recv_wr recv_wr, *recv_err; struct ibv_qp *ib_qp; int i; /* MXS -> MSS or HST, PI service will be on QP1 */ if (MXS_EP(&m_qp->smd->md->addr) && (MSS_EP(&m_qp->cm->msg.daddr1) || HST_EP(&m_qp->cm->msg.daddr1))) ib_qp = m_qp->ib_qp1; else ib_qp = m_qp->ib_qp2; if (!ib_qp) { mlog(0, " ERR: m_qp %p ib_qp == 0, QP1 %p QP2 %p\n", m_qp, m_qp->ib_qp1, m_qp->ib_qp2); return -1; } mlog(4, " post %d 0-byte messages, m_qp %p qpn %x\n", mcm_rx_entries, m_qp, ib_qp->qp_num); recv_wr.next = NULL; recv_wr.sg_list = NULL; recv_wr.num_sge = 0; recv_wr.wr_id = (uint64_t)(uintptr_t) m_qp; /* pre-post zero byte messages for proxy-in service, inbound rdma_writes with immed data */ for (i=0; i< mcm_rx_entries; i++) { errno = 0; if (ibv_post_recv(ib_qp, &recv_wr, &recv_err)) { mlog(0, " ERR: qpn %x ibv_post_recv[%d] - %s\n", ib_qp->qp_num, i, strerror(errno)); return 1; } MCNTR(m_qp->smd->md, MCM_QP_RECV); } return 0; } static int m_pi_send_wc_local(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_r, int wc_idx) { mcm_cm_t *m_cm = m_qp->cm; mlog(0, " ERR: Po->Pi same node: not implemented\n"); mlog(0, " CM %p %s SRC 0x%x %x 0x%x %Lx -> DST 0x%x %x 0x%x %Lx %s\n", m_cm, mcm_state_str(m_cm->state), htons(m_cm->msg.saddr1.lid), htonl(m_cm->msg.saddr1.qpn), htons(m_cm->msg.sport), system_guid, htons(m_cm->msg.daddr1.lid), htonl(m_cm->msg.dqpn), htons(m_cm->msg.dport), ntohll(m_cm->msg.sys_guid), mcm_map_str(m_cm->msg.daddr1.ep_map)); return 0; } /* called with m_qp->rxlock */ static int m_pi_send_wc(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_rx, int status) { struct ibv_send_wr *bad_wr; struct ibv_send_wr wr; struct ibv_sge sge; struct wrc_idata wrc; struct mcm_wc_rx wc_rx; struct mcm_wc_rx *wc_rx_ptr; struct ibv_qp *ib_qp; int wc_idx, ret; mlog(0x10,"[%d:%d:%d] WC_rem: wr_rx[%d] %p wc_hd %d flgs %x WR_r tl %d-%d" " wt %d hd %d wr_id %Lx org_id %Lx\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx, m_qp->wc_hd_rem, wr_rx->flags, m_qp->wr_tl_r, wr_rx->w_idx, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, wr_rx->wr.wr_id, wr_rx->org_id); /* local WR and remote WR are serialized, should never reach tail of remote WR */ if (((m_qp->wc_hd_rem + 1) & m_qp->wrc.wc_end) == m_qp->wc_tl_rem) { mlog(0, " ERR: m_qp %p stalled, peer proxy-out WC queue full hd %d == tl %d\n", m_qp, m_qp->wc_hd_rem, m_qp->wc_tl_rem); return -1; } m_qp->wc_hd_rem = (m_qp->wc_hd_rem + 1) & m_qp->wrc.wc_end; /* move remote wc_hd */ m_qp->wr_tl_r = wr_rx->w_idx; /* move wr_rx tail */ wc_idx = m_qp->wc_hd_rem; wrc.id = (uint16_t)wc_idx; /* imm_data for proxy_out rcv engine */ wrc.type = M_WC_TYPE; wrc.flags = 0; if (m_qp->smd->md->indata) { wc_rx_ptr = &wc_rx; sge.lkey = 0; /* inline doesn't need registered */ } else { wc_rx_ptr = (struct mcm_wc_rx *) (m_qp->wc_buf_rx + (sizeof(struct mcm_wc_rx) * wc_idx)); sge.lkey = m_qp->wc_buf_rx_mr->lkey; } sge.addr = (uint64_t)(uintptr_t) wc_rx_ptr; sge.length = (uint32_t) sizeof(struct mcm_wc_rx); mcm_hton_wc_rx(wc_rx_ptr, wr_rx, m_qp->wr_tl_r, status); /* P2P on same system, keep it local */ if (htonll(m_qp->cm->msg.sys_guid) == system_guid) return (m_pi_send_wc_local(m_qp, wr_rx, wc_idx)); /* send back a WC with error */ memset(&wr, 0, sizeof(struct ibv_send_wr)); wr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM; wr.imm_data = htonl(*(uint32_t *)&wrc); wr.num_sge = 1; wr.send_flags |= IBV_SEND_SIGNALED; wr.wr_id = WRID_SET(wr_rx, WRID_RX_RW_IMM); wr.wr.rdma.rkey = m_qp->wrc_rem.wc_rkey; wr.wr.rdma.remote_addr = (uint64_t)(uintptr_t)((struct mcm_wc_rx *) (m_qp->wrc_rem.wc_addr + (m_qp->wrc_rem.wc_sz * wc_idx))); wr.sg_list = &sge; if (m_qp->smd->md->indata) wr.send_flags |= IBV_SEND_INLINE; mlog(4, " WC: RW_imm post: wr_id[%d] %Lx sglist %p sge %d op %d flgs %x" " idata %x WR_rem = raddr %p rkey %x ln %d op %x\n", wr_rx->w_idx, wr.wr_id, wr.sg_list, wr.num_sge, wr.opcode, wr.send_flags, ntohl(wr.imm_data), wr.wr.rdma.remote_addr, wr.wr.rdma.rkey, sge.length, wr_rx->wr.opcode); /* MXS -> MSS or HST, PI service will be on QP1 */ if (MXS_EP(&m_qp->smd->md->addr) && (MSS_EP(&m_qp->cm->msg.daddr1) || HST_EP(&m_qp->cm->msg.daddr1))) ib_qp = m_qp->ib_qp1; else ib_qp = m_qp->ib_qp2; errno = 0; ret = ibv_post_send(ib_qp, &wr, &bad_wr); if (ret) { mlog(0, " ERR: wr_rx %p rx_idx %d laddr=%p ln=%d lkey=%x\n", wr_rx, wr_rx->w_idx, sge.addr, sge.length, sge.lkey); mlog(0, " wr_id %Lx %p sglist %p sge %d op %d flgs %x" " idata 0x%x raddr %p rkey %x \n", wr_rx->wr.wr_id, wr_rx->sg, wr_rx->wr.num_sge, wr_rx->wr.opcode, wr_rx->wr.send_flags, wr_rx->wr.imm_data, wr_rx->wr.wr.rdma.remote_addr, wr_rx->wr.wr.rdma.rkey); return ret; } m_qp->pi_rw_cnt++; mlog(4," WC_rem hd %d tl %d, m_qp %p qpn 0x%x, m_cm %p\n", m_qp->wc_hd_rem, m_qp->wc_tl_rem, m_qp, ib_qp->qp_num, m_qp->cm); return 0; } /* called with rxlock, process all RR's up to signal marker at wr_last */ static void m_pi_post_writeto(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_sig, struct ibv_wc *wc) { mcm_scif_dev_t *smd = m_qp->smd; struct mcm_wr_rx *wr_rx; struct mcm_sr *m_sr = NULL; off_t l_off, l_off_wr, r_off; int ret, i, l_start, l_end, l_len, sg_len, w_len, num_sge, wr_idx, wr_cnt = 0; int wt_flag; wr_idx = m_qp->wr_tl_r_wt; /* from WT tail, process RR's posted until reaching wr_last */ while (m_qp->pi_rr_cnt) { /* RR's pending */ wr_rx = (struct mcm_wr_rx *)(m_qp->wrc.wr_addr + (m_qp->wrc.wr_sz * wr_idx)); if (!(wr_rx->flags & M_READ_POSTED)) { /* reached RR signaled marker, or head pointer */ if (wr_idx == wr_sig->w_idx || wr_idx == m_qp->wr_hd_r) break; wr_idx = (wr_idx + 1) & m_qp->wrc.wr_end; /* next WR */ continue; } wr_cnt++; #if MCM_PROFILE if (wr_rx == wr_sig) mcm_qp_prof_ts(m_qp, MCM_QP_IB_RR, wr_rx->time, wr_rx->qcnt, wr_cnt); #endif mlog(4, " WR_rx[%d-%d] %p m_qp %p wc %p wc->op %x wr_rx->wr.op %x\n", wr_rx->w_idx, wr_sig->w_idx, wr_rx, m_qp, wc, wc->opcode, wr_rx->wr.opcode); m_qp->pi_rr_cnt--; /* rdma read complete */ MCNTR(smd->md, MCM_QP_READ_DONE); /* if SR or RW_imm, need a posted receive */ if ((wr_rx->wr.opcode == IBV_WR_SEND) || (wr_rx->wr.opcode == IBV_WR_RDMA_WRITE_WITH_IMM)) { m_sr = m_pi_get_sr(m_qp, wr_rx->w_idx); if (!m_sr) { mlog(0, " WARNING: SR stalled, no RCV messages posted" " m_qp %p, sr_tl %d sr_hd %d\n", m_qp, m_qp->sr_tl, m_qp->sr_hd); wr_rx->flags |= M_RECV_PAUSED; return; } wr_rx->s_idx = m_sr->s_idx; /* link WR_RX and SR */ m_sr->len = 0; num_sge = m_sr->num_sge; sg_len = m_sr->sg[0].length; r_off = m_sr->sg[0].addr; /* post recv buffer address */ mlog(4, " WR %s: m_sr[%d] %p -> scif r_off %Lx ln %d\n", (wr_rx->wr.opcode == IBV_WR_SEND) ? "SR":"RW_IMM", m_sr->s_idx, m_sr, r_off, sg_len); } /* need to translate to rdma write dst */ if (!(wr_rx->wr.opcode == IBV_WR_SEND)) { num_sge = 1; sg_len = wr_rx->sg[2].length; r_off = m_pi_mr_trans(smd, wr_rx->wr.wr.rdma.remote_addr, wr_rx->wr.wr.rdma.rkey, sg_len); if (!r_off) goto bail; mlog(4, " RDMA_WRITE op: wr_rx[%d] %p -> scif r_off %Lx len %d\n", wr_rx->w_idx, wr_rx, r_off, sg_len, 0); } /* sg[0] entry == proxy-out buffer, src for IB RR */ /* sg[1] entry == proxy-in buffer, dst for IB RR */ /* sg[2] entry == proxy-in buffer src for scif_sendto */ /* wr.rdma.remote_addr, wr.rdma.rkey, dst for scif_sento - TPT to sci_off */ wr_rx->wr.wr_id = 0; l_off_wr = (uint64_t) (m_qp->wr_off_r + (wr_rx->w_idx * m_qp->wrc.wr_sz)); l_off = wr_rx->sg[2].addr; l_len = wr_rx->sg[2].length; l_start = l_off - (uint64_t)smd->m_offset_r; l_end = l_start + l_len; for (i=0; (iw_idx, wr_rx, l_off, r_off, l_start, l_end, w_len, wr_rx->org_id, m_qp->wr_tl_r, m_qp->wr_hd_r); #if MCM_PROFILE wr_rx->time = mcm_ts_us(); wr_rx->qcnt = m_qp->post_cnt_wt; #endif if (w_len < 256) wt_flag = SCIF_RMA_USECPU; ret = scif_writeto(smd->scif_tx_ep, l_off, w_len, r_off, wt_flag); if (ret) { mlog(0, " ERR: scif_sendto, ret %d err: %d %s\n", ret, errno, strerror(errno)); goto bail; } MCNTR(smd->md, MCM_SCIF_WRITE_TO); /* adjust for multiple SG entries on post_recv */ l_off += w_len; l_len = l_len - w_len; if (m_sr) { m_sr->len += w_len; r_off = m_sr->sg[i].addr; /* next SR segment */ sg_len = m_sr->sg[i].length; } } if (l_len) { mlog(0, " ERR: RX overrun: written %d remaining %d sge's %d\n", wr_rx->sg[2].length, l_len, num_sge); goto bail; } /* signal last segment */ mlog(4, " SCIF_fence_signal: l_off_wr %p, wr_rx %p wr_idx %d\n", l_off_wr, wr_rx, wr_rx->w_idx); ret = scif_fence_signal(smd->scif_tx_ep, l_off_wr, wr_rx->org_id, 0, 0, SCIF_FENCE_INIT_SELF | SCIF_SIGNAL_LOCAL); if (ret) { mlog(0," ERR: scif_fence_signal, ret %d %s\n", ret, strerror(errno)); goto bail; } MCNTR(smd->md, MCM_SCIF_SIGNAL); wr_rx->flags &= ~M_READ_POSTED; /* reset READ_POSTED */ wr_rx->flags |= M_READ_DONE; wr_rx->flags |= M_READ_WRITE_TO; m_qp->post_cnt_wt++; /* reached RR signaled marker, or head */ if (wr_idx == wr_sig->w_idx || wr_idx == m_qp->wr_hd_r) break; wr_idx = (wr_idx + 1) & m_qp->wrc.wr_end; /* next WR */ } return; bail: /* report error via WC back to proxy-out */ mlog(0, " ERR: writeto: wr_rx[%d] %p -> raddr %Lx rkey %x (scif r_off %Lx) len %d\n", wr_rx->w_idx, wr_rx, wr_rx->wr.wr.rdma.remote_addr, wr_rx->wr.wr.rdma.rkey, r_off, sg_len); return; } /* Called from TX request thread */ void m_pi_pending_wc(struct mcm_qp *m_qp, int *events) { mpxy_lock(&m_qp->rxlock); *events += (m_qp->pi_rw_cnt + m_qp->pi_rr_cnt); mpxy_unlock(&m_qp->rxlock); } /* RR has completed, forward segment to final dst address via SCIF_sendto */ void m_pi_req_event(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_rx, struct ibv_wc *wc, int type) { mlog(4, " WR_rx[%d] %p %s complete po-addr=%p ln=%d, key=%x ctx=%Lx\n", wr_rx->w_idx, wr_rx, wr_rx->wr.opcode == IBV_WR_RDMA_READ ? "RR":"RW_IMM WC", wr_rx->sg[0].addr, wr_rx->sg[0].length, wr_rx->sg[0].lkey, wr_rx->context); if (wc->status && (wc->status != IBV_WC_WR_FLUSH_ERR)) { char *sbuf = (char*)wr_rx->sg[1].addr; mlog(0," WR ERR: st %d, vn %x pst %d cmp %d qstate 0x%x\n", wc->status, wc->vendor_err, m_qp->post_cnt, m_qp->comp_cnt, m_qp->ib_qp2->state); mlog(0, " WR ERR: wr_rx %p laddr %p=0x%x - %p=0x%x, len=%d, lkey=%x\n", wr_rx, sbuf, sbuf[0], &sbuf[wr_rx->sg[1].length], sbuf[wr_rx->sg[1].length], wr_rx->sg[1].length, wr_rx->sg[1].lkey); mlog(0, " WR ERR: wr_id %Lx sglist %p sge %d op %d flgs" " %d idata 0x%x raddr %p rkey %x saddr %p key %x ln %d\n", wr_rx->org_id, wr_rx->sg, wr_rx->wr.num_sge, wr_rx->wr.opcode, wr_rx->wr.send_flags, wr_rx->wr.imm_data, wr_rx->wr.wr.rdma.remote_addr, wr_rx->wr.wr.rdma.rkey, wr_rx->sg[0].addr, wr_rx->sg[0]. lkey,wr_rx->sg[0].length); /* send WC with ERR to RW initiator, hold rxlock */ mpxy_lock(&m_qp->rxlock); if (m_pi_send_wc(m_qp, wr_rx, wc->status)) mlog(0, "WR ERR: proxy-in to proxy-out WC send failed\n"); mpxy_unlock(&m_qp->rxlock); return; } /* RR complete, ready for SCIF_writeto to complete RW or SR */ if (type == WRID_RX_RR) { mpxy_lock(&m_qp->rxlock); m_pi_post_writeto(m_qp, wr_rx, wc); mpxy_unlock(&m_qp->rxlock); write(m_qp->smd->md->mc->rx_pipe[1], "w", sizeof "w"); /* signal rx_thread */ sched_yield(); } else { mlog(4, " WR_rx[%d] %p flgs %x %s complete - WR tl %d tl_wt %d hd %d\n", wr_rx->w_idx, wr_rx, wr_rx->flags, wc->opcode == IBV_WC_RDMA_READ ? "RR":"RW_IMM WC", m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r); mpxy_lock(&m_qp->rxlock); m_qp->pi_rw_cnt--; /* pending WC post_send */ mpxy_unlock(&m_qp->rxlock); } } /* called with m_qp->rxlock */ static void m_pi_post_read(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_rx) { mcm_scif_dev_t *smd = m_qp->smd; struct ibv_qp *ib_qp; char *rbuf; int l_start, l_end, ret = 0; int l_len = wr_rx->sg[0].length; struct ibv_send_wr ib_wr; struct ibv_send_wr *bad_wr; mlog(4, " [%d:%d:%d] WR_rx[%d] %p RR init: po-addr=%p ln=%d, key=%x ctx=%Lx\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx, wr_rx->sg[0].addr, wr_rx->sg[0].length, wr_rx->sg[0].lkey, wr_rx->context); /* shared proxy-in buffer, device level serialization */ mpxy_lock(&smd->rblock); /* slice out proxy buffer for this segment */ l_start = ALIGN_64(smd->m_hd_r); if ((l_start + l_len) > smd->m_len_r) l_start = 64; l_end = l_start + l_len; if (pb_full(l_start, l_end, smd->m_hd_r, smd->m_tl_r, l_len, smd->m_len_r)) { if (!(wr_rx->flags & M_READ_PAUSED)) { wr_rx->flags |= M_READ_PAUSED; m_qp->stall_cnt_rr++; MCNTR(smd->md, MCM_MX_RR_STALL); mlog(1, " WARN[%d:%d:%d] WR_rx[%d] org_id %Lx RR stall (%d)" " low mem (%p-%p) hd 0x%x tl 0x%x ln %x,%d\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx->org_id, m_qp->stall_cnt_rr, smd->m_buf_r, smd->m_buf_r + smd->m_len_r, smd->m_hd_r, smd->m_tl_r, l_len, l_len); mlog(1, " wr[%d] %p RR(%d,%d,%d): flgs %x tl %d tl_wt %d hd %d\n", wr_rx->w_idx, wr_rx, m_qp->post_cnt_rr, m_qp->stall_cnt_rr, m_qp->pi_rr_cnt, wr_rx->flags, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r); } mpxy_unlock(&smd->rblock); return; } rbuf = (char*)(smd->m_buf_r + l_start); if ((m_qp->pi_rr_cnt >= mcm_rr_max) && !(wr_rx->flags & M_READ_PAUSED)) { wr_rx->flags |= M_READ_PAUSED; m_qp->stall_cnt_rr++; mlog(0x1, "WARN[%d:%d:%d] WR_rx[%d] max RR's, stalling (%d)" " memory (%p-%p) hd 0x%x tl 0x%x %x,%d\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, m_qp->stall_cnt_rr, smd->m_buf_r, smd->m_buf_r + smd->m_len_r, smd->m_hd_r, smd->m_tl_r, l_len, l_len); mlog(0x1, " wr[%d] %p RR(%d,%d,%d): flgs %x tl %d tl_wt %d hd %d\n", wr_rx->w_idx, wr_rx, m_qp->post_cnt_rr, m_qp->stall_cnt_rr, m_qp->pi_rr_cnt, wr_rx->flags, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r); mpxy_unlock(&smd->rblock); return; } /* rbuf available, progress if paused, no progress if any prior IO waiting */ if (wr_rx->flags & M_READ_PAUSED) { m_qp->stall_cnt_rr--; wr_rx->flags &= ~M_READ_PAUSED; mlog(0x1, "[%d:%d:%d] WR_rx[%d] RR (%d) got memory (%p-%p)" " hd 0x%x tl 0x%x (0x%x-0x%x) ln %x,%d\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, m_qp->stall_cnt_rr, smd->m_buf_r, smd->m_buf_r + smd->m_len_r, smd->m_hd_r, smd->m_tl_r, l_start, l_end, l_len, l_len); } else if (m_qp->stall_cnt_rr) { wr_rx->flags |= M_READ_PAUSED; m_qp->stall_cnt_rr++; mlog(0x1, "WARN[%d:%d:%d] WR_rx[%d] previous RR stall (%d)" " memory (%p-%p) hd 0x%x tl 0x%x %x,%d\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, m_qp->stall_cnt_rr, smd->m_buf_r, smd->m_buf_r + smd->m_len_r, smd->m_hd_r, smd->m_tl_r, l_len, l_len); mlog(0x1, " wr[%d] %p RR(%d,%d,%d): flgs %x tl %d tl_wt %d hd %d\n", wr_rx->w_idx, wr_rx, m_qp->post_cnt_rr, m_qp->stall_cnt_rr, m_qp->pi_rr_cnt, wr_rx->flags, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r); mpxy_unlock(&smd->rblock); return; } /* sg[0] entry == proxy-out buffer, src for IB RR */ /* sg[1] entry == proxy-in buffer, dst for IB RR */ /* sg[2] entry == proxy-in buffer src for scif_sendto */ /* wr.rdma.remote_addr, wr.rdma.rkey, dst for scif_sento */ wr_rx->sg[1].addr = (uint64_t)(rbuf); wr_rx->sg[1].lkey = smd->m_mr_r->lkey; wr_rx->sg[1].length = l_len; wr_rx->sg[2].addr = (uint64_t)smd->m_offset_r + l_start; wr_rx->sg[2].lkey = 0; wr_rx->sg[2].length = l_len; /* initiate RR from remote po proxy buf to local pi buffer, signal all */ wr_rx->wr.wr_id = 0; /* indication of wr_rx type */ wr_rx->m_idx = 0; /* build an ib_wr from wr_rx */ const_ib_rr(&ib_wr, &wr_rx->wr, (struct ibv_sge*)wr_rx->sg); ib_wr.wr_id = WRID_SET(wr_rx, WRID_RX_RR); /* signal and mark rbuf idx, if m_idx out of order must mark and signal */ if ((wr_rx->flags & M_SEND_LS) || (!m_pi_buf_ordered(smd, rbuf - smd->m_buf_r)) || (m_qp->pi_rr_cnt == mcm_rr_max-1) || (!((m_qp->post_cnt_rr+1) % mcm_rr_signal))) { ib_wr.send_flags = IBV_SEND_SIGNALED; wr_rx->m_idx = ((rbuf + (l_len - 1)) - smd->m_buf_r); if (m_pi_buf_hd(smd, wr_rx->m_idx, wr_rx)) { mpxy_unlock(&smd->rblock); goto buf_err; } } #ifdef MCM_PROFILE if (l_end < smd->m_hd_r) smd->m_hd_ro_r++; #endif /* * update shared proxy-in buffer hd, save end of buffer idx * and save ref m_idx for out of order completions across QP's */ smd->m_hd_r = l_end; mpxy_unlock(&smd->rblock); /* MXS -> MSS or HST, PI service will be on QP1 */ if (MXS_EP(&m_qp->smd->md->addr) && (MSS_EP(&m_qp->cm->msg.daddr1) || HST_EP(&m_qp->cm->msg.daddr1))) ib_qp = m_qp->ib_qp1; else ib_qp = m_qp->ib_qp2; #if MCM_PROFILE wr_rx->time = mcm_ts_us(); wr_rx->qcnt = m_qp->pi_rr_cnt; #endif wr_rx->flags |= M_READ_POSTED; errno = 0; ret = ibv_post_send(ib_qp, &ib_wr, &bad_wr); if (ret) goto bail; m_qp->pi_rr_cnt++; m_qp->post_cnt_rr++; MCNTR(smd->md, MCM_QP_READ); mlog(0x10, "[%d:%d:%d] WR[%d] %p RR(%d,%d,%d): wr_id %Lx qn %x flgs %x,%x ln %d " "r_addr,key %Lx %x to l_addr,key %Lx %x tl %d hd %d, m_idx %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx, m_qp->post_cnt_rr, m_qp->stall_cnt_rr, m_qp->pi_rr_cnt, ib_wr.wr_id, ib_qp->qp_num, ib_wr.send_flags, wr_rx->flags, l_len, ib_wr.wr.rdma.remote_addr, ib_wr.wr.rdma.rkey, ib_wr.sg_list->addr, ib_wr.sg_list->lkey, m_qp->wr_tl_r, m_qp->wr_hd_r, wr_rx->m_idx); write(smd->md->mc->tx_pipe[1], "w", sizeof "w"); return; bail: mpxy_lock(&smd->rblock); mlog(0x0, "[%d:%d:%d] ERR: WR[%d] %p RR(%d,%d,%d): wr_id %Lx qn %x f=%x,%x ln %d " "RA %Lx %x to LA %Lx %x tl %d hd %d, m=%x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx, m_qp->post_cnt_rr, m_qp->stall_cnt_rr, m_qp->pi_rr_cnt, ib_wr.wr_id, ib_qp->qp_num, ib_wr.send_flags, wr_rx->flags, l_len, ib_wr.wr.rdma.remote_addr, ib_wr.wr.rdma.rkey, ib_wr.sg_list->addr, ib_wr.sg_list->lkey, m_qp->wr_tl_r, m_qp->wr_hd_r, wr_rx->m_idx); m_pi_buf_tl(smd, wr_rx->m_idx, wr_rx); /* return buffer slot */ mpxy_unlock(&smd->rblock); buf_err: m_qp->stall_cnt_rr++; wr_rx->flags |= M_READ_PAUSED; wr_rx->flags &= ~M_READ_POSTED; mlog(0, " WARN[%d] (%d,%d): wr[%d] %p RR ibv_post/pi_buf ERR stall (%d,%d,%d,%d):" " flgs 0x%x ln %d r_addr,key %Lx %x to l_addr,key %Lx %x" " tl %d w_tl %d hd %d\n", smd->entry.tid, ret, errno, wr_rx->w_idx, wr_rx, m_qp->pi_rr_cnt, m_qp->pi_rw_cnt, m_qp->post_sig_cnt, m_qp->stall_cnt_rr, ib_wr.send_flags, l_len, ib_wr.wr.rdma.remote_addr, ib_wr.wr.rdma.rkey, ib_wr.sg_list->addr, ib_wr.sg_list->lkey, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r); } void m_pi_rcv_event(struct mcm_qp *m_qp, wrc_idata_t *wrc) { mlog(8," WRC id %x, type %x, flags %x\n", wrc->id, wrc->type, wrc->flags); if (wrc->type == M_WR_TYPE) { struct mcm_wr_rx *wr_rx; if (wrc->id > m_qp->wrc.wr_end) { mlog(0," RX imm_data: WR id out of range %x > %x \n", wrc->id, m_qp->wrc.wr_end); return; } wr_rx = (struct mcm_wr_rx *)(m_qp->wrc.wr_addr + (m_qp->wrc.wr_sz * wrc->id)); mcm_ntoh_wr_rx(wr_rx); /* received in network order, convert */ wr_rx->context = (uint64_t)(uintptr_t)m_qp; /* local side QP context */ mlog(8," WR_rx[%d] %p org_id %Lx wc_tl_rem %d flgs %x wr.wr_id %Lx imm 0x%x\n", wrc->id, wr_rx, wr_rx->org_id, wr_rx->w_idx, wr_rx->flags, wr_rx->wr.wr_id, wr_rx->wr.imm_data); mpxy_lock(&m_qp->rxlock); m_qp->wc_tl_rem = wr_rx->w_idx; /* remote WC tail update in WR */ #ifdef MCM_PROFILE if (wrc->id == m_qp->wr_hd_r) mlog(0," ERR: RX imm_data: WR id %d duplicate!!!\n", wrc->id); #endif m_qp->wr_hd_r = wrc->id; /* new WR took slot, move hd_r */ wr_rx->w_idx = wrc->id; /* my idx slot, to move tl */ m_pi_post_read(m_qp, wr_rx); mpxy_unlock(&m_qp->rxlock); write(m_qp->smd->md->mc->tx_pipe[1], "w", sizeof "w"); } else if (wrc->type == M_WC_TYPE) { struct mcm_wc_rx *m_wc; /* work completion of rdma_write sent to remote proxy-in */ if (wrc->id > m_qp->wrc.wc_end) { mlog(0," RX imm_data: WC id out of range %x > %x \n", wrc->id, m_qp->wrc.wc_end); return; } m_wc = (struct mcm_wc_rx *)(m_qp->wrc.wc_addr + (m_qp->wrc.wc_sz * wrc->id)); mcm_ntoh_wc_rx(m_wc); /* convert received WC contents */ /* work completion for proxy_out service */ m_po_wc_event(m_qp, m_wc, wrc->id); } else { mlog(0," ERR: RX imm_data: type unknown %x\n", wrc->type); } } /* Proxy-in service - RX thread * * <- Work request in (RW_imm - WR idata), remote initiated RW, local RR * <- Work completion in (RW_imm - WC idata), local initiated RW, remote RR */ void m_rcv_event(struct mcm_cq *m_cq, int *events) { struct ibv_wc wc[mcm_wc_max/2]; struct ibv_cq *ib_cq; struct mcm_qp *m_qp; void *cq_ctx; int i, wc_cnt, ret, err=0, notify=0; ret = ibv_get_cq_event(m_cq->ib_ch, &ib_cq, (void *)&cq_ctx); if (ret == 0) ibv_ack_cq_events(m_cq->ib_cq, 1); wc_cnt = 0; retry: if (wc_cnt >= mcm_wc_max) { *events += 1; /* pending */ return; } ret = ibv_poll_cq(m_cq->ib_cq, mcm_wc_max/2, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(m_cq->ib_cq, 0); notify = 1; goto retry; } return; } else notify = 0; wc_cnt += ret; for (i=0; iib_qp2->state); continue; } if (m_qp->cm && (m_qp->cm->state == MCM_DISCONNECTED)) { mlog(1," WARN: RX data on DISC m_qp %p qp1 %p qp2 %p %s\n", m_qp, m_qp->ib_qp1, m_qp->ib_qp2, mcm_state_str(m_qp->cm->state)); continue; } if (wc[i].opcode == IBV_WC_RECV_RDMA_WITH_IMM) { struct ibv_recv_wr r_wr, *r_err; wrc_idata_t wrc; struct ibv_qp *ib_qp; wrc.id = WRC_ID_DATA(ntohl(wc[i].imm_data)); wrc.type = WRC_TYPE_DATA(ntohl(wc[i].imm_data)); wrc.flags = WRC_FLAGS_DATA(ntohl(wc[i].imm_data)); /* process WR or WC */ m_pi_rcv_event(m_qp, &wrc); /* re-post message */ r_wr.next = NULL; r_wr.sg_list = NULL; r_wr.num_sge = 0; r_wr.wr_id = (uint64_t)(uintptr_t) m_qp; /* MXS -> MSS or HST, PI service will be on QP1 */ if (MXS_EP(&m_qp->smd->md->addr) && (MSS_EP(&m_qp->cm->msg.daddr1) || HST_EP(&m_qp->cm->msg.daddr1))) ib_qp = m_qp->ib_qp1; else ib_qp = m_qp->ib_qp2; errno = 0; if (ib_qp) { err = ibv_post_recv(ib_qp, &r_wr, &r_err); if (err) { mlog(0,"ERR: qp %p (%s) qpn %x ibv_post_recv ret = %d %s\n", m_qp, (MXS_EP(&m_qp->smd->md->addr) && MSS_EP(&m_qp->cm->msg.daddr1)) ? "QP1":"QP2", m_qp->ib_qp2 ? m_qp->ib_qp2->qp_num:m_qp->ib_qp1->qp_num, ret, strerror(errno)); } } MCNTR(m_qp->smd->md, MCM_QP_RECV); } else { mlog(0,"ERR: unexpected WC opcode = %d on m_qp %p\n", wc[i].opcode, m_qp); } } goto retry; } /* * Pending Proxy-in services for RDMA Writes from remote peer * * RX side WR's waiting for proxy buffer to post RR for data segment * RX side WR's waiting for scif_sendto to complete * */ void m_pi_pending_wr(struct mcm_qp *m_qp, int *data) { mcm_scif_dev_t *smd = m_qp->smd; struct mcm_wr_rx *wr_rx; int wr_idx, wr_max, wr_cnt; if (m_qp->cm && m_qp->cm->state != MCM_CONNECTED) { if (m_qp->post_cnt_wt) { mlog(8," !CONN: qp %p cm %p %s tl_r %d wt_tl_r %d hd_r %d pp %d st %d data %d\n", m_qp, m_qp->cm, m_qp->cm ? mcm_state_str(m_qp->cm->state):"", m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, m_qp->post_cnt_wt, m_qp->stall_cnt_rr, *data); } return; } mpxy_lock(&m_qp->rxlock); wr_max = mcm_wr_max; wr_idx = m_qp->wr_tl_r_wt; /* last write_to marker */ wr_cnt = 0; while (--wr_max && (m_qp->post_cnt_wt || m_qp->stall_cnt_rr)) { wr_rx = (struct mcm_wr_rx *)(m_qp->wrc.wr_addr + (m_qp->wrc.wr_sz * wr_idx)); if (wr_rx->flags & M_READ_WRITE_TO_DONE) { if (wr_idx == m_qp->wr_hd_r) goto done; wr_idx = (wr_idx + 1) & m_qp->wrc.wr_end; /* next */ continue; } wr_cnt++; if ((wr_rx->flags & M_READ_WRITE_TO) && (wr_rx->wr.wr_id == wr_rx->org_id)) { struct ibv_wc; #if MCM_PROFILE mcm_qp_prof_ts(m_qp, MCM_QP_WT, wr_rx->time, wr_rx->qcnt, 1); #endif wr_rx->flags |= M_READ_WRITE_TO_DONE; wr_rx->flags &= ~M_READ_WRITE_TO; MCNTR(smd->md, MCM_SCIF_WRITE_TO_DONE); mlog(0x10, " [%d,%d,%d] WR_rx[%d] wr %p scif_wt DONE! flgs 0x%x" " tl %d w_tl %d hd %d org_id %Lx m_idx %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, wr_rx->w_idx, wr_rx, wr_rx->flags, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, wr_rx->wr.wr_id, wr_rx->m_idx); m_qp->post_cnt_wt--; if (wr_rx->m_idx) { mpxy_lock(&smd->rblock); m_pi_buf_tl(smd, wr_rx->m_idx, wr_rx); /* release shared buffer slot */ mpxy_unlock(&smd->rblock); } m_qp->wr_tl_r_wt = wr_rx->w_idx; /* writeto pending tail */ /* if SR operation, send local RX event */ if ((wr_rx->wr.opcode == IBV_WR_SEND) || (wr_rx->wr.opcode == IBV_WR_RDMA_WRITE_WITH_IMM)) { struct dat_mix_wc wc; struct mcm_sr *m_sr; m_sr = (struct mcm_sr *)(m_qp->sr_buf + (m_qp->sr_sz * wr_rx->s_idx)); wc.wr_id = m_sr->wr_id; wc.imm_data = wr_rx->wr.imm_data; wc.byte_len = m_sr->len; wc.status = IBV_WC_SUCCESS; wc.vendor_err = 0; wc.wc_flags = 0; wc.opcode = (wr_rx->wr.opcode == IBV_WR_SEND) ? IBV_WC_RECV:IBV_WC_RECV_RDMA_WITH_IMM; mlog(4, " SR[%d] rx_event: m_sr %p idx %d wr_idx %d" " wr_id %Lx imm %x ln %d wr.op %x wc.op %x\n", wr_rx->s_idx,m_sr, m_sr->s_idx, m_sr->w_idx, m_sr->wr_id, wr_rx->wr.imm_data, m_sr->len, wr_rx->wr.opcode, wc.opcode); mix_dto_event(m_qp->m_cq_rx, &wc, 1); m_pi_free_sr(m_qp, m_sr); } /* Last Segment and !DIRECT (no segments) or peer PO wants signaled */ if ((wr_rx->flags & M_SEND_MP_SIG) || ((wr_rx->flags & M_SEND_LS) && !(wr_rx->flags & M_SEND_DIRECT))) { mlog(4, "WR_rx[%d] wr %p LastSeg: send WC! tl %d hd %d\n", wr_rx->w_idx, wr_rx, m_qp->wr_tl_r, m_qp->wr_hd_r); if (m_pi_send_wc(m_qp, wr_rx, IBV_WC_SUCCESS)) goto done; } } else if (wr_rx->flags & M_READ_PAUSED) { mlog(0x4, " RR PAUSED: qp %p tl %d hd %d idx %d wr %p wr_id %p," " addr %p sz %d sflg 0x%x mflg 0x%x\n", m_qp, m_qp->wr_tl_r, m_qp->wr_hd_r, wr_idx, wr_rx, wr_rx->org_id, wr_rx->sg[1].addr, wr_rx->sg[1].length, wr_rx->wr.send_flags, wr_rx->flags); mlog(0x4, " WR_rx[%d] RR stall (pnd %d stl %d cnt %d max %d)" " memory (%p-%p) hd 0x%x tl 0x%x %x\n", wr_rx->w_idx, m_qp->pi_rr_cnt, m_qp->stall_cnt_rr, wr_cnt, wr_max, smd->m_buf_r, smd->m_buf_r + smd->m_len_r, smd->m_hd_r, smd->m_tl_r, wr_rx->sg[0].length); /* check for buffer, post RR if available */ m_pi_post_read(m_qp, wr_rx); /* no progress or RR posted needs completion processing */ if ((wr_rx->flags & M_READ_PAUSED) || (m_qp->pi_rr_cnt >= 10)) { mlog(0x4, " PAUSED or pi_rr_cnt %d > 10, exit\n", m_qp->pi_rr_cnt); goto done; } } /* still pending, maintain order */ if (wr_rx->flags & M_READ_WRITE_TO) goto done; /* reached pending RR with max pending, don't release any paused RR's */ if ((wr_rx->flags & M_READ_POSTED) && (m_qp->pi_rr_cnt >= 10)) goto done; if (wr_idx == m_qp->wr_hd_r) /* reached head */ goto done; wr_idx = (wr_idx + 1) & m_qp->wrc.wr_end; /* next */ if (smd->destroy) { mlog(0, " SMD destroy - QP %p hd %d tl %d pst %d,%d cmp %d, pp %d, data %d\n", m_qp, m_qp->wr_hd, m_qp->wr_tl,m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp, data); mlog(0, " wr %p wr_id %p org_id %p sglist %p sge %d ln %d op %d flgs" " %x idata 0x%x raddr %p rkey %x m_flgs %x\n", wr_rx, wr_rx->wr.wr_id, wr_rx->org_id, wr_rx->sg, wr_rx->wr.num_sge, wr_rx->sg->length, wr_rx->wr.opcode, wr_rx->wr.send_flags, wr_rx->wr.imm_data, wr_rx->wr.wr.rdma.remote_addr, wr_rx->wr.wr.rdma.rkey, wr_rx->flags); goto done; } } done: /* wt pending, stalled RR's, pending RR's, wr queued */ *data += ((m_qp->post_cnt_wt || m_qp->stall_cnt_rr || m_qp->pi_rr_cnt || m_qp->wr_tl_r != m_qp->wr_hd_r) ? 1:0); mpxy_unlock(&m_qp->rxlock); if (smd->destroy) { mlog(0, " SMD destroy - QP %p hd %d tl %d, pending data %d\n", m_qp, m_qp->wr_hd_r, m_qp->wr_tl_r, data); } } dapl-2.1.5/dapl/svc/mpxy_out.c000066400000000000000000001104041255317474200162140ustar00rootroot00000000000000/* * Copyright (c) 2012-2015 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mpxyd service - mpxy_out.c * * Proxy-out resources/services * */ #include "mpxyd.h" extern int log_level; extern int mcm_wc_max; extern int mcm_rw_signal; extern int mcm_wr_max; extern int mcm_ib_inline; extern int mix_eager_completion; extern int mix_inline_threshold; extern uint64_t system_guid; #ifdef MCM_PROFILE extern void mcm_check_io(); #endif /* buffer pool for proxy outbount RDMA work request entries, SCIF registration, scif_ep */ void m_po_destroy_bpool(struct mcm_qp *m_qp) { if (m_qp->wr_off) scif_unregister(m_qp->smd->scif_tx_ep, m_qp->wr_off, ALIGN_PAGE(m_qp->wr_len)); if (m_qp->wr_buf) { free(m_qp->wr_buf); m_qp->wr_buf = 0; } if (m_qp->wr_buf_rx_mr) { ibv_dereg_mr(m_qp->wr_buf_rx_mr); m_qp->wr_buf_rx_mr = NULL; } if (m_qp->wr_buf_rx) { free(m_qp->wr_buf_rx); m_qp->wr_buf_rx = 0; } } int m_po_create_bpool(struct mcm_qp *m_qp, int entries) { /* RDMA proxy pool, register with SCIF and IB, set pool and segm size with parameters */ m_qp->wr_end = entries - 1; m_qp->wr_sz = ALIGN_64(sizeof(struct mcm_wr)); m_qp->wr_len = m_qp->wr_sz * entries; /* 64 byte aligned for signal_fence */ m_qp->wr_tl = 0; m_qp->wr_tl_rf = 1; /* start at tl+1 */ if (posix_memalign((void **)&m_qp->wr_buf, 4096, ALIGN_PAGE(m_qp->wr_len))) { mlog(0, "failed to allocate wr_buf, m_qp=%p, wr_len=%d, entries=%d\n", m_qp, m_qp->wr_len, entries); goto err; } memset(m_qp->wr_buf, 0, ALIGN_PAGE(m_qp->wr_len)); m_qp->wr_off = scif_register(m_qp->smd->scif_tx_ep, m_qp->wr_buf, ALIGN_PAGE(m_qp->wr_len), (off_t)0, SCIF_PROT_READ | SCIF_PROT_WRITE, 0); if (m_qp->wr_off == (off_t)(-1)) { mlog(0, " SCIF_register addr=%p,%d failed %s\n", m_qp->wr_buf, ALIGN_PAGE(m_qp->wr_len), strerror(errno)); goto err; } mlog(4, " WR buf pool %p, LEN req=%d, act=%d\n", m_qp->wr_buf, m_qp->wr_len, ALIGN_PAGE(m_qp->wr_len)); mlog(4, " SCIF_mr for wr_buf addr %p, off 0x%llx, len %d, entries %d\n", m_qp->wr_buf, m_qp->wr_off, ALIGN_PAGE(m_qp->wr_len), entries); if (!m_qp->smd->md->indata) { if (posix_memalign((void **)&m_qp->wr_buf_rx, 4096, entries * sizeof(mcm_wr_rx_t))) { mlog(0, "failed to allocate wr_buf_rx, m_qp=%p, wr_rx_len=%d, entries=%d\n", m_qp, entries * sizeof(mcm_wr_rx_t), entries); goto err; } memset(m_qp->wr_buf, 0, entries * sizeof(mcm_wr_rx_t)); m_qp->wr_buf_rx_mr = ibv_reg_mr(m_qp->smd->md->pd, (void*)m_qp->wr_buf_rx, entries * sizeof(mcm_wr_rx_t), IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if (!m_qp->wr_buf_rx_mr) { mlog(0, " IB_register addr=%p,%d failed %s\n", m_qp->wr_buf_rx_mr->addr, entries * sizeof(mcm_wr_rx_t), strerror(errno)); goto err; } mlog(4, " no inline support: WR_buf_rx pool %p, LEN %d\n", m_qp->wr_buf, entries * sizeof(mcm_wr_rx_t)); mlog(4, " no inline support: WR_buf_rx_mr = %x\n", m_qp->wr_buf_rx_mr); } return 0; err: m_po_destroy_bpool(m_qp); return -1; } /* called with smd->tblock */ int m_po_buf_hd(mcm_scif_dev_t *smd, int m_idx, struct mcm_wr *wr) { mlog(0x10," [%d:%d] m_hd 0x%Lx - m_wc %p: tl %d wc_hd[%d].m_idx=0x%x insert\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_hd, smd->m_buf_wc, smd->m_buf_tl, (smd->m_buf_hd + 1) & smd->m_buf_end, m_idx); if (((smd->m_buf_hd + 1) & smd->m_buf_end) == smd->m_buf_tl) { mlog(0, " ERR: PO Buf WC full (%d) m_buf_wc %p:" "tl %d hd %d buf_wc_hd[%d].m_idx=0x%x\n", smd->m_buf_end, smd->m_buf_wc, smd->m_buf_tl, smd->m_buf_hd, smd->m_buf_hd, m_idx); return 1; } smd->m_buf_hd = (smd->m_buf_hd + 1) & smd->m_buf_end; /* move hd */ smd->m_buf_wc[smd->m_buf_hd].m_idx = m_idx; smd->m_buf_wc[smd->m_buf_hd].done = 0; #ifdef MCM_PROFILE smd->m_buf_wc[smd->m_buf_hd].hd = smd->m_hd; smd->m_buf_wc[smd->m_buf_hd].tl = smd->m_tl; smd->m_buf_wc[smd->m_buf_hd].ref++; smd->m_buf_wc[smd->m_buf_hd].ts = mcm_ts_us(); smd->m_buf_wc[smd->m_buf_hd].wr = (void *) wr; if ((smd->m_hd_ro != smd->m_tl_ro) && (smd->m_hd >= smd->m_tl)) { struct mcm_qp *m_qp = (struct mcm_qp*)wr->context; mlog(0, " WARNING: [%d:%d:%d] PO_buf HD(%d) passed TL(%d): w_tl %d w_hd %d:" " wc_r[%d].m_idx=%x, m_tl %x m_hd %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp->r_entry.tid, smd->m_hd_ro, smd->m_tl_ro, smd->m_buf_tl + 1, smd->m_buf_hd, smd->m_buf_hd, m_idx, smd->m_tl, smd->m_hd); mcm_check_io(); } #endif return 0; } /* called with smd->tblock */ static void m_po_buf_tl(mcm_scif_dev_t *smd, int m_idx) { int idx; int busy = 0, match = 0, hits = 0; #ifdef MCM_PROFILE off_t tl_sav = smd->m_tl; uint32_t now = mcm_ts_us(); #endif idx = (smd->m_buf_tl + 1) & smd->m_buf_end; /* tl == hd is empty */ mlog(0x10," [%d:%d] m_tl 0x%Lx m_hd 0x%Lx - " "m_wc %p: tl %d hd %d - m_idx=0x%x free\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_tl, smd->m_hd, smd->m_buf_wc, idx, (smd->m_buf_hd + 1) & smd->m_buf_end, m_idx); /* mark m_idx complete, move proxy buffer tail until busy slot */ while ((!match || !busy) && smd->m_buf_tl != smd->m_buf_hd) { if (smd->m_buf_wc[idx].m_idx == m_idx) { smd->m_buf_wc[idx].done = 1; match = 1; #ifdef MCM_PROFILE smd->m_buf_wc[idx].ref--; smd->m_buf_wc[idx].ts = now - smd->m_buf_wc[idx].ts; #endif } if (smd->m_buf_wc[idx].done && !busy) { smd->m_tl = smd->m_buf_wc[idx].m_idx; smd->m_buf_wc[idx].m_idx = 0; smd->m_buf_tl = (smd->m_buf_tl + 1) & smd->m_buf_end; hits++; } if (!smd->m_buf_wc[idx].done) busy = 1; if (idx == smd->m_buf_hd) break; idx = (idx + 1) & smd->m_buf_end; } #ifdef MCM_PROFILE if (tl_sav > smd->m_tl) smd->m_tl_ro++; if (!match) { mlog(0, " [%d:%d] ERR: m_tl 0x%x m_hd 0x%x" "- m_wc %p: tl %d hd %d - m_idx=0x%x NO MATCH\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_tl, smd->m_hd, smd->m_buf_wc, smd->m_buf_tl, (smd->m_buf_hd + 1) & smd->m_buf_end, m_idx); mcm_check_io(); } #endif } /* * Proxy-out to Proxy-in - Endpoints are on same platform */ static int m_po_send_wr_local(struct mcm_qp *m_qp, struct mcm_wr *m_wr, int wr_idx) { mcm_cm_t *m_cm = m_qp->cm; mlog(0, " ERR: Po->Pi same node: not implemented\n"); mlog(0, " SRC 0x%x %x 0x%x -> DST 0x%x %x 0x%x guid %Lx %Lx %s\n", htons(m_cm->msg.saddr1.lid), htonl(m_cm->msg.saddr1.qpn), htons(m_cm->msg.sport), htons(m_cm->msg.daddr1.lid), htonl(m_cm->msg.dqpn), htons(m_cm->msg.dport), ntohll(m_cm->msg.sys_guid), ntohll(system_guid), mcm_map_str(m_cm->msg.daddr1.ep_map)); return 0; } /* * Proxy-out to Proxy-in - Endpoints remote across fabric * * check data xfer segment complete, forward segment to proxy-in on remote node * * RDMA Write WR to remote proxy-in service, manage WR hd/tl from this side. * With inline large enough we don't have to register local side WR data * * called with m_qp->txlock held * */ static int m_po_send_pi(struct mcm_qp *m_qp, struct mcm_wr *m_wr, int wr_idx) { struct ibv_send_wr *bad_wr; struct ibv_qp *ib_qp; struct ibv_send_wr wr; struct ibv_sge sge; struct mcm_wr_rx wr_rx; struct mcm_wr_rx *wr_rx_ptr; int ret; struct wrc_idata wrc; /* if proxy-out to proxy-in on same system, keep it local */ if (m_qp->cm->msg.sys_guid == system_guid) return (m_po_send_wr_local(m_qp, m_wr, wr_idx)); if (m_qp->smd->md->indata) { wr_rx_ptr = &wr_rx; sge.lkey = 0; /* inline doesn't need registered */ } else { wr_rx_ptr = (struct mcm_wr_rx *) (m_qp->wr_buf_rx + (sizeof(struct mcm_wr_rx) * wr_idx)); sge.lkey = m_qp->wr_buf_rx_mr->lkey; } sge.addr = (uint64_t)(uintptr_t) wr_rx_ptr; sge.length = (uint32_t) sizeof(struct mcm_wr_rx); /* proxy m_wr over to remote m_wr_rem slot, remote will initiate RR and send back WC */ m_wr->flags |= M_SEND_PI; mcm_hton_wr_rx(wr_rx_ptr, m_wr, m_qp->wc_tl); /* build rx_wr for wire transfer, send it */ wrc.id = (uint16_t)wr_idx; /* setup imm_data for proxy_in rcv engine */ wrc.type = M_WR_TYPE; wrc.flags = 0; memset(&wr, 0, sizeof(struct ibv_send_wr)); wr.wr_id = WRID_SET(m_wr, WRID_TX_RW_IMM); wr.sg_list = &sge; wr.num_sge = 1; wr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM; if (m_qp->smd->md->indata) wr.send_flags = IBV_SEND_INLINE; if (m_wr->flags & M_SEND_MP_SIG) { m_qp->post_sig_cnt++; /* sig event pending */ #if MCM_PROFILE /* MCM_QP_PO_PI_RW */ if ((m_wr->flags & M_SEND_FS) && (m_wr->sg[0].length > 1024)) { m_wr->wr.wr.atomic.swap = mcm_ts_us(); m_wr->wr.wr.atomic.rkey = ((m_wr->w_idx - m_qp->last_wr_pst) & m_qp->wr_end); /* queued */ m_qp->last_wr_pst = m_wr->w_idx; } #endif } wr.send_flags |= IBV_SEND_SIGNALED; wr.imm_data = htonl(*(uint32_t *)&wrc); wr.wr.rdma.rkey = m_qp->wrc_rem.wr_rkey; wr.wr.rdma.remote_addr = (uint64_t)(uintptr_t) ((struct mcm_wr_rx *) (m_qp->wrc_rem.wr_addr + (m_qp->wrc_rem.wr_sz * wr_idx))); /* MXS -> MSS or HST, PI service will be on QP1 */ if (MXS_EP(&m_qp->smd->md->addr) && (MSS_EP(&m_qp->cm->msg.daddr1) || HST_EP(&m_qp->cm->msg.daddr1))) ib_qp = m_qp->ib_qp1; else ib_qp = m_qp->ib_qp2; mlog(0x4, " RW_imm: wr_id %Lx qn %x op %d flgs %x" " idata %x wr_rx: raddr %p rkey %x ln %d tl %d me %d hd %d\n", wr.wr_id, ib_qp->qp_num, wr.opcode, wr.send_flags, ntohl(wr.imm_data), wr.wr.rdma.remote_addr, wr.wr.rdma.rkey, m_wr->sg[0].length, m_qp->wr_tl, wr_idx, m_qp->wr_hd); mlog(0x4, "[%d:%d:%d] RW_wr[%d]: %p org_id %Lx op %d flgs %d imm 0x%x" " raddr %p rkey %x m_idx %x\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, wr_idx, m_wr, m_wr->wr.wr_id, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey, m_wr->m_idx); errno = 0; ret = ibv_post_send(ib_qp, &wr, &bad_wr); if (ret) { mlog(0, " ERR: m_wr %p idx %d laddr=%p ln=%d lkey=%x flgs %x" " tl %d hd %d pp %d sig %d\n", m_wr, wr_idx, sge.addr, sge.length, sge.lkey, m_wr->flags, m_qp->wr_tl, m_qp->wr_hd, m_qp->wr_pp_rem, m_qp->post_sig_cnt); mlog(0, " ERR: wr_id %Lx %p sglist %p sge %d op %d flgs %x" " idata 0x%x raddr %p rkey %x \n", m_wr->wr.wr_id, m_wr->wr.sg_list, m_wr->wr.num_sge, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); return ret; } m_qp->wr_pp_rem++; return 0; } void m_po_pending_wr(struct mcm_qp *m_qp, int *data) { mcm_scif_dev_t *smd = m_qp->smd; struct mcm_wr *m_wr; struct ibv_send_wr *bad_wr; int ret, wr_idx, wr_max, poll_cnt, cn_signal; mpxy_lock(&m_qp->txlock); if ((m_qp->wr_tl == m_qp->wr_hd) || ((m_qp->wr_tl_rf == m_qp->wr_hd) && !m_qp->wr_pp)) { /* empty, no work pending */ mpxy_unlock(&m_qp->txlock); return; } wr_max = mcm_wr_max; wr_idx = m_qp->wr_tl_rf; while (wr_max && m_qp->wr_pp) { cn_signal = 0; poll_cnt = 50; m_wr = (struct mcm_wr *)(m_qp->wr_buf + (m_qp->wr_sz * wr_idx)); mlog(0x4, " CHECK: qp %p hd %d tl %d idx %d wr %p wr_id %p," " addr %p sz %d sflg 0x%x mflg 0x%x pp %d\n", m_qp, m_qp->wr_hd, m_qp->wr_tl, wr_idx, m_wr, m_wr->org_id, m_wr->wr.sg_list ? m_wr->wr.sg_list->addr:0, m_wr->wr.sg_list ? m_wr->sg->length:0, m_wr->wr.send_flags, m_wr->flags, m_qp->wr_pp); /* inline, OP thread posted */ if (m_wr->flags & M_SEND_POSTED) { mlog(0x20, " POSTED: qp %p hd %d tl %d idx %d wr %p wr_id %p," " addr %p sz %d sflg 0x%x mflg 0x%x\n", m_qp, m_qp->wr_hd, m_qp->wr_tl, wr_idx, m_wr, m_wr->org_id, m_wr->wr.sg_list ? m_wr->wr.sg_list->addr:0, m_wr->wr.sg_list ? m_wr->sg->length:0, m_wr->wr.send_flags, m_wr->flags); if (wr_idx == m_qp->wr_hd) goto done; wr_idx = (wr_idx + 1) & m_qp->wr_end; continue; } wr_max--; while ((m_wr->wr.wr_id != m_wr->org_id) && (--poll_cnt)); mlog(4, " qp %p hd %d tl %d idx %d wr %p wr_id %Lx = %Lx at %p POLL=%d flgs=%x\n", m_qp, m_qp->wr_hd, (m_qp->wr_tl + 1) & m_qp->wr_end, wr_idx, m_wr, m_wr->org_id, m_wr->wr.wr_id, &m_wr->wr.wr_id, poll_cnt, m_wr->flags); if (m_wr->wr.wr_id == m_wr->org_id) { char *sbuf = (char*)m_wr->wr.sg_list->addr; /* mark RF done, start timer */ if (!(m_wr->flags & M_READ_FROM_DONE)) { m_wr->flags |= M_READ_FROM_DONE; #if MCM_PROFILE if (!(m_wr->flags & M_SEND_INLINE)) { mcm_qp_prof_ts(m_qp, MCM_QP_RF, m_wr->wr.wr.atomic.swap, m_wr->wr.wr.atomic.rkey, 1); } #endif } if (!(m_wr->flags & M_SEND_INLINE)) MCNTR(smd->md, MCM_SCIF_READ_FROM_DONE); mlog(4, " m_wr %p READY for ibv_post addr=%p ln=%d, lkey=%x\n", m_wr, sbuf, m_wr->sg->length, m_wr->sg->lkey); mlog(4, " wr_id %Lx next %p sglist %p sge %d op %d flgs" " %d idata 0x%x raddr %p rkey %x \n", m_wr->wr.wr_id, m_wr->wr.next, m_wr->wr.sg_list, m_wr->wr.num_sge, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); /* signaling and eager completion */ if (m_wr->flags & M_SEND_CN_SIG) cn_signal = 1; if (mix_eager_completion) { m_wr->flags &= ~M_SEND_CN_SIG; if (!(m_wr->flags & M_SEND_MP_SIG)) m_wr->wr.send_flags &= ~IBV_SEND_SIGNALED; } if (!(MXS_EP(&m_qp->cm->msg.daddr1)) && (m_wr->wr.send_flags & IBV_SEND_SIGNALED)) { m_qp->post_sig_cnt++; mlog(0x10, "[%d:%d:%d] %s_RW_post_sig: qp %p wr %p wr_id %p flgs 0x%x," " pcnt %d sg_rate %d hd %d tl %d sz %d m_idx %x\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, (MXS_EP(&m_qp->cm->msg.daddr1)) ? "po_pi":"po_direct", m_qp, m_wr, m_wr->wr.wr_id, m_wr->wr.send_flags, m_qp->post_cnt, mcm_rw_signal, m_qp->wr_hd, m_qp->wr_tl, m_wr->wr.sg_list->length, m_wr->m_idx); #if MCM_PROFILE m_wr->wr.wr.atomic.swap = mcm_ts_us(); m_wr->wr.wr.atomic.rkey = ((m_wr->w_idx - m_qp->last_wr_pst) & ~m_qp->wr_end); /* queued */ m_qp->last_wr_pst = m_wr->w_idx; #endif } m_wr->wr.wr_id = WRID_SET(m_wr, WRID_TX_RW); errno = 0; if (MXS_EP(&m_qp->cm->msg.daddr1)) /* remote PI */ ret = m_po_send_pi(m_qp, m_wr, wr_idx); else ret = ibv_post_send(m_qp->ib_qp2, &m_wr->wr, &bad_wr); if (ret || (cn_signal && mix_eager_completion)) { struct dat_mix_wc wc; wc.wr_id = m_wr->org_id; wc.byte_len = m_wr->sg->length; wc.status = ret ? IBV_WC_GENERAL_ERR : IBV_WC_SUCCESS; wc.opcode = m_wr->wr.opcode == IBV_WR_SEND ? IBV_WC_SEND:IBV_WC_RDMA_WRITE; wc.vendor_err = ret; mix_dto_event(m_qp->ib_qp2->send_cq->cq_context, &wc, 1); } if (m_wr->w_idx != m_qp->wr_hd) /* set next start */ m_qp->wr_tl_rf = (m_wr->w_idx + 1) & m_qp->wr_end; else m_qp->wr_tl_rf = m_qp->wr_hd; m_qp->wr_pp--; m_qp->post_cnt++; m_wr->flags |= M_SEND_POSTED; if (m_wr->wr.opcode == IBV_WR_SEND) { if (m_wr->sg->length <= mix_inline_threshold) MCNTR(smd->md, MCM_QP_SEND_INLINE); else MCNTR(smd->md, MCM_QP_SEND); } else { if (m_wr->sg->length <= mix_inline_threshold) MCNTR(smd->md, MCM_QP_WRITE_INLINE); else MCNTR(smd->md, MCM_QP_WRITE); } mlog(4, " qp %p wr %p wr_id %Lx posted tl=%d tl_rf=%d" " hd=%d idx=%d pst=%d,%d cmp %d %s\n", m_qp, m_wr, m_wr->org_id, m_qp->wr_tl, m_qp->wr_tl_rf, m_qp->wr_hd, wr_idx, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_wr->flags & M_SEND_FS ? "FS": (m_wr->flags & M_SEND_LS) ? "LS":""); } if (!(m_wr->flags & M_SEND_POSTED)) { mlog(4, " qp %p wr %p wr_id %Lx not done\n", m_qp, m_wr, m_wr->org_id); goto done; } if (wr_idx == m_qp->wr_hd) goto done; wr_idx = (wr_idx + 1) & m_qp->wr_end; /* next, hd == done */ if (smd->destroy) { mlog(0, " SMD destroy - QP %p hd %d tl %d pst %d,%d cmp %d, pp %d, data %d\n", m_qp, m_qp->wr_hd, m_qp->wr_tl,m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp, data); mlog(0, " wr %p wr_id %p org_id %p sglist %p sge %d ln %d op %d flgs" " %x idata 0x%x raddr %p rkey %x m_flgs %x\n", m_wr, m_wr->wr.wr_id, m_wr->org_id, m_wr->wr.sg_list, m_wr->wr.num_sge, m_wr->sg->length, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey, m_wr->flags); goto done; } } done: *data += m_qp->wr_pp; *data += m_qp->post_sig_cnt - m_qp->comp_cnt; mpxy_unlock(&m_qp->txlock); if (smd->destroy) { mlog(0, " SMD destroy - QP %p hd %d tl %d pst %d,%d cmp %d," " pending data %d, data %d\n", m_qp, m_qp->wr_hd, m_qp->wr_tl,m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, data, data); } } static uint32_t po_ts = 0; /* initiate proxy data transfer, operation channel */ int m_po_proxy_data(mcm_scif_dev_t *smd, dat_mix_sr_t *pmsg, struct mcm_qp *m_qp) { int len, ret, i, retries, wc_err = IBV_WC_GENERAL_ERR; off_t l_off, r_off; uint64_t total_offset; int l_start, l_end, l_len, cacheln_off, seg_len; struct mcm_wr *m_wr; struct ibv_sge *m_sge; mlog(4, " q_id %d, q_ctx %p, len %d, wr_id %p, sge %d, op %x flgs %x wr_idx %d\n", pmsg->qp_id, (void*)pmsg->qp_ctx, pmsg->len, pmsg->wr.wr_id, pmsg->wr.num_sge, pmsg->wr.opcode, pmsg->wr.send_flags, pmsg->sge[0].lkey); total_offset = 0; #if MCM_PROFILE if (!m_qp->last_ps) { m_qp->last_ps = mcm_ts_us(); } else { mcm_qp_prof_ts(m_qp, MCM_QP_PO_POST, m_qp->last_ps, 1, 1); m_qp->last_ps = mcm_ts_us(); } #endif if (pmsg->wr.opcode == IBV_WR_SEND) MCNTR(smd->md, MCM_MX_SEND); else MCNTR(smd->md, MCM_MX_WRITE); mpxy_lock(&m_qp->txlock); retries = 0; while (((m_qp->wr_hd + 1) & m_qp->wr_end) == m_qp->wr_tl) { if (!retries) { MCNTR(smd->md, MCM_MX_WR_STALL); } if (!(++retries % 100)) { mlog(1, " WARN: DTO delay: no PO WRs: sz %d, hd %d tl %d io %d" " retried %d pst %d,%d cmp %d wr_pp %d -> %s\n", m_qp->wr_end, m_qp->wr_hd, m_qp->wr_tl, pmsg->len, retries, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mcm_pr_addrs(1, &m_qp->cm->msg, m_qp->cm->state, 0); } if (retries == 1000) { ret = ENOMEM; wc_err = IBV_WC_RETRY_EXC_ERR; goto bail; } write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); mpxy_unlock(&m_qp->txlock); sched_yield(); mpxy_lock(&m_qp->txlock); } if (retries) { mlog(1, " WR stalled: sz %d, hd %d tl %d io %d" " retried %d pst %d,%d cmp %d wr_pp %d\n", m_qp->wr_end, m_qp->wr_hd, m_qp->wr_tl, pmsg->len, retries, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp); } m_qp->wr_hd = (m_qp->wr_hd + 1) & m_qp->wr_end; /* move hd */ m_wr = (struct mcm_wr *)(m_qp->wr_buf + (m_qp->wr_sz * m_qp->wr_hd)); m_sge = m_wr->sg; m_wr->org_id = pmsg->wr.wr_id; m_wr->m_idx = 0; m_wr->w_idx = m_qp->wr_hd; m_wr->flags = M_SEND_FS; m_wr->context = (uint64_t)m_qp; const_ib_rw(&m_wr->wr, &pmsg->wr, m_sge); mlog(4, " m_wr %p m_sge %p num_sge %d\n", m_wr, m_sge, pmsg->wr.num_sge); mlog(4, " m_wr: raddr %Lx rkey 0x%x, ib_wr: raddr %Lx rkey 0x%x\n", pmsg->wr.wr.rdma.remote_addr, pmsg->wr.wr.rdma.rkey, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); for (i=0;iwr.num_sge;i++) { len = pmsg->sge[i].length; r_off = pmsg->sge[i].addr; l_len = ALIGN_64(r_off + len) - ALIGN_DOWN_64(r_off); cacheln_off = OFFSET_64(r_off); r_off = ALIGN_DOWN_64(r_off); mlog(4, " r_off %p = %p, cl_off %d l_len %d len %d\n", pmsg->sge[i].addr, r_off, cacheln_off, l_len, len); while (l_len) { m_wr->wr.num_sge++; /* Send or last available WR, send all */ if (pmsg->wr.opcode == IBV_WR_SEND) seg_len = l_len; else seg_len = (l_len > smd->m_seg) ? smd->m_seg : l_len; retries = 0; mpxy_lock(&smd->tblock); retry_mr: l_start = ALIGN_64(smd->m_hd); if ((l_start + seg_len) > smd->m_len) l_start = 64; l_end = l_start + seg_len; if (pb_full(l_start, l_end, smd->m_hd, smd->m_tl, seg_len, smd->m_len)) { if (!retries) { po_ts = mcm_ts_us(); MCNTR(smd->md, MCM_MX_MR_STALL); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); } if (!(++retries % 100)) { mlog(1, " [%d:%d:%d] WARN: no PO memory," " 0x%x hd 0x%x tl 0x%x 0x%x 0x%x," " need 0x%x-0x%x ln %d %d<-%d," " retries = %d -> %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, smd->m_buf, smd->m_hd, smd->m_tl, smd->m_len, smd->m_buf + smd->m_len, l_start, l_end, seg_len, l_len, pmsg->sge[i].length, retries, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mlog(1," [%d:%d:%d] WR tl %d idx %d hd %d QP pst %d,%d cmp %d - %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp->wr_tl, m_wr->w_idx, m_qp->wr_hd, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mcm_pr_addrs(1, &m_qp->cm->msg, m_qp->cm->state, 0); } if (retries == 1000) { ret = ENOMEM; wc_err = IBV_WC_RETRY_EXC_ERR; mpxy_unlock(&smd->tblock); goto bail; } mpxy_unlock(&smd->tblock); mpxy_unlock(&m_qp->txlock); sleep_usec(1000); mpxy_lock(&m_qp->txlock); mpxy_lock(&smd->tblock); goto retry_mr; } if (retries) { mlog(1, " MEM stalled: %x hd 0x%x tl 0x%x %x" " got 0x%x-0x%x ln %d %d<-%d retried %d %dus\n", smd->m_buf, smd->m_hd, smd->m_tl, smd->m_buf + smd->m_len, l_start, l_end, seg_len, l_len, pmsg->sge[i].length, retries, mcm_ts_us() - po_ts); } #ifdef MCM_PROFILE if (l_end < smd->m_hd) smd->m_hd_ro++; #endif l_off = smd->m_offset + l_start; smd->m_hd = l_end; mlog(4, " SCIF_readfrom[%d] l_off %p, r_off %p," " l_start 0x%x l_end 0x%x seg_len %d," " len %d l_len %d cacheln_off %d %s\n", i, l_off, r_off, l_start, l_end, seg_len, len, l_len, cacheln_off, m_wr->flags & M_SEND_FS ? "FS": (len <= smd->m_seg) ? "LS":""); #if MCM_PROFILE m_wr->wr.wr.atomic.swap = mcm_ts_us(); m_wr->wr.wr.atomic.rkey = m_qp->wr_pp; if (m_qp->last_rf) { uint32_t now = mcm_ts_us(); if ((now - m_qp->last_rf) > 100000) { mlog(0x1, " WARN: delayed post (%d us):" " WR[%d] hd %d tl %d io %d" " pst %d,%d cmp %d wr_pp %d\n", now - m_qp->last_rf, m_wr->w_idx, m_qp->wr_hd, m_qp->wr_tl, seg_len, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp); } } m_qp->last_rf = mcm_ts_us(); #endif if (seg_len < 256) ret = scif_readfrom(smd->scif_tx_ep, l_off, seg_len, r_off, SCIF_RMA_USECPU); else ret = scif_readfrom(smd->scif_tx_ep, l_off, seg_len, r_off, 0); if (ret) { mlog(0, " ERR: scif_readfrom, ret %d\n", ret); mpxy_unlock(&smd->tblock); goto bail; } MCNTR(smd->md, MCM_SCIF_READ_FROM); m_sge->addr = (uint64_t)(smd->m_buf + l_start + cacheln_off); m_sge->lkey = smd->m_mr->lkey; m_sge->length = seg_len - cacheln_off; if (m_sge->length > len) m_sge->length = len; mlog(4, " update sge[%d] addr %p len %d lkey 0x%x\n", i, m_sge->addr, m_sge->length, m_sge->lkey); l_len -= seg_len; r_off += seg_len; len -= m_sge->length; total_offset += m_sge->length; cacheln_off = 0; /* only apply to the first segment of a sge */ m_sge++; /* if enough for this WR, then set up DMA signal, and move to next WR */ if (seg_len == smd->m_seg || i == (pmsg->wr.num_sge - 1)) { l_off = m_qp->wr_off + (m_qp->wr_hd * m_qp->wr_sz); /* Remove IMM unless it's the last segment * NON-COMPLIANT: IMM segmented causes receiver * RDMA length will be wrong */ if (len || i != (pmsg->wr.num_sge - 1)) { if (m_wr->wr.opcode == IBV_WR_RDMA_WRITE_WITH_IMM) m_wr->wr.opcode = IBV_WR_RDMA_WRITE; m_wr->wr.send_flags = 0; } else { m_wr->flags |= M_SEND_LS; if (m_wr->wr.send_flags & IBV_SEND_SIGNALED) m_wr->flags |= M_SEND_CN_SIG; } /* MP service signaling, set PO mbuf tail adjustment */ if (!((m_wr->w_idx) % mcm_rw_signal) || m_wr->flags & M_SEND_LS) { char *sbuf = (char*)m_wr->wr.sg_list->addr; m_wr->wr.send_flags |= IBV_SEND_SIGNALED; m_wr->flags |= M_SEND_MP_SIG; m_wr->m_idx = (sbuf + (m_wr->wr.sg_list->length - 1)) - smd->m_buf; if (m_po_buf_hd(smd, m_wr->m_idx, m_wr)) { mpxy_unlock(&smd->tblock); goto bail; } mlog(0x10, "[%d:%d:%d] %s_RF_post_sig: qp %p wr %p wr_id %p flgs 0x%x," " pcnt %d sg_rate %d hd %d tl %d sz %d m_idx %x\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, (MXS_EP(&m_qp->cm->msg.daddr1)) ? "po_pi":"po_direct", m_qp, m_wr, pmsg->wr.wr_id, m_wr->wr.send_flags, m_qp->post_cnt, mcm_rw_signal, m_qp->wr_hd, m_qp->wr_tl, m_wr->wr.sg_list->length, m_wr->m_idx); } if ((smd->md->indata) && (pmsg->len <= mcm_ib_inline)) m_wr->wr.send_flags |= IBV_SEND_INLINE; mlog(4, " SCIF_fence[%d] l_off %p, ln %d,%d,%d wr_id %p" " wr_idx %d, tl %d hd %d\n", i, l_off, len, l_len, seg_len, pmsg->wr.wr_id, m_wr->w_idx, m_qp->wr_tl, m_qp->wr_hd); ret = scif_fence_signal(smd->scif_tx_ep, l_off, pmsg->wr.wr_id, 0, 0, SCIF_FENCE_INIT_SELF | SCIF_SIGNAL_LOCAL); if (ret) { mlog(0," ERR: scif_fence_sig, ret %d \n", ret); mpxy_unlock(&smd->tblock); goto bail; } m_qp->wr_pp++; MCNTR(smd->md, MCM_SCIF_SIGNAL); MCNTR(smd->md, MCM_MX_WRITE_SEG); if (!len) { /* done */ mpxy_unlock(&smd->tblock); break; } /* get next WR */ retries = 0; while (((m_qp->wr_hd + 1) & m_qp->wr_end) == m_qp->wr_tl) { if (!retries) { MCNTR(smd->md, MCM_MX_WR_STALL); write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); } if (!(++retries % 100)) { mlog(1, " WARN: DTO delay: no PO WR: sz %d, hd %d tl %d io %d" " retried %d pst %d,%d cmp %d wr_pp %d -> %s\n", m_qp->wr_end, m_qp->wr_hd, m_qp->wr_tl, seg_len, retries, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mcm_pr_addrs(1, &m_qp->cm->msg, m_qp->cm->state, 0); } if (retries == 1000) { ret = ENOMEM; wc_err = IBV_WC_RETRY_EXC_ERR; mpxy_unlock(&smd->tblock); goto bail; } mpxy_unlock(&smd->tblock); mpxy_unlock(&m_qp->txlock); sleep_usec(1000); mpxy_lock(&m_qp->txlock); mpxy_lock(&smd->tblock); } if (retries) { mlog(1, " WR stalled: sz %d, hd %d tl %d io %d" " retried %d pst %d,%d cmp %d wr_pp %d\n", m_qp->wr_end, m_qp->wr_hd, m_qp->wr_tl, seg_len, retries, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp); } if (m_wr->flags & M_SEND_LS) { mpxy_unlock(&smd->tblock); goto bail; } /* prepare the next WR */ m_qp->wr_hd = (m_qp->wr_hd + 1) & m_qp->wr_end; /* move hd */ m_wr = (struct mcm_wr *)(m_qp->wr_buf + (m_qp->wr_sz * m_qp->wr_hd)); m_sge = m_wr->sg; m_wr->org_id = pmsg->wr.wr_id; m_wr->w_idx = m_qp->wr_hd; m_wr->m_idx = 0; m_wr->flags = 0; m_wr->context = (uint64_t)m_qp; const_ib_rw(&m_wr->wr, &pmsg->wr, m_sge); m_wr->wr.wr.rdma.remote_addr += total_offset; } mpxy_unlock(&smd->tblock); if (!(m_qp->wr_hd % mcm_wr_max)) { write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); mpxy_unlock(&m_qp->txlock); sched_yield(); mpxy_lock(&m_qp->txlock); } } } ret = 0; bail: write(smd->md->mc->tx_pipe[1], "w", sizeof("w")); write(smd->md->mc->rx_pipe[1], "w", sizeof("w")); mpxy_unlock(&m_qp->txlock); if (ret) { struct dat_mix_wc wc; wc.wr_id = pmsg->wr.wr_id; wc.byte_len = 0; wc.status = wc_err; wc.opcode = pmsg->wr.opcode == IBV_WR_SEND ? IBV_WC_SEND:IBV_WC_RDMA_WRITE; wc.vendor_err = ret; mix_dto_event(m_qp->ib_qp2->send_cq->cq_context, &wc, 1); } mlog(4, " exit: q_id %d, q_ctx %p, len %d, wr_hd %d pp %d\n", pmsg->qp_id, (void*)pmsg->qp_ctx, pmsg->len, m_qp->wr_hd, m_qp->wr_pp); sched_yield(); return ret; } /* work completion from remote proxy-in service, RX thread */ void m_po_wc_event(struct mcm_qp *m_qp, struct mcm_wc_rx *wc_rx, int wc_idx) { struct mcm_wr *m_wr; struct mcm_cq *m_cq; struct dat_mix_wc wc_ev; int event = 0; m_wr = (struct mcm_wr *)(m_qp->wr_buf + (m_qp->wr_sz * wc_rx->wr_idx)); if (wc_rx->wr_idx > m_qp->wr_end) { mlog(0," ERR: WC_rx: WR idx out of range %x > %x \n", wc_rx->wr_idx, m_qp->wr_end); return; } m_cq = m_qp->m_cq_rx; if (wc_rx->wc.status == IBV_WC_SUCCESS) { mlog(8," WC_RX: SUCCESS m_wr %p idx %d=%d flags 0x%x \n", m_wr, m_wr->w_idx, wc_rx->wr_idx, m_wr->flags); if (m_wr->flags & M_SEND_CN_SIG) { wc_ev.wr_id = m_wr->org_id; wc_ev.status = IBV_WC_SUCCESS; wc_ev.byte_len = wc_rx->wc.byte_len; event++; } } else { /* segmentation, only report first error */ if (m_cq->prev_id != m_wr->org_id) { char *sbuf = (char*)m_wr->sg->addr; mlog(0," DTO ERR: st %d, vn %x pst %d cmp %d qstate 0x%x\n", wc_rx->wc.status, wc_rx->wc.vendor_err, m_qp->post_cnt, m_qp->comp_cnt, m_qp->ib_qp2->state); mlog(0, " DTO ERR: m_wr %p laddr %p=0x%x - %p=0x%x, len=%d, lkey=%x\n", m_wr, sbuf, sbuf[0], &sbuf[m_wr->sg->length], sbuf[m_wr->sg->length], m_wr->sg->length, m_wr->sg->lkey); mlog(0, " DTO ERR: wr_id %Lx next %p sglist %p sge %d op %d flgs" " %d idata 0x%x raddr %p rkey %x \n", m_wr->org_id, m_wr->wr.next, m_wr->sg, m_wr->wr.num_sge, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); m_cq->prev_id = m_wr->org_id; wc_ev.wr_id = m_wr->org_id; wc_ev.status = wc_rx->wc.status; wc_ev.vendor_err = wc_rx->wc.vendor_err; event++; } } mlog(0x10," [%d:%d:%d] po_pi_RW DONE!: mb_tl %x->%x, m_hd %x wr_tl %d->%d wr_id %d wr_hd %d" " wc_tl %d->%d - pst %d,%d cmp %d\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp->smd->m_tl, m_wr->m_idx, m_qp->smd->m_hd, m_qp->wr_tl, wc_rx->wr_tl, m_wr->w_idx, m_qp->wr_hd, m_qp->wc_tl, wc_idx, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt); /* PI peer has copy of data, free buffer slot if saved on MP signal mark */ if (m_wr->flags & M_SEND_MP_SIG) { #if MCM_PROFILE if ((m_wr->flags & M_SEND_LS) && (m_wr->sg[0].length > 1024)) { mcm_qp_prof_ts( m_qp, MCM_QP_PO_PI_RW, m_wr->wr.wr.atomic.swap, m_wr->wr.wr.atomic.rkey, 1); m_qp->last_wr_sig = m_wr->w_idx; } #endif m_qp->comp_cnt++; mpxy_lock(&m_qp->smd->tblock); m_po_buf_tl(m_qp->smd, m_wr->m_idx); /* move proxy buffer tail */ mpxy_unlock(&m_qp->smd->tblock); } mpxy_lock(&m_qp->txlock); if (m_qp->wrc_rem.wr_addr) /* remote MXS: sync PO WR tail with remote PI WR tail */ m_qp->wr_tl = wc_rx->wr_tl; m_qp->wc_tl = wc_idx; /* move local wc_tl, for wc_tl_rem on peer PI service */ mpxy_unlock(&m_qp->txlock); if (event) mix_dto_event(m_cq, &wc_ev, 1); } /* * Process the following completions from request queue: * * Proxy-out -> Direct-in, ibv_post_send RW of data segment * Proxy-out -> Proxy-in, ibv_post_send RW_imm of M_WR referencing data segment * * Proxy-in -> Proxy-out, ibv_post_send RR of remote proxy-out data segment * Proxy-in -> Proxy-out, ibv_post_send RW_imm of a M_WC completion status * * */ void m_req_event(struct mcm_cq *m_cq, int *events) { struct ibv_cq *ib_cq = NULL; struct mcm_qp *m_qp; struct mcm_wr *m_wr; struct mcm_wr_rx *m_wr_rx; void *cq_ctx; int i, ret, num, wr_type, wc_cnt, notify = 0; struct ibv_wc wc[DAT_MIX_WC_MAX]; struct dat_mix_wc wc_ev[DAT_MIX_WC_MAX]; ret = ibv_get_cq_event(m_cq->ib_ch, &ib_cq, (void *)&cq_ctx); if (ret == 0) ibv_ack_cq_events(m_cq->ib_cq, 1); wc_cnt = 0; retry: if (wc_cnt >= mcm_wc_max) { *events += 1; /* pending */ return; } ret = ibv_poll_cq(m_cq->ib_cq, DAT_MIX_WC_MAX, wc); if (ret <= 0) { if (!ret && !notify) { ibv_req_notify_cq(m_cq->ib_cq, 0); notify = 1; goto retry; } return; } else notify = 0; wc_cnt += ret; num = 0; for (i=0; icontext; assert(m_qp); mlog(4," wr_rx_id[%d of %d] wr_rx %p m_qp %p\n", i+1, ret, m_wr_rx, m_qp); m_pi_req_event(m_qp, m_wr_rx, &wc[i], wr_type); continue; } else if (wr_type > WRID_RX_RW_IMM) { mlog(0," ERR: wr_id corrupt - ib_wc[%d of %d]: wr_id %Lx stat %d" " op %x vn %x len %d type %d\n", i+1, ret, wc[i].wr_id, wc[i].status, wc[i].opcode, wc[i].vendor_err, wc[i].byte_len, wr_type); continue; } m_wr = (struct mcm_wr *)WRID_ADDR(wc[i].wr_id); m_qp = (struct mcm_qp *)m_wr->context; if (MSS_EP(&m_qp->cm->msg.daddr1)) m_qp->comp_cnt++; MCNTR(m_qp->smd->md, MCM_QP_WRITE_DONE); mlog(8," wr_id[%d of %d] m_wr %p m_qp %p\n", i, ret, m_wr, m_qp); if (wc[i].status == IBV_WC_SUCCESS) { if (m_wr->flags & M_SEND_CN_SIG) { wc_ev[num].wr_id = m_wr->org_id; wc_ev[num].status = IBV_WC_SUCCESS; wc_ev[num].byte_len = wc[i].byte_len; num++; } } else { /* segmentation, only report first error */ if (m_cq->prev_id != m_wr->org_id) { char *sbuf = (char*)m_wr->sg->addr; mlog(0," DTO ERR: st %d, vn %x pst %d cmp %d qstate 0x%x\n", wc[i].status, wc[i].vendor_err, m_qp->post_cnt, m_qp->comp_cnt, m_qp->ib_qp2->state); mlog(0, " DTO ERR: m_wr %p laddr %p=0x%x - %p=0x%x, len=%d, lkey=%x\n", m_wr, sbuf, sbuf[0], &sbuf[m_wr->sg->length], sbuf[m_wr->sg->length], m_wr->sg->length, m_wr->sg->lkey); mlog(0, " DTO ERR: wr_id %Lx next %p sglist %p sge %d op %d flgs" " %d idata 0x%x raddr %p rkey %x \n", m_wr->org_id, m_wr->wr.next, m_wr->sg, m_wr->wr.num_sge, m_wr->wr.opcode, m_wr->wr.send_flags, m_wr->wr.imm_data, m_wr->wr.wr.rdma.remote_addr, m_wr->wr.wr.rdma.rkey); m_cq->prev_id = m_wr->org_id; wc_ev[num].wr_id = m_wr->org_id; wc_ev[num].status = wc[i].status; wc_ev[num].vendor_err = wc[i].vendor_err; num++; } } /* Can move PO buffer tail if no peer PI service */ if (!MXS_EP(&m_qp->cm->msg.daddr1)) { #if MCM_PROFILE mcm_qp_prof_ts( m_qp, MCM_QP_IB_RW, m_wr->wr.wr.atomic.swap, m_wr->wr.wr.atomic.rkey, ((m_wr->w_idx - m_qp->last_wr_sig) & m_qp->wr_end)); m_qp->last_wr_sig = m_wr->w_idx; #endif mlog(0x10," [%d:%d:%d] po_RW DONE!: WR[%d] wr %p MB_tl %Lx hd %Lx m_idx %x - %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_wr->w_idx, m_wr, m_qp->smd->m_tl, m_qp->smd->m_hd, m_wr->m_idx, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); mpxy_lock(&m_qp->smd->tblock); m_po_buf_tl(m_qp->smd, m_wr->m_idx); /* move proxy buffer tail */ mpxy_unlock(&m_qp->smd->tblock); mpxy_lock(&m_qp->txlock); m_qp->wr_tl = m_wr->w_idx; /* move QP wr tail */ mpxy_unlock(&m_qp->txlock); } else m_qp->wr_pp_rem--; mlog(0x10," [%d:%d:%d] mb_tl %x hd %x: WR tl %d idx %d hd %d: QP pst %d,%d cmp %d - %s\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp->smd->m_tl, m_qp->smd->m_hd, m_qp->wr_tl, m_wr->w_idx, m_qp->wr_hd, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, mcm_map_str(m_qp->cm->msg.daddr1.ep_map)); } if (num) mix_dto_event(m_cq, wc_ev, num); goto retry; } dapl-2.1.5/dapl/svc/mpxyd.c000066400000000000000000001220201255317474200154660ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "mpxyd.h" scif_epd_t scif_listen_ep; struct scif_portID scif_id; short scif_sport = SCIF_OFED_PORT_8; int scif_listen_qlen = 240; int mix_buffer_mb = 32; int mix_buffer_sg = 131072; int mix_buffer_sg_po2 = DAT_MCM_SEG_PO2; /* 128 KB */ int mcm_set_priority = 0; /* set to SCHED_FIFO */ int mcm_affinity = 1; int mcm_op_poll = 0; int mcm_affinity_base_mic = 0; int mcm_affinity_base_hca = 0; int mcm_counters = 0; int mcm_cpu_model = 0; int mcm_cpu_family = 0; uint64_t system_guid = 0; /* network order */ extern int mix_max_msg_mb; extern int mcm_tx_entries; extern int mcm_rx_entries; extern int mcm_ib_inline; extern char *lock_file; extern char *log_file; extern char *opts_file; extern FILE *logfile; extern mpxy_lock_t flock; extern char gid_str[INET6_ADDRSTRLEN]; #define MCM_NNODES 8 static mcm_client_t mcm_client_list[MCM_CLIENT_MAX]; static int mcm_cpumask[MCM_NNODES]; static mpxy_lock_t mcm_cplock; void mcm_check_io(); /* * mpxyd service - mpxyd.c * * MIC proxy service for uDAPL rdma write, message send/recv * * init SCI services, listen on well-known port service * create/manage thread pool for each MIC (op, cm, tx, rx) * open/manage IB devices per client device open */ /* main service entry point for all MIC clients */ static int init_scif() { int i,ii,ret; mcm_client_t *mc; mcm_ib_dev_t *md; mpxy_lock_init(&mcm_cplock, NULL); for (i=0;iscif_id = 0; if (pipe(mc->op_pipe) || pipe(mc->tx_pipe) || pipe(mc->cm_pipe) || pipe(mc->rx_pipe)) return -1; /* non-blocking */ mcm_config_fd(mc->op_pipe[0]); mcm_config_fd(mc->op_pipe[1]); mcm_config_fd(mc->tx_pipe[0]); mcm_config_fd(mc->tx_pipe[1]); mcm_config_fd(mc->cm_pipe[0]); mcm_config_fd(mc->cm_pipe[1]); mcm_config_fd(mc->rx_pipe[0]); mcm_config_fd(mc->rx_pipe[1]); mpxy_lock_init(&mc->oplock, NULL); mpxy_lock_init(&mc->txlock, NULL); mpxy_lock_init(&mc->cmlock, NULL); mpxy_lock_init(&mc->rxlock, NULL); for (ii=0; ii< MCM_IB_MAX; ii++) { md = &mc->mdev[ii]; memset((void *)md, 0, sizeof(mcm_ib_dev_t)); } } ret = scif_get_nodeIDs(NULL, 0, &scif_id.node); if (ret < 0) { mlog(0, "scif_get_nodeIDs() failed with error %d\n", strerror(errno)); return -1; } mlog(8," SCIF node_id: %d, scif node count =%d\n", (uint16_t)scif_id.node, ret); if (scif_id.node != 0) { mlog(0,"ERROR scif node_id must be 0, get_nodeID = %d\n", (uint16_t)scif_id.node); return -1; } scif_listen_ep = scif_open(); if (scif_listen_ep < 0) { mlog(0, "scif_open() failed with error %s\n", strerror(errno)); return -1; } mlog(8,"Opened SCIF endpoint for OPERATIONS listening, ep = %d\n", scif_listen_ep); ret = scif_bind(scif_listen_ep, scif_sport); if (ret < 0) { mlog(0, "scif_bind() to %d failed with error %s\n", scif_sport, strerror(errno)); scif_close(scif_listen_ep); return -1; } scif_id.port = ret; ret = scif_listen(scif_listen_ep, scif_listen_qlen); if (ret < 0) { mlog(0, "scif_listen() failed with error %s\n", strerror(errno)); scif_close(scif_listen_ep); return -1; } mlog(1," MPXYD: Listening on reserved SCIF OFED port %d, listen_EP %d, backlog %d\n", (uint16_t)scif_id.port, scif_sport, scif_listen_qlen); return 0; } static void close_scif() { scif_close(scif_listen_ep); } static void close_ib() { int i,ii; mcm_client_t *mc; mcm_ib_dev_t *md; /* clean up device resources */ for (i=0; imdev[ii]; if (md->cntrs) { free(md->cntrs); md->cntrs = NULL; } if (md->ibctx) { ibv_close_device(md->ibctx); md->ibctx = NULL; md->ibdev = NULL; } } } return; } /* Open IB device */ static struct ibv_context *open_ib_device(struct mcm_ib_dev *md, char *name, int port) { int i, ibcnt; struct ibv_device **iblist; struct ibv_context *ibctx = NULL; struct ibv_port_attr port_attr; /* get list of all IB devices */ iblist = ibv_get_device_list(&ibcnt); if (!iblist) { mlog(0,"ERR ibv_get_dev_list, %s\n", strerror(errno)); return NULL; } for (i=0; i < ibcnt; ++i) { /* system GUID set to first IB device GUID */ if (!system_guid && iblist[i]->transport_type == IBV_TRANSPORT_IB) { system_guid = ibv_get_device_guid(iblist[i]); mlog(0, "System GUID == %04x:%04x:%04x:%04x\n", (unsigned) (system_guid >> 48) & 0xffff, (unsigned) (system_guid >> 32) & 0xffff, (unsigned) (system_guid >> 16) & 0xffff, (unsigned) (system_guid >> 0) & 0xffff); } if (!strcmp(iblist[i]->name, name)) { ibctx = ibv_open_device(iblist[i]); if (!ibctx) { mlog(0,"ERR ibv_open, %s\n", strerror(errno)); goto bail; } if (ibv_query_port(ibctx, port, &port_attr)) { mlog(0,"ERR ibv_query, %s\n", strerror(errno)); ibv_close_device(ibctx); ibctx = NULL; goto bail; } else { char val[64]; md->ibdev = iblist[i]; if (!rd_dev_file(md->ibdev->ibdev_path, "device/numa_node", val, sizeof val)) md->numa_node = atoi(val); else mlog(0," ERR ibdev %s numa_node at " "%s/device/numa_node unreadable\n", name, md->ibdev->ibdev_path); if (mcm_ib_inline_data(ibctx) && mcm_ib_inline) md->indata = 1; break; } } else { continue; } } bail: ibv_free_device_list(iblist); return ibctx; } void mcm_destroy_md(struct mcm_ib_dev *md) { if (md->mr_sbuf) ibv_dereg_mr(md->mr_sbuf); if (md->mr_rbuf) ibv_dereg_mr(md->mr_rbuf); if (md->qp) ibv_destroy_qp(md->qp); if (md->scq) ibv_destroy_cq(md->scq); if (md->rcq) ibv_destroy_cq(md->rcq); if (md->rch) ibv_destroy_comp_channel(md->rch); if (md->ah) { int i; for (i = 0;i < 0xffff; i++) { if (md->ah[i]) ibv_destroy_ah(md->ah[i]); } free(md->ah); } if (md->pd) ibv_dealloc_pd(md->pd); if (md->ports) free(md->ports); if (md->rbuf) free(md->rbuf); if (md->sbuf) free(md->sbuf); if (md->ibctx) ibv_close_device(md->ibctx); memset((void *)md, 0, sizeof(mcm_ib_dev_t)); return; } void mpxy_destroy_bpool(mcm_scif_dev_t *smd) { if (smd->m_offset && smd->scif_tx_ep) scif_unregister(smd->scif_tx_ep, smd->m_offset, smd->m_len); if (smd->m_offset_r && smd->scif_tx_ep) scif_unregister(smd->scif_tx_ep, smd->m_offset_r, smd->m_len_r); if (smd->m_mr) ibv_dereg_mr(smd->m_mr); if (smd->m_mr_r) ibv_dereg_mr(smd->m_mr_r); if (smd->m_buf) free (smd->m_buf); if (smd->m_buf_r) free (smd->m_buf_r); if (smd->m_buf_wc_r) free(smd->m_buf_wc_r); if (smd->m_buf_wc) free(smd->m_buf_wc); } /* destroy SMD, md->slock held */ void mpxy_destroy_smd(mcm_scif_dev_t *smd) { mcm_cm_t *m_cm, *next_cm; mcm_qp_t *m_qp, *next_qp; mcm_cq_t *m_cq, *next_cq; mcm_mr_t *m_mr, *next_mr; if (smd->entry.tid) remove_entry(&smd->entry); /* remove off md->smd_list */ /* free cm_id port */ if (smd->cm_id) { mpxy_lock(&smd->md->plock); mcm_free_port(smd->md->ports, smd->cm_id); mpxy_unlock(&smd->md->plock); smd->cm_id = 0; } /* free all listen objects */ mpxy_lock(&smd->llock); m_cm = get_head_entry(&smd->llist); while (m_cm) { next_cm = get_next_entry(&m_cm->entry, &smd->llist); mpxy_unlock(&smd->llock); mcm_dqlisten_free(smd, m_cm); /* dequeue and free */ mpxy_lock(&smd->llock); m_cm = next_cm; } init_list(&smd->llist); mpxy_unlock(&smd->llock); mlog(8, " cm listen list destroyed \n"); /* free all CM, QP, CQ objects and then port space */ mpxy_lock(&smd->clock); m_cm = get_head_entry(&smd->clist); while (m_cm) { next_cm = get_next_entry(&m_cm->entry, &smd->clist); mpxy_unlock(&smd->clock); mcm_dqconn_free(smd, m_cm); /* dequeue and free */ mpxy_lock(&smd->clock); m_cm = next_cm; } init_list(&smd->clist); mpxy_unlock(&smd->clock); mlog(8, " cm connection list destroyed \n"); mpxy_lock(&smd->qptlock); m_qp = get_head_entry(&smd->qptlist); while (m_qp) { next_qp = get_next_entry(&m_qp->t_entry, &smd->qptlist); m_qp_free(m_qp); m_qp = next_qp; } init_list(&smd->qptlist); mpxy_unlock(&smd->qptlock); mlog(8, " qpt_list destroyed \n"); mpxy_lock(&smd->qprlock); m_qp = get_head_entry(&smd->qprlist); while (m_qp) { next_qp = get_next_entry(&m_qp->r_entry, &smd->qprlist); m_qp_free(m_qp); m_qp = next_qp; } init_list(&smd->qprlist); mpxy_unlock(&smd->qprlock); mlog(8, " qpr_list destroyed \n"); mpxy_lock(&smd->cqlock); m_cq = get_head_entry(&smd->cqlist); while (m_cq) { next_cq = get_next_entry(&m_cq->entry, &smd->cqlist); m_cq_free(m_cq); m_cq = next_cq; } init_list(&smd->cqlist); mlog(8, " cqt_list destroyed \n"); mpxy_unlock(&smd->cqlock); mpxy_lock(&smd->cqrlock); m_cq = get_head_entry(&smd->cqrlist); while (m_cq) { next_cq = get_next_entry(&m_cq->entry, &smd->cqrlist); m_cq_free(m_cq); m_cq = next_cq; } init_list(&smd->cqrlist); mpxy_unlock(&smd->cqrlock); mlog(8, " cqr_list destroyed \n"); mpxy_lock(&smd->mrlock); m_mr = get_head_entry(&smd->mrlist); while (m_mr) { next_mr = get_next_entry(&m_mr->entry, &smd->mrlist); m_mr_free(m_mr); m_mr = next_mr; } init_list(&smd->mrlist); mpxy_unlock(&smd->mrlock); mlog(8, " mr_list destroyed \n"); mpxy_lock(&smd->plock); if (smd->ports) { free(smd->ports); smd->ports = NULL; } mpxy_unlock(&smd->plock); mlog(8, " port space destroyed \n"); if (smd->cmd_buf) free(smd->cmd_buf); mlog(8, " cmd_buf freed\n"); if (smd->ref_cnt) mlog(0, " WARNING: ref_cnt not 0, = %d \n", smd->ref_cnt); mpxy_destroy_bpool(smd); mlog(8, " proxy buffer pools destroyed \n"); /* destroy all mutex resources */ mpxy_lock_destroy(&smd->plock); mpxy_lock_destroy(&smd->clock); mpxy_lock_destroy(&smd->llock); mpxy_lock_destroy(&smd->qptlock); mpxy_lock_destroy(&smd->qprlock); mpxy_lock_destroy(&smd->cqlock); mpxy_lock_destroy(&smd->cqrlock); mpxy_lock_destroy(&smd->mrlock); mpxy_lock_destroy(&smd->evlock); mpxy_lock_destroy(&smd->tblock); mpxy_lock_destroy(&smd->rblock); if (mcm_counters) md_cntr_log(smd->md, MCM_ALL_COUNTERS, 1); smd->md = NULL; free(smd); } static int create_smd_bpool(mcm_scif_dev_t *smd) { int ret; int wcq_len, wcq_size, wcq_entries; /* SEND proxy buffers */ smd->m_seg = mix_buffer_sg; /* segment size */ smd->m_len = ((mix_buffer_mb + 8) * (1024 * 1024)); ret = posix_memalign((void **)&smd->m_buf, 4096, smd->m_len); if (ret) { mlog(0, "failed to allocate smd m_buf, m_len=%d, ERR: %d\n", smd->m_len, ret); return -1; } mlog(8, " Allocate/Register RDMA Proxy-out TX buffer %p-%p, ln=%d\n", smd->m_buf, (char*)smd->m_buf + smd->m_len, smd->m_len); smd->m_offset = scif_register(smd->scif_tx_ep, smd->m_buf, smd->m_len, (off_t)0, SCIF_PROT_READ | SCIF_PROT_WRITE, 0); if (smd->m_offset == (off_t)(-1)) { mlog(0, " scif_register addr=%p,%d failed %s\n", smd->m_buf, smd->m_len, strerror(errno)); return -1; } mlog(8, " SCIF addr=%p, offset=0x%llx, len %d\n", smd->m_buf, smd->m_offset, smd->m_len); smd->m_mr = ibv_reg_mr(smd->md->pd, smd->m_buf, smd->m_len, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ); if (smd->m_mr == NULL) { mlog(0, " IB addr=%p,%d failed %s\n", smd->m_buf, smd->m_len, strerror(errno)); return -1; } mlog(8, " IB registered addr=%p,%d, mr_addr=%p handle=0x%x, lkey=0x%x rkey=0x%x \n", smd->m_buf, smd->m_len, smd->m_mr->addr, smd->m_mr->handle, smd->m_mr->lkey, smd->m_mr->rkey); /* SEND WC queue for buffer management, manage empty slots, power of 2 */ wcq_size = (((mix_max_msg_mb*1024*1024)/smd->m_seg) * 8); wcq_entries = 1; while (wcq_entries < wcq_size) wcq_entries <<= 1; wcq_len = (sizeof(mcm_buf_wc_t) * wcq_entries); ret = posix_memalign((void **)&smd->m_buf_wc, 4096, wcq_len); if (ret) { mlog(0, "failed to allocate smd m_bu_wc, m_len=%d, ERR: %d\n", wcq_len, ret); return -1; } memset(smd->m_buf_wc, 0, wcq_len); mlog(0x10, " m_buf_wc %p, len %d, entries %d \n", smd->m_buf_wc, wcq_len, wcq_entries); smd->m_buf_hd = 0; smd->m_buf_tl = 0; smd->m_buf_end = wcq_entries - 1; /* RECEIVE proxy buffers */ smd->m_len_r = ((mix_buffer_mb + 8) * (1024 * 1024)); ret = posix_memalign((void **)&smd->m_buf_r, 4096, smd->m_len_r); if (ret) { mlog(0, "failed to allocate smd m_buf_r, m_lrx_en=%d, ERR: %d\n", smd->m_len_r, ret); return -1; } mlog(8, " Allocate/Register RDMA Proxy-in RX buffer %p-%p, ln=%d\n", smd->m_buf_r, (char*)smd->m_buf_r + smd->m_len_r, smd->m_len_r); smd->m_offset_r = scif_register(smd->scif_tx_ep, smd->m_buf_r, smd->m_len_r, (off_t)0, SCIF_PROT_READ | SCIF_PROT_WRITE, 0); if (smd->m_offset_r == (off_t)(-1)) { mlog(0, " scif_register rx_addr=%p,%d failed %s\n", smd->m_buf_r, smd->m_len_r, strerror(errno)); return -1; } mlog(8, " SCIF rx_addr=%p, rx_offset=0x%llx, rx_len %d on smd->ev_ep %d\n", smd->m_buf_r, smd->m_offset_r, smd->m_len_r, smd->scif_ev_ep); smd->m_mr_r = ibv_reg_mr(smd->md->pd, smd->m_buf_r, smd->m_len_r, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE); if (smd->m_mr_r == NULL) { mlog(0, " IB rx_addr=%p,%d failed %s\n", smd->m_buf_r, smd->m_len_r, strerror(errno)); return -1; } mlog(8, " IB registered rx_addr=%p,%d, mr_addr=%p rx_handle=0x%x, rx_lkey=0x%x rx_rkey=0x%x \n", smd->m_buf_r, smd->m_len_r, smd->m_mr_r->addr, smd->m_mr_r->handle, smd->m_mr_r->lkey, smd->m_mr_r->rkey); /* RECV WC queue for buffer management, manage empty slots, power of 2 */ wcq_size = (((mix_max_msg_mb*1024*1024)/smd->m_seg) * 8); wcq_entries = 1; while (wcq_entries < wcq_size) wcq_entries <<= 1; wcq_len = (sizeof(mcm_buf_wc_t) * wcq_entries); ret = posix_memalign((void **)&smd->m_buf_wc_r, 4096, wcq_len); if (ret) { mlog(0, "failed to allocate smd m_buf_wc_r, m_len=%d, ERR: %d\n", wcq_len); return -1; } memset(smd->m_buf_wc_r, 0, wcq_len); mlog(0x10, " m_buf_wc_r %p, len %d, entries %d \n", smd->m_buf_wc_r, wcq_len, wcq_entries); smd->m_buf_hd_r = 0; smd->m_buf_tl_r = 0; smd->m_buf_end_r = wcq_entries - 1; return 0; } static mcm_scif_dev_t *mcm_create_smd(mcm_ib_dev_t *md, scif_epd_t op_ep, scif_epd_t ev_ep, scif_epd_t tx_ep) { mcm_scif_dev_t *smd = NULL; int ret; /* SCIF device object, allocate and init resources, one per MIC client */ smd = malloc(sizeof(*smd)); if (!smd) { mlog(0, "failed to allocate smd: %s\n", strerror(errno)); goto err; } memset(smd, 0, sizeof(*smd)); smd->md = md; ret = posix_memalign((void **)&smd->cmd_buf, 4096, DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX); if (ret) { mlog(0, "failed to allocate smd cmd_buf, m_len=%d, ERR: %d\n", ALIGN_64(DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX), ret); smd->cmd_buf = NULL; goto err; } mlog(8, "Allocated smd cmd_buf = %p len %d\n", smd->cmd_buf, DAT_MIX_MSG_MAX + DAT_MIX_INLINE_MAX); /* SCIF device client port space */ smd->ports = (uint64_t*) malloc(sizeof(uint64_t) * 0xffff); if (!smd->ports) { mlog(0, "failed to allocate smd ports: %s\n", strerror(errno)); goto err; } memset(smd->ports, 0, sizeof(uint64_t) * 0xffff); mpxy_lock(&md->plock); smd->scif_op_ep = op_ep; smd->scif_ev_ep = ev_ep; smd->scif_tx_ep = tx_ep; smd->cm_id = mcm_get_port(md->ports, 0, (uint64_t)smd); mpxy_unlock(&md->plock); if (!smd->cm_id) goto err; if (create_smd_bpool(smd)) goto err; mpxy_lock_init(&smd->plock, NULL); /* port space for EP's */ mpxy_lock_init(&smd->clock, NULL); /* connect list */ mpxy_lock_init(&smd->llock, NULL); /* listen list */ mpxy_lock_init(&smd->qptlock, NULL); /* qp tx list */ mpxy_lock_init(&smd->qprlock, NULL); /* qp rx list */ mpxy_lock_init(&smd->cqlock, NULL); /* cq list */ mpxy_lock_init(&smd->cqrlock, NULL); /* cq rx list */ mpxy_lock_init(&smd->mrlock, NULL); /* mr list */ mpxy_lock_init(&smd->evlock, NULL); /* DTO event, multi-threads */ mpxy_lock_init(&smd->tblock, NULL); /* tx proxy buffer, shared across all QP's */ mpxy_lock_init(&smd->rblock, NULL); /* rx proxy buffer, shared across all QP's */ init_list(&smd->entry); init_list(&smd->clist); init_list(&smd->llist); init_list(&smd->qptlist); init_list(&smd->qprlist); init_list(&smd->cqlist); init_list(&smd->cqrlist); init_list(&smd->mrlist); return smd; err: if (smd) { if (smd->cmd_buf) free(smd->cmd_buf); if (smd->ports) free(smd->ports); mpxy_destroy_bpool(smd); free(smd); } return NULL; } /* * * Platform side - MIC Indirect eXchange (MIX) operations, SCIF * */ /* open MCM device, New MIC client via SCIF listen on well known port, new ep from accept */ mcm_scif_dev_t *mix_open_device(dat_mix_open_t *msg, scif_epd_t op_ep, scif_epd_t ev_ep, scif_epd_t tx_ep, uint16_t node) { mcm_client_t *mc; mcm_ib_dev_t *md = NULL, *new_md = NULL; mcm_scif_dev_t *smd = NULL; int i, ret; mlog(8, " Open IB device - %s, IB port %d, scif_node %d EPs %d %d %d op_msg %p\n", msg->name, msg->port, node, op_ep, tx_ep, ev_ep, msg); mc = &mcm_client_list[node]; mpxy_lock(&mc->oplock); mpxy_lock(&mc->cmlock); mpxy_lock(&mc->txlock); mpxy_lock(&mc->rxlock); /* New MIC node, start up OP and TX threads per node */ if (!mc->scif_id) { char value[64]; char path[64]; mc->ver = msg->hdr.ver; mc->scif_id = node; mc->numa_node = -1; sprintf(path, "/sys/class/mic/mic%d/device", mc->scif_id - 1); if (!rd_dev_file(path, "numa_node", value, sizeof value)) mc->numa_node = atoi(value); if (mc->numa_node < 0 || mc->numa_node > MCM_NNODES) { mlog(0, " WARN: %s numa_node = %d invalid\n", path, mc->numa_node); mc->numa_node = 0; } if (!rd_dev_file(path, "local_cpulist", value, sizeof value)) { if (mcm_cpumask[mc->numa_node] < 0) mcm_cpumask[mc->numa_node] = atoi(value); } mlog(0, " New MIC device - %s, numa_node %d, cpu %d - %s\n", path, mc->numa_node, mcm_cpumask[mc->numa_node], value); if (pthread_create(&mc->op_thread, NULL, (void *(*)(void *))mpxy_op_thread, (void*)mc)) { mlog(0, " op pthread_create ERR: %s\n", strerror(errno)); goto err; } if (pthread_create(&mc->tx_thread, NULL, (void *(*)(void *))mpxy_tx_thread, (void*)mc)) { pthread_cancel(mc->op_thread); mlog(0, " tx pthread_create ERR: %s\n", strerror(errno)); goto err; } if (pthread_create(&mc->cm_thread, NULL, (void *(*)(void *))mpxy_cm_thread, (void*)mc)) { pthread_cancel(mc->op_thread); pthread_cancel(mc->tx_thread); mlog(0, " cm pthread_create ERR: %s\n", strerror(errno)); goto err; } if (pthread_create(&mc->rx_thread, NULL, (void *(*)(void *))mpxy_rx_thread, (void*)mc)) { pthread_cancel(mc->cm_thread); pthread_cancel(mc->op_thread); pthread_cancel(mc->tx_thread); mlog(0, " rx pthread_create ERR: %s\n", strerror(errno)); goto err; } } for (i=0; imdev[i]; if (md->ibdev && !strcmp(md->ibdev->name, msg->name) && md->port == msg->port) goto found; else if (md->ibctx == NULL && new_md == NULL) { new_md = md; break; } } if (!new_md) goto err; /* This IB device is not yet open for SCIF node. Allocate and init */ md = new_md; memset(md, 0, sizeof(*md)); init_list(&md->entry); init_list(&md->smd_list); mpxy_lock_init(&md->slock, NULL); mpxy_lock_init(&md->plock, NULL); mpxy_lock_init(&md->txlock, NULL); md->cntrs = malloc(sizeof(uint64_t) * MCM_ALL_COUNTERS); if (!md->cntrs) { free(md); goto err; } memset(md->cntrs, 0, sizeof(uint64_t) * MCM_ALL_COUNTERS); md->mc = mc; md->port = msg->port; md->ibctx = open_ib_device(md, msg->name, msg->port); if ((!md->ibctx) || mcm_init_cm_service(md)) { mcm_destroy_md(md); goto err; } found: MCNTR(md, MCM_IA_OPEN); /* SCIF client (SMD) bound to IB device, send open_dev response */ smd = mcm_create_smd(md, op_ep, ev_ep, tx_ep); if (!smd) goto err; /* insert on active MIX device list */ mpxy_lock(&md->slock); insert_tail(&smd->entry, &md->smd_list, (void *)smd); mpxy_unlock(&md->slock); msg->hdr.req_id = smd->entry.tid; msg->hdr.status = MIX_SUCCESS; memcpy(&md->dev_attr, &msg->dev_attr, sizeof(dat_mix_dev_attr_t)); memcpy(&msg->dev_addr, &md->addr, sizeof(dat_mcm_addr_t)); err: if (!smd) { mlog(0, " ERR: mix_open_device failed for %s - %d\n", msg->name, msg->port); msg->hdr.status = MIX_ENODEV; } /* send back response */ ret = scif_send_msg(op_ep, (void*)msg, sizeof(dat_mix_open_t)); if (ret) { mlog(0, " ERR: scif_send dev_id %d op_ep %d, closing device %p\n", op_ep, msg->hdr.req_id, smd); if (smd) { mpxy_destroy_smd(smd); smd = NULL; } goto bail; } mlog(1, " MIC client: open mdev[%d] %p smd %p mic%d[%d] -> %s[%d] port %d - %s\n", md->smd_list.tid, md, smd, mc->scif_id-1, mc->numa_node, msg->name, md->numa_node, msg->port, md->addr.ep_map == MIC_SSOCK_DEV ? "MSS":"MXS"); bail: mpxy_unlock(&mc->oplock); mpxy_unlock(&mc->cmlock); mpxy_unlock(&mc->txlock); mpxy_unlock(&mc->rxlock); /* new device, FD's to add to poll in threads */ write(mc->op_pipe[1], "w", sizeof "w"); /* signal op_thread */ write(mc->cm_pipe[1], "w", sizeof "w"); /* signal cm_thread */ return smd; } static int finished = 0; void sig_handler( int signum ) { mlog(0, "Killed by signal %d.\n", signum); finished = 1; } static int mpxy_set_thread_attrs(struct mcm_client *mc, cpu_set_t *cpu_mask, int rx) { int policy, cpu = 0; struct sched_param params; pthread_t self; if (cpu_mask && mcm_affinity) { mpxy_lock(&mcm_cplock); CPU_ZERO(cpu_mask); if (mcm_affinity_base_mic) { if (mcm_affinity == 2) cpu = mcm_affinity_base_mic; else cpu = mcm_affinity_base_mic++; } else { if (mcm_affinity == 2) cpu = mcm_cpumask[mc->numa_node]; else cpu = mcm_cpumask[mc->numa_node]++; } CPU_SET(cpu, cpu_mask); if(sched_setaffinity( 0, sizeof(*cpu_mask), cpu_mask) == -1) mlog(0, "WARNING: setaffinity (%s) ERR, cpu_id=%d\n", strerror(errno), cpu); mpxy_unlock(&mcm_cplock); } else { cpu = sched_getcpu(); } if (mcm_set_priority) { self = pthread_self(); params.sched_priority = sched_get_priority_max(SCHED_FIFO) - 50; if (pthread_setschedparam(self, SCHED_FIFO, ¶ms)) { mlog(0, " ERR: setschedparam returned - %s\n", strerror(errno)); goto bail; } if (pthread_getschedparam(self, &policy, ¶ms)) { mlog(0, " ERR: getschedparam returned - %s\n", strerror(errno)); goto bail; } if (policy != SCHED_FIFO) { mlog(0, " ERR: policy != SCHED_FIFO\n"); goto bail; } mlog(0, " Thread (%x) policy = SCHED_FIFO, priority = %d\n", pthread_self(), params.sched_priority); } bail: return cpu; } void mpxy_tx_thread(void *mic_client) { mcm_client_t *mc = (mcm_client_t*)mic_client; struct mcm_ib_dev *md; struct mcm_scif_dev *smd; struct mcm_cq *m_cq; struct mcm_qp *m_qp; struct mcm_fd_set *set; int i, time_ms, data, cpu_id; char rbuf[2]; cpu_id = mpxy_set_thread_attrs(mc, &mc->tx_mask, 0); mlog(0, "TX thread (%x) MIC node_id %d bound to numa_node %d and cpu_id=%d\n", pthread_self(), mc->scif_id, mc->numa_node, cpu_id); set = mcm_alloc_fd_set(); if (!set) return; while (!finished) { mpxy_lock(&mc->txlock); mcm_fd_zero(set); mcm_fd_set(mc->tx_pipe[0], set, POLLIN); data = 0; for (i=0;imdev[i]; if (md->ibctx == NULL) continue; /* all active MCM clients on this IB device */ mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { smd->th_ref_cnt++; mpxy_unlock(&md->slock); mpxy_lock(&smd->cqlock); m_cq = get_head_entry(&smd->cqlist); while (m_cq) { m_req_event(m_cq, &data); /* check completions, PO and PI */ if (m_cq->ib_ch) mcm_fd_set(m_cq->ib_ch->fd, set, POLLIN); m_cq = get_next_entry(&m_cq->entry, &smd->cqlist); } mpxy_unlock(&smd->cqlock); mpxy_lock(&smd->qptlock); m_qp = get_head_entry(&smd->qptlist); while (m_qp) { if (m_qp->r_entry.tid) m_pi_pending_wc(m_qp, &data); m_po_pending_wr(m_qp, &data); /* proxy-out WR's */ m_qp = get_next_entry(&m_qp->t_entry, &smd->qptlist); } mpxy_unlock(&smd->qptlock); sched_yield(); mpxy_lock(&md->slock); smd->th_ref_cnt--; smd = get_next_entry(&smd->entry, &md->smd_list); } mpxy_unlock(&md->slock); sched_yield(); } mc->tx_busy = data; time_ms = (data) ? 0:-1; mpxy_unlock(&mc->txlock); if (time_ms == -1) mlog(0x10," sleep\n"); mcm_select(set, time_ms); if (time_ms == -1) mlog(0x10," wake\n"); if (mcm_poll(mc->tx_pipe[0], POLLIN) == POLLIN) { int cnt = 0; while (read(mc->tx_pipe[0], rbuf, 1) > 0) cnt++; } } mlog(0, "TX thread exiting, cpu=%d\n"); } void mpxy_op_thread(void *mic_client) { mcm_client_t *mc = (mcm_client_t*)mic_client; struct mcm_fd_set *set; struct mcm_ib_dev *md; struct mcm_scif_dev *smd, *next; char rbuf[2]; int i, ret, time_ms, cpu_id, smd_cnt; cpu_id = mpxy_set_thread_attrs(mc, &mc->op_mask, 0); mlog(0, "OP thread (%x) MIC node_id %d bound to numa_node %d and cpu_id=%d\n", pthread_self(), mc->scif_id, mc->numa_node, cpu_id ); set = mcm_alloc_fd_set(); if (!set) return; while (!finished) { mpxy_lock(&mc->oplock); smd_cnt = 0; time_ms = -1; mcm_fd_zero(set); mcm_fd_set(mc->op_pipe[0], set, POLLIN); /* Set up FD set array for all active client sessions */ for (i=0;imdev[i]; if (md->ibctx == NULL) continue; /* all active SCIF MIC clients, OP channels */ mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { smd_cnt++; smd->th_ref_cnt++; mpxy_unlock(&md->slock); ret = mcm_poll(smd->scif_op_ep, POLLIN); /* operations */ if (ret == POLLIN) ret = mix_scif_recv(smd, smd->scif_op_ep); if (ret != POLLERR) { ret = mcm_poll(smd->scif_ev_ep, POLLIN); /* client CM msgs */ if (ret == POLLIN) ret = mix_scif_recv(smd, smd->scif_ev_ep); } mpxy_lock(&md->slock); next = get_next_entry(&smd->entry, &md->smd_list); smd->th_ref_cnt--; if (ret == POLLERR) { mix_close_device(md, smd); } else { mcm_fd_set(smd->scif_op_ep, set, POLLIN); mcm_fd_set(smd->scif_ev_ep, set, POLLIN); } smd = next; } mpxy_unlock(&md->slock); sched_yield(); } mpxy_unlock(&mc->oplock); /* data-path, loop if busy or device open & single core */ if ((mc->tx_busy || mc->rx_busy) || (smd_cnt && mcm_op_poll)) time_ms = 0; mcm_select(set, time_ms); if (time_ms == -1) mlog(0x10," OP wake\n"); if (mcm_poll(mc->op_pipe[0], POLLIN) == POLLIN) read(mc->op_pipe[0], rbuf, 2); } free(set); mlog(0, "OP,CM,Event thread exiting\n"); } void mpxy_cm_thread(void *mic_client) { mcm_client_t *mc = (mcm_client_t*)mic_client; struct mcm_ib_dev *md; struct mcm_scif_dev *smd, *next; struct pollfd set[MCM_IB_MAX*3]; int i, fds, cpu_id, ret, cnt, time_ms = -1; char rbuf[2]; cpu_id = mpxy_set_thread_attrs(mc, &mc->cm_mask, 0); mlog(0, "CM thread (%x) MIC node_id %d bound to numa_node %d and cpu_id=%d\n", pthread_self(), mc->scif_id, mc->numa_node, cpu_id); while (!finished) { mpxy_lock(&mc->cmlock); set[0].fd = mc->cm_pipe[0]; set[0].events = POLLIN; set[0].revents = 0; fds = 1; for (i=0;imdev[i]; if (md->ibctx == NULL) continue; set[fds].fd = md->rch->fd; set[fds].events = POLLIN; set[fds].revents = 0; set[fds+1].fd = md->ibctx->async_fd; set[fds+1].events = POLLIN; set[fds+1].revents = 0; fds += 2; } mpxy_unlock(&mc->cmlock); poll(set, fds, time_ms); time_ms = -1; mpxy_lock(&mc->cmlock); for (i=0;imdev[i]; if (md->ibctx == NULL) continue; while (mcm_poll(mc->cm_pipe[0], POLLIN) == POLLIN) read(mc->cm_pipe[0], rbuf, 2); if (mcm_poll(md->rch->fd, POLLIN) == POLLIN) mcm_ib_recv(md); if (mcm_poll(md->ibctx->async_fd, POLLIN) == POLLIN) { ret = mcm_ib_async_event(md); if (ret) { mlog(0, " Shutdown all clients on MC %p MD %p \n", mc, md); mpxy_lock(&mc->oplock); mpxy_lock(&mc->txlock); mpxy_lock(&mc->rxlock); mpxy_lock(&md->slock); cnt = 0; smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { cnt++; next = get_next_entry(&smd->entry, &md->smd_list); mix_close_device(md, smd); smd = next; } mpxy_unlock(&md->slock); mcm_destroy_md(md); mpxy_unlock(&mc->rxlock); mpxy_unlock(&mc->txlock); mpxy_unlock(&mc->oplock); mlog(0, " Shutdown MC %p MD %p complete (%d clients)\n", mc, md, cnt); } } mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { mcm_check_timers(smd, &time_ms); smd = get_next_entry(&smd->entry, &md->smd_list); } mpxy_unlock(&md->slock); sched_yield(); } mpxy_unlock(&mc->cmlock); } mlog(0, "CM thread exiting\n"); } void mpxy_rx_thread(void *mic_client) { mcm_client_t *mc = (mcm_client_t*)mic_client; struct mcm_ib_dev *md; struct mcm_scif_dev *smd = NULL; struct mcm_qp *m_qp; struct mcm_cq *m_cq; struct mcm_fd_set *set; char rbuf[2]; int i, cpu_id, data, time_ms; cpu_id = mpxy_set_thread_attrs(mc, &mc->cm_mask, 1); mlog(0, "RX thread (%x) MIC node_id %d bound to numa_node %d and cpu_id=%d\n", pthread_self(), mc->scif_id, mc->numa_node, cpu_id); set = mcm_alloc_fd_set(); if (!set) return; while (!finished) { mpxy_lock(&mc->rxlock); mcm_fd_zero(set); mcm_fd_set(mc->rx_pipe[0], set, POLLIN); data = 0; for (i=0;imdev[i]; if (md->ibctx == NULL) continue; mpxy_lock(&md->slock); smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { smd->th_ref_cnt++; mpxy_unlock(&md->slock); mpxy_lock(&smd->cqrlock); m_cq = get_head_entry(&smd->cqrlist); while (m_cq) { m_rcv_event(m_cq, &data); /* chk receive requests, initiate RR's */ if (m_cq->ib_ch) mcm_fd_set(m_cq->ib_ch->fd, set, POLLIN); m_cq = get_next_entry(&m_cq->entry, &smd->cqrlist); } mpxy_unlock(&smd->cqrlock); mpxy_lock(&smd->qprlock); m_qp = get_head_entry(&smd->qprlist); while (m_qp) { m_pi_pending_wr(m_qp, &data); /* RR's and scif_sendto */ m_qp = get_next_entry(&m_qp->r_entry, &smd->qprlist); } mpxy_unlock(&smd->qprlock); sched_yield(); mpxy_lock(&md->slock); smd->th_ref_cnt--; smd = get_next_entry(&smd->entry, &md->smd_list); } mpxy_unlock(&md->slock); sched_yield(); } mc->rx_busy = data; time_ms = data ? 0:-1; mpxy_unlock(&mc->rxlock); if (time_ms == -1) mlog(0x10," RX sleep\n"); mcm_select(set, time_ms); if (time_ms == -1) mlog(0x10," RX wake\n"); if (mcm_poll(mc->rx_pipe[0], POLLIN) == POLLIN) read(mc->rx_pipe[0], rbuf, 2); } mlog(0, "RX thread exiting\n"); } /* * MPXY server will listen on both a IB UD QP for fabric CM messages * and a SCIF port for inter-bus MCM operation messages to/from MIC MCM clients. * * MPXY message protocol is very similar to existing DCM but not compatible * therefore we are setting version number to 1 for MCM protocol so it will * not connect incompatible DAPL endpoints by mistake. * * 1st draft - one IB UD QP per device, multiplex multiple MIC opens to same device * one thread for both SCIF and IB traffic, try FD select for now * and move to polling memory if we can't get pipelining at wire speeds. * */ static void mpxy_server(void) { struct pollfd set; struct sigaction act, oldact; int i, cpu_id; act.sa_handler = sig_handler; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(SIGINT, &act, &oldact)) mlog(0, "sigaction: %s\n", strerror(errno)); if (sigaction(SIGTERM, &act, &oldact)) mlog(0, "sigaction: %s\n", strerror(errno)); cpu_id = mpxy_set_thread_attrs(&mcm_client_list[0], NULL, 0); mlog(0, "Server started, cpu_id=%d\n", cpu_id); while (!finished) { set.fd = scif_listen_ep; set.events = POLLIN; set.revents = 0; mlog(0x8, "Server sleep\n"); poll(&set, 1, -1); /* sleep */ mlog(0x8, "Server wake, cpu_id=%d\n"); /* process listens */ if (mcm_poll(scif_listen_ep, POLLIN) == POLLIN) mix_scif_accept(scif_listen_ep); } mlog(0, "server exiting, canceling all threads...\n"); /* cancel all MIC node client threads */ for (i=0;iwr_pp_rem + m_qp->wr_pp + (m_qp->post_sig_cnt - m_qp->comp_cnt); mlog(0, "[%d:%d:%d] PO QPt %p - WR tl %d tl_rf %d hd %d -" " RW pst %d sig %d po_cmp %d, wr_rem %d wr %d - IO %d ACT %d\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp, m_qp->wr_tl, m_qp->wr_tl_rf, m_qp->wr_hd, m_qp->post_cnt, m_qp->post_sig_cnt, m_qp->comp_cnt, m_qp->wr_pp_rem, m_qp->wr_pp, m_qp->post_cnt, io); if (m_qp->cm) mcm_pr_addrs(0, &m_qp->cm->msg, m_qp->cm->state, 0); } else { io = m_qp->stall_cnt_rr + m_qp->post_cnt_wt + m_qp->pi_rw_cnt; mlog(0, "[%d:%d:%d] PI QPr %p - WR tl %d tl_wt %d hd %d -" " RR pst %d pst_pnd %d stl %d, WT %d, RW_imm %d - IO %d ACT %d\n", m_qp->smd->md->mc->scif_id, m_qp->smd->entry.tid, m_qp->r_entry.tid, m_qp, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, m_qp->post_cnt_rr, m_qp->pi_rr_cnt, m_qp->stall_cnt_rr, m_qp->post_cnt_wt, m_qp->pi_rw_cnt, m_qp->post_cnt_rr, io); if (m_qp->cm) mcm_pr_addrs(0, &m_qp->cm->msg, m_qp->cm->state, 0); } } void mcm_connect_log(struct mcm_scif_dev *smd) { struct mcm_qp *m_qp_t; struct mcm_qp *m_qp_r; m_qp_t = get_head_entry(&smd->qptlist); m_qp_r = get_head_entry(&smd->qprlist); while (m_qp_t || m_qp_r) { if (m_qp_t) { mcm_qp_log(m_qp_t, 1); m_qp_t = get_next_entry(&m_qp_t->t_entry, &smd->qptlist); } if (m_qp_r) { mcm_qp_log(m_qp_r, 0); m_qp_r = get_next_entry(&m_qp_r->r_entry, &smd->qprlist); } } } void mcm_dat_dev_log(struct mcm_scif_dev *smd) { int idx; uint32_t now = mcm_ts_us(); mlog(0, "[%d:%d] PO_BUF %p tl 0x%x hd 0x%x ln %d -" " WC %p tl %d hd %d ln %d - SEGs %d ACT %u\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_buf, smd->m_tl, smd->m_hd, smd->m_len, smd->m_buf_wc, smd->m_buf_tl, smd->m_buf_hd, smd->m_buf_end, smd->m_buf_hd, smd->m_buf_hd - smd->m_buf_tl); mlog(0, "[%d:%d] PI_BUF %p tl 0x%x hd 0x%x ln %d -" " WC %p tl %d hd %d ln %d - SEGs %d ACT %u\n", smd->md->mc->scif_id, smd->entry.tid, smd->m_buf_r, smd->m_tl_r, smd->m_hd_r, smd->m_len_r, smd->m_buf_wc_r, smd->m_buf_tl_r, smd->m_buf_hd_r, smd->m_buf_end_r, smd->m_buf_hd_r, smd->m_buf_hd_r - smd->m_buf_tl_r); /* show PO mbuf_wc busy slots */ idx = smd->m_buf_tl; while ((smd->m_buf_tl != smd->m_buf_hd) && (smd->m_buf_hd - smd->m_buf_tl)) { if ((smd->m_buf_wc[idx].m_idx && !smd->m_buf_wc[idx].done) || 1) { struct mcm_wr *m_wr = NULL; struct mcm_qp *m_qp = NULL; if (smd->m_buf_wc[idx].wr) { m_wr = (struct mcm_wr *)smd->m_buf_wc[idx].wr; m_qp = (struct mcm_qp *)m_wr->context; } mlog(0, "[%d:%d:%d] PO: m_wc - tl %d hd %d wc[%d].m_idx=0x%x %s" " wr[%d] f=%x,m=%x t=%u ref=%d m_tl %x hd %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp ? m_qp->r_entry.tid:0, smd->m_buf_tl, smd->m_buf_hd, idx, smd->m_buf_wc[idx].m_idx, smd->m_buf_wc[idx].done ? "DONE":"BUSY", m_wr ? m_wr->w_idx:0, m_wr ? m_wr->flags:0, m_wr ? m_wr->m_idx:0, smd->m_buf_wc[idx].done ? smd->m_buf_wc[idx].ts : now - smd->m_buf_wc[idx].ts, smd->m_buf_wc[idx].ref, smd->m_buf_wc[idx].tl, smd->m_buf_wc[idx].hd); } idx = (idx + 1) & smd->m_buf_end; if (idx == (smd->m_buf_hd+2)) break; } /* show PI mbuf_wc busy slots, start from tail */ idx = smd->m_buf_tl_r; while ((smd->m_buf_tl_r != smd->m_buf_hd_r) && (smd->m_buf_hd_r - smd->m_buf_tl_r)) { if (smd->m_buf_wc_r[idx].m_idx || 1) { struct mcm_wr_rx *m_wr = NULL; struct mcm_qp *m_qp = NULL; if (smd->m_buf_wc_r[idx].wr) { m_wr = (struct mcm_wr_rx *)smd->m_buf_wc_r[idx].wr; m_qp = (struct mcm_qp *)m_wr->context; } mlog(0, "[%d:%d:%d] PI: m_wc_r - tl %d hd %d wc[%d].m_idx=0x%x %s " "wr[%d] f=%x,m=%x t=%u ref=%d m_tl %x hd %x\n", smd->md->mc->scif_id, smd->entry.tid, m_qp ? m_qp->r_entry.tid:0, smd->m_buf_tl_r, smd->m_buf_hd_r, idx, smd->m_buf_wc_r[idx].m_idx, smd->m_buf_wc_r[idx].done ? "DONE":"BUSY", m_wr ? m_wr->w_idx:0, m_wr ? m_wr->flags:0, m_wr ? m_wr->m_idx:0, smd->m_buf_wc_r[idx].done ? smd->m_buf_wc_r[idx].ts : now - smd->m_buf_wc_r[idx].ts, smd->m_buf_wc_r[idx].ref, smd->m_buf_wc_r[idx].tl, smd->m_buf_wc_r[idx].hd); } idx = (idx + 1) & smd->m_buf_end_r; if (idx == (smd->m_buf_hd_r+2)) break; } } void mcm_ib_dev_log(struct mcm_ib_dev *md) { mlog(0, "[%d] MD %p - LID 0x%x PORT %d GID %s QPN 0x%x: mic%d ->" " %s - %s, mic_ver %d\n", md->mc->scif_id, md, ntohs(md->addr.lid), md->port, inet_ntop(AF_INET6, md->addr.gid, gid_str, sizeof(gid_str)), md->qp->qp_num, md->mc->scif_id - 1, md->ibdev->name, md->addr.ep_map == MIC_SSOCK_DEV ? "MSS":"MXS", md->mc->ver); } static int check_io_run; void mcm_check_io() { mcm_client_t *mc; struct mcm_ib_dev *md; struct mcm_scif_dev *smd; int i, ii; if (check_io_run) return; else check_io_run++; for (i=0;imdev[ii]; if (md->ibctx == NULL) continue; mcm_ib_dev_log(md); /* ibv_open_device */ smd = get_head_entry(&md->smd_list); while (smd && !smd->destroy) { mlog(0, "[%d:%d] SMD %p \n", smd->md->mc->scif_id, smd->entry.tid, smd); mcm_dat_dev_log(smd); /* dat_ia_open */ mcm_connect_log(smd); /* dat_connect */ smd = get_next_entry(&smd->entry, &md->smd_list); } } } assert(0); } #endif dapl-2.1.5/dapl/svc/mpxyd.h000066400000000000000000000660411255317474200155050ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef _MPXYD_H_ #define _MPXYD_H_ #if HAVE_CONFIG_H # include #endif /* HAVE_CONFIG_H */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dat2/udat.h" #include "dapl_mic_common.h" #define min(a, b) ((a < b) ? (a) : (b)) #define max(a, b) ((a > b) ? (a) : (b)) #define MCM_IB_INLINE 160 #define MIX_MAX_MSG_SIZE (8*1024*1024) #define MIX_MIN 4 /* oldest version supported */ #define MIX_COMP 4 /* compatibility version */ #define MIX_MAX DAT_MIX_VER /* #define MCM_PROFILE 1 */ /* locking */ typedef pthread_mutex_t mpxy_lock_t; #define mpxy_lock_init(x,y) pthread_mutex_init(x,y) #define mpxy_lock_destroy(x) pthread_mutex_destroy(x) #define mpxy_lock(x) pthread_mutex_lock(x) #define mpxy_unlock(x) pthread_mutex_unlock(x) /* lists, fds, etc., include tid for lists */ typedef struct _llist_entry { struct _llist_entry *next; struct _llist_entry *prev; struct _llist_entry *head; void *data; uint32_t tid; } LLIST_ENTRY; #define MCM_PORT_SPACE 0xffff #define MCM_FD_SETSIZE 16384 struct mcm_fd_set { int index; struct pollfd set[MCM_FD_SETSIZE]; }; /* Support for IB devices - One service per device: UD QP for fabric CM services */ typedef struct mcm_ib_dev { LLIST_ENTRY entry; LLIST_ENTRY smd_list; /* MIC client open instances */ mpxy_lock_t slock; /* SCIF client device lock */ mpxy_lock_t plock; /* port space lock */ mpxy_lock_t txlock; /* MCM UD CM tx lock */ /* MCM - IB Device Resources */ struct ibv_device *ibdev; struct ibv_context *ibctx; struct mcm_client *mc; /* parent MIC client */ int ref_cnt; uint16_t port; /* IB device port */ struct ibv_pd *pd; struct ibv_cq *scq; struct ibv_cq *rcq; struct ibv_qp *qp; struct ibv_mr *mr_rbuf; struct ibv_mr *mr_sbuf; struct ibv_comp_channel *rch; struct ibv_ah **ah; struct dat_mcm_msg *sbuf; struct dat_mcm_msg *rbuf; uint64_t *ports; /* SCIF device open clients, cm_id*/ struct dat_mcm_addr addr; uint16_t lid; struct dat_mix_dev_attr dev_attr; /* provided with mix_open */ int s_hd; int s_tl; int cqe; int qpe; int signal; int retries; int cm_timer; int rep_time; int rtu_time; int numa_node; int indata; void *cntrs; } mcm_ib_dev_t; /* * MPXYD shared proxy buffer management, work completion * Required for out of order completions across multiple QP's */ typedef struct mcm_buf_wc { uint32_t m_idx; uint32_t done; #ifdef MCM_PROFILE uint32_t hd; uint32_t tl; uint32_t ref; uint32_t ts; void *wr; #endif } mcm_buf_wc_t; /* performance profiling */ enum mcm_prof_type { MCM_QP_WT, MCM_QP_RF, MCM_QP_IB_RW, MCM_QP_IB_RR, MCM_QP_PO_POST, MCM_QP_PO_PI_RW, MCM_QP_ALL }; typedef struct mcm_qp_prof_val { uint32_t min; uint32_t max; uint32_t avg; uint32_t all; uint32_t cnt; uint32_t start; uint32_t stop; } mcm_qp_prof_val_t; typedef struct mcm_qp_prof { mcm_qp_prof_val_t wt; /* scif_writeto */ mcm_qp_prof_val_t rf; /* scif_readfrom */ mcm_qp_prof_val_t rw; /* IB write */ mcm_qp_prof_val_t rr; /* IB read */ mcm_qp_prof_val_t ps; /* Mix post_send times */ mcm_qp_prof_val_t po; /* IO proxy-out: FirstSeg to LastSeg */ } mcm_qp_prof_t; /* DAPL MCM QP object, id in entry */ typedef struct mcm_qp { LLIST_ENTRY t_entry; LLIST_ENTRY r_entry; struct mcm_scif_dev *smd; struct mcm_cm *cm; struct ibv_qp *ib_qp1; /* RX proxy QP, MIC_XSOCK_DEV */ struct ibv_qp *ib_qp2; /* TX proxy QP, all cases */ mpxy_lock_t txlock; /* QP lock, pool and cookies, TX proxy-out side */ mpxy_lock_t rxlock; /* QP lock, pool and cookies, RX proxy-in side */ dat_mix_qp_attr_t qp_attr1; /* RX attributes, QP1 */ dat_mix_qp_attr_t qp_attr2; /* TX attributes, QP2 */ struct mcm_cq *m_cq_rx; /* RX CQ proxy-in service */ struct mcm_cq *m_cq_tx; /* TX CQ proxy-out service */ /* Proxy-out: WR local queue, local on TX side */ char *wr_buf; /* WR entries, 128 bytes * qp_t->max_send_wr */ off_t wr_off; /* SCIF registered, for scif_fence_signal @ wr->wr_id */ int wr_hd; /* work request pool head */ int wr_tl; /* work request pool tail */ int wr_tl_rf; /* work requets pool RF tail */ int wr_end; /* work request pool end */ int wr_len; /* work request pool size */ int wr_pp; /* work request pending */ int wr_sz; /* work request entry size, 64 byte aligned */ int post_cnt; /* completion management to avoid WR depletion */ int post_sig_cnt; int comp_cnt; char *wr_buf_rx; /* mcm_wr_rx_t entries, for devices without inline data */ struct ibv_mr *wr_buf_rx_mr; /* Proxy-in: WR management, remote view from TX side */ mcm_wrc_info_t wrc_rem; /* WR and WC buffers: remote, in CM req and reply */ int wr_pp_rem; /* work request pending */ int wr_sz_rem; /* work request entry size, 64 byte aligned */ int wc_tl; /* WC tail update, back to proxy_in via wr_rx writes */ /* Proxy-in: WC management, remote view from RX side */ int wc_hd_rem; /* work completion pool head */ int wc_tl_rem; /* work completion pool tail */ int wc_sz_rem; /* work request entry size, 64 byte aligned */ /* Proxy-in: WR and WC buffer resources, local on RX side */ mcm_wrc_info_t wrc; /* WR and WC buffers: local, addr, key, len, end */ off_t wr_off_r; /* SCIF registered, for scif_fence_signal @ wr->wr_id */ struct ibv_mr *wr_rbuf_mr; /* IB WR - MR address and key */ int wr_hd_r; /* RX side, WR pool head */ int wr_tl_r; /* RX side, WR pool tail */ int wr_tl_r_wt; /* RX side, WR pool tail, writeto pending tail */ struct ibv_mr *wc_rbuf_mr; /* RX WC - IB MR address and key */ int post_cnt_rr; /* RX WR - total RR posted count */ int pi_rw_cnt; /* Proxy-in pending, RW_imm for WC's */ int post_cnt_wt; /* RX WR, proxy-in, scif_writeto post pending */ int pi_rr_cnt; /* RX WR, proxy-in, IB Rdma Reads pending */ int stall_cnt_rr; /* RX WR, proxy-in, IB Rdma Reads stalled */ char *wc_buf_rx; /* mcm_wc_rx_t entries, for devices without inline data */ struct ibv_mr *wc_buf_rx_mr; /* Proxy-in: send/recv message queue, local on RX side */ char *sr_buf; /* Send-Recv message work request queue */ int sr_hd; /* SR WR head */ int sr_tl; /* SR WR tail */ int sr_end; /* SR WR end */ int sr_len; /* SR WR buffer pool len */ int sr_sz; /* SR WR entry size */ int post_sr; #ifdef MCM_PROFILE mcm_qp_prof_t ts; uint32_t last_wr_sig; uint32_t last_wr_pst; uint32_t last_rf; uint32_t last_ps; #endif } mcm_qp_t; /* DAPL MCM CQ object, id in entry */ typedef struct mcm_cq { LLIST_ENTRY entry; struct mcm_scif_dev *smd; struct ibv_cq *ib_cq; struct ibv_comp_channel *ib_ch; uint32_t cq_len; uint32_t cq_id; /* MIC client */ uint64_t cq_ctx; /* MIC client */ uint64_t prev_id; int ref_cnt; } mcm_cq_t; /* DAPL MCM MR object, id in entry */ typedef struct mcm_mr { LLIST_ENTRY entry; struct mcm_scif_dev *smd; int busy; dat_mix_mr_t mre; } mcm_mr_t; /* DAPL MCM Connection/Listen object */ typedef struct mcm_cm { LLIST_ENTRY entry; mpxy_lock_t lock; struct mcm_ib_dev *md; /* mcm_ib_dev parent reference */ struct mcm_scif_dev *smd; /* mcm_scif_dev parent reference */ struct mcm_cm *l_ep; /* listen reference, passive */ uint16_t sid; /* service ID for endpoint */ uint32_t cm_id; /* id of client, QPr */ uint64_t cm_ctx; /* ctx of client, QPr */ uint64_t sp_ctx; /* ctx of client, listen SP */ uint64_t timer; int ref_cnt; int state; int retries; struct mcm_qp *m_qp; /* pair of QP's, qp_t and qp_r */ uint16_t p_size; /* accept p_data, for retries */ uint8_t p_data[DAT_MCM_PDATA_SIZE]; struct dat_mcm_msg msg; } mcm_cm_t; /* * per MIC MCM client open, SCIF device object: */ typedef struct mcm_scif_dev { LLIST_ENTRY entry; LLIST_ENTRY clist; /* LISTS: cm list */ LLIST_ENTRY llist; /* listen list */ LLIST_ENTRY qptlist; /* qp proxy out service */ LLIST_ENTRY qprlist; /* qp proxy in service */ LLIST_ENTRY cqlist; /* client cq create list */ LLIST_ENTRY cqrlist; /* mpxyd cq list for proxy in service */ LLIST_ENTRY mrlist; /* mr list */ mpxy_lock_t clock; /* LOCKS: cm lock */ mpxy_lock_t llock; /* listen lock */ mpxy_lock_t plock; /* port space lock */ mpxy_lock_t qptlock; /* qpt list lock */ mpxy_lock_t qprlock; /* qpr list lock */ mpxy_lock_t cqlock; /* cq tx lock */ mpxy_lock_t cqrlock; /* cq rx lock */ mpxy_lock_t mrlock; /* mr lock */ mpxy_lock_t evlock; /* DTO event lock, multi-threads on ev_ep */ int destroy; /* destroying device, all resources */ int ref_cnt; /* child references */ int th_ref_cnt; /* work thread references */ struct mcm_ib_dev *md; /* mcm_ib_dev, parent */ uint16_t cm_id; /* port ID MIC client, md->ports */ uint64_t *ports; /* EP port space MIC client */ scif_epd_t scif_op_ep; /* SCIF EP, MIX operations, CM messages */ scif_epd_t scif_ev_ep; /* SCIF Event EP, MIX dto, cm, async */ scif_epd_t scif_tx_ep; /* SCIF CM EP, MIX data xfer */ struct scif_portID peer; /* SCIF EP peer, MIC adapter */ struct scif_portID peer_cm; /* SCIF CM EP peer, MIC adapter */ mpxy_lock_t tblock; /* TX proxy buffer lock */ char *m_buf; /* MIC TX proxy buffer, SCIF and IB */ struct ibv_mr *m_mr; /* ib registration */ off_t m_offset; /* SCIF registration */ int m_hd; /* buffer pool head */ int m_tl; /* buffer pool tail */ int m_len; /* TX buffer size */ int m_seg; /* segment size, same for TX and RX proxy */ struct mcm_buf_wc *m_buf_wc; /* Proxy Buffer work completion queue */ int m_buf_tl; /* Proxy Buffer WC queue tl */ int m_buf_hd; /* Proxy Buffer WC queue hd */ int m_buf_end; /* Proxy Buffer WC queue end */ mpxy_lock_t rblock; /* RX proxy buffer lock */ char *m_buf_r; /* MIC RX proxy buffer, SCIF and IB */ struct ibv_mr *m_mr_r; /* Rcv proxy buffer, ib registration */ off_t m_offset_r; /* Rcv proxy buffer, SCIF registration */ int m_hd_r; /* Rcv buffer pool head */ int m_tl_r; /* Rcv buffer pool tail */ int m_len_r; /* Rcv proxy buffer size */ struct mcm_buf_wc *m_buf_wc_r; /* Proxy Buffer work completion queue */ int m_buf_tl_r; /* Proxy Buffer WC queue tl */ int m_buf_hd_r; /* Proxy Buffer WC queue hd */ int m_buf_end_r; /* Proxy Buffer WC queue end */ char *cmd_buf; /* operation command buffer */ #ifdef MCM_PROFILE uint16_t m_hd_ro; /* HD,TL tracking */ uint16_t m_tl_ro; uint16_t m_hd_ro_r; uint16_t m_tl_ro_r; #endif } mcm_scif_dev_t; /* 1-8 MIC nodes, 1-8 IB ports, 4 threads (op/events, CM, TX, RX) each node */ #define MCM_IB_MAX 8 #define MCM_CLIENT_MAX 8 typedef struct mcm_client { uint16_t ver; uint16_t scif_id; int numa_node; int op_pipe[2]; int tx_pipe[2]; int rx_pipe[2]; int cm_pipe[2]; int tx_busy; int rx_busy; cpu_set_t op_mask; cpu_set_t tx_mask; cpu_set_t rx_mask; cpu_set_t cm_mask; mpxy_lock_t oplock; mpxy_lock_t txlock; mpxy_lock_t rxlock; mpxy_lock_t cmlock; pthread_t tx_thread; pthread_t rx_thread; pthread_t op_thread; pthread_t cm_thread; mcm_ib_dev_t mdev[MCM_IB_MAX]; } mcm_client_t; typedef enum mcm_counters { MCM_IA_OPEN, MCM_IA_CLOSE, MCM_PD_CREATE, MCM_PD_FREE, MCM_MR_CREATE, MCM_MR_FREE, MCM_CQ_CREATE, MCM_CQ_FREE, MCM_CQ_POLL, MCM_CQ_REARM, MCM_CQ_EVENT, MCM_MX_SEND, MCM_MX_SEND_INLINE, MCM_MX_WRITE, MCM_MX_WRITE_SEG, MCM_MX_WRITE_INLINE, MCM_MX_WR_STALL, MCM_MX_MR_STALL, MCM_MX_RR_STALL, MCM_QP_CREATE, MCM_QP_SEND, MCM_QP_SEND_INLINE, MCM_QP_WRITE, MCM_QP_WRITE_INLINE, MCM_QP_WRITE_DONE, MCM_QP_READ, MCM_QP_READ_DONE, MCM_QP_RECV, MCM_QP_FREE, MCM_QP_EVENT, MCM_SRQ_CREATE, MCM_SRQ_FREE, MCM_MEM_ALLOC, MCM_MEM_ALLOC_DATA, MCM_MEM_FREE, MCM_ASYNC_ERROR, MCM_ASYNC_QP_ERROR, MCM_ASYNC_CQ_ERROR, MCM_SCIF_SEND, MCM_SCIF_RECV, MCM_SCIF_READ_FROM, MCM_SCIF_READ_FROM_DONE, MCM_SCIF_WRITE_TO, MCM_SCIF_WRITE_TO_DONE, MCM_SCIF_SIGNAL, MCM_LISTEN_CREATE, MCM_LISTEN_CREATE_ANY, MCM_LISTEN_FREE, MCM_CM_CONN_EVENT, MCM_CM_DISC_EVENT, MCM_CM_TIMEOUT_EVENT, MCM_CM_ERR_EVENT, MCM_CM_TX_POLL, MCM_CM_RX_POLL, MCM_CM_MSG_OUT, MCM_CM_MSG_IN, MCM_CM_MSG_POST, MCM_CM_REQ_OUT, MCM_CM_REQ_IN, MCM_CM_REQ_ACCEPT, MCM_CM_REP_OUT, MCM_CM_REP_IN, MCM_CM_RTU_OUT, MCM_CM_RTU_IN, MCM_CM_REJ_OUT, MCM_CM_REJ_IN, MCM_CM_REJ_USER_OUT, MCM_CM_REJ_USER_IN, MCM_CM_ACTIVE_EST, MCM_CM_PASSIVE_EST, MCM_CM_AH_REQ_OUT, MCM_CM_AH_REQ_IN, MCM_CM_AH_RESOLVED, MCM_CM_DREQ_OUT, MCM_CM_DREQ_IN, MCM_CM_DREQ_DUP, MCM_CM_DREP_OUT, MCM_CM_DREP_IN, MCM_CM_MRA_OUT, MCM_CM_MRA_IN, MCM_CM_REQ_FULLQ_POLL, MCM_CM_ERR, MCM_CM_ERR_REQ_FULLQ, MCM_CM_ERR_REQ_DUP, MCM_CM_ERR_REQ_RETRY, MCM_CM_ERR_REP_DUP, MCM_CM_ERR_REP_RETRY, MCM_CM_ERR_RTU_DUP, MCM_CM_ERR_RTU_RETRY, MCM_CM_ERR_REFUSED, MCM_CM_ERR_RESET, MCM_CM_ERR_TIMEOUT, MCM_CM_ERR_REJ_TX, MCM_CM_ERR_REJ_RX, MCM_CM_ERR_DREQ_DUP, MCM_CM_ERR_DREQ_RETRY, MCM_CM_ERR_DREP_DUP, MCM_CM_ERR_DREP_RETRY, MCM_CM_ERR_MRA_DUP, MCM_CM_ERR_MRA_RETRY, MCM_CM_ERR_UNEXPECTED_STATE, MCM_CM_ERR_UNEXPECTED_MSG, MCM_ALL_COUNTERS, /* MUST be last */ } MCM_COUNTERS; #define MCNTR(mdev, cntr) ((uint64_t *)mdev->cntrs)[cntr]++ /* prototypes */ /* mpxyd - daemon services, thread processing */ void mpxy_destroy_md(struct mcm_ib_dev *md); void mpxy_destroy_smd(struct mcm_scif_dev *smd); void mpxy_destroy_bpool(struct mcm_scif_dev *smd); void mpxy_op_thread(void *mic_client); void mpxy_tx_thread(void *mic_client); void mpxy_cm_thread(void *mic_client); void mpxy_rx_thread(void *mic_client); mcm_scif_dev_t *mix_open_device(dat_mix_open_t *msg, scif_epd_t op_ep, scif_epd_t ev_ep, scif_epd_t tx_ep, uint16_t node); #ifdef MCM_PROFILE void mcm_check_io(); #endif /* mcm.c, cm services */ void mcm_get_attr(dat_mix_prov_attr_t *pr_attr); int mcm_init_cm_service(mcm_ib_dev_t *md); mcm_cm_t *m_cm_create(mcm_scif_dev_t *smd, mcm_qp_t *m_qp, dat_mcm_addr_t *dst); void m_cm_free(mcm_cm_t *cm); void mcm_cm_disc(mcm_cm_t *m_cm); int mcm_cm_req_out(mcm_cm_t *m_cm); int mcm_cm_rtu_out(mcm_cm_t *m_cm); int mcm_cm_rep_out(mcm_cm_t *cm); int mcm_cm_rej_out(mcm_ib_dev_t *md, dat_mcm_msg_t *msg, DAT_MCM_OP type, int swap); void mcm_check_timers(mcm_scif_dev_t *smd, int *timer); void mcm_ib_recv(mcm_ib_dev_t *md); int mcm_ib_async_event(struct mcm_ib_dev *md); void mcm_qlisten(mcm_scif_dev_t *smd, mcm_cm_t *cm); void mcm_dqlisten_free(mcm_scif_dev_t *smd, mcm_cm_t *cm); void mcm_qconn(mcm_scif_dev_t *smd, mcm_cm_t *cm); void mcm_dqconn_free(mcm_scif_dev_t *smd, mcm_cm_t *cm); int mcm_modify_qp(struct ibv_qp *qp_handle, enum ibv_qp_state qp_state, uint32_t qpn, uint16_t lid, union ibv_gid *gid); void mcm_flush_qp(struct mcm_qp *m_qp); void mcm_dump_cm_lists(mcm_scif_dev_t *smd); /* mix.c, MIC message exchange (MIX) services */ void m_cq_free(struct mcm_cq *m_cq); void m_qp_free(struct mcm_qp *m_qp); void m_mr_free(struct mcm_mr *m_mr); int mix_scif_recv(mcm_scif_dev_t *smd, scif_epd_t scif_ep); int mix_cm_disc_in(mcm_cm_t *m_cm); int mix_cm_rtu_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len); int mix_cm_req_in(mcm_cm_t *cm, dat_mcm_msg_t *pkt, int pkt_len); int mix_cm_rep_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len); int mix_cm_rej_in(mcm_cm_t *m_cm, dat_mcm_msg_t *pkt, int pkt_len); void mix_close_device(mcm_ib_dev_t *md, mcm_scif_dev_t *smd); void mix_scif_accept(scif_epd_t listen_ep); void mix_cm_event(mcm_cm_t *m_cm, uint32_t event); void mix_dto_event(struct mcm_cq *m_cq, struct dat_mix_wc *wc, int nc); /* util.c, helper funtions */ FILE *mpxy_open_log(void); void mpxy_set_options(int debug_mode); void mpxy_log_options(void); int mpxy_open_lock_file(void); void mpxyd_release_lock_file( void ); void mpxy_write(int level, const char *format, ...); void mpxy_pr_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in); int mpxy_cpuinfo_atoi(const char *v_str); #ifdef MCM_PROFILE void mcm_qp_prof_pr(struct mcm_qp *m_qp, int type); void mcm_qp_prof_ts(struct mcm_qp *m_qp, int type, uint32_t start, uint32_t qcnt, uint32_t ccnt); #endif struct mcm_fd_set *mcm_alloc_fd_set(void); void mcm_fd_zero(struct mcm_fd_set *set); int mcm_fd_set(int fd, struct mcm_fd_set *set, int event); int mcm_config_fd(int fd); int mcm_poll(int fd, int event); int mcm_select(struct mcm_fd_set *set, int time_ms); uint16_t mcm_get_port(uint64_t *p_port, uint16_t port, uint64_t ctx); uint64_t mcm_get_port_ctx(uint64_t *p_port, uint16_t port); int rd_dev_file(char *path, char *file, char *v_str, int len); void md_cntr_log(mcm_ib_dev_t *md, int counter, int reset); /* mpxy_out.c, proxy_out services, rdma write, message req side */ void m_po_destroy_bpool(struct mcm_qp *m_qp); int m_po_create_bpool(struct mcm_qp *m_qp, int max_req_wr); void m_po_pending_wr(struct mcm_qp *m_qp, int *data); int m_po_proxy_data(mcm_scif_dev_t *smd, dat_mix_sr_t *pmsg, struct mcm_qp *m_qp); void m_po_wc_event(struct mcm_qp *m_qp, struct mcm_wc_rx *wc_rx, int wc_idx); void m_req_event(struct mcm_cq *m_cq, int *events); int m_po_buf_hd(mcm_scif_dev_t *smd, int m_idx, struct mcm_wr *wr); /* mpxy_in.c, proxy_in services, rdma write, message rcv side */ void m_pi_destroy_wc_q(struct mcm_qp *m_qp); void m_pi_destroy_bpool(struct mcm_qp *m_qp); int m_pi_create_wr_q(struct mcm_qp *m_qp, int entries); int m_pi_create_wc_q(struct mcm_qp *m_qp, int entries); int m_pi_create_sr_q(struct mcm_qp *m_qp, int entries); int m_pi_create_bpool(struct mcm_qp *m_qp, int max_recv_wr); void m_qp_destroy_pi(struct mcm_qp *m_qp); int m_qp_create_pi(mcm_scif_dev_t *smd, struct mcm_qp *m_qp); void m_pi_pending_wr(struct mcm_qp *m_qp, int *data); void m_pi_pending_wc(struct mcm_qp *m_qp, int *events); void m_pi_req_event(struct mcm_qp *m_qp, struct mcm_wr_rx *wr_rx, struct ibv_wc *wc, int type); void m_rcv_event(struct mcm_cq *m_cq, int *events); int m_pi_prep_rcv_q(struct mcm_qp *m_qp); /* logging levels, bit control: * 0=errors * 1=warnings * 2=cm * 4=data * 8=info * 0x10=perf */ #define mlog(level, format, ...) \ mpxy_write(level, "%s: "format, __func__, ## __VA_ARGS__) /* inline functions */ /* link list helper resources */ static inline void init_list(LLIST_ENTRY *head) { head->next = head; head->prev = head; head->data = NULL; head->tid = 0; } static inline int list_empty(LLIST_ENTRY *head) { return head->next == head; } static inline void *get_head_entry(LLIST_ENTRY *head) { if (list_empty(head)) return NULL; else return head->next->data; } static inline void *get_next_entry(LLIST_ENTRY *entry, LLIST_ENTRY *head) { if (entry->next == head) return NULL; else return entry->next->data; } static inline void insert_head(LLIST_ENTRY *entry, LLIST_ENTRY *head, void *data) { head->tid++; /* each insertion gets unique ID */ entry->tid = head->tid; entry->next = head->next; entry->prev = head; entry->data = data; head->next->prev = entry; head->next = entry; } static inline void insert_tail(LLIST_ENTRY *entry, LLIST_ENTRY *head, void *data) { if (entry->next != entry) { mlog(0, " WARNING: entry %p already on list %d\n", entry, entry->next); return; } head->tid++; /* each insertion gets unique ID */ entry->tid = head->tid; entry->data = data; entry->next = head->prev->next; entry->prev = head->prev; head->prev->next = entry; head->prev = entry; } static inline void remove_entry(LLIST_ENTRY *entry) { entry->prev->next = entry->next; entry->next->prev = entry->prev; entry->data = NULL; entry->tid = 0; } extern int mcm_affinity; static inline void sleep_usec(int usec) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = usec * 1000; nanosleep(&sleep, &remain); sched_yield(); } static inline uint32_t mcm_ts_us(void) { struct timeval curtime; timerclear(&curtime); gettimeofday(&curtime, NULL); return (uint32_t) (((curtime.tv_sec & 0xff) * 1000000) + curtime.tv_usec); } static inline uint64_t mcm_time_us(void) { struct timeval curtime; timerclear(&curtime); gettimeofday(&curtime, NULL); return (uint64_t) curtime.tv_sec * 1000000 + (uint64_t) curtime.tv_usec; } #define mcm_time_ms() (mcm_time_us() / 1000) static inline int pb_full(int start, int end, int head, int tail, int len, int size) { if (((start < tail) && (end >= tail)) || (((head - tail) < 0) && (ALIGN_64(head) + len) >= tail) || (((ALIGN_64(head) + len) > size) && start >= tail)) return 1; else return 0; } static inline void mcm_free_port(uint64_t *p_port, uint16_t port) { p_port[port] = 0; } /* Blocking for now, eliminates the need for MPXYD level locking */ static inline int scif_send_msg(scif_epd_t ep, void *msg, int snd_len) { int ret, len = snd_len; int off = 0; int flags = 0; /* !SCIF_SEND_BLOCK */ while (len) { errno = 0; if (len == snd_len) mlog(8, " scif_send - ep %d, msg %p len=%d \n", ep, msg+off, len); ret = scif_send(ep, msg+off, len, flags); if (len == snd_len) mlog(8, " scif_sent - ep %d, len=%d ret=%d %s\n", ep, len, ret, strerror(errno)); if ((ret == -1) || (flags == SCIF_SEND_BLOCK && (ret != len))) { mlog(0, "ERR: scif_send - ep %d, %s, (len %d != ret %d) msg(%p %p)\n", ep, strerror(errno), len, ret, msg, msg+off); return -1; } if ((ret < len) && ret) { mlog(1, " WARN: scif_send - ep %d, msg %p off %d blocked len=%d, sent=%d\n", ep, msg, off, len, ret); } off += ret; len -= ret; } return 0; } static inline void const_mix_wc(struct dat_mix_wc *mwc, struct ibv_wc *iwc, int entries) { int i; for (i=0;isg_list = sg_ptr; iwr->opcode = mwr->opcode; iwr->send_flags = mwr->send_flags; iwr->imm_data = mwr->imm_data; iwr->wr.rdma.remote_addr = mwr->wr.rdma.remote_addr; iwr->wr.rdma.rkey = mwr->wr.rdma.rkey; } /* rdma read, 4 sg entries */ /* sg[0] entry == proxy-out buffer, src for IB RR */ /* sg[1] entry == proxy-in buffer, dst for IB RR */ static inline void const_ib_rr(struct ibv_send_wr *iwr, struct dat_mix_wr *mwr, struct ibv_sge *sg) { memset((void*)iwr, 0, sizeof(*iwr)); iwr->num_sge = 1; iwr->sg_list = &sg[1]; iwr->opcode = IBV_WR_RDMA_READ; iwr->send_flags = 0; iwr->imm_data = 0; iwr->wr.rdma.remote_addr = sg[0].addr; iwr->wr.rdma.rkey = sg[0].lkey; } static inline void mcm_pr_addrs(int lvl, struct dat_mcm_msg *msg, int state, int in) { if (in) { if (MXS_EP(&msg->daddr1) && MXS_EP(&msg->saddr1)) { mlog(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s <- QPt_r addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map)); } else { mlog(lvl, " QPr addr1: %s 0x%x %x 0x%x %s <- QPt addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->daddr1.lid), htonl(msg->daddr1.qpn), htons(msg->dport), mcm_map_str(msg->daddr1.ep_map), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map)); mlog(lvl, " QPt addr2: %s 0x%x %x 0x%x %s <- QPr addr1: 0x%x %x 0x%x %s\n", mcm_state_str(state),htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map), htons(msg->saddr1.lid), htonl(msg->saddr1.qpn), htons(msg->sport), mcm_map_str(msg->saddr1.ep_map)); } } else { if (MXS_EP(&msg->saddr1) && MXS_EP(&msg->daddr1)) { mlog(lvl, " QPr_t addr2: %s 0x%x %x 0x%x %s -> QPt_r addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map)); } else { mlog(lvl, " QPr addr1: %s 0x%x %x 0x%x %s -> QPt addr2: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr1.lid), htonl(msg->saddr1.qpn), htons(msg->sport), mcm_map_str(msg->saddr1.ep_map), htons(msg->daddr2.lid), htonl(msg->daddr2.qpn), htons(msg->dport), mcm_map_str(msg->daddr2.ep_map)); mlog(lvl, " QPt addr2: %s 0x%x %x 0x%x %s -> QPr addr1: 0x%x %x 0x%x %s\n", mcm_state_str(state), htons(msg->saddr2.lid), htonl(msg->saddr2.qpn), htons(msg->sport), mcm_map_str(msg->saddr2.ep_map), htons(msg->daddr1.lid), htonl(msg->daddr1.qpn), htons(msg->dport), mcm_map_str(msg->daddr1.ep_map)); } } } static inline int mcm_ib_inline_data (IN struct ibv_context *ib_ctx) { struct ibv_qp_init_attr qp_create; struct ibv_pd *ib_pd = NULL; struct ibv_cq *ib_cq = NULL; struct ibv_qp *ib_qp = NULL; int ret = 0; ib_pd = ibv_alloc_pd(ib_ctx); if (!ib_pd) goto bail; ib_cq = ibv_create_cq(ib_ctx, 10, ib_ctx, NULL, 0); if (!ib_cq) goto bail; memset((void *)&qp_create, 0, sizeof(qp_create)); qp_create.qp_type = IBV_QPT_RC; qp_create.send_cq = ib_cq; qp_create.recv_cq = ib_cq; qp_create.cap.max_send_wr = 1; qp_create.cap.max_send_sge = 1; qp_create.cap.max_inline_data = MCM_IB_INLINE; qp_create.qp_context = (void *)ib_ctx; ib_qp = ibv_create_qp(ib_pd, &qp_create); if (ib_qp && qp_create.cap.max_inline_data >= MCM_IB_INLINE) ret = 1; bail: if (ib_qp) ibv_destroy_qp(ib_qp); if (ib_cq) ibv_destroy_cq(ib_cq); if (ib_pd) ibv_dealloc_pd(ib_pd); return ret; } #endif /* _MPXYD_H_ */ dapl-2.1.5/dapl/svc/util.c000066400000000000000000000465151255317474200153200ustar00rootroot00000000000000/* * Copyright (c) 2012-2014 Intel Corporation. All rights reserved. * * This software is available to you under the OpenIB.org BSD license * below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* * mpxyd service - util.c * * helper functions * */ #include "mpxyd.h" /* * Service options - set through mpxyd.conf file. */ char *opts_file = MPXYD_CONF; char log_file[128] = "/tmp/mpxyd.log"; int log_level = 0; char lock_file[128] = "/var/run/mpxyd.pid"; char gid_str[INET6_ADDRSTRLEN]; int mcm_profile = 0; FILE *logfile; mpxy_lock_t flock; /* mcm.c */ extern int mcm_depth; extern int mcm_size; extern int mcm_signal; extern int mcm_max_rcv; extern int mcm_retry; extern int mcm_disc_retry; extern int mcm_rep_ms; extern int mcm_rtu_ms; extern int mcm_dreq_ms; extern int mcm_proxy_in; /* mix.c */ extern int mix_align; extern int mix_buffer_sg_cnt; extern int mix_cmd_depth; extern int mix_cmd_size; extern int mix_shared_buffer; extern int mix_max_msg_mb; extern int mix_inline_threshold; extern int mix_eager_completion; extern int mcm_ib_inline; extern int mcm_rw_signal; extern int mcm_rr_signal; extern int mcm_rr_max; extern int mcm_wr_max; extern int mcm_wc_max; extern int mcm_tx_entries; extern int mcm_rx_entries; extern int mcm_rx_cq_size; /* mpxyd.c */ extern short scif_sport; extern int scif_listen_qlen; extern int mix_buffer_mb; extern int mix_buffer_sg; extern int mix_buffer_sg_po2; extern int mcm_affinity; extern int mcm_affinity_base_mic; extern int mcm_affinity_base_hca; extern int mcm_op_poll; extern int mcm_counters; /* Counters */ static char *mcm_cntr_names[] = { "MCM_IA_OPEN", "MCM_IA_CLOSE", "MCM_PD_CREATE", "MCM_PD_FREE", "MCM_MR_CREATE", "MCM_MR_FREE", "MCM_CQ_CREATE", "MCM_CQ_FREE", "MCM_CQ_POLL", "MCM_CQ_REARM", "MCM_CQ_EVENT", "MCM_MX_SEND", "MCM_MX_SEND_INLINE", "MCM_MX_WRITE", "MCM_MX_WRITE_SEG", "MCM_MX_WRITE_INLINE", "MCM_MX_WR_STALL", "MCM_MX_MR_STALL", "MCM_MX_RR_STALL", "MCM_QP_CREATE", "MCM_QP_SEND", "MCM_QP_SEND_INLINE", "MCM_QP_WRITE", "MCM_QP_WRITE_INLINE", "MCM_QP_WRITE_DONE", "MCM_QP_READ", "MCM_QP_READ_DONE", "MCM_QP_RECV", "MCM_QP_FREE", "MCM_QP_EVENT", "MCM_SRQ_CREATE", "MCM_SRQ_FREE", "MCM_MEM_ALLOC", "MCM_MEM_ALLOC_DATA", "MCM_MEM_FREE", "MCM_ASYNC_ERROR", "MCM_ASYNC_QP_ERROR", "MCM_ASYNC_CQ_ERROR", "MCM_SCIF_SEND", "MCM_SCIF_RECV", "MCM_SCIF_READ_FROM", "MCM_SCIF_READ_FROM_DONE", "MCM_SCIF_WRITE_TO", "MCM_SCIF_WRITE_TO_DONE", "MCM_SCIF_SIGNAL", "MCM_LISTEN_CREATE", "MCM_LISTEN_CREATE_ANY", "MCM_LISTEN_FREE", "MCM_CM_CONN_EVENT", "MCM_CM_DISC_EVENT", "MCM_CM_TIMEOUT_EVENT", "MCM_CM_ERR_EVENT", "MCM_CM_TX_POLL", "MCM_CM_RX_POLL", "MCM_CM_MSG_OUT", "MCM_CM_MSG_IN", "MCM_CM_MSG_POST", "MCM_CM_REQ_OUT", "MCM_CM_REQ_IN", "MCM_CM_REQ_ACCEPT", "MCM_CM_REP_OUT", "MCM_CM_REP_IN", "MCM_CM_RTU_OUT", "MCM_CM_RTU_IN", "MCM_CM_REJ_OUT", "MCM_CM_REJ_IN", "MCM_CM_REJ_USER_OUT", "MCM_CM_REJ_USER_IN", "MCM_CM_ACTIVE_EST", "MCM_CM_PASSIVE_EST", "MCM_CM_AH_REQ_OUT", "MCM_CM_AH_REQ_IN", "MCM_CM_AH_RESOLVED", "MCM_CM_DREQ_OUT", "MCM_CM_DREQ_IN", "MCM_CM_DREQ_DUP", "MCM_CM_DREP_OUT", "MCM_CM_DREP_IN", "MCM_CM_MRA_OUT", "MCM_CM_MRA_IN", "MCM_CM_REQ_FULLQ_POLL", "MCM_CM_ERR", "MCM_CM_ERR_REQ_FULLQ", "MCM_CM_ERR_REQ_DUP", "MCM_CM_ERR_REQ_RETRY", "MCM_CM_ERR_REP_DUP", "MCM_CM_ERR_REP_RETRY", "MCM_CM_ERR_RTU_DUP", "MCM_CM_ERR_RTU_RETRY", "MCM_CM_ERR_REFUSED", "MCM_CM_ERR_RESET", "MCM_CM_ERR_TIMEOUT", "MCM_CM_ERR_REJ_TX", "MCM_CM_ERR_REJ_RX", "MCM_CM_ERR_DREQ_DUP", "MCM_CM_ERR_DREQ_RETRY", "MCM_CM_ERR_DREP_DUP", "MCM_CM_ERR_DREP_RETRY", "MCM_CM_ERR_MRA_DUP", "MCM_CM_ERR_MRA_RETRY", "MCM_CM_ERR_UNEXPECTED_STATE", "MCM_CM_ERR_UNEXPECTED_MSG", }; void mpxy_write(int level, const char *format, ...) { va_list args; uint32_t ts; if (level && !(level & log_level)) return; ts = mcm_ts_us(); va_start(args, format); mpxy_lock(&flock); fprintf(logfile, " %x:%u: ", (unsigned)pthread_self(), ts); vfprintf(logfile, format, args); fflush(logfile); mpxy_unlock(&flock); va_end(args); } void md_cntr_log(mcm_ib_dev_t *md, int counter, int reset) { int i; mlog(0, "MPXYD Device Counters:\n"); for (i = 0; i < MCM_ALL_COUNTERS; i++) { if ((counter == i) || (counter == MCM_ALL_COUNTERS)) { if (((uint64_t *)md->cntrs)[i]) { mlog(0, "%s = %llu\n", mcm_cntr_names[i], ((uint64_t *)md->cntrs)[i]); if (reset) ((uint64_t *)md->cntrs)[i] = 0; } } } mlog(0, "return:\n"); } /* FD and thread helper resources */ struct mcm_fd_set *mcm_alloc_fd_set(void) { return malloc(sizeof(struct mcm_fd_set)); } void mcm_fd_zero(struct mcm_fd_set *set) { set->index = 0; } int mcm_fd_set(int fd, struct mcm_fd_set *set, int event) { if (set->index == MCM_FD_SETSIZE - 1) { mlog(0," mcm exceeded FD_SETSIZE %d\n", MCM_FD_SETSIZE); return -1; } set->set[set->index].fd = fd; set->set[set->index].revents = 0; set->set[set->index++].events = event; return 0; } int mcm_config_fd(int fd) { int opts; opts = fcntl(fd, F_GETFL); if (opts < 0 || fcntl(fd, F_SETFL, opts | O_NONBLOCK) < 0) { mlog(0, " config_fd: fcntl on fd %d ERR %d %s\n", fd, opts, strerror(errno)); return errno; } return 0; } int mcm_poll(int fd, int event) { struct pollfd fds; int ret; fds.fd = fd; fds.events = event; fds.revents = 0; ret = poll(&fds, 1, 0); if (ret == 0) return 0; else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) return POLLERR; else return fds.revents; } int mcm_select(struct mcm_fd_set *set, int time_ms) { int ret, i; if (time_ms != -1) sched_yield(); mlog(0x20, " sleep, fds=%d\n", set->index); ret = poll(set->set, set->index, time_ms); if (ret > 0) { for (i=0;iindex;i++) { mlog(0x20, " wakeup, set[%d].fd %d = %d\n", i, set->set[i].fd, set->set[i].revents); } } return ret; } /* MCM 16-bit port space */ uint16_t mcm_get_port(uint64_t *p_port, uint16_t port, uint64_t ctx) { int i = 0; /* get specific port */ if (port) { if (p_port[port] == 0) { p_port[port] = ctx; i = port; } goto done; } /* get first free port */ for (i = MCM_PORT_SPACE; i > 0; i--) { if (p_port[i] == 0) { p_port[i] = ctx; break; } } done: return i; } uint64_t mcm_get_port_ctx(uint64_t *p_port, uint16_t port) { return p_port[port]; } FILE *mpxy_open_log(void) { FILE *f; if (!strcasecmp(log_file, "stdout")) return stdout; if (!strcasecmp(log_file, "stderr")) return stderr; if (!(f = fopen(log_file, "w"))) f = stdout; return f; } void mpxy_set_options( int debug_mode ) { FILE *f; char s[120]; char opt[32], value[128]; if (!(f = fopen(opts_file, "r"))) return; while (fgets(s, sizeof s, f)) { if (s[0] == '#') continue; if (sscanf(s, "%32s%128s", opt, value) != 2) continue; if (!strcasecmp("log_file", opt)) strcpy(log_file, value); else if (!strcasecmp("log_level", opt)) log_level = strtol(value,NULL,0); else if (!strcasecmp("lock_file", opt)) strcpy(lock_file, value); else if (!strcasecmp("max_message_mb", opt)) mix_max_msg_mb = atoi(value); else if (!strcasecmp("buffer_pool_mb", opt)) mix_buffer_mb = atoi(value); else if (!strcasecmp("buffer_segment_size", opt)) { int i = 0, ssize = atoi(value); /* power of 2 */ mix_buffer_sg = 1; while ((mix_buffer_sg < ssize) && (mix_buffer_sg < DAT_MIX_RDMA_MAX)) { mix_buffer_sg <<= 1; i++; } mix_buffer_sg_po2 = i; } else if (!strcasecmp("buffer_alignment", opt)) mix_align = atoi(value); else if (!strcasecmp("buffer_inline_threshold", opt)) { mix_inline_threshold = atoi(value); if (mix_inline_threshold > DAT_MIX_INLINE_MAX) mix_inline_threshold = DAT_MIX_INLINE_MAX; } else if (!strcasecmp("mcm_depth", opt)) mcm_depth = atoi(value); else if (!strcasecmp("scif_port_id", opt)) scif_sport = (short) atoi(value); else if (!strcasecmp("scif_listen_qlen", opt)) scif_listen_qlen = atoi(value); else if (!strcasecmp("mcm_rr_signal_rate", opt)) mcm_rr_signal = atoi(value); else if (!strcasecmp("mcm_rw_signal_rate", opt)) mcm_rw_signal = atoi(value); else if (!strcasecmp("mcm_rr_max_pending", opt)) mcm_rr_max = atoi(value); else if (!strcasecmp("mcm_wr_max", opt)) mcm_wr_max = atoi(value); else if (!strcasecmp("mcm_wc_max", opt)) mcm_wc_max = atoi(value); else if (!strcasecmp("mcm_req_timeout_ms", opt)) mcm_rep_ms = atoi(value); else if (!strcasecmp("mcm_rep_timeout_ms", opt)) mcm_rtu_ms = atoi(value); else if (!strcasecmp("mcm_retry_count", opt)) mcm_retry = atoi(value); else if (!strcasecmp("mcm_affinity", opt)) { mcm_affinity = atoi(value); if (mcm_affinity == 2) mcm_op_poll = 1; } else if (!strcasecmp("mcm_affinity_base_hca", opt)) mcm_affinity_base_hca = atoi(value); else if (!strcasecmp("mcm_affinity_base_mic", opt)) mcm_affinity_base_mic = atoi(value); else if (!strcasecmp("mcm_ib_inline", opt)) mcm_ib_inline = atoi(value); if (mcm_ib_inline) mcm_ib_inline = max(atoi(value), MCM_IB_INLINE); else if (!strcasecmp("mcm_perf_profile", opt)) mcm_profile = atoi(value); else if (!strcasecmp("mcm_eager_completion", opt)) mix_eager_completion = atoi(value); else if (!strcasecmp("mcm_counters", opt)) mcm_counters = atoi(value); else if (!strcasecmp("mcm_proxy_in", opt)) mcm_proxy_in = atoi(value); else if (!strcasecmp("mcm_op_poll", opt)) mcm_op_poll = atoi(value); else if (!strcasecmp("proxy_tx_depth", opt)) { int tsize = atoi(value); /* power of 2 */ mcm_tx_entries = 1; while (mcm_tx_entries < tsize) mcm_tx_entries <<= 1; } else if (!strcasecmp("proxy_rx_depth", opt)) { int rsize = atoi(value); /* power of 2 */ mcm_rx_entries = 1; while (mcm_rx_entries < rsize) mcm_rx_entries <<= 1; } } fclose(f); if (debug_mode) { sprintf(log_file, "/tmp/mpxyd.log.pid.%d", getuid()); sprintf(lock_file, "/tmp/mpxyd.pid.%d", getuid()); } } void mpxy_log_options(void) { mlog(0, "log level 0x%x\n", log_level); mlog(0, "lock file %s\n", lock_file); mlog(0, "configuration file %s\n", opts_file); mlog(0, "SCIF server_port %d%s\n", scif_sport, scif_sport?"":"(auto)"); mlog(0, "SCIF listen queue length %d\n", scif_listen_qlen); mlog(0, "CPU affinity enabled %d\n", mcm_affinity); mlog(0, "CPU affinity base core_id for MICs %d\n", mcm_affinity_base_mic); mlog(0, "OP thread polling %s\n", mcm_op_poll ? "enabled":"disabled"); mlog(0, "RDMA buffer pool size %d MB\n", mix_buffer_mb); mlog(0, "RDMA buffer segment size %d\n", mix_buffer_sg); mlog(0, "RDMA buffer alignment %d\n", mix_align); mlog(0, "RDMA Proxy TX queue depth %d\n", mcm_tx_entries); mlog(0, "RDMA Proxy RX queue depth %d\n", mcm_rx_entries); mlog(0, "RDMA SCIF inline threshold %d\n", mix_inline_threshold); mlog(0, "RDMA IB inline threshold %d\n", mcm_ib_inline); mlog(0, "RDMA eager completion %d\n", mix_eager_completion); mlog(0, "RDMA proxy-out signal rate %d\n", mcm_rw_signal); mlog(0, "RDMA proxy-out/in max WR processing %d\n", mcm_wr_max); mlog(0, "RDMA proxy-out/in max WC processing %d\n", mcm_wc_max); mlog(0, "RDMA proxy-in %s\n", mcm_proxy_in ? "enabled":"disabled"); if (mcm_proxy_in) { mlog(0, "RDMA proxy-in signal rate %d\n", mcm_rr_signal); mlog(0, "RDMA proxy-in max reads outstanding %d\n", mcm_rr_max); } mlog(0, "Maximum message size %d MB\n", mix_max_msg_mb); mlog(0, "CM msg queue depth %d\n", mcm_depth); mlog(0, "CM msg completion signal rate %d\n", mcm_signal); mlog(0, "CM msg reply timeout %d ms\n", mcm_rep_ms); mlog(0, "CM msg rtu timeout %d ms\n", mcm_rtu_ms); mlog(0, "CM msg retry count %d\n", mcm_retry); mlog(0, "Performance Profiling == %d\n", mcm_profile); mlog(0, "MPXYD log device counters (print at close) == %d\n", mcm_counters); } int lock_fd; int mpxy_open_lock_file(void) { int rc; char pid[16]; lock_fd = open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0640); if (lock_fd < 0) { perror(lock_file); return lock_fd; } if (lockf(lock_fd, F_TLOCK, 0)) { perror(lock_file); close(lock_fd); return -1; } rc = sprintf(pid, "%d", getpid()); if (write(lock_fd, pid, strlen(pid)) != rc) { perror(lock_file); return -1; } return 0; } void mpxyd_release_lock_file( void ) { lockf(lock_fd, F_ULOCK, 0); close(lock_fd); unlink(lock_file); } int rd_dev_file(char *path, char *file, char *v_str, int len) { char *f_path; int fd; if (asprintf(&f_path, "%s/%s", path, file) < 0) return -1; fd = open(f_path, O_RDONLY); if (fd < 0) { free(f_path); return -1; } len = read(fd, v_str, len); if ((len > 0) && (v_str[--len] == '\n')) v_str[len] = '\0'; close(fd); free(f_path); return 0; } int mpxy_cpuinfo_atoi(const char *v_str) { char r_buf[500]; char *f_path = "/proc/cpuinfo"; char *token = ":"; int i, ii, fd, len, v_len, r_len; int val = 0; fd = open(f_path, O_RDONLY); if (fd < 0) return val; v_len = strlen(v_str); r_len = sizeof(r_buf) - 1; len = read(fd, r_buf, r_len); if (len < 1) return val; /* get value pattern followed by : followed by value */ for (i=0; i < len; i++) { for (ii=0; ii < v_len && i < len; ii++, i++) { if ((v_str[ii] == r_buf[i]) && (ii == v_len-1)) for (; i < len; i++) { if (!strncmp(&r_buf[i], token, 1)) { val = atoi(&r_buf[i+1]); i = len; } } else if (v_str[ii] != r_buf[i]) break; } } close(fd); return val; } #ifdef MCM_PROFILE void mcm_qp_prof_pr(struct mcm_qp *m_qp, int type) { if ((m_qp->ts.wt.min) && (type == MCM_QP_WT || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF scif_WT() times (usecs):" " max %u min %u avg %u ttime %u cnt %u - et %u avg %u\n", m_qp, m_qp->ts.wt.max, m_qp->ts.wt.min, m_qp->ts.wt.avg, m_qp->ts.wt.all, m_qp->ts.wt.cnt, m_qp->ts.wt.stop - m_qp->ts.wt.start, (m_qp->ts.wt.stop - m_qp->ts.wt.start)/m_qp->ts.wt.cnt); if ((m_qp->ts.rf.min) && (type == MCM_QP_RF || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF scif_RF() times (usecs):" " max %u min %u avg %u ttime %u cnt %u - et %u avg %u\n", m_qp, m_qp->ts.rf.max, m_qp->ts.rf.min, m_qp->ts.rf.avg, m_qp->ts.rf.all, m_qp->ts.rf.cnt, m_qp->ts.rf.stop - m_qp->ts.rf.start, (m_qp->ts.rf.stop - m_qp->ts.rf.start)/m_qp->ts.rf.cnt); if ((m_qp->ts.rw.min) && (type == MCM_QP_IB_RW || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF %s times (usecs):" " max %u min %u avg %u ttime %u cnt %u - et %u avg %u\n", m_qp, "ib_RW or RW_imm+RR", m_qp->ts.rw.max, m_qp->ts.rw.min, m_qp->ts.rw.avg, m_qp->ts.rw.all, m_qp->ts.rw.cnt, m_qp->ts.rw.stop - m_qp->ts.rw.start, (m_qp->ts.rw.stop - m_qp->ts.rw.start)/m_qp->ts.rw.cnt); if ((m_qp->ts.rr.min) && (type == MCM_QP_IB_RR || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF ib_RR() times (usecs):" " max %u min %u avg %u ttime %u cnt %u - et %u avg %u\n", m_qp, m_qp->ts.rr.max, m_qp->ts.rr.min, m_qp->ts.rr.avg, m_qp->ts.rr.all, m_qp->ts.rr.cnt, m_qp->ts.rr.stop - m_qp->ts.rr.start, (m_qp->ts.rr.stop - m_qp->ts.rr.start)/m_qp->ts.rr.cnt); if ((m_qp->ts.ps.min) && (type == MCM_QP_PO_POST || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF send_post() times:" " (usecs): max %u min %u avg %u ttime %u cnt %u - et %u avg %u\n", m_qp, m_qp->ts.ps.max, m_qp->ts.ps.min, m_qp->ts.ps.avg, m_qp->ts.ps.all, m_qp->ts.ps.cnt, m_qp->ts.ps.stop - m_qp->ts.ps.start, (m_qp->ts.ps.stop - m_qp->ts.ps.start)/m_qp->ts.ps.cnt); if ((m_qp->ts.po.min) && (type == MCM_QP_PO_PI_RW || type == MCM_QP_ALL)) mlog(0, " QP (%p) PERF IO: Proxy-out -> Proxy-in: FS to LS times" " (usecs): max %u min %u avg %u ttime %u cnt %u et %u\n", m_qp, m_qp->ts.po.max, m_qp->ts.po.min, m_qp->ts.po.avg, m_qp->ts.po.all, m_qp->ts.po.cnt, m_qp->ts.po.stop - m_qp->ts.po.start, (m_qp->ts.po.stop - m_qp->ts.po.start)/m_qp->ts.po.cnt); } void mcm_qp_prof_ts(struct mcm_qp *m_qp, int type, uint32_t start, uint32_t que, uint32_t cmp) { uint32_t diff, stop = mcm_ts_us(); uint32_t *min, *max, *avg, *all, *cnt, *begin, *end, qcnt, ccnt; char *type_str; diff = stop - start; ccnt = cmp ? cmp:1; qcnt = que ? que:1; switch (type) { case MCM_QP_WT: type_str = "MCM_QP_WT"; min = &m_qp->ts.wt.min; max = &m_qp->ts.wt.max; avg = &m_qp->ts.wt.avg; all = &m_qp->ts.wt.all; cnt = &m_qp->ts.wt.cnt; begin = &m_qp->ts.wt.start; end = &m_qp->ts.wt.stop; diff = diff/qcnt; break; case MCM_QP_RF: type_str = "MCM_QP_RF"; min = &m_qp->ts.rf.min; max = &m_qp->ts.rf.max; avg = &m_qp->ts.rf.avg; all = &m_qp->ts.rf.all; cnt = &m_qp->ts.rf.cnt; begin = &m_qp->ts.rf.start; end = &m_qp->ts.rf.stop; diff = diff/qcnt; break; case MCM_QP_IB_RW: type_str = "MCM_QP_IB_RW"; min = &m_qp->ts.rw.min; max = &m_qp->ts.rw.max; avg = &m_qp->ts.rw.avg; all = &m_qp->ts.rw.all; cnt = &m_qp->ts.rw.cnt; begin = &m_qp->ts.rw.start; end = &m_qp->ts.rw.stop; diff = diff/qcnt; break; case MCM_QP_IB_RR: type_str = "MCM_QP_IB_RR"; min = &m_qp->ts.rr.min; max = &m_qp->ts.rr.max; avg = &m_qp->ts.rr.avg; all = &m_qp->ts.rr.all; cnt = &m_qp->ts.rr.cnt; begin = &m_qp->ts.rr.start; end = &m_qp->ts.rr.stop; diff = diff/qcnt; break; case MCM_QP_PO_POST: type_str = "MCM_QP_PO_POST"; min = &m_qp->ts.ps.min; max = &m_qp->ts.ps.max; avg = &m_qp->ts.ps.avg; all = &m_qp->ts.ps.all; cnt = &m_qp->ts.ps.cnt; begin = &m_qp->ts.ps.start; end = &m_qp->ts.ps.stop; break; case MCM_QP_PO_PI_RW: type_str = "MCM_QP_PO_PI_RW"; min = &m_qp->ts.po.min; max = &m_qp->ts.po.max; avg = &m_qp->ts.po.avg; all = &m_qp->ts.po.all; cnt = &m_qp->ts.po.cnt; begin = &m_qp->ts.po.start; end = &m_qp->ts.po.stop; break; default: return; } if (*cnt == 0) *begin = start; diff = diff/ccnt; *cnt += ccnt; *all += diff; *end = stop; if (*min == 0 || diff < *min) *min = diff; if (*max == 0 || diff > *max) *max = diff; if (*avg == 0) *avg = diff; else *avg = (*all / *cnt); if (log_level == 0x10) mlog(0x10, "us(%u-%u=%u,%d,%d) %s: io %d: mx %u mn %u av %u tt %u et %u " "TX tl %d hd %d RX tl %d w_tl %d hd %d rr %d wt %d\n", start, stop, diff, qcnt, ccnt, type_str, *cnt, *max, *min, *avg, *all, *end - *begin, m_qp->wr_tl, m_qp->wr_hd, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, m_qp->pi_rr_cnt, m_qp->post_cnt_wt); else if (log_level == 0x1 && !(*cnt % 100)) mlog(0x1, "us(%u-%u=%u,%d,%d) %s: io %d: mx %u mn %u av %u tt %u et %u " "TX tl %d hd %d RX tl %d w_tl %d hd %d rr %d wt %d\n", start, stop, diff, qcnt, ccnt, type_str, *cnt, *max, *min, *avg, *all, *end - *begin, m_qp->wr_tl, m_qp->wr_hd, m_qp->wr_tl_r, m_qp->wr_tl_r_wt, m_qp->wr_hd_r, m_qp->pi_rr_cnt, m_qp->post_cnt_wt); } #endif dapl-2.1.5/dapl/udapl/000077500000000000000000000000001255317474200144765ustar00rootroot00000000000000dapl-2.1.5/dapl/udapl/dapl_cno_create.c000066400000000000000000000052271255317474200177520ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_create.c * * PURPOSE: Consumer Notification Object creation * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.2.1 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_cno_util.h" #include "dapl_ia_util.h" /* * dapl_cno_create * * DAPL Requirements Version xxx, 6.3.4.1 * * Create a consumer notification object instance * * Input: * ia_handle * wait_agent * cno_handle * * Output: * cno_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cno_create(IN DAT_IA_HANDLE ia_handle, /* ia_handle */ IN DAT_OS_WAIT_PROXY_AGENT wait_agent, /* agent */ OUT DAT_CNO_HANDLE * cno_handle) { /* cno_handle */ DAPL_IA *ia_ptr; DAPL_CNO *cno_ptr; DAT_RETURN dat_status; ia_ptr = (DAPL_IA *) ia_handle; cno_ptr = NULL; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } cno_ptr = dapl_cno_alloc(ia_ptr, wait_agent); if (!cno_ptr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } cno_ptr->cno_state = DAPL_CNO_STATE_UNTRIGGERED; dapl_ia_link_cno(ia_ptr, cno_ptr); *cno_handle = cno_ptr; bail: if (dat_status != DAT_SUCCESS && cno_ptr != NULL) { dapl_cno_dealloc(cno_ptr); } return dat_status; } dapl-2.1.5/dapl/udapl/dapl_cno_free.c000066400000000000000000000045571255317474200174350ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_free.c * * PURPOSE: Consumer Notification Object destruction * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.2.2 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_ia_util.h" #include "dapl_cno_util.h" /* * dapl_cno_free * * DAPL Requirements Version xxx, 6.3.2.2 * * Destroy a consumer notification object instance * * Input: * cno_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_cno_free(IN DAT_CNO_HANDLE cno_handle) { /* cno_handle */ DAPL_CNO *cno_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; cno_ptr = (DAPL_CNO *) cno_handle; if (DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); goto bail; } if (dapl_os_atomic_read(&cno_ptr->cno_ref_count) != 0 || cno_ptr->cno_waiters != 0) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_CNO_IN_USE); goto bail; } dapl_ia_unlink_cno(cno_ptr->header.owner_ia, cno_ptr); dapl_cno_dealloc(cno_ptr); bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_cno_modify_agent.c000066400000000000000000000044111255317474200211460ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_modify_agent.c * * PURPOSE: Modify the wait proxy agent associted with the CNO * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.2.4 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_cno_modify_agent * * DAPL Requirements Version xxx, 6.3.2.4 * * Modify the wait proxy agent associted with the CNO * * Input: * cno_handle * prx_agent * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cno_modify_agent(IN DAT_CNO_HANDLE cno_handle, /* cno_handle */ IN DAT_OS_WAIT_PROXY_AGENT prx_agent) { /* agent */ DAPL_CNO *cno_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); goto bail; } cno_ptr = (DAPL_CNO *) cno_handle; dapl_os_lock(&cno_ptr->header.lock); cno_ptr->cno_wait_agent = prx_agent; dapl_os_unlock(&cno_ptr->header.lock); bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_cno_query.c000066400000000000000000000053571255317474200176600ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_query.c * * PURPOSE: Return the consumer parameters of the CNO * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.2.5 * * $Id: dapl_cno_query.c 1301 2005-03-24 05:58:55Z jlentini $ **********************************************************************/ #include "dapl.h" /* * dapl_cno_query * * DAPL Requirements Version xxx, 6.3.2.5 * * Return the consumer parameters of the CNO * * Input: * cno_handle * cno_param_mask * cno_param * * Output: * cno_param * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cno_query(IN DAT_CNO_HANDLE cno_handle, /* cno_handle */ IN DAT_CNO_PARAM_MASK cno_param_mask, /* cno_param_mask */ OUT DAT_CNO_PARAM * cno_param) { /* cno_param */ DAPL_CNO *cno_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); goto bail; } if (NULL == cno_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } cno_ptr = (DAPL_CNO *) cno_handle; cno_param->proxy_type = DAT_PROXY_TYPE_AGENT; cno_param->proxy.agent = cno_ptr->cno_wait_agent; dats_get_ia_handle(cno_ptr->header.owner_ia, &cno_param->ia_handle); bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_cno_wait.c000066400000000000000000000075041255317474200174530ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_cno_wait.c * * PURPOSE: Wait for a consumer notification event * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.2.3 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_cno_wait * * DAPL Requirements Version xxx, 6.3.2.3 * * Wait for a consumer notification event * * Input: * cno_handle * timeout * evd_handle * * Output: * evd_handle * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_QUEUE_EMPTY * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_cno_wait(IN DAT_CNO_HANDLE cno_handle, /* cno_handle */ IN DAT_TIMEOUT timeout, /* agent */ OUT DAT_EVD_HANDLE * evd_handle) { /* ia_handle */ DAPL_CNO *cno_ptr; DAT_RETURN dat_status; if (DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_INVALID_HANDLE | DAT_INVALID_HANDLE_CNO; goto bail; } dat_status = DAT_SUCCESS; cno_ptr = (DAPL_CNO *) cno_handle; if (cno_ptr->cno_state == DAPL_CNO_STATE_DEAD) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_CNO_DEAD); goto bail; } dapl_os_lock(&cno_ptr->header.lock); if (cno_ptr->cno_state == DAPL_CNO_STATE_TRIGGERED) { cno_ptr->cno_state = DAPL_CNO_STATE_UNTRIGGERED; *evd_handle = cno_ptr->cno_evd_triggered; cno_ptr->cno_evd_triggered = NULL; dapl_os_unlock(&cno_ptr->header.lock); goto bail; } while (cno_ptr->cno_state == DAPL_CNO_STATE_UNTRIGGERED && DAT_GET_TYPE(dat_status) != DAT_TIMEOUT_EXPIRED) { cno_ptr->cno_waiters++; dapl_os_unlock(&cno_ptr->header.lock); dat_status = dapl_os_wait_object_wait(&cno_ptr->cno_wait_object, timeout); dapl_os_lock(&cno_ptr->header.lock); cno_ptr->cno_waiters--; } if (cno_ptr->cno_state == DAPL_CNO_STATE_DEAD) { dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_CNO_DEAD); } else if (dat_status == DAT_SUCCESS) { /* * After the first triggering, this will be a valid handle. * If we're racing with wakeups of other CNO waiters, * that's ok. */ dapl_os_assert(cno_ptr->cno_state == DAPL_CNO_STATE_TRIGGERED); cno_ptr->cno_state = DAPL_CNO_STATE_UNTRIGGERED; *evd_handle = cno_ptr->cno_evd_triggered; cno_ptr->cno_evd_triggered = NULL; } else if (DAT_GET_TYPE(dat_status) == DAT_TIMEOUT_EXPIRED) { cno_ptr->cno_state = DAPL_CNO_STATE_UNTRIGGERED; *evd_handle = NULL; dat_status = DAT_QUEUE_EMPTY; } else { /* * The only other reason we could have made it out of * the loop is an interrupted system call. */ dapl_os_assert(DAT_GET_TYPE(dat_status) == DAT_INTERRUPTED_CALL); } dapl_os_unlock(&cno_ptr->header.lock); bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_clear_unwaitable.c000066400000000000000000000042041255317474200220010ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_clear_unwaitable.c * * PURPOSE: EVENT management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.4.8 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_evd_clear_unwaitable * * DAPL Requirements Version 1.1, 6.3.4.8 * * Transition the Event Dispatcher into a waitable state * * Input: * evd_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_evd_clear_unwaitable(IN DAT_EVD_HANDLE evd_handle) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } dapl_os_lock(&evd_ptr->header.lock); evd_ptr->evd_waitable = DAT_TRUE; dapl_os_unlock(&evd_ptr->header.lock); dat_status = DAT_SUCCESS; bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_create.c000066400000000000000000000113231255317474200177430ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_create.c * * PURPOSE: EVENT management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" /* * dapl_evd_create * * DAPL Requirements Version xxx, 6.3.2.1 * * Create and instance of Event Dispatcher. * * Input: * ia_handle * cno_handle * evd_min_qlen * evd_flags * * Output: * evd_handle * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER */ /* ** REVISIT ** * * Selecting the cqe handing domain must still be done. * We *probably* want one per hca, but we could have one * per provider or one per consumer. */ /* Note that if there already is a cq, it is not deleted * even if it is not required. However, it will not be armed. */ DAT_RETURN DAT_API dapl_evd_create(IN DAT_IA_HANDLE ia_handle, IN DAT_COUNT evd_min_qlen, IN DAT_CNO_HANDLE cno_handle, IN DAT_EVD_FLAGS evd_flags, OUT DAT_EVD_HANDLE * evd_handle) { DAPL_IA *ia_ptr; DAPL_EVD *evd_ptr; DAPL_CNO *cno_ptr; DAT_RETURN dat_status; DAT_PROVIDER_ATTR provider_attr; int i; int j; int flag_mask[6]; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_evd_create (%p, %d, %p, 0x%x, %p)\n", ia_handle, evd_min_qlen, cno_handle, evd_flags, evd_handle); ia_ptr = (DAPL_IA *) ia_handle; cno_ptr = (DAPL_CNO *) cno_handle; evd_ptr = NULL; *evd_handle = NULL; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } DAPL_CNTR(ia_ptr, DCNT_IA_EVD_CREATE); if (evd_min_qlen <= 0) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); goto bail; } if (evd_min_qlen > ia_ptr->hca_ptr->ia_attr.max_evd_qlen) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_TEVD); goto bail; } if (cno_handle != DAT_HANDLE_NULL && DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); goto bail; } /* * Check the merging attributes to ensure the combination of * flags requested is supported. */ dapl_ia_query(ia_handle, NULL, 0, NULL, DAT_PROVIDER_FIELD_ALL, &provider_attr); /* Set up an array of flags to compare against; the EVD bits are * a sparse array that need to be mapped to the merging flags */ flag_mask[0] = DAT_EVD_SOFTWARE_FLAG; flag_mask[1] = DAT_EVD_CR_FLAG; flag_mask[2] = DAT_EVD_DTO_FLAG; flag_mask[3] = DAT_EVD_CONNECTION_FLAG; flag_mask[4] = DAT_EVD_RMR_BIND_FLAG; flag_mask[5] = DAT_EVD_ASYNC_FLAG; for (i = 0; i < 6; i++) { if (flag_mask[i] & evd_flags) { for (j = 0; j < 6; j++) { if (flag_mask[j] & evd_flags) { if (provider_attr. evd_stream_merging_supported[i][j] == DAT_FALSE) { dat_status = DAT_ERROR (DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } } } /* end for j */ } } /* end for i */ dat_status = dapls_evd_internal_create(ia_ptr, cno_ptr, evd_min_qlen, evd_flags, &evd_ptr); if (dat_status != DAT_SUCCESS) { goto bail; } evd_ptr->evd_state = DAPL_EVD_STATE_OPEN; *evd_handle = (DAT_EVD_HANDLE) evd_ptr; bail: if (dat_status != DAT_SUCCESS) { if (evd_ptr) { dapl_evd_free(evd_ptr); } } dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_evd_create () returns 0x%x\n", dat_status); return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_disable.c000066400000000000000000000040231255317474200201020ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_disable.c * * PURPOSE: EVENT management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_evd_disable * * DAPL Requirements Version xxx, 6.3.2.5 * * Modify the size of the event queue of an Event Dispatcher * * Input: * evd_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_evd_disable(IN DAT_EVD_HANDLE evd_handle) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } evd_ptr->evd_enabled = DAT_FALSE; bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_enable.c000066400000000000000000000046561255317474200177410ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_enable.c * * PURPOSE: EVENT management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_evd_enable * * DAPL Requirements Version xxx, 6.3.2.5 * * Modify the size of the event queue of an Event Dispatcher * * Input: * evd_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_evd_enable(IN DAT_EVD_HANDLE evd_handle) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } evd_ptr->evd_enabled = DAT_TRUE; /* We need to enable the callback handler if there is a CNO. */ if (evd_ptr->cno_ptr != NULL && evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { dat_status = dapls_ib_completion_notify(evd_ptr->header.owner_ia-> hca_ptr->ib_hca_handle, evd_ptr, IB_NOTIFY_ON_NEXT_COMP); /* FIXME report error */ dapl_os_assert(dat_status == DAT_SUCCESS); } bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_modify_cno.c000066400000000000000000000057501255317474200206350ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_modify_cno.c * * PURPOSE: Event Management * * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_evd_modify_cno * * DAPL Requirements Version xxx, 6.3.2.4 * * Modify the CNO associated with the EVD * * Input: * evd_handle * cno_handle * * Output: * none * * Returns: * DAT_SUCCSSS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_evd_modify_cno(IN DAT_EVD_HANDLE evd_handle, IN DAT_CNO_HANDLE cno_handle) { DAPL_EVD *evd_ptr; DAPL_CNO *cno_ptr; DAPL_CNO *old_cno_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; cno_ptr = (DAPL_CNO *) cno_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } if (cno_handle != NULL && DAPL_BAD_HANDLE(cno_handle, DAPL_MAGIC_CNO)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); goto bail; } dapl_os_lock(&evd_ptr->header.lock); old_cno_ptr = evd_ptr->cno_ptr; evd_ptr->cno_ptr = cno_ptr; dapl_os_unlock(&evd_ptr->header.lock); if (cno_ptr) { dapl_os_atomic_inc(&(cno_ptr->cno_ref_count)); } if (old_cno_ptr) { dapl_os_atomic_dec(&(old_cno_ptr->cno_ref_count)); } /* We need to enable the callback handler if the EVD is enabled. */ if (evd_ptr->evd_enabled && cno_handle != DAT_HANDLE_NULL && evd_ptr->ib_cq_handle != IB_INVALID_HANDLE) { dat_status = dapls_ib_completion_notify(evd_ptr->header.owner_ia-> hca_ptr->ib_hca_handle, evd_ptr, IB_NOTIFY_ON_NEXT_COMP); /* FIXME report error */ dapl_os_assert(dat_status == DAT_SUCCESS); } bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_query.c000066400000000000000000000065131255317474200176520ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_query.c * * PURPOSE: Event management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3 * * $Id:$ **********************************************************************/ #include "dapl.h" /* * dapl_evd_query * * DAPL Requirements Version xxx, 6.3.2.3 * * Provides the consumer with arguments of the Event Dispatcher. * * Input: * evd_handle * evd_mask * * Output: * evd_param * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER */ DAT_RETURN DAT_API dapl_evd_query(IN DAT_EVD_HANDLE evd_handle, IN DAT_EVD_PARAM_MASK evd_param_mask, OUT DAT_EVD_PARAM * evd_param) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; if (NULL == evd_param) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } /* Note: the spec. allows for events to be directed to a NULL EVD */ /* with handle of type DAT_HANDLE_NULL. See 6.3.1 */ if (DAT_HANDLE_NULL == evd_handle) { dapl_os_memzero(evd_param, sizeof(DAT_EVD_PARAM)); } else { if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } evd_ptr = (DAPL_EVD *) evd_handle; /* * We may be racing against the thread safe modify * calls here (dat_evd_{enable,disable,{set,clear}_unwaitable}). * They are thread safe, so our reads need to be atomic with * regard to those calls. The below is ok (a single bit * read counts as atomic; if it's in transition you'll get one * of the correct values) but we'll need to be careful * about reading the state variable atomically when we add * in waitable/unwaitable. */ evd_param->evd_state = (evd_ptr-> evd_enabled ? DAT_EVD_STATE_ENABLED : DAT_EVD_STATE_DISABLED); evd_param->evd_state |= (evd_ptr-> evd_waitable ? DAT_EVD_STATE_WAITABLE : DAT_EVD_STATE_UNWAITABLE); dats_get_ia_handle(evd_ptr->header.owner_ia, &evd_param->ia_handle); evd_param->evd_qlen = evd_ptr->qlen; evd_param->cno_handle = (DAT_CNO_HANDLE) evd_ptr->cno_ptr; evd_param->evd_flags = evd_ptr->evd_flags; } bail: return dat_status; } dapl-2.1.5/dapl/udapl/dapl_evd_set_unwaitable.c000066400000000000000000000052351255317474200215130ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_set_unwaitable.c * * PURPOSE: EVENT management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 3.4.7 * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_adapter_util.h" /* * dapl_evd_set_unwaitable * * DAPL Requirements Version 1.1, 6.3.4.7 * * Transition the Event Dispatcher into an unwaitable state * * Input: * evd_handle * * Output: * none * * Returns: * DAT_SUCCESS * DAT_INVALID_HANDLE */ DAT_RETURN DAT_API dapl_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } dapl_os_lock(&evd_ptr->header.lock); evd_ptr->evd_waitable = DAT_FALSE; /* * If this evd is waiting, wake it up. There is an obvious race * condition here where we may wakeup the waiter before it goes to * sleep; but the wait_object allows this and will do the right * thing. */ if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED) { if (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG)) dapls_evd_dto_wakeup(evd_ptr); else dapl_os_wait_object_wakeup(&evd_ptr->wait_object); } dapl_os_unlock(&evd_ptr->header.lock); bail: return dat_status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/udapl/dapl_evd_wait.c000066400000000000000000000171111255317474200174450ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_evd_wait.c * * PURPOSE: EVENT management * * Description: Interfaces in this file are completely defined in * the uDAPL 1.1 API specification * * $Id:$ **********************************************************************/ #include "dapl.h" #include "dapl_evd_util.h" #include "dapl_ring_buffer_util.h" #include "dapl_adapter_util.h" /* * dapl_evd_wait * * UDAPL Requirements Version xxx, * * Wait, up to specified timeout, for notification event on EVD. * Then return first available event. * * Input: * evd_handle * timeout * * Output: * event * * Returns: * DAT_SUCCESS * DAT_INVALID_PARAMETER * DAT_INVALID_STATE */ DAT_RETURN DAT_API dapl_evd_wait(IN DAT_EVD_HANDLE evd_handle, IN DAT_TIMEOUT time_out, IN DAT_COUNT threshold, OUT DAT_EVENT * event, OUT DAT_COUNT * nmore) { DAPL_EVD *evd_ptr; DAT_RETURN dat_status; DAT_EVENT *local_event; DAT_BOOLEAN notify_requested = DAT_FALSE; DAT_BOOLEAN waitable; DAPL_EVD_STATE evd_state; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_evd_wait (%p, %d, %d, %p, %p)\n", evd_handle, time_out, threshold, event, nmore); evd_ptr = (DAPL_EVD *) evd_handle; dat_status = DAT_SUCCESS; if (DAPL_BAD_HANDLE(evd_ptr, DAPL_MAGIC_EVD)) { /* * We return directly rather than bailing because * bailing attempts to update the evd, and we don't have * one. */ dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0); goto bail; } if (!event) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); goto bail; } if (!nmore) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); goto bail; } if (threshold <= 0 || (threshold > 1 && evd_ptr->completion_type != DAPL_EVD_STATE_THRESHOLD) || threshold > evd_ptr->qlen) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } if (evd_ptr->catastrophic_overflow) { dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); goto bail; } DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT); dapl_dbg_log(DAPL_DBG_TYPE_EVD, "dapl_evd_wait: EVD %p, CQ %p\n", evd_ptr, (void *)evd_ptr->ib_cq_handle); /* * Make sure there are no other waiters and the evd is active. * Currently this means only the OPEN state is allowed. * Do this atomically. We need to take a lock to synchronize * with dapl_evd_dequeue(), but the atomic transition allows * non-locking synchronization with dapl_evd_query() and * dapl_evd_{query,enable,disable,{set,clear}_unwaitable}. */ dapl_os_lock(&evd_ptr->header.lock); waitable = evd_ptr->evd_waitable; dapl_os_assert(sizeof(DAT_COUNT) == sizeof(DAPL_EVD_STATE)); evd_state = evd_ptr->evd_state; if (evd_ptr->evd_state == DAPL_EVD_STATE_OPEN) evd_ptr->evd_state = DAPL_EVD_STATE_WAITED; if (evd_state != DAPL_EVD_STATE_OPEN) { /* Bogus state, bail out */ dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); goto bail; } if (!waitable) { /* This EVD is not waitable, reset the state and bail */ if (evd_ptr->evd_state == DAPL_EVD_STATE_WAITED) evd_ptr->evd_state = evd_state; dat_status = DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_EVD_UNWAITABLE); goto bail; } /* * We now own the EVD, even though we don't have the lock anymore, * because we're in the WAITED state. */ evd_ptr->threshold = threshold; for (;;) { /* * Ideally we'd just check the number of entries on the CQ, but * we don't have a way to do that. Because we have to set *nmore * at some point in this routine, we'll need to do this copy * sometime even if threshold == 1. * * For connection evd or async evd, the function checks and * return right away if the ib_cq_handle associate with these evd * equal to IB_INVALID_HANDLE */ dat_status = dapls_evd_copy_cq(evd_ptr); if (dat_status == DAT_QUEUE_FULL) goto bail; if (dapls_rbuf_count(&evd_ptr->pending_event_queue) >= threshold) break; /* * Do not enable the completion notification if this evd is not * a DTO_EVD or RMR_BIND_EVD */ if ((!notify_requested) && (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG))) { dat_status = dapls_ib_completion_notify(evd_ptr->header. owner_ia->hca_ptr-> ib_hca_handle, evd_ptr, (evd_ptr-> completion_type == DAPL_EVD_STATE_SOLICITED_WAIT) ? IB_NOTIFY_ON_SOLIC_COMP : IB_NOTIFY_ON_NEXT_COMP); DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT_NOTIFY); /* FIXME report error */ dapl_os_assert(dat_status == DAT_SUCCESS); notify_requested = DAT_TRUE; /* Try again. */ continue; } /* * Unused by poster; it has no way to tell how many * items are on the queue without copying them over to the * EVD queue, and we're the only ones allowed to dequeue * from the CQ for synchronization/locking reasons. */ evd_ptr->threshold = threshold; DAPL_CNTR(evd_ptr, DCNT_EVD_WAIT_BLOCKED); dapl_os_unlock(&evd_ptr->header.lock); if ((!evd_ptr->cno_ptr) && (evd_ptr->evd_flags & (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG))) { dat_status = dapls_evd_dto_wait(evd_ptr, time_out); } else { dat_status = dapl_os_wait_object_wait(&evd_ptr->wait_object, time_out); } dapl_os_lock(&evd_ptr->header.lock); /* * FIXME: if the thread loops around and waits again * the time_out value needs to be updated. */ notify_requested = DAT_FALSE; /* We've used it up. */ /* See if we were awakened by evd_set_unwaitable */ if (!evd_ptr->evd_waitable) { dat_status = DAT_ERROR(DAT_INVALID_STATE, 0); } if (dat_status != DAT_SUCCESS) { /* * If the status is DAT_TIMEOUT, we'll break out of the * loop, *not* dequeue an event (because dat_status * != DAT_SUCCESS), set *nmore (as we should for timeout) * and return DAT_TIMEOUT. */ break; } } evd_ptr->evd_state = DAPL_EVD_STATE_OPEN; if (dat_status == DAT_SUCCESS) { local_event = dapls_rbuf_remove(&evd_ptr->pending_event_queue); *event = *local_event; dapls_rbuf_add(&evd_ptr->free_event_queue, local_event); } /* * Valid if dat_status == DAT_SUCCESS || dat_status == DAT_TIMEOUT * Undefined otherwise, so ok to set it. */ *nmore = dapls_rbuf_count(&evd_ptr->pending_event_queue); bail: dapl_os_unlock(&evd_ptr->header.lock); if (dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_RTN, "dapl_evd_wait () returns 0x%x\n", dat_status); if (dat_status == DAT_QUEUE_FULL) dapls_evd_post_overflow_event(evd_ptr); } return dat_status; } dapl-2.1.5/dapl/udapl/dapl_init.c000066400000000000000000000165751255317474200166230ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_init.c * * PURPOSE: Interface Adapter management * Description: Interfaces in this file are completely described in * the DAPL 1.1 API, Chapter 6, section 2 * * $Id:$ **********************************************************************/ #include "dapl.h" #include /* Provider API function prototypes */ #include "dapl_hca_util.h" #include "dapl_init.h" #include "dapl_provider.h" #include "dapl_mr_util.h" #include "dapl_osd.h" #include "dapl_adapter_util.h" #include "dapl_name_service.h" #include "dapl_timer_util.h" #include "dapl_vendor.h" #include "config.h" /* * dapl_init * * initialize this provider * includes initialization of all global variables * as well as registering all supported IAs with the dat registry * * This function needs to be called once when the provider is loaded. * * Input: * none * * Output: * none * * Return Values: */ void dapl_init(void) { DAT_RETURN dat_status; /* set up debug type */ g_dapl_dbg_type = dapl_os_get_env_val("DAPL_DBG_TYPE", DAPL_DBG_TYPE_ERR | DAPL_DBG_TYPE_WARN); g_dapl_dbg_level = dapl_os_get_env_val("DAPL_DBG_LEVEL", 0); /* set up debug destination */ g_dapl_dbg_dest = dapl_os_get_env_val("DAPL_DBG_DEST", DAPL_DBG_DEST_STDOUT); g_dapl_dbg_mem = dapl_os_get_env_val("DAPL_DBG_SYS_MEM", 5); /* open log file on first logging call if necessary */ if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG) openlog("libdapl", LOG_ODELAY | LOG_PID | LOG_CONS, LOG_USER); dapl_log(DAPL_DBG_TYPE_UTIL, "dapl_init: dbg_type=%x,dbg_dest=%x,dbg_level=%x\n", g_dapl_dbg_type, g_dapl_dbg_dest, g_dapl_dbg_level); dapl_log(DAPL_DBG_TYPE_VER, " %s dapl-%s-%u, DAPL_DBG_TYPE 0x%x\n", PROVIDER_NAME, VERSION, PACKAGE_DATE, g_dapl_dbg_type); /* See if the user is on a loopback setup */ g_dapl_loopback_connection = dapl_os_get_env_bool("DAPL_LOOPBACK"); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: %s Setting Loopback\n", g_dapl_loopback_connection ? "" : "NOT"); /* initialize verbs library */ dapls_ib_init(); /* initialize the timer */ dapls_timer_init(); /* Set up name services */ dat_status = dapls_ns_init(); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapls_ns_init failed %d\n", dat_status); goto bail; } /* initialize the provider list */ dat_status = dapl_provider_list_create(); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapl_provider_list_create failed %d\n", dat_status); goto bail; } return; bail: dapl_dbg_log(DAPL_DBG_TYPE_ERR, "ERROR: dapl_init failed\n"); return; } /* * dapl_fini * * finalize this provider * includes freeing of all global variables * as well as deregistering all supported IAs from the dat registry * * This function needs to be called once when the provider is loaded. * * Input: * none * * Output: * none * * Return Values: */ void dapl_fini(void) { DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: ENTER (dapl_fini)\n"); dat_status = dapl_provider_list_destroy(); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dapl_provider_list_destroy failed %d\n", dat_status); } dapls_ib_release(); dapls_timer_release(); dapl_dbg_log(DAPL_DBG_TYPE_UTIL, "DAPL: Exit (dapl_fini)\n"); if (g_dapl_dbg_dest & DAPL_DBG_DEST_SYSLOG) closelog(); return; } /* * * This function is called by the registry to initialize a provider * * The instance data string is expected to have the following form: * * * */ void DAT_API DAT_PROVIDER_INIT_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info, IN const char *instance_data) { DAT_PROVIDER *provider; DAPL_HCA *hca_ptr; DAT_RETURN dat_status; char *data; char *name; char *port; unsigned int len; unsigned int i; data = NULL; provider = NULL; hca_ptr = NULL; #if defined(_WIN32) || defined(_WIN64) /* initialize DAPL library here as when called from DLL context in DLLmain() * the IB (ibal) call hangs. */ dapl_init(); #endif dat_status = dapl_provider_list_insert(provider_info->ia_name, &provider); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dat_provider_list_insert failed: %x\n", dat_status); goto bail; } data = dapl_os_strdup(instance_data); if (NULL == data) { goto bail; } len = dapl_os_strlen(data); for (i = 0; i < len; i++) { if (' ' == data[i]) { data[i] = '\0'; break; } } /* if the instance data did not have a valid format */ if (i == len) { goto bail; } name = data; port = data + (i + 1); hca_ptr = dapl_hca_alloc(name, port); if (NULL == hca_ptr) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "%s() dapl_hca_alloc failed?\n"); goto bail; } provider->extension = hca_ptr; dat_status = dat_registry_add_provider(provider, provider_info); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dat_registry_add_provider failed: %x\n", dat_status); } bail: if (NULL != data) { dapl_os_free(data, len + 1); } if (DAT_SUCCESS != dat_status) { if (NULL != provider) { (void)dapl_provider_list_remove(provider_info->ia_name); } if (NULL != hca_ptr) { dapl_hca_free(hca_ptr); } } } /* * * This function is called by the registry to de-initialize a provider * */ void DAT_API DAT_PROVIDER_FINI_FUNC_NAME(IN const DAT_PROVIDER_INFO * provider_info) { DAT_PROVIDER *provider; DAT_RETURN dat_status; dat_status = dapl_provider_list_search(provider_info->ia_name, &provider); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dat_registry_add_provider failed: %x\n", dat_status); return; } dat_status = dat_registry_remove_provider(provider, provider_info); if (DAT_SUCCESS != dat_status) { dapl_dbg_log(DAPL_DBG_TYPE_ERR, "dat_registry_add_provider failed: %x\n", dat_status); } /* * free HCA memory */ dapl_hca_free(provider->extension); (void)dapl_provider_list_remove(provider_info->ia_name); #if defined(_WIN32) || defined(_WIN64) /* cleanup DAPL library - relocated here from OSD DLL context as the IBAL * calls hung in the DLL context? */ dapl_fini(); #endif } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/udapl/dapl_lmr_create.c000066400000000000000000000261651255317474200177710ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_lmr_create.c * * PURPOSE: Memory management * * $Id:$ **********************************************************************/ #include "dapl_lmr_util.h" #include "dapl_adapter_util.h" #include "dapl_vendor.h" /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ STATIC _INLINE_ DAT_RETURN dapli_lmr_create_virtual(IN DAPL_IA * ia, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address); STATIC _INLINE_ DAT_RETURN dapli_lmr_create_lmr(IN DAPL_IA * ia, IN DAPL_LMR * original_lmr, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address); STATIC _INLINE_ DAT_RETURN dapli_lmr_create_shared(IN DAPL_IA * ia, IN DAT_REGION_DESCRIPTION reg_desc, IN DAT_VLEN length, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address); /********************************************************************* * * * Function Definitions * * * *********************************************************************/ DAT_RETURN dapli_lmr_create_virtual(IN DAPL_IA * ia, IN DAT_PVOID virt_addr, IN DAT_VLEN length, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address) { DAPL_LMR *lmr; DAT_REGION_DESCRIPTION reg_desc; DAT_RETURN dat_status; reg_desc.for_va = virt_addr; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_create (ia=%p,pz=%p)\n", ia, pz); lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_VIRTUAL, reg_desc, length, (DAT_PZ_HANDLE) pz, privileges); if (NULL == lmr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_status = dapls_ib_mr_register(ia, lmr, virt_addr, length, privileges, va_type); #ifdef DAPL_COUNTERS dapl_os_memchk(g_dapl_dbg_mem, "create_mr"); #endif if (DAT_SUCCESS != dat_status) { dapl_lmr_dealloc(lmr); goto bail; } dapl_os_atomic_inc(&pz->pz_ref_count); *lmr_handle = (DAT_LMR_HANDLE) lmr; if (NULL != lmr_context) { *lmr_context = lmr->param.lmr_context; } if (NULL != rmr_context) { *rmr_context = lmr->param.rmr_context; } if (NULL != registered_length) { *registered_length = lmr->param.registered_size; } if (NULL != registered_address) { *registered_address = lmr->param.registered_address; } bail: return dat_status; } DAT_RETURN dapli_lmr_create_lmr(IN DAPL_IA * ia, IN DAPL_LMR * original_lmr, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address) { DAPL_LMR *lmr; DAT_REGION_DESCRIPTION reg_desc; DAT_RETURN dat_status; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_create_lmr (%p, %p, %p, %x, %x, %p, %p, %p, %p)\n", ia, original_lmr, pz, privileges, va_type, lmr_handle, lmr_context, registered_length, registered_address); reg_desc.for_lmr_handle = (DAT_LMR_HANDLE) original_lmr; lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, original_lmr->param.length, (DAT_PZ_HANDLE) pz, privileges); if (NULL == lmr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_status = dapls_ib_mr_register_shared(ia, lmr, privileges, va_type); if (DAT_SUCCESS != dat_status) { dapl_lmr_dealloc(lmr); goto bail; } dapl_os_atomic_inc(&pz->pz_ref_count); *lmr_handle = (DAT_LMR_HANDLE) lmr; if (NULL != lmr_context) { *lmr_context = lmr->param.lmr_context; } if (NULL != rmr_context) { *rmr_context = lmr->param.rmr_context; } if (NULL != registered_length) { *registered_length = lmr->param.registered_size; } if (NULL != registered_address) { *registered_address = lmr->param.registered_address; } bail: return dat_status; } DAT_RETURN dapli_lmr_create_shared(IN DAPL_IA * ia, IN DAT_REGION_DESCRIPTION reg_desc, IN DAT_VLEN length, IN DAPL_PZ * pz, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address) { DAPL_LMR *lmr; DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_create_shared_virtual (ia=%p len=%x pz=%p priv=%x)\n", ia, length, pz, privileges); lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, length, /* length is meaningless */ (DAT_PZ_HANDLE) pz, privileges); if (NULL == lmr) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } /* * Added for the shared memory support - - - * Save the region description. We need to copy the shared * memory id because the region_desc only contains a pointer * to it. */ dapl_os_memcpy(&lmr->shmid, reg_desc.for_shared_memory.shared_memory_id, sizeof(lmr->shmid)); lmr->param.region_desc = reg_desc; lmr->param.length = length; lmr->param.mem_type = DAT_MEM_TYPE_SHARED_VIRTUAL; lmr->param.region_desc.for_shared_memory.shared_memory_id = &lmr->shmid; dat_status = dapls_ib_mr_register_shared(ia, lmr, privileges, va_type); if (dat_status != DAT_SUCCESS) { dapl_lmr_dealloc(lmr); dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY_REGION); goto bail; } dapl_os_atomic_inc(&pz->pz_ref_count); *lmr_handle = (DAT_LMR_HANDLE) lmr; if (NULL != lmr_context) { *lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context; } if (NULL != rmr_context) { *rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context; } if (NULL != registered_length) { *registered_length = lmr->param.length; } if (NULL != registered_address) { *registered_address = (DAT_VADDR) (uintptr_t) lmr->param.region_desc.for_shared_memory.virtual_address; } bail: return dat_status; } /* * dapl_lmr_create * * Register a memory region with an Interface Adaptor. * * Input: * ia_handle * mem_type * region_description * length * pz_handle * privileges * * Output: * lmr_handle * lmr_context * registered_length * registered_address * * Returns: * DAT_SUCCESS * DAT_INSUFFICIENT_RESOURCES * DAT_INVALID_PARAMETER * DAT_INVALID_HANDLE * DAT_INVALID_STATE * DAT_MODEL_NOT_SUPPORTED * */ DAT_RETURN DAT_API dapl_lmr_create(IN DAT_IA_HANDLE ia_handle, IN DAT_MEM_TYPE mem_type, IN DAT_REGION_DESCRIPTION region_description, IN DAT_VLEN length, IN DAT_PZ_HANDLE pz_handle, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address) { DAPL_IA *ia; DAPL_PZ *pz; DAT_RETURN dat_status; if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); goto bail; } if (NULL == lmr_handle) { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG7); goto bail; } ia = (DAPL_IA *) ia_handle; pz = (DAPL_PZ *) pz_handle; DAPL_CNTR(ia, DCNT_IA_LMR_CREATE); switch (mem_type) { case DAT_MEM_TYPE_VIRTUAL: { dat_status = dapli_lmr_create_virtual(ia, region_description.for_va, length, pz, privileges, va_type, lmr_handle, lmr_context, rmr_context, registered_length, registered_address); break; } case DAT_MEM_TYPE_LMR: { DAPL_LMR *lmr; if (DAPL_BAD_HANDLE (region_description.for_lmr_handle, DAPL_MAGIC_LMR)) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR); goto bail; } lmr = (DAPL_LMR *) region_description.for_lmr_handle; dat_status = dapli_lmr_create_lmr(ia, lmr, pz, privileges, va_type, lmr_handle, lmr_context, rmr_context, registered_length, registered_address); break; } case DAT_MEM_TYPE_SHARED_VIRTUAL: { #if (VN_MEM_SHARED_VIRTUAL_SUPPORT > 0) dat_status = dapli_lmr_create_shared(ia, region_description, length, pz, privileges, va_type, lmr_handle, lmr_context, rmr_context, registered_length, registered_address); #else dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE); #endif break; } default: { dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); break; } } bail: return dat_status; } dapl-2.1.5/dapl/udapl/libdaplofa.map000077500000000000000000000001521255317474200172730ustar00rootroot00000000000000DAPL_CMA_2.0 { global: dat_provider_fini; dat_provider_init; dapl_extensions; local: *; }; dapl-2.1.5/dapl/udapl/libdaplomcm.map000066400000000000000000000001521255317474200174560ustar00rootroot00000000000000DAPL_MCM_2.0 { global: dat_provider_fini; dat_provider_init; dapl_extensions; local: *; }; dapl-2.1.5/dapl/udapl/libdaploscm.map000077500000000000000000000001521255317474200174670ustar00rootroot00000000000000DAPL_SCM_2.0 { global: dat_provider_fini; dat_provider_init; dapl_extensions; local: *; }; dapl-2.1.5/dapl/udapl/libdaploucm.map000077500000000000000000000001521255317474200174710ustar00rootroot00000000000000DAPL_OCM_2.0 { global: dat_provider_fini; dat_provider_init; dapl_extensions; local: *; }; dapl-2.1.5/dapl/udapl/linux/000077500000000000000000000000001255317474200156355ustar00rootroot00000000000000dapl-2.1.5/dapl/udapl/linux/dapl_osd.c000066400000000000000000000344771255317474200176050ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dapl_osd.c * * PURPOSE: Operating System Dependent layer * Description: * Provide OS dependent functions with a canonical DAPL * interface. Designed to be portable and hide OS specific quirks * of common functions. * * * $Id:$ **********************************************************************/ #include "dapl_osd.h" #include "dapl.h" #include "dapl_hca_util.h" #include "dapl_ia_util.h" #include "dapl_rmr_util.h" #include "dapl_lmr_util.h" #include "dapl_pz_util.h" #include "dapl_ep_util.h" #include "dapl_cr_util.h" #include "dapl_evd_util.h" #include "dapl_sp_util.h" #include "dapl_adapter_util.h" #include "dapl_provider.h" #include "dapl_hash.h" #include "dapl_timer_util.h" #include "dapl_debug.h" #include #include /* needed for getenv() */ #include /* needed for pthread_atfork() */ #include /* needed for thread setup */ static void dapls_osd_fork_cleanup(void); /* * dapl_osd_init * * Do Linux initialization: * - Set up fork handler to clean up DAPL resources in the child * process after a fork(). * * Input: * none * * Returns: * DAT_SUCCESS */ void dapl_os_init() { int status; /* * Set up fork control */ status = pthread_atfork(NULL, NULL, dapls_osd_fork_cleanup); if (status != 0) { dapl_os_printf("WARNING: pthread_atfork %d\n", status); } } /* * dapl_os_get_time * * Return 64 bit value of current time in microseconds. * * Input: * loc User location to place current time * * Returns: * DAT_SUCCESS */ DAT_RETURN dapl_os_get_time(OUT DAPL_OS_TIMEVAL * loc) { struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); *loc = ((DAT_UINT64) (tv.tv_sec) * 1000000L) + (DAT_UINT64) tv.tv_usec; return DAT_SUCCESS; } /* * dapl_os_get__env_bool * * Return boolean value of passed in environment variable: 1 if present, * 0 if not * * Input: * * * Returns: * TRUE or FALSE */ int dapl_os_get_env_bool(char *env_str) { char *env_var; env_var = getenv(env_str); if (env_var != NULL) { return 1; } return 0; } /* * dapl_os_get_env_val * * Update val to value of passed in environment variable if present * * Input: * env_str * def_val default value if environment variable does not exist * * Returns: * TRUE or FALSE */ int dapl_os_get_env_val(char *env_str, int def_val) { char *env_var; env_var = getenv(env_str); if (env_var != NULL) { def_val = strtol(env_var, NULL, 0); } return def_val; } /* * Wait object routines */ /* * dapl_os_wait_object_init * * Initialize a wait object * * Input: * wait_obj * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR */ DAT_RETURN dapl_os_wait_object_init(IN DAPL_OS_WAIT_OBJECT * wait_obj) { wait_obj->signaled = DAT_FALSE; if (0 != pthread_cond_init(&wait_obj->cv, NULL)) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } /* Always returns 0. */ pthread_mutex_init(&wait_obj->lock, NULL); return DAT_SUCCESS; } /* Wait on the supplied wait object, up to the specified time_out. * A timeout of DAT_TIMEOUT_INFINITE will wait indefinitely. * Timeout should be specified in micro seconds. * * Functional returns: * DAT_SUCCESS -- another thread invoked dapl_os_wait object_wakeup * DAT_INVALID_STATE -- someone else is already waiting in this wait * object. * only one waiter is allowed at a time. * DAT_ABORT -- another thread invoked dapl_os_wait_object_destroy * DAT_TIMEOUT -- the specified time limit was reached. */ DAT_RETURN dapl_os_wait_object_wait(IN DAPL_OS_WAIT_OBJECT * wait_obj, IN DAT_TIMEOUT timeout_val) { DAT_RETURN dat_status; int pthread_status; struct timespec future; dat_status = DAT_SUCCESS; pthread_status = 0; if (timeout_val != DAT_TIMEOUT_INFINITE) { struct timeval now; struct timezone tz; unsigned int microsecs; gettimeofday(&now, &tz); #define USEC_PER_SEC 1000000 microsecs = now.tv_usec + timeout_val; now.tv_sec = now.tv_sec + microsecs / USEC_PER_SEC; now.tv_usec = microsecs % USEC_PER_SEC; /* Convert timeval to timespec */ future.tv_sec = now.tv_sec; future.tv_nsec = now.tv_usec * 1000; pthread_mutex_lock(&wait_obj->lock); while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) { pthread_status = pthread_cond_timedwait(&wait_obj->cv, &wait_obj->lock, &future); /* * No need to reset &future if we go around the loop; * It's an absolute time. */ } /* Reset the signaled status if we were woken up. */ if (pthread_status == 0) { wait_obj->signaled = DAT_FALSE; } pthread_mutex_unlock(&wait_obj->lock); } else { pthread_mutex_lock(&wait_obj->lock); while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) { pthread_status = pthread_cond_wait(&wait_obj->cv, &wait_obj->lock); } /* Reset the signaled status if we were woken up. */ if (pthread_status == 0) { wait_obj->signaled = DAT_FALSE; } pthread_mutex_unlock(&wait_obj->lock); } if (ETIMEDOUT == pthread_status) { dat_status = DAT_ERROR(DAT_TIMEOUT_EXPIRED, 0); } else if (EINTR == pthread_status) { dat_status = DAT_ERROR(DAT_INTERRUPTED_CALL, 0); } else if (0 != pthread_status) { dat_status = DAT_ERROR(DAT_INTERNAL_ERROR, 0); } return dat_status; } /* * dapl_os_wait_object_wakeup * * Wakeup a thread waiting on a wait object * * Input: * wait_obj * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR */ DAT_RETURN dapl_os_wait_object_wakeup(IN DAPL_OS_WAIT_OBJECT * wait_obj) { pthread_mutex_lock(&wait_obj->lock); wait_obj->signaled = DAT_TRUE; pthread_mutex_unlock(&wait_obj->lock); if (0 != pthread_cond_signal(&wait_obj->cv)) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } return DAT_SUCCESS; } /* * dapl_os_wait_object_destroy * * Destroy a wait object * * Input: * wait_obj * * Returns: * DAT_SUCCESS * DAT_INTERNAL_ERROR */ DAT_RETURN dapl_os_wait_object_destroy(IN DAPL_OS_WAIT_OBJECT * wait_obj) { if (0 != pthread_cond_destroy(&wait_obj->cv)) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } if (0 != pthread_mutex_destroy(&wait_obj->lock)) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } return DAT_SUCCESS; } /* * dapls_osd_fork_cleanup * * Update val to value of passed in environment variable if present * * Input: * env_str * val Updated if environment variable exists * * Returns: * TRUE or FALSE */ void dapls_osd_fork_cleanup(void) { DAPL_PROVIDER_LIST_NODE *cur_node; DAPL_HCA *hca_ptr; DAPL_IA *ia_ptr; DAPL_LMR *lmr_ptr; DAPL_RMR *rmr_ptr; DAPL_PZ *pz_ptr; DAPL_CR *cr_ptr; DAPL_EP *ep_ptr; DAPL_EVD *evd_ptr; DAT_EP_PARAM *param; DAPL_SP *sp_ptr; while (NULL != g_dapl_provider_list.head) { cur_node = g_dapl_provider_list.head; g_dapl_provider_list.head = cur_node->next; hca_ptr = (DAPL_HCA *) cur_node->data.extension; /* * Walk the list of IA ptrs & clean up. This is purposely * a destructive list walk, we really don't want to preserve * any of it. */ while (!dapl_llist_is_empty(&hca_ptr->ia_list_head)) { ia_ptr = (DAPL_IA *) dapl_llist_peek_head(&hca_ptr->ia_list_head); /* * The rest of the cleanup code is similar to dapl_ia_close, * the big difference is that we don't release IB resources, * only memory; the underlying IB subsystem doesn't deal * with fork at all, so leave IB handles alone. */ while (!dapl_llist_is_empty(&ia_ptr->rmr_list_head)) { rmr_ptr = (DAPL_RMR *) dapl_llist_peek_head(&ia_ptr-> rmr_list_head); if (rmr_ptr->param.lmr_triplet. virtual_address != 0) { dapl_os_atomic_dec(&rmr_ptr->lmr-> lmr_ref_count); rmr_ptr->param.lmr_triplet. virtual_address = 0; } dapl_os_atomic_dec(&rmr_ptr->pz->pz_ref_count); dapl_ia_unlink_rmr(rmr_ptr->header.owner_ia, rmr_ptr); dapl_rmr_dealloc(rmr_ptr); } while (!dapl_llist_is_empty(&ia_ptr->rsp_list_head)) { sp_ptr = (DAPL_SP *) dapl_llist_peek_head(&ia_ptr-> rsp_list_head); dapl_os_atomic_dec(& ((DAPL_EVD *) sp_ptr-> evd_handle)->evd_ref_count); dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapls_sp_free_sp(sp_ptr); } while (!dapl_llist_is_empty(&ia_ptr->ep_list_head)) { ep_ptr = (DAPL_EP *) dapl_llist_peek_head(&ia_ptr->ep_list_head); param = &ep_ptr->param; if (param->pz_handle != NULL) { dapl_os_atomic_dec(& ((DAPL_PZ *) param-> pz_handle)-> pz_ref_count); } if (param->recv_evd_handle != NULL) { dapl_os_atomic_dec(& ((DAPL_EVD *) param-> recv_evd_handle)-> evd_ref_count); } if (param->request_evd_handle) { dapl_os_atomic_dec(& ((DAPL_EVD *) param-> request_evd_handle)-> evd_ref_count); } if (param->connect_evd_handle != NULL) { dapl_os_atomic_dec(& ((DAPL_EVD *) param-> connect_evd_handle)-> evd_ref_count); } /* ...and free the resource */ dapl_ia_unlink_ep(ia_ptr, ep_ptr); dapl_ep_dealloc(ep_ptr); } while (!dapl_llist_is_empty(&ia_ptr->lmr_list_head)) { lmr_ptr = (DAPL_LMR *) dapl_llist_peek_head(&ia_ptr-> lmr_list_head); (void)dapls_hash_remove(lmr_ptr->header. owner_ia->hca_ptr-> lmr_hash_table, lmr_ptr->param. lmr_context, NULL); pz_ptr = (DAPL_PZ *) lmr_ptr->param.pz_handle; dapl_os_atomic_dec(&pz_ptr->pz_ref_count); dapl_ia_unlink_lmr(lmr_ptr->header.owner_ia, lmr_ptr); dapl_lmr_dealloc(lmr_ptr); } while (!dapl_llist_is_empty(&ia_ptr->psp_list_head)) { sp_ptr = (DAPL_SP *) dapl_llist_peek_head(&ia_ptr-> psp_list_head); while (!dapl_llist_is_empty (&sp_ptr->cr_list_head)) { cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr-> cr_list_head); dapl_sp_remove_cr(sp_ptr, cr_ptr); dapls_cr_free(cr_ptr); } dapls_ia_unlink_sp(ia_ptr, sp_ptr); dapl_os_atomic_dec(& ((DAPL_EVD *) sp_ptr-> evd_handle)->evd_ref_count); dapls_sp_free_sp(sp_ptr); } while (!dapl_llist_is_empty(&ia_ptr->pz_list_head)) { pz_ptr = (DAPL_PZ *) dapl_llist_peek_head(&ia_ptr->pz_list_head); dapl_ia_unlink_pz(pz_ptr->header.owner_ia, pz_ptr); dapl_pz_dealloc(pz_ptr); } while (!dapl_llist_is_empty(&ia_ptr->evd_list_head)) { evd_ptr = (DAPL_EVD *) dapl_llist_peek_head(&ia_ptr-> evd_list_head); dapl_ia_unlink_evd(evd_ptr->header.owner_ia, evd_ptr); /* reset the cq_handle to avoid having it removed */ evd_ptr->ib_cq_handle = IB_INVALID_HANDLE; dapls_evd_dealloc(evd_ptr); } dapl_hca_unlink_ia(ia_ptr->hca_ptr, ia_ptr); /* asycn error evd was taken care of above, reset the pointer */ ia_ptr->async_error_evd = NULL; dapls_ia_free(ia_ptr); } /* end while ( ia_ptr != NULL ) */ dapl_os_free(cur_node, sizeof(DAPL_PROVIDER_LIST_NODE)); } /* end while (NULL != g_dapl_provider_list.head) */ } /* * Structure to contain all elements of a thread in order to enable a * local routine to intercept and do some necessary initialization. */ struct thread_draft { void (*func) (void *); /* start routine */ void *data; /* argument to start routine */ }; void dapli_thread_init(struct thread_draft *thread_draft); /* * dapls_os_thread_create * * Create a thread for dapl * * Input: * func function to invoke thread * f_arg argument to pass to function * * Output * thread_id handle for thread * * Returns: * DAT_SUCCESS */ DAT_RETURN dapl_os_thread_create(IN void (*func) (void *), IN void *data, OUT DAPL_OS_THREAD * thread_id) { pthread_attr_t thread_attr; struct thread_draft *thread_draft; int status; /* * Get default set of thread attributes */ status = pthread_attr_init(&thread_attr); if (status != 0) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } /* Create dapl threads as detached from this process */ status = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); if (status != 0) { return DAT_ERROR(DAT_INTERNAL_ERROR, 0); } thread_draft = dapl_os_alloc(sizeof(struct thread_draft)); thread_draft->func = func; thread_draft->data = data; /* Create the thread. Observe that we first invoke a local * routine to set up OS parameters, before invoking the user * specified routine. */ status = pthread_create(thread_id, &thread_attr, (void *(*)(void *))dapli_thread_init, (void *)thread_draft); /* clean up resources */ (void)pthread_attr_destroy(&thread_attr); if (status != 0) { return DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0); } return DAT_SUCCESS; } /* * dapli_thread_init * * Need to mask all signals from this thread in order to be a good * citizen. Signals will arrive randomly and will be processed by * whatever thread is running unless they are specifically blocked; and * this should be a user thread, not a dapl thread */ void dapli_thread_init(struct thread_draft *thread_draft) { sigset_t sigset; void (*func) (void *); void *data; sigfillset(&sigset); pthread_sigmask(SIG_BLOCK, &sigset, NULL); func = thread_draft->func; data = thread_draft->data; dapl_os_free(thread_draft, sizeof(struct thread_draft)); (*func) (data); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dapl/udapl/linux/dapl_osd.h000066400000000000000000000351271255317474200176030ustar00rootroot00000000000000/* * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is * available from the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dapl_osd.h * * PURPOSE: Operating System Dependent layer * Description: * Provide OS dependent data structures & functions with * a canonical DAPL interface. Designed to be portable * and hide OS specific quirks of common functions. * * $Id:$ **********************************************************************/ #ifndef _DAPL_OSD_H_ #define _DAPL_OSD_H_ /* * This file is defined for Linux systems only, including it on any * other build will cause an error */ #ifndef __linux__ #error UNDEFINED OS TYPE #endif /* __linux__ */ #if !defined (__i386__) && !defined (__ia64__) && !defined(__x86_64__) && \ !defined(__PPC__) && !defined(__PPC64__) && !defined(__s390x__) && \ !defined(__aarch64__) #error UNDEFINED ARCH #endif #include #include #include #include #include #include #include #include #include #include /* for printf */ #include #include #include /* for getaddrinfo */ #include #include /* for IOCTL's */ #include "dapl_debug.h" /* * Include files for setting up a network name */ #include /* for socket(2) */ #include /* for struct ifreq */ #include /* for ARPHRD_ETHER */ #include #include #include #include #include #include #include #include #include #include #include #include #if !defined(SUSE_11) && !defined(REDHAT_EL5) && defined(__ia64__) #include #endif #if defined(SUSE_11) && defined(__ia64__) #include #include #endif /* Useful debug definitions */ #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef _INLINE_ #define _INLINE_ __inline__ #endif /* _INLINE_ */ #define LINUX_VERSION(a,b) (((a) << 16) + (b)) void dapl_os_init ( void ); /* initialization function */ #define dapl_os_panic(...) \ do { \ fprintf(stderr, "PANIC in %s:%i:%s\n", __FILE__, __LINE__, __func__); \ fprintf(stderr, __VA_ARGS__); \ exit(1); \ } while(0) #define dapl_ip_addr6(sockaddr) (((struct sockaddr_in6 *)sockaddr)->sin6_addr.s6_addr32) /* * Atomic operations */ typedef volatile DAT_COUNT DAPL_ATOMIC; /* atomic function prototypes */ STATIC _INLINE_ void /* DAT_COUNT */ dapl_os_atomic_inc ( INOUT DAPL_ATOMIC *v); STATIC _INLINE_ void /* DAT_COUNT */ dapl_os_atomic_dec ( INOUT DAPL_ATOMIC *v); STATIC _INLINE_ DAT_COUNT dapl_os_atomic_assign ( INOUT DAPL_ATOMIC *v, IN DAT_COUNT match_value, IN DAT_COUNT new_value ); #define dapl_os_atomic_read(v) (*v) #define dapl_os_atomic_set(v,i) (*v = i) int dapl_os_get_env_bool ( char *env_str ); int dapl_os_get_env_val ( char *env_str, int def_val ); /* atomic functions */ #ifdef __s390x__ #define DAPL_CS_ADD(ptr, op_val) ({ \ int old_val, new_val; \ __asm__ __volatile__( \ " l %0,%2\n" \ "0: lr %1,%0\n" \ " ar %1,%3\n" \ " cs %0,%1,%2\n" \ " jl 0b" \ : "=&d" (old_val), "=&d" (new_val), \ "=Q" (*ptr) \ : "d" (op_val), "Q" (*ptr) \ : "cc", "memory"); \ new_val; \ }) #endif /* dapl_os_atomic_inc * * get the current value of '*v', and then increment it. * * This is equivalent to an IB atomic fetch and add of 1, * except that a DAT_COUNT might be 32 bits, rather than 64 * and it occurs in local memory. */ STATIC _INLINE_ void dapl_os_atomic_inc ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; #if defined(REDHAT_EL5) old_value = __sync_fetch_and_add(v, 1); #elif !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) IA64_FETCHADD(old_value,v,1,4,rel); #else IA64_FETCHADD(old_value,v,1,4); #endif #elif defined(__s390x__) DAT_COUNT tmp; DAT_COUNT delta = 1; tmp = DAPL_CS_ADD(v, delta); #elif defined(__PPC__) || defined(__PPC64__) int tmp; __asm__ __volatile__( "1: lwarx %0,0,%2\n\ addic %0,%0,1\n\ stwcx. %0,0,%2\n\ bne- 1b" : "=&r" (tmp), "+m" (v) : "b" (v) : "cc"); #elif defined(__aarch64__) __atomic_fetch_add(v, 1, __ATOMIC_ACQ_REL); #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "incl %0" :"=m" (*v) :"m" (*v)); #endif return; } /* dapl_os_atomic_dec * * decrement the current value of '*v'. No return value is required. */ STATIC _INLINE_ void dapl_os_atomic_dec ( INOUT DAPL_ATOMIC *v) { #ifdef __ia64__ DAT_COUNT old_value; #if defined(REDHAT_EL5) old_value = __sync_fetch_and_sub(v, 1); #elif !defined(REDHAT_EL4) && (OS_RELEASE >= LINUX_VERSION(2,6)) IA64_FETCHADD(old_value,v,-1,4,rel); #else IA64_FETCHADD(old_value,v,-1,4); #endif #elif defined(__s390x__) DAT_COUNT tmp; DAT_COUNT delta = -1; tmp = DAPL_CS_ADD(v, delta); #elif defined (__PPC__) || defined(__PPC64__) int tmp; __asm__ __volatile__( "1: lwarx %0,0,%2\n\ addic %0,%0,-1\n\ stwcx. %0,0,%2\n\ bne- 1b" : "=&r" (tmp), "+m" (v) : "b" (v) : "cc"); #elif defined(__aarch64__) __atomic_fetch_add(v, -1, __ATOMIC_ACQ_REL); #else /* !__ia64__ */ __asm__ __volatile__ ( "lock;" "decl %0" :"=m" (*v) :"m" (*v)); #endif return; } /* dapl_os_atomic_assign * * assign 'new_value' to '*v' if the current value * matches the provided 'match_value'. * * Make no assignment if there is no match. * * Return the current value in any case. * * This matches the IBTA atomic operation compare & swap * except that it is for local memory and a DAT_COUNT may * be only 32 bits, rather than 64. */ STATIC _INLINE_ DAT_COUNT dapl_os_atomic_assign ( INOUT DAPL_ATOMIC *v, IN DAT_COUNT match_value, IN DAT_COUNT new_value ) { DAT_COUNT current_value; /* * Use the Pentium compare and exchange instruction */ #ifdef __ia64__ #if defined(REDHAT_EL5) current_value = __sync_val_compare_and_swap(v,match_value,new_value); #elif defined(REDHAT_EL4) current_value = ia64_cmpxchg("acq",v,match_value,new_value,4); #else current_value = ia64_cmpxchg(acq,v,match_value,new_value,4); #endif /* __ia64__ */ #elif defined(__s390x__) __asm__ __volatile__( " cs %0,%2,%1\n" : "+d" (match_value), "=Q" (*v) : "d" (new_value), "Q" (*v) : "cc", "memory"); current_value = match_value; #elif defined(__PPC__) || defined(__PPC64__) __asm__ __volatile__ ( " lwsync\n\ 1: lwarx %0,0,%2 # __cmpxchg_u32\n\ cmpw 0,%0,%3\n\ bne- 2f\n\ stwcx. %4,0,%2\n\ bne- 1b\n\ isync\n\ 2:" : "=&r" (current_value), "=m" (*v) : "r" (v), "r" (match_value), "r" (new_value), "m" (*v) : "cc", "memory"); #elif defined(__aarch64__) current_value = match_value; __atomic_compare_exchange_n(v, ¤t_value, new_value, 1, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED); #else __asm__ __volatile__ ( "lock; cmpxchgl %1, %2" : "=a" (current_value) : "q" (new_value), "m" (*v), "0" (match_value) : "memory"); #endif return current_value; } /* * Thread Functions */ typedef pthread_t DAPL_OS_THREAD; DAT_RETURN dapl_os_thread_create ( IN void (*func) (void *), IN void *data, OUT DAPL_OS_THREAD *thread_id ); STATIC _INLINE_ void dapl_os_sleep_usec(int usec) { struct timespec sleep, remain; sleep.tv_sec = 0; sleep.tv_nsec = usec * 1000; nanosleep(&sleep, &remain); } /* * Lock Functions */ typedef pthread_mutex_t DAPL_OS_LOCK; /* function prototypes */ STATIC _INLINE_ DAT_RETURN dapl_os_lock_init ( IN DAPL_OS_LOCK *m); STATIC _INLINE_ DAT_RETURN dapl_os_lock ( IN DAPL_OS_LOCK *m); STATIC _INLINE_ DAT_RETURN dapl_os_unlock ( IN DAPL_OS_LOCK *m); STATIC _INLINE_ DAT_RETURN dapl_os_lock_destroy ( IN DAPL_OS_LOCK *m); /* lock functions */ STATIC _INLINE_ DAT_RETURN dapl_os_lock_init ( IN DAPL_OS_LOCK *m) { /* pthread_mutex_init always returns 0 */ pthread_mutex_init (m, NULL); return DAT_SUCCESS; } STATIC _INLINE_ DAT_RETURN dapl_os_lock ( IN DAPL_OS_LOCK *m) { if (0 == pthread_mutex_lock (m)) { return DAT_SUCCESS; } else { return DAT_CLASS_ERROR | DAT_INTERNAL_ERROR; } } STATIC _INLINE_ DAT_RETURN dapl_os_unlock ( IN DAPL_OS_LOCK *m) { if (0 == pthread_mutex_unlock (m)) { return DAT_SUCCESS; } else { return DAT_CLASS_ERROR | DAT_INTERNAL_ERROR; } } STATIC _INLINE_ DAT_RETURN dapl_os_lock_destroy ( IN DAPL_OS_LOCK *m) { if (0 == pthread_mutex_destroy (m)) { return DAT_SUCCESS; } else { return DAT_CLASS_ERROR | DAT_INTERNAL_ERROR; } } /* * Wait Objects */ /* * The wait object invariant: Presuming a call to dapl_os_wait_object_wait * occurs at some point, there will be at least one wakeup after each call * to dapl_os_wait_object_signal. I.e. Signals are not ignored, though * they may be coallesced. */ typedef struct { DAT_BOOLEAN signaled; pthread_cond_t cv; pthread_mutex_t lock; } DAPL_OS_WAIT_OBJECT; /* function prototypes */ DAT_RETURN dapl_os_wait_object_init ( IN DAPL_OS_WAIT_OBJECT *wait_obj); DAT_RETURN dapl_os_wait_object_wait ( IN DAPL_OS_WAIT_OBJECT *wait_obj, IN DAT_TIMEOUT timeout_val); DAT_RETURN dapl_os_wait_object_wakeup ( IN DAPL_OS_WAIT_OBJECT *wait_obj); DAT_RETURN dapl_os_wait_object_destroy ( IN DAPL_OS_WAIT_OBJECT *wait_obj); /* * Memory Functions */ STATIC _INLINE_ void dapl_os_memchk(int percent, const char *txt); /* function prototypes */ STATIC _INLINE_ void *dapl_os_alloc (int size); STATIC _INLINE_ void *dapl_os_realloc (void *ptr, int size); STATIC _INLINE_ void dapl_os_free (void *ptr, int size); STATIC _INLINE_ void * dapl_os_memzero (void *loc, int size); STATIC _INLINE_ void * dapl_os_memcpy (void *dest, const void *src, int len); STATIC _INLINE_ int dapl_os_memcmp (const void *mem1, const void *mem2, int len); /* memory functions */ STATIC _INLINE_ void dapl_os_memchk(int percent, const char *txt) { struct sysinfo si; double mfree, threshold = (double)percent/100; sysinfo(&si); mfree = si.freeram + si.sharedram + si.bufferram; if (mfree/(double)si.totalram < threshold) { dapl_log(DAPL_DBG_TYPE_SYS_WARN, " WARNING: LOW MEMORY: %s (Free %d Share %d, Bufs %d)" " < %2.2f percent of total (%d MB) memory\n", txt, si.freeram/(1024*1024), si.sharedram/(1024*1024), si.bufferram/(1024*1024), si.totalram/(1024*1024), (mfree/(double)si.totalram)*100); } } STATIC _INLINE_ void *dapl_os_alloc (int size) { #ifdef DAPL_COUNTERS dapl_os_memchk(g_dapl_dbg_mem, "malloc"); #endif return malloc (size); } STATIC _INLINE_ void *dapl_os_realloc (void *ptr, int size) { return realloc(ptr, size); } STATIC _INLINE_ void dapl_os_free (void *ptr, int size) { free (ptr); } STATIC _INLINE_ void * dapl_os_memzero (void *loc, int size) { return memset (loc, 0, size); } STATIC _INLINE_ void * dapl_os_memcpy (void *dest, const void *src, int len) { return memcpy (dest, src, len); } STATIC _INLINE_ int dapl_os_memcmp (const void *mem1, const void *mem2, int len) { return memcmp (mem1, mem2, len); } /* * Memory coherency functions * For i386 Linux, there are no coherency issues so we just return success. */ STATIC _INLINE_ DAT_RETURN dapl_os_sync_rdma_read ( IN const DAT_LMR_TRIPLET *local_segments, IN DAT_VLEN num_segments) { return DAT_SUCCESS; } STATIC _INLINE_ DAT_RETURN dapl_os_sync_rdma_write ( IN const DAT_LMR_TRIPLET *local_segments, IN DAT_VLEN num_segments) { return DAT_SUCCESS; } /* * String Functions */ STATIC _INLINE_ unsigned int dapl_os_strlen(const char *str) { return strlen(str); } STATIC _INLINE_ char * dapl_os_strdup(const char *str) { return strdup(str); } STATIC _INLINE_ int dapl_os_pstrcmp(const char *pstr, const char *str) { int i, ii; int plen = strlen(pstr); int slen = strlen(str); for (i=0; i < slen; i++) { for (ii=0; ii < plen && i < slen; ii++, i++) { if ((pstr[ii] == str[i]) && (ii == plen-1)) return 0; else if (pstr[ii] != str[i]) break; } } return 1; } /* * Timer Functions */ typedef DAT_UINT64 DAPL_OS_TIMEVAL; typedef struct dapl_timer_entry DAPL_OS_TIMER; typedef unsigned long long int DAPL_OS_TICKS; /* function prototypes */ DAT_RETURN dapl_os_get_time (DAPL_OS_TIMEVAL *); /* * * Name Service Helper functions * */ #if defined(IBHOSTS_NAMING) || defined(CM_BUSTED) #define dapls_osd_getaddrinfo(name, addr_ptr) getaddrinfo(name,NULL,NULL,addr_ptr) #define dapls_osd_freeaddrinfo(addr) freeaddrinfo (addr) #endif /* IBHOSTS_NAMING */ /* * *printf format helpers. We use the C string constant concatenation * ability to define 64 bit formats, which unfortunatly are non standard * in the C compiler world. E.g. %llx for gcc, %I64x for Windows */ #include #define F64d "%"PRId64 #define F64u "%"PRIu64 #define F64x "%"PRIx64 #define F64X "%"PRIX64 /* * Conversion Functions */ STATIC _INLINE_ long int dapl_os_strtol(const char *nptr, char **endptr, int base) { return strtol(nptr, endptr, base); } /* * Helper Functions */ #define dapl_os_assert(expression) assert(expression) #define dapl_os_printf(...) printf(__VA_ARGS__) #define dapl_os_vprintf(fmt,args) vprintf(fmt,args) #define dapl_os_syslog(fmt,args) vsyslog(LOG_USER|LOG_WARNING,fmt,args) #define dapl_os_getpid (DAT_UINT32)getpid #define dapl_os_gettid (DAT_UINT32)pthread_self #endif /* _DAPL_OSD_H_ */ /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/000077500000000000000000000000001255317474200132215ustar00rootroot00000000000000dapl-2.1.5/dat/common/000077500000000000000000000000001255317474200145115ustar00rootroot00000000000000dapl-2.1.5/dat/common/dat_api.c000077500000000000000000000774551255317474200163030ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /********************************************************************** * * MODULE: dat_api.c * * PURPOSE: DAT Provider and Consumer registry functions. * Also provide small integers for IA_HANDLES * * $Id: dat_api.c 1326 2005-05-20 22:25:31Z jlentini $ **********************************************************************/ #include #include #include "dat_osd.h" #include "dat_init.h" /* * structure to deal with IA handles */ typedef struct { DAT_OS_LOCK handle_lock; unsigned long handle_max; void **handle_array; } DAT_HANDLE_VEC; /* * Number of IA Handle entries allocated at a time. */ #define DAT_HANDLE_ENTRY_STEP 64 static DAT_HANDLE_VEC g_hv; /*********************************************************************** * Function: dats_handle_init * * Initialize a handle_vector. Happens when the module initializes ***********************************************************************/ DAT_RETURN dats_handle_vector_init(void) { DAT_RETURN dat_status; unsigned long i; dat_status = DAT_SUCCESS; g_hv.handle_max = DAT_HANDLE_ENTRY_STEP; dat_status = dat_os_lock_init(&g_hv.handle_lock); if (DAT_SUCCESS != dat_status) { return dat_status; } g_hv.handle_array = dat_os_alloc(sizeof(void *) * DAT_HANDLE_ENTRY_STEP); if (g_hv.handle_array == NULL) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } for (i = 0; i < g_hv.handle_max; i++) { g_hv.handle_array[i] = NULL; } bail: return dat_status; } /*********************************************************************** * Function: dats_set_ia_handle * * Install an ia_handle into a handle vector and return a small * integer. ***********************************************************************/ DAT_IA_HANDLE dats_set_ia_handle(IN DAT_IA_HANDLE ia_handle) { unsigned long i; void **h; dat_os_lock(&g_hv.handle_lock); /* * Don't give out handle zero since that is DAT_HANDLE_NULL! */ for (i = 1; i < g_hv.handle_max; i++) { if (g_hv.handle_array[i] == NULL) { g_hv.handle_array[i] = ia_handle; dat_os_unlock(&g_hv.handle_lock); dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "dat_set_handle %p to %d\n", ia_handle, i); return DAT_UL_TO_IA_HANDLE(i); } } /* Didn't find an entry, grow the list & try again */ dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "Growing the handle array from %d to %d\n", g_hv.handle_max, g_hv.handle_max + DAT_HANDLE_ENTRY_STEP); /* reallocate the handle array */ h = dat_os_alloc(sizeof(void *) * (g_hv.handle_max + DAT_HANDLE_ENTRY_STEP)); if (h == NULL) { dat_os_unlock(&g_hv.handle_lock); return DAT_UL_TO_IA_HANDLE(-1); } /* copy old data to new area & free old memory */ memcpy((void *)h, (void *)g_hv.handle_array, sizeof(void *) * g_hv.handle_max); dat_os_free(g_hv.handle_array, sizeof(void *) * g_hv.handle_max); g_hv.handle_array = h; /* Initialize the new entries */ for (i = g_hv.handle_max; i < g_hv.handle_max + DAT_HANDLE_ENTRY_STEP; i++) { g_hv.handle_array[i] = NULL; } i = g_hv.handle_max; g_hv.handle_array[i] = ia_handle; g_hv.handle_max += DAT_HANDLE_ENTRY_STEP; dat_os_unlock(&g_hv.handle_lock); dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "dat_set_handle x %p to %d\n", ia_handle, i); return DAT_UL_TO_IA_HANDLE(i); } /*********************************************************************** * Function: dats_get_ia_handle( * * Get handle from vector OR vector from handle, return in OUT parameter * ***********************************************************************/ DAT_RETURN dats_get_ia_handle(IN DAT_IA_HANDLE handle, OUT DAT_IA_HANDLE * ia_handle_p) { DAT_RETURN dat_status = DAT_SUCCESS; if (handle == NULL) return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); /* handle to vector */ if (DAT_IA_HANDLE_TO_UL(handle) >= g_hv.handle_max) { unsigned long i; dat_os_lock(&g_hv.handle_lock); for (i = 1; i < g_hv.handle_max; i++) { if (g_hv.handle_array[i] == handle) { dat_os_unlock(&g_hv.handle_lock); *ia_handle_p = DAT_UL_TO_IA_HANDLE(i); goto bail; } } dat_os_unlock(&g_hv.handle_lock); dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); /* vector to handle */ } else { *ia_handle_p = g_hv.handle_array[DAT_IA_HANDLE_TO_UL(handle)]; if (*ia_handle_p == NULL) dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); } bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "dat_get_ia_handle from %d to %p\n", handle, *ia_handle_p); return dat_status; } /*********************************************************************** * Function: dats_is_ia_handle * * Unlike other handles, a DAT_IA_HANDLE is a small integer. Therefore, * we must be able to distinguish between a DAT_IA_HANDLE and other * types of handles (which are actually pointers). * * The current implementation assumes that any value for which an IA * handle exists is a DAT_IA_HANDLE. Unfortunately this will result in * false positives. In particular it may identify a NULL pointer as IA * handle 0. An implementation that does not have this deficiency would * be preferable. * ***********************************************************************/ DAT_RETURN dats_is_ia_handle(IN DAT_HANDLE dat_handle) { unsigned long handle = DAT_IA_HANDLE_TO_UL((DAT_IA_HANDLE) dat_handle); if (g_hv.handle_max <= handle) { return DAT_FALSE; } else if (NULL == g_hv.handle_array[handle]) { return DAT_FALSE; } else { return DAT_TRUE; } } /*********************************************************************** * Function: dats_free_ia_handle * * Free a handle in a handle vector ***********************************************************************/ DAT_RETURN dats_free_ia_handle(IN DAT_IA_HANDLE handle) { DAT_RETURN dat_status; if (DAT_IA_HANDLE_TO_UL(handle) >= g_hv.handle_max) { dat_status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); goto bail; } g_hv.handle_array[DAT_IA_HANDLE_TO_UL(handle)] = NULL; dat_status = DAT_SUCCESS; dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "dats_free_ia_handle %d\n", handle); bail: return dat_status; } /********************************************************************** * API definitions for common API entry points **********************************************************************/ DAT_RETURN DAT_API dat_ia_query(IN DAT_IA_HANDLE ia_handle, OUT DAT_EVD_HANDLE * async_evd_handle, IN DAT_IA_ATTR_MASK ia_attr_mask, OUT DAT_IA_ATTR * ia_attr, IN DAT_PROVIDER_ATTR_MASK provider_attr_mask, OUT DAT_PROVIDER_ATTR * provider_attr) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_IA_QUERY(dapl_ia_handle, async_evd_handle, ia_attr_mask, ia_attr, provider_attr_mask, provider_attr); } return dat_status; } DAT_RETURN DAT_API dat_set_consumer_context(IN DAT_HANDLE dat_handle, IN DAT_CONTEXT context) { if (dat_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } if (dats_is_ia_handle(dat_handle)) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle((DAT_IA_HANDLE) dat_handle, &dapl_ia_handle); /* failure to map the handle is unlikely but possible */ /* in a mult-threaded environment */ if (DAT_SUCCESS != dat_status) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } dat_handle = dapl_ia_handle; } return DAT_SET_CONSUMER_CONTEXT(dat_handle, context); } DAT_RETURN DAT_API dat_get_consumer_context(IN DAT_HANDLE dat_handle, OUT DAT_CONTEXT * context) { if (dat_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } if (dats_is_ia_handle(dat_handle)) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle((DAT_IA_HANDLE) dat_handle, &dapl_ia_handle); /* failure to map the handle is unlikely but possible */ /* in a mult-threaded environment */ if (DAT_SUCCESS != dat_status) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } dat_handle = dapl_ia_handle; } return DAT_GET_CONSUMER_CONTEXT(dat_handle, context); } DAT_RETURN DAT_API dat_get_handle_type(IN DAT_HANDLE dat_handle, OUT DAT_HANDLE_TYPE * type) { if (dat_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } if (dats_is_ia_handle(dat_handle)) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle((DAT_IA_HANDLE) dat_handle, &dapl_ia_handle); /* failure to map the handle is unlikely but possible */ /* in a mult-threaded environment */ if (DAT_SUCCESS != dat_status) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } dat_handle = dapl_ia_handle; } return DAT_GET_HANDLE_TYPE(dat_handle, type); } DAT_RETURN DAT_API dat_cr_query(IN DAT_CR_HANDLE cr_handle, IN DAT_CR_PARAM_MASK cr_param_mask, OUT DAT_CR_PARAM * cr_param) { if (cr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); } return DAT_CR_QUERY(cr_handle, cr_param_mask, cr_param); } DAT_RETURN DAT_API dat_cr_accept(IN DAT_CR_HANDLE cr_handle, IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data) { if (cr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); } return DAT_CR_ACCEPT(cr_handle, ep_handle, private_data_size, private_data); } DAT_RETURN DAT_API dat_cr_reject(IN DAT_CR_HANDLE cr_handle, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data) { if (cr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); } return DAT_CR_REJECT(cr_handle, private_data_size, private_data); } DAT_RETURN DAT_API dat_evd_resize(IN DAT_EVD_HANDLE evd_handle, IN DAT_COUNT evd_min_qlen) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_RESIZE(evd_handle, evd_min_qlen); } DAT_RETURN DAT_API dat_evd_post_se(IN DAT_EVD_HANDLE evd_handle, IN const DAT_EVENT * event) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_POST_SE(evd_handle, event); } DAT_RETURN DAT_API dat_evd_dequeue(IN DAT_EVD_HANDLE evd_handle, OUT DAT_EVENT * event) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_DEQUEUE(evd_handle, event); } DAT_RETURN DAT_API dat_evd_free(IN DAT_EVD_HANDLE evd_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_FREE(evd_handle); } DAT_RETURN DAT_API dat_evd_query(IN DAT_EVD_HANDLE evd_handle, IN DAT_EVD_PARAM_MASK evd_param_mask, OUT DAT_EVD_PARAM * evd_param) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_QUERY(evd_handle, evd_param_mask, evd_param); } DAT_RETURN DAT_API dat_ep_create(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_EVD_HANDLE recv_completion_evd_handle, IN DAT_EVD_HANDLE request_completion_evd_handle, IN DAT_EVD_HANDLE connect_evd_handle, IN const DAT_EP_ATTR * ep_attributes, OUT DAT_EP_HANDLE * ep_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_EP_CREATE(dapl_ia_handle, pz_handle, recv_completion_evd_handle, request_completion_evd_handle, connect_evd_handle, ep_attributes, ep_handle); } return dat_status; } DAT_RETURN DAT_API dat_ep_query(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, OUT DAT_EP_PARAM * ep_param) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_QUERY(ep_handle, ep_param_mask, ep_param); } DAT_RETURN DAT_API dat_ep_modify(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_PARAM_MASK ep_param_mask, IN const DAT_EP_PARAM * ep_param) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_MODIFY(ep_handle, ep_param_mask, ep_param); } DAT_RETURN DAT_API dat_ep_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR remote_ia_address, IN DAT_CONN_QUAL remote_conn_qual, IN DAT_TIMEOUT timeout, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data, IN DAT_QOS quality_of_service, IN DAT_CONNECT_FLAGS connect_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_CONNECT(ep_handle, remote_ia_address, remote_conn_qual, timeout, private_data_size, private_data, quality_of_service, connect_flags); } DAT_RETURN DAT_API dat_ep_common_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_IA_ADDRESS_PTR remote_ia_address, IN DAT_TIMEOUT timeout, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_COMMON_CONNECT(ep_handle, remote_ia_address, timeout, private_data_size, private_data); } DAT_RETURN DAT_API dat_ep_dup_connect(IN DAT_EP_HANDLE ep_handle, IN DAT_EP_HANDLE ep_dup_handle, IN DAT_TIMEOUT timeout, IN DAT_COUNT private_data_size, IN const DAT_PVOID private_data, IN DAT_QOS quality_of_service) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_DUP_CONNECT(ep_handle, ep_dup_handle, timeout, private_data_size, private_data, quality_of_service); } DAT_RETURN DAT_API dat_ep_disconnect(IN DAT_EP_HANDLE ep_handle, IN DAT_CLOSE_FLAGS close_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_DISCONNECT(ep_handle, close_flags); } DAT_RETURN DAT_API dat_ep_post_send(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_SEND(ep_handle, num_segments, local_iov, user_cookie, completion_flags); } DAT_RETURN DAT_API dat_ep_post_send_with_invalidate(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags, IN DAT_BOOLEAN invalidate_flag, IN DAT_RMR_CONTEXT rmr_context) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_SEND_WITH_INVALIDATE(ep_handle, num_segments, local_iov, user_cookie, completion_flags, invalidate_flag, rmr_context); } DAT_RETURN DAT_API dat_ep_post_recv(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_RECV(ep_handle, num_segments, local_iov, user_cookie, completion_flags); } DAT_RETURN DAT_API dat_ep_post_rdma_read(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_RDMA_READ(ep_handle, num_segments, local_iov, user_cookie, remote_iov, completion_flags); } DAT_RETURN DAT_API dat_ep_post_rdma_read_to_rmr(IN DAT_EP_HANDLE ep_handle, IN const DAT_RMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_RDMA_READ_TO_RMR(ep_handle, local_iov, user_cookie, remote_iov, completion_flags); } DAT_RETURN DAT_API dat_ep_post_rdma_write(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie, IN const DAT_RMR_TRIPLET * remote_iov, IN DAT_COMPLETION_FLAGS completion_flags) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_POST_RDMA_WRITE(ep_handle, num_segments, local_iov, user_cookie, remote_iov, completion_flags); } DAT_RETURN DAT_API dat_ep_get_status(IN DAT_EP_HANDLE ep_handle, OUT DAT_EP_STATE * ep_state, OUT DAT_BOOLEAN * recv_idle, OUT DAT_BOOLEAN * request_idle) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_GET_STATUS(ep_handle, ep_state, recv_idle, request_idle); } DAT_RETURN DAT_API dat_ep_free(IN DAT_EP_HANDLE ep_handle) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_FREE(ep_handle); } DAT_RETURN DAT_API dat_ep_reset(IN DAT_EP_HANDLE ep_handle) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_RESET(ep_handle); } DAT_RETURN DAT_API dat_lmr_free(IN DAT_LMR_HANDLE lmr_handle) { if (lmr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR); } return DAT_LMR_FREE(lmr_handle); } DAT_RETURN DAT_API dat_rmr_create(IN DAT_PZ_HANDLE pz_handle, OUT DAT_RMR_HANDLE * rmr_handle) { if (pz_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); } return DAT_RMR_CREATE(pz_handle, rmr_handle); } DAT_RETURN DAT_API dat_rmr_create_for_ep(IN DAT_PZ_HANDLE pz_handle, OUT DAT_RMR_HANDLE * rmr_handle) { if (pz_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); } return DAT_RMR_CREATE_FOR_EP(pz_handle, rmr_handle); } DAT_RETURN DAT_API dat_rmr_query(IN DAT_RMR_HANDLE rmr_handle, IN DAT_RMR_PARAM_MASK rmr_param_mask, OUT DAT_RMR_PARAM * rmr_param) { if (rmr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); } return DAT_RMR_QUERY(rmr_handle, rmr_param_mask, rmr_param); } DAT_RETURN DAT_API dat_rmr_bind(IN DAT_RMR_HANDLE rmr_handle, IN DAT_LMR_HANDLE lmr_handle, IN const DAT_LMR_TRIPLET * lmr_triplet, IN DAT_MEM_PRIV_FLAGS mem_priv, IN DAT_VA_TYPE va_type, IN DAT_EP_HANDLE ep_handle, IN DAT_RMR_COOKIE user_cookie, IN DAT_COMPLETION_FLAGS completion_flags, OUT DAT_RMR_CONTEXT * context) { if (rmr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); } return DAT_RMR_BIND(rmr_handle, lmr_handle, lmr_triplet, mem_priv, va_type, ep_handle, user_cookie, completion_flags, context); } DAT_RETURN DAT_API dat_rmr_free(IN DAT_RMR_HANDLE rmr_handle) { if (rmr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR); } return DAT_RMR_FREE(rmr_handle); } DAT_RETURN DAT_API dat_lmr_sync_rdma_read(IN DAT_IA_HANDLE ia_handle, IN const DAT_LMR_TRIPLET * local_segments, IN DAT_VLEN num_segments) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_LMR_SYNC_RDMA_READ(dapl_ia_handle, local_segments, num_segments); } return dat_status; } DAT_RETURN DAT_API dat_lmr_sync_rdma_write(IN DAT_IA_HANDLE ia_handle, IN const DAT_LMR_TRIPLET * local_segments, IN DAT_VLEN num_segments) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_LMR_SYNC_RDMA_WRITE(dapl_ia_handle, local_segments, num_segments); } return dat_status; } DAT_RETURN DAT_API dat_psp_create(IN DAT_IA_HANDLE ia_handle, IN DAT_CONN_QUAL conn_qual, IN DAT_EVD_HANDLE evd_handle, IN DAT_PSP_FLAGS psp_flags, OUT DAT_PSP_HANDLE * psp_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_PSP_CREATE(dapl_ia_handle, conn_qual, evd_handle, psp_flags, psp_handle); } return dat_status; } DAT_RETURN DAT_API dat_psp_create_any(IN DAT_IA_HANDLE ia_handle, OUT DAT_CONN_QUAL * conn_qual, IN DAT_EVD_HANDLE evd_handle, IN DAT_PSP_FLAGS psp_flags, OUT DAT_PSP_HANDLE * psp_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_PSP_CREATE_ANY(dapl_ia_handle, conn_qual, evd_handle, psp_flags, psp_handle); } return dat_status; } DAT_RETURN DAT_API dat_psp_query(IN DAT_PSP_HANDLE psp_handle, IN DAT_PSP_PARAM_MASK psp_param_mask, OUT DAT_PSP_PARAM * psp_param) { if (psp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); } return DAT_PSP_QUERY(psp_handle, psp_param_mask, psp_param); } DAT_RETURN DAT_API dat_psp_free(IN DAT_PSP_HANDLE psp_handle) { if (psp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); } return DAT_PSP_FREE(psp_handle); } DAT_RETURN DAT_API dat_csp_create(IN DAT_IA_HANDLE ia_handle, IN DAT_COMM * comm, IN DAT_IA_ADDRESS_PTR address, IN DAT_EVD_HANDLE evd_handle, OUT DAT_CSP_HANDLE * csp_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_CSP_CREATE(dapl_ia_handle, comm, address, evd_handle, csp_handle); } return dat_status; } DAT_RETURN DAT_API dat_csp_query(IN DAT_CSP_HANDLE csp_handle, IN DAT_CSP_PARAM_MASK csp_param_mask, OUT DAT_CSP_PARAM * csp_param) { if (csp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CSP); } return DAT_CSP_QUERY(csp_handle, csp_param_mask, csp_param); } DAT_RETURN DAT_API dat_csp_free(IN DAT_CSP_HANDLE csp_handle) { if (csp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CSP); } return DAT_CSP_FREE(csp_handle); } DAT_RETURN DAT_API dat_rsp_create(IN DAT_IA_HANDLE ia_handle, IN DAT_CONN_QUAL conn_qual, IN DAT_EP_HANDLE ep_handle, IN DAT_EVD_HANDLE evd_handle, OUT DAT_RSP_HANDLE * rsp_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_RSP_CREATE(dapl_ia_handle, conn_qual, ep_handle, evd_handle, rsp_handle); } return dat_status; } DAT_RETURN DAT_API dat_rsp_query(IN DAT_RSP_HANDLE rsp_handle, IN DAT_RSP_PARAM_MASK rsp_param_mask, OUT DAT_RSP_PARAM * rsp_param) { if (rsp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RSP); } return DAT_RSP_QUERY(rsp_handle, rsp_param_mask, rsp_param); } DAT_RETURN DAT_API dat_rsp_free(IN DAT_RSP_HANDLE rsp_handle) { if (rsp_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RSP); } return DAT_RSP_FREE(rsp_handle); } DAT_RETURN DAT_API dat_pz_create(IN DAT_IA_HANDLE ia_handle, OUT DAT_PZ_HANDLE * pz_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_PZ_CREATE(dapl_ia_handle, pz_handle); } return dat_status; } DAT_RETURN DAT_API dat_pz_query(IN DAT_PZ_HANDLE pz_handle, IN DAT_PZ_PARAM_MASK pz_param_mask, OUT DAT_PZ_PARAM * pz_param) { if (pz_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); } return DAT_PZ_QUERY(pz_handle, pz_param_mask, pz_param); } DAT_RETURN DAT_API dat_pz_free(IN DAT_PZ_HANDLE pz_handle) { if (pz_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ); } return DAT_PZ_FREE(pz_handle); } DAT_RETURN DAT_API dat_ep_create_with_srq(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_EVD_HANDLE recv_evd_handle, IN DAT_EVD_HANDLE request_evd_handle, IN DAT_EVD_HANDLE connect_evd_handle, IN DAT_SRQ_HANDLE srq_handle, IN const DAT_EP_ATTR * ep_attributes, OUT DAT_EP_HANDLE * ep_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_EP_CREATE_WITH_SRQ(dapl_ia_handle, pz_handle, recv_evd_handle, request_evd_handle, connect_evd_handle, srq_handle, ep_attributes, ep_handle); } return dat_status; } DAT_RETURN DAT_API dat_ep_recv_query(IN DAT_EP_HANDLE ep_handle, OUT DAT_COUNT * nbufs_allocated, OUT DAT_COUNT * bufs_alloc_span) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_RECV_QUERY(ep_handle, nbufs_allocated, bufs_alloc_span); } DAT_RETURN DAT_API dat_ep_set_watermark(IN DAT_EP_HANDLE ep_handle, IN DAT_COUNT soft_high_watermark, IN DAT_COUNT hard_high_watermark) { if (ep_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP); } return DAT_EP_SET_WATERMARK(ep_handle, soft_high_watermark, hard_high_watermark); } /* SRQ functions */ DAT_RETURN DAT_API dat_srq_create(IN DAT_IA_HANDLE ia_handle, IN DAT_PZ_HANDLE pz_handle, IN DAT_SRQ_ATTR * srq_attr, OUT DAT_SRQ_HANDLE * srq_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_SRQ_CREATE(dapl_ia_handle, pz_handle, srq_attr, srq_handle); } return dat_status; } DAT_RETURN DAT_API dat_srq_free(IN DAT_SRQ_HANDLE srq_handle) { if (srq_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); } return DAT_SRQ_FREE(srq_handle); } DAT_RETURN DAT_API dat_srq_post_recv(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT num_segments, IN DAT_LMR_TRIPLET * local_iov, IN DAT_DTO_COOKIE user_cookie) { if (srq_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); } return DAT_SRQ_POST_RECV(srq_handle, num_segments, local_iov, user_cookie); } DAT_RETURN DAT_API dat_srq_query(IN DAT_SRQ_HANDLE srq_handle, IN DAT_SRQ_PARAM_MASK srq_param_mask, OUT DAT_SRQ_PARAM * srq_param) { if (srq_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); } return DAT_SRQ_QUERY(srq_handle, srq_param_mask, srq_param); } DAT_RETURN DAT_API dat_srq_resize(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT srq_max_recv_dto) { if (srq_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); } return DAT_SRQ_RESIZE(srq_handle, srq_max_recv_dto); } DAT_RETURN DAT_API dat_srq_set_lw(IN DAT_SRQ_HANDLE srq_handle, IN DAT_COUNT low_watermark) { if (srq_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ); } return DAT_SRQ_SET_LW(srq_handle, low_watermark); } #ifdef DAT_EXTENSIONS extern int g_dat_extensions; extern DAT_RETURN udat_extension_open(IN const DAT_NAME_PTR name, IN DAT_EXTENDED_OP ext_op, IN va_list args); extern DAT_RETURN udat_extension_close(IN const DAT_NAME_PTR name, IN DAT_EXTENDED_OP ext_op, IN va_list args); /* Consumer API - dat_extension_op() * * Handle == IA, EP, EVD, etc * !Handle == direct extension operation to provider without device open * provider name supplied for linkage to library * */ DAT_RETURN DAT_API dat_extension_op(IN DAT_HANDLE handle, IN DAT_EXTENDED_OP ext_op, IN ...) { DAT_RETURN status; DAT_IA_HANDLE dapl_handle = handle; va_list args; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " dat_extension_op: (handle %p, op %d) called\n", handle, ext_op); /* only convert if ia_handle vector */ if (handle && dats_is_ia_handle(handle)) { if (dats_get_ia_handle(handle, &dapl_handle)) return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE1); } dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " dat_extension_op: dapl_handle %p \n", handle); /* verify provider extension support, if open */ if (dapl_handle && !g_dat_extensions) return DAT_ERROR(DAT_NOT_IMPLEMENTED, 0); /* extension will validate the handle based on op */ va_start(args, ext_op); if (ext_op & DAT_OPEN_EXTENSION_BASE) { const DAT_NAME_PTR name = va_arg(args, const DAT_NAME_PTR); dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " call udat_ext_open: (name %p, %s op %d) called\n", name, name, handle, ext_op); if (name == NULL) status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_ARG3); else status = udat_extension_open(name, ext_op, args); } else if (ext_op & DAT_CLOSE_EXTENSION_BASE) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " call udat_ext_close: handle %p\n", handle); status = udat_extension_close(handle, ext_op, args); } else { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " call dat_ext_op: handle %p\n", dapl_handle); status = DAT_HANDLE_EXTENDEDOP(dapl_handle, ext_op, args); } va_end(args); return status; } #endif /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/common/dat_dictionary.c000066400000000000000000000302201255317474200176470ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_dictionary.c * * PURPOSE: dictionary data structure * * $Id: dat_dictionary.c,v 1.17 2005/05/20 22:24:01 jlentini Exp $ **********************************************************************/ #include "dat_dictionary.h" /********************************************************************* * * * Structures * * * *********************************************************************/ typedef struct DAT_DICTIONARY_NODE { DAT_PROVIDER_INFO key; DAT_DICTIONARY_DATA data; struct DAT_DICTIONARY_NODE *prev; struct DAT_DICTIONARY_NODE *next; } DAT_DICTIONARY_NODE; struct DAT_DICTIONARY { DAT_DICTIONARY_NODE *head; DAT_DICTIONARY_NODE *tail; DAT_COUNT size; }; /********************************************************************* * * * Function Declarations * * * *********************************************************************/ static DAT_RETURN dat_dictionary_key_dup(const DAT_PROVIDER_INFO * old_key, DAT_PROVIDER_INFO * new_key); static DAT_BOOLEAN dat_dictionary_key_is_equal(const DAT_PROVIDER_INFO * key_a, const DAT_PROVIDER_INFO * key_b); /********************************************************************* * * * External Functions * * * *********************************************************************/ /*********************************************************************** * Function: dat_dictionary_create ***********************************************************************/ DAT_RETURN dat_dictionary_create(OUT DAT_DICTIONARY ** pp_dictionary) { DAT_DICTIONARY *p_dictionary; DAT_RETURN status; dat_os_assert(NULL != pp_dictionary); status = DAT_SUCCESS; /* create the dictionary */ p_dictionary = dat_os_alloc(sizeof(DAT_DICTIONARY)); if (NULL == p_dictionary) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_memset(p_dictionary, '\0', sizeof(DAT_DICTIONARY)); /* create the head node */ p_dictionary->head = dat_os_alloc(sizeof(DAT_DICTIONARY_NODE)); if (NULL == p_dictionary->head) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_memset(p_dictionary->head, '\0', sizeof(DAT_DICTIONARY_NODE)); /* create the tail node */ p_dictionary->tail = dat_os_alloc(sizeof(DAT_DICTIONARY_NODE)); if (NULL == p_dictionary->tail) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_memset(p_dictionary->tail, '\0', sizeof(DAT_DICTIONARY_NODE)); p_dictionary->head->next = p_dictionary->tail; p_dictionary->tail->prev = p_dictionary->head; *pp_dictionary = p_dictionary; bail: if (DAT_SUCCESS != status) { if (NULL != p_dictionary) { if (NULL != p_dictionary->head) { dat_os_free(p_dictionary->head, sizeof(DAT_DICTIONARY_NODE)); } if (NULL != p_dictionary->tail) { dat_os_free(p_dictionary->tail, sizeof(DAT_DICTIONARY_NODE)); } dat_os_free(p_dictionary, sizeof(DAT_DICTIONARY)); } } return status; } /*********************************************************************** * Function: dat_dictionary_destroy ***********************************************************************/ DAT_RETURN dat_dictionary_destroy(IN DAT_DICTIONARY * p_dictionary) { DAT_DICTIONARY_NODE *cur_node; dat_os_assert(NULL != p_dictionary); while (NULL != p_dictionary->head) { cur_node = p_dictionary->head; p_dictionary->head = cur_node->next; dat_os_free(cur_node, sizeof(DAT_DICTIONARY_NODE)); } dat_os_free(p_dictionary, sizeof(DAT_DICTIONARY)); return DAT_SUCCESS; } /*********************************************************************** * Function: dat_dictionary_size ***********************************************************************/ DAT_RETURN dat_dictionary_size(IN DAT_DICTIONARY * p_dictionary, OUT DAT_COUNT * p_size) { dat_os_assert(NULL != p_dictionary); dat_os_assert(NULL != p_size); *p_size = p_dictionary->size; return DAT_SUCCESS; } /*********************************************************************** * Function: dat_dictionary_entry_create ***********************************************************************/ DAT_RETURN dat_dictionary_entry_create(OUT DAT_DICTIONARY_ENTRY * p_entry) { DAT_DICTIONARY_NODE *node; DAT_RETURN dat_status; dat_os_assert(NULL != p_entry); dat_status = DAT_SUCCESS; node = dat_os_alloc(sizeof(DAT_DICTIONARY_NODE)); if (NULL == node) { dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } *p_entry = node; bail: return dat_status; } /*********************************************************************** * Function: dat_dictionary_entry_destroy ***********************************************************************/ DAT_RETURN dat_dictionary_entry_destroy(OUT DAT_DICTIONARY_ENTRY entry) { dat_os_free(entry, sizeof(DAT_DICTIONARY_NODE)); return DAT_SUCCESS; } /*********************************************************************** * Function: dat_dictionary_insert ***********************************************************************/ DAT_RETURN dat_dictionary_insert(IN DAT_DICTIONARY * p_dictionary, IN DAT_DICTIONARY_ENTRY entry, IN const DAT_PROVIDER_INFO * key, IN DAT_DICTIONARY_DATA data) { DAT_RETURN dat_status; DAT_DICTIONARY_NODE *cur_node, *prev_node, *next_node; dat_os_assert(NULL != p_dictionary); dat_os_assert(NULL != entry); cur_node = entry; if (DAT_SUCCESS == dat_dictionary_search(p_dictionary, key, NULL)) { dat_status = DAT_ERROR(DAT_PROVIDER_ALREADY_REGISTERED, 0); goto bail; } dat_status = dat_dictionary_key_dup(key, &cur_node->key); if (DAT_SUCCESS != dat_status) { goto bail; } /* insert node at end of list to preserve registration order */ prev_node = p_dictionary->tail->prev; next_node = p_dictionary->tail; cur_node->data = data; cur_node->next = next_node; cur_node->prev = prev_node; prev_node->next = cur_node; next_node->prev = cur_node; p_dictionary->size++; bail: return dat_status; } /*********************************************************************** * Function: dat_dictionary_search ***********************************************************************/ DAT_RETURN dat_dictionary_search(IN DAT_DICTIONARY * p_dictionary, IN const DAT_PROVIDER_INFO * key, OUT DAT_DICTIONARY_DATA * p_data) { DAT_DICTIONARY_NODE *cur_node; DAT_RETURN status; dat_os_assert(NULL != p_dictionary); status = DAT_ERROR(DAT_PROVIDER_NOT_FOUND, DAT_NAME_NOT_REGISTERED); for (cur_node = p_dictionary->head->next; p_dictionary->tail != cur_node; cur_node = cur_node->next) { if (DAT_TRUE == dat_dictionary_key_is_equal(&cur_node->key, key)) { if (NULL != p_data) { *p_data = cur_node->data; } status = DAT_SUCCESS; goto bail; } } bail: return status; } /*********************************************************************** * Function: dat_dictionary_enumerate ***********************************************************************/ DAT_RETURN dat_dictionary_enumerate(IN DAT_DICTIONARY * p_dictionary, IN DAT_DICTIONARY_DATA array[], IN DAT_COUNT array_size) { DAT_DICTIONARY_NODE *cur_node; DAT_COUNT i; DAT_RETURN status; dat_os_assert(NULL != p_dictionary); dat_os_assert(NULL != array); status = DAT_SUCCESS; if (array_size < p_dictionary->size) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, 0); goto bail; } for (cur_node = p_dictionary->head->next, i = 0; p_dictionary->tail != cur_node; cur_node = cur_node->next, i++) { array[i] = cur_node->data; } bail: return status; } /*********************************************************************** * Function: dat_dictionary_remove ***********************************************************************/ DAT_RETURN dat_dictionary_remove(IN DAT_DICTIONARY * p_dictionary, IN DAT_DICTIONARY_ENTRY * p_entry, IN const DAT_PROVIDER_INFO * key, OUT DAT_DICTIONARY_DATA * p_data) { DAT_DICTIONARY_NODE *cur_node, *prev_node, *next_node; DAT_RETURN status; dat_os_assert(NULL != p_dictionary); dat_os_assert(NULL != p_entry); status = DAT_ERROR(DAT_PROVIDER_NOT_FOUND, DAT_NAME_NOT_REGISTERED); for (cur_node = p_dictionary->head->next; p_dictionary->tail != cur_node; cur_node = cur_node->next) { if (DAT_TRUE == dat_dictionary_key_is_equal(&cur_node->key, key)) { if (NULL != p_data) { *p_data = cur_node->data; } prev_node = cur_node->prev; next_node = cur_node->next; prev_node->next = next_node; next_node->prev = prev_node; *p_entry = cur_node; p_dictionary->size--; status = DAT_SUCCESS; goto bail; } } bail: return status; } /********************************************************************* * * * Internal Function Definitions * * * *********************************************************************/ /*********************************************************************** * Function: dat_dictionary_key_create ***********************************************************************/ DAT_RETURN dat_dictionary_key_dup(const DAT_PROVIDER_INFO * old_key, DAT_PROVIDER_INFO * new_key) { dat_os_assert(NULL != old_key); dat_os_assert(NULL != new_key); dat_os_strncpy(new_key->ia_name, old_key->ia_name, DAT_NAME_MAX_LENGTH); new_key->dapl_version_major = old_key->dapl_version_major; new_key->dapl_version_minor = old_key->dapl_version_minor; new_key->is_thread_safe = old_key->is_thread_safe; return DAT_SUCCESS; } /*********************************************************************** * Function: dat_dictionary_key_is_equal ***********************************************************************/ DAT_BOOLEAN dat_dictionary_key_is_equal(const DAT_PROVIDER_INFO * key_a, const DAT_PROVIDER_INFO * key_b) { if ((dat_os_strlen(key_a->ia_name) == dat_os_strlen(key_b->ia_name)) && (!dat_os_strncmp (key_a->ia_name, key_b->ia_name, dat_os_strlen(key_a->ia_name))) && (key_a->dapl_version_major == key_b->dapl_version_major) && (key_a->dapl_version_minor == key_b->dapl_version_minor) && (key_a->is_thread_safe == key_b->is_thread_safe)) { return DAT_TRUE; } else { return DAT_FALSE; } } dapl-2.1.5/dat/common/dat_dictionary.h000066400000000000000000000071701255317474200176640ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_dictionary.h * * PURPOSE: dictionary data structure * * $Id: dat_dictionary.h,v 1.10 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #ifndef _DAT_DICTIONARY_H_ #define _DAT_DICTIONARY_H_ #include "dat_osd.h" /********************************************************************* * * * Typedefs * * * *********************************************************************/ typedef struct DAT_DICTIONARY DAT_DICTIONARY; typedef void * DAT_DICTIONARY_DATA; typedef void * DAT_DICTIONARY_ENTRY; /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ extern DAT_RETURN dat_dictionary_create ( OUT DAT_DICTIONARY **pp_dictionary); extern DAT_RETURN dat_dictionary_destroy ( IN DAT_DICTIONARY *p_dictionary); extern DAT_RETURN dat_dictionary_size ( IN DAT_DICTIONARY *p_dictionary, OUT DAT_COUNT *p_size); extern DAT_RETURN dat_dictionary_entry_create ( OUT DAT_DICTIONARY_ENTRY *p_entry); extern DAT_RETURN dat_dictionary_entry_destroy ( IN DAT_DICTIONARY_ENTRY entry); extern DAT_RETURN dat_dictionary_insert ( IN DAT_DICTIONARY *p_dictionary, IN DAT_DICTIONARY_ENTRY entry, IN const DAT_PROVIDER_INFO *key, IN DAT_DICTIONARY_DATA data); extern DAT_RETURN dat_dictionary_search ( IN DAT_DICTIONARY *p_dictionary, IN const DAT_PROVIDER_INFO *key, OUT DAT_DICTIONARY_DATA *p_data); extern DAT_RETURN dat_dictionary_enumerate ( IN DAT_DICTIONARY *p_dictionary, IN DAT_DICTIONARY_DATA array[], IN DAT_COUNT array_size); extern DAT_RETURN dat_dictionary_remove ( IN DAT_DICTIONARY *p_dictionary, IN DAT_DICTIONARY_ENTRY *p_entry, IN const DAT_PROVIDER_INFO *key, OUT DAT_DICTIONARY_DATA *p_data); #endif dapl-2.1.5/dat/common/dat_dr.c000066400000000000000000000221001255317474200161050ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_dr.c * * PURPOSE: dynamic registry implementation * * $Id: dat_dr.c,v 1.17 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #include #include "dat_dr.h" #include "dat_dictionary.h" /********************************************************************* * * * Global Variables * * * *********************************************************************/ static DAT_OS_LOCK g_dr_lock; static DAT_DICTIONARY *g_dr_dictionary = NULL; /********************************************************************* * * * External Functions * * * *********************************************************************/ //*********************************************************************** // Function: dat_dr_init //*********************************************************************** DAT_RETURN dat_dr_init(void) { DAT_RETURN status; status = dat_os_lock_init(&g_dr_lock); if (DAT_SUCCESS != status) { return status; } status = dat_dictionary_create(&g_dr_dictionary); if (DAT_SUCCESS != status) { return status; } return DAT_SUCCESS; } //*********************************************************************** // Function: dat_dr_fini //*********************************************************************** DAT_RETURN dat_dr_fini(void) { DAT_RETURN status; status = dat_os_lock_destroy(&g_dr_lock); if (DAT_SUCCESS != status) { return status; } status = dat_dictionary_destroy(g_dr_dictionary); if (DAT_SUCCESS != status) { return status; } return DAT_SUCCESS; } //*********************************************************************** // Function: dat_dr_insert //*********************************************************************** DAT_RETURN dat_dr_insert(IN const DAT_PROVIDER_INFO * info, IN DAT_DR_ENTRY * entry) { DAT_RETURN status; DAT_DICTIONARY_ENTRY dict_entry = NULL; DAT_DR_ENTRY *data; data = dat_os_alloc(sizeof(DAT_DR_ENTRY)); if (NULL == data) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } *data = *entry; status = dat_dictionary_entry_create(&dict_entry); if (DAT_SUCCESS != status) { goto bail; } dat_os_lock(&g_dr_lock); status = dat_dictionary_insert(g_dr_dictionary, dict_entry, info, (DAT_DICTIONARY_DATA *) data); dat_os_unlock(&g_dr_lock); bail: if (DAT_SUCCESS != status) { if (NULL != data) { dat_os_free(data, sizeof(DAT_DR_ENTRY)); } if (NULL != dict_entry) { (void)dat_dictionary_entry_destroy(dict_entry); } } return status; } //*********************************************************************** // Function: dat_dr_remove //*********************************************************************** DAT_RETURN dat_dr_remove(IN const DAT_PROVIDER_INFO * info) { DAT_DICTIONARY_ENTRY dict_entry; DAT_RETURN status; DAT_DICTIONARY_DATA data; dict_entry = NULL; dat_os_lock(&g_dr_lock); status = dat_dictionary_search(g_dr_dictionary, info, &data); if (DAT_SUCCESS != status) { /* return status from dat_dictionary_search() */ goto bail; } if (0 != ((DAT_DR_ENTRY *) data)->ref_count) { status = DAT_ERROR(DAT_PROVIDER_IN_USE, 0); goto bail; } status = dat_dictionary_remove(g_dr_dictionary, &dict_entry, info, &data); if (DAT_SUCCESS != status) { /* return status from dat_dictionary_remove() */ goto bail; } dat_os_free(data, sizeof(DAT_DR_ENTRY)); bail: dat_os_unlock(&g_dr_lock); if (NULL != dict_entry) { (void)dat_dictionary_entry_destroy(dict_entry); } return status; } //*********************************************************************** // Function: dat_dr_provider_open //*********************************************************************** DAT_RETURN dat_dr_provider_open(IN const DAT_PROVIDER_INFO * info, OUT DAT_IA_OPEN_FUNC * p_ia_open_func) { DAT_RETURN status; DAT_DICTIONARY_DATA data; dat_os_lock(&g_dr_lock); status = dat_dictionary_search(g_dr_dictionary, info, &data); dat_os_unlock(&g_dr_lock); if (DAT_SUCCESS == status) { ((DAT_DR_ENTRY *) data)->ref_count++; *p_ia_open_func = ((DAT_DR_ENTRY *) data)->ia_open_func; } return status; } //*********************************************************************** // Function: dat_dr_provider_open_ext //*********************************************************************** #ifdef DAT_EXTENSIONS DAT_RETURN dat_dr_provider_open_ext(IN const DAT_PROVIDER_INFO *info, OUT DAT_HANDLE_EXTENDEDOP_FUNC *p_ext_func) { DAT_RETURN status; DAT_DICTIONARY_DATA data; dat_os_lock(&g_dr_lock); status = dat_dictionary_search(g_dr_dictionary, info, &data); dat_os_unlock(&g_dr_lock); if (DAT_SUCCESS == status) { ((DAT_DR_ENTRY *) data)->ref_count++; *p_ext_func = ((DAT_DR_ENTRY *)data)->ia_ext_func; } return status; } #endif //*********************************************************************** // Function: dat_dr_provider_close //*********************************************************************** DAT_RETURN dat_dr_provider_close(IN const DAT_PROVIDER_INFO * info) { DAT_RETURN status; DAT_DICTIONARY_DATA data; dat_os_lock(&g_dr_lock); status = dat_dictionary_search(g_dr_dictionary, info, &data); dat_os_unlock(&g_dr_lock); if (DAT_SUCCESS == status) { ((DAT_DR_ENTRY *) data)->ref_count--; } return status; } //*********************************************************************** // Function: dat_dr_size //*********************************************************************** DAT_RETURN dat_dr_size(OUT DAT_COUNT * size) { return dat_dictionary_size(g_dr_dictionary, size); } //*********************************************************************** // Function: dat_dr_list //*********************************************************************** DAT_RETURN dat_dr_list(IN DAT_COUNT max_to_return, OUT DAT_COUNT * entries_returned, OUT DAT_PROVIDER_INFO * (dat_provider_list[])) { DAT_DR_ENTRY **array; DAT_COUNT array_size; DAT_COUNT i; DAT_RETURN status; array = NULL; status = DAT_SUCCESS; /* The dictionary size may increase between the call to */ /* dat_dictionary_size() and dat_dictionary_enumerate(). */ /* Therefore we loop until a successful enumeration is made. */ *entries_returned = 0; for (;;) { status = dat_dictionary_size(g_dr_dictionary, &array_size); if (status != DAT_SUCCESS) { goto bail; } if (array_size == 0) { status = DAT_SUCCESS; goto bail; } array = dat_os_alloc(array_size * sizeof(DAT_DR_ENTRY *)); if (array == NULL) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_lock(&g_dr_lock); status = dat_dictionary_enumerate(g_dr_dictionary, (DAT_DICTIONARY_DATA *) array, array_size); dat_os_unlock(&g_dr_lock); if (DAT_SUCCESS == status) { break; } else { dat_os_free(array, array_size * sizeof(DAT_DR_ENTRY *)); array = NULL; continue; } } for (i = 0; (i < max_to_return) && (i < array_size); i++) { if (NULL == dat_provider_list[i]) { status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } *dat_provider_list[i] = array[i]->info; } *entries_returned = i; bail: if (NULL != array) { dat_os_free(array, array_size * sizeof(DAT_DR_ENTRY *)); } return status; } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/common/dat_dr.h000066400000000000000000000070001255317474200161140ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_dr.h * * PURPOSE: dynamic registry interface declarations * * $Id: dat_dr.h,v 1.12 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #ifndef __DAT_DR_H__ #define __DAT_DR_H__ #include "dat_osd.h" #include /* Provider API function prototypes */ /********************************************************************* * * * Strucutres * * * *********************************************************************/ typedef struct { DAT_COUNT ref_count; DAT_IA_OPEN_FUNC ia_open_func; DAT_PROVIDER_INFO info; #ifdef DAT_EXTENSIONS DAT_HANDLE_EXTENDEDOP_FUNC ia_ext_func; #endif /* DAT_EXTENSIONS */ } DAT_DR_ENTRY; /********************************************************************* * * * Function Declarations * * * *********************************************************************/ extern DAT_RETURN dat_dr_init ( void ); extern DAT_RETURN dat_dr_fini ( void ); extern DAT_RETURN dat_dr_insert ( IN const DAT_PROVIDER_INFO *info, IN DAT_DR_ENTRY *entry ); extern DAT_RETURN dat_dr_remove ( IN const DAT_PROVIDER_INFO *info ); extern DAT_RETURN dat_dr_provider_open ( IN const DAT_PROVIDER_INFO *info, OUT DAT_IA_OPEN_FUNC *p_ia_open_func ); #ifdef DAT_EXTENSIONS extern DAT_RETURN dat_dr_provider_open_ext ( IN const DAT_PROVIDER_INFO *info, OUT DAT_HANDLE_EXTENDEDOP_FUNC *p_ext_func ); #endif extern DAT_RETURN dat_dr_provider_close ( IN const DAT_PROVIDER_INFO *info); extern DAT_RETURN dat_dr_size ( OUT DAT_COUNT *size); extern DAT_RETURN dat_dr_list ( IN DAT_COUNT max_to_return, OUT DAT_COUNT *entries_returned, OUT DAT_PROVIDER_INFO * (dat_provider_list[]) ); #endif dapl-2.1.5/dat/common/dat_init.c000066400000000000000000000120031255317474200164440ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_init.c * * PURPOSE: DAT registry implementation for uDAPL * Description: init and fini functions for DAT module. * * $Id: dat_init.c,v 1.18 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #include #include "dat_init.h" #include "dat_dr.h" #include "dat_osd.h" #ifndef DAT_NO_STATIC_REGISTRY #include "dat_sr.h" #endif /********************************************************************* * * * Global Variables * * * *********************************************************************/ /* * Ideally, the following two rules could be enforced: * * - The DAT Registry's initialization function is executed before that * of any DAT Providers and hence all calls into the registry occur * after the registry module is initialized. * * - The DAT Registry's deinitialization function is executed after that * of any DAT Providers and hence all calls into the registry occur * before the registry module is deinitialized. * * However, on many platforms few guarantees are provided regarding the * order in which module initialization and deinitialization functions * are invoked. * * To understand why these rules are difficult to enforce using only * features common to all platforms, consider the Linux platform. The order * in which Linux shared libraries are loaded into a process's address space * is undefined. When a DAT consumer explicitly links to DAT provider * libraries, the order in which library initialization and deinitialization * functions are invoked becomes important. In this scenario, a DAPL provider * may call dat_registry_add_provider() before the registry has been * initialized. * * We assume that modules are loaded with a single thread. Given * this assumption, we can use a simple state variable to determine * the state of the DAT registry. */ static DAT_MODULE_STATE g_module_state = DAT_MODULE_STATE_UNINITIALIZED; //*********************************************************************** // Function: dat_module_get_state //*********************************************************************** DAT_MODULE_STATE dat_module_get_state(void) { return g_module_state; } //*********************************************************************** // Function: dat_init //*********************************************************************** void dat_init(void) { if (DAT_MODULE_STATE_UNINITIALIZED == g_module_state) { /* * update the module state flag immediately in case there * is a recursive call to dat_init(). */ g_module_state = DAT_MODULE_STATE_INITIALIZING; dat_os_dbg_init(); dats_handle_vector_init(); dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC, "DAT Registry: Started (dat_init)\n"); #ifndef DAT_NO_STATIC_REGISTRY dat_sr_init(); #endif dat_dr_init(); g_module_state = DAT_MODULE_STATE_INITIALIZED; } } //*********************************************************************** // Function: dat_fini //*********************************************************************** void dat_fini(void) { if (DAT_MODULE_STATE_INITIALIZED == g_module_state) { g_module_state = DAT_MODULE_STATE_DEINITIALIZING; dat_dr_fini(); #ifndef DAT_NO_STATIC_REGISTRY dat_sr_fini(); #endif dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC, "DAT Registry: Stopped (dat_fini)\n"); g_module_state = DAT_MODULE_STATE_DEINITIALIZED; } } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/common/dat_init.h000066400000000000000000000063471255317474200164670ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_init.h * * PURPOSE: DAT registry global data * * $Id: dat_init.h,v 1.16 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #ifndef _DAT_INIT_H_ #define _DAT_INIT_H_ #include "dat_osd.h" /********************************************************************* * * * Enumerations * * * *********************************************************************/ typedef enum { DAT_MODULE_STATE_UNINITIALIZED, DAT_MODULE_STATE_INITIALIZING, DAT_MODULE_STATE_INITIALIZED, DAT_MODULE_STATE_DEINITIALIZING, DAT_MODULE_STATE_DEINITIALIZED } DAT_MODULE_STATE; /********************************************************************* * * * Function Prototypes * * * *********************************************************************/ DAT_MODULE_STATE dat_module_get_state ( void ) ; #if defined(_MSC_VER) || defined(_WIN64) || defined(_WIN32) /* NT. MSC compiler, Win32/64 platform */ void dat_init ( void ); void dat_fini ( void ); #else /* GNU C */ void dat_init ( void ) __attribute__ ((constructor)); void dat_fini ( void ) __attribute__ ((destructor)); #endif extern DAT_RETURN dats_handle_vector_init ( void ); extern DAT_IA_HANDLE dats_set_ia_handle ( IN DAT_IA_HANDLE ia_handle); extern DAT_RETURN dats_get_ia_handle( IN DAT_IA_HANDLE handle, OUT DAT_IA_HANDLE *ia_handle_p); extern DAT_BOOLEAN dats_is_ia_handle ( IN DAT_HANDLE dat_handle); extern DAT_RETURN dats_free_ia_handle( IN DAT_IA_HANDLE handle); #endif dapl-2.1.5/dat/common/dat_sr.c000077500000000000000000000347541255317474200161510ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_sr.c * * PURPOSE: static registry implementation * * $Id: dat_sr.c,v 1.17 2005/03/24 05:58:27 jlentini Exp $ **********************************************************************/ #include "dat_sr.h" #include "dat_dictionary.h" #include "udat_sr_parser.h" /********************************************************************* * * * Global Variables * * * *********************************************************************/ static DAT_OS_LOCK g_sr_lock; static DAT_DICTIONARY *g_sr_dictionary = NULL; /********************************************************************* * * * External Functions * * * *********************************************************************/ //*********************************************************************** // Function: dat_sr_init //*********************************************************************** DAT_RETURN dat_sr_init(void) { DAT_RETURN status; status = dat_os_lock_init(&g_sr_lock); if (DAT_SUCCESS != status) { return status; } status = dat_dictionary_create(&g_sr_dictionary); if (DAT_SUCCESS != status) { return status; } /* * Since DAT allows providers to be loaded by either the static * registry or explicitly through OS dependent methods, do not * return an error if no providers are loaded via the static registry. */ (void)dat_sr_load(); return DAT_SUCCESS; } //*********************************************************************** // Function: dat_sr_fini //*********************************************************************** extern DAT_RETURN dat_sr_fini(void) { DAT_RETURN status; status = dat_sr_remove_all(g_sr_dictionary); if (DAT_SUCCESS != status) { return status; } status = dat_os_lock_destroy(&g_sr_lock); if (DAT_SUCCESS != status) { return status; } status = dat_dictionary_destroy(g_sr_dictionary); if (DAT_SUCCESS != status) { return status; } return DAT_SUCCESS; } //*********************************************************************** // Function: dat_sr_insert //*********************************************************************** extern DAT_RETURN dat_sr_insert(IN const DAT_PROVIDER_INFO * info, IN DAT_SR_ENTRY * entry) { DAT_RETURN status; DAT_SR_ENTRY *data; DAT_OS_SIZE lib_path_len; DAT_OS_SIZE ia_params_len; DAT_DICTIONARY_ENTRY dict_entry; DAT_DICTIONARY_DATA prev_data; if (NULL == (data = dat_os_alloc(sizeof(DAT_SR_ENTRY)))) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_memset(data, '\0', sizeof(DAT_SR_ENTRY)); lib_path_len = strlen(entry->lib_path); data->lib_path_size = (lib_path_len + 1) * sizeof(char); if (NULL == (data->lib_path = dat_os_alloc(data->lib_path_size))) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_strncpy(data->lib_path, entry->lib_path, lib_path_len); data->lib_path[lib_path_len] = '\0'; ia_params_len = strlen(entry->ia_params); data->ia_params_size = (ia_params_len + 1) * sizeof(char); if (NULL == (data->ia_params = dat_os_alloc(data->ia_params_size))) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_strncpy(data->ia_params, entry->ia_params, ia_params_len); data->ia_params[ia_params_len] = '\0'; data->info = entry->info; data->lib_handle = entry->lib_handle; data->ref_count = entry->ref_count; data->next = NULL; dict_entry = NULL; status = dat_dictionary_entry_create(&dict_entry); if (DAT_SUCCESS != status) { goto bail; } dat_os_lock(&g_sr_lock); status = dat_dictionary_search(g_sr_dictionary, info, &prev_data); if (DAT_SUCCESS == status) { /* We already have a dictionary entry, so we don't need a new one. * This means there are multiple duplicate names in dat.conf, * but presumably they have different paths. Simply link the * new entry at the end of the chain of like-named entries. */ (void)dat_dictionary_entry_destroy(dict_entry); dict_entry = NULL; /* Find the next available slot in this chain */ while (NULL != ((DAT_SR_ENTRY *) prev_data)->next) { prev_data = ((DAT_SR_ENTRY *) prev_data)->next; } dat_os_assert(NULL != prev_data); ((DAT_SR_ENTRY *) prev_data)->next = data; } else { status = dat_dictionary_insert(g_sr_dictionary, dict_entry, info, (DAT_DICTIONARY_DATA *) data); } dat_os_unlock(&g_sr_lock); bail: if (DAT_SUCCESS != status) { if (NULL != data) { if (NULL != data->lib_path) { dat_os_free(data->lib_path, data->lib_path_size); } if (NULL != data->ia_params) { dat_os_free(data->ia_params, data->ia_params_size); } dat_os_free(data, sizeof(DAT_SR_ENTRY)); } if (NULL != dict_entry) { (void)dat_dictionary_entry_destroy(dict_entry); } } return status; } //*********************************************************************** // Function: dat_sr_size //*********************************************************************** extern DAT_RETURN dat_sr_remove(IN const DAT_PROVIDER_INFO *info) { DAT_DICTIONARY_ENTRY dict_entry = NULL; DAT_RETURN status = DAT_ERROR(DAT_PROVIDER_IN_USE, 0); DAT_SR_ENTRY *data; dat_os_lock(&g_sr_lock); status = dat_dictionary_search(g_sr_dictionary, info, (DAT_DICTIONARY_DATA)&data); if (DAT_SUCCESS != status) goto bail; if (0 != ((DAT_SR_ENTRY *) data)->ref_count) goto bail; status = dat_dictionary_remove(g_sr_dictionary, &dict_entry, info, (DAT_DICTIONARY_DATA)&data); if (DAT_SUCCESS != status) goto bail; dat_os_free(data->lib_path, data->lib_path_size); dat_os_free(data->ia_params, data->ia_params_size); dat_os_free(data, sizeof(DAT_SR_ENTRY)); bail: dat_os_unlock(&g_sr_lock); if (NULL != dict_entry) (void)dat_dictionary_entry_destroy(dict_entry); return status; } //*********************************************************************** // Function: dat_sr_size //*********************************************************************** extern DAT_RETURN dat_sr_size(OUT DAT_COUNT * size) { return dat_dictionary_size(g_sr_dictionary, size); } //*********************************************************************** // Function: dat_sr_list //*********************************************************************** extern DAT_RETURN dat_sr_list(IN DAT_COUNT max_to_return, OUT DAT_COUNT * entries_returned, OUT DAT_PROVIDER_INFO * (dat_provider_list[])) { DAT_SR_ENTRY **array; DAT_COUNT array_size; DAT_COUNT i; DAT_RETURN status; array = NULL; status = DAT_SUCCESS; /* The dictionary size may increase between the call to */ /* dat_dictionary_size() and dat_dictionary_enumerate(). */ /* Therefore we loop until a successful enumeration is made. */ *entries_returned = 0; for (;;) { status = dat_dictionary_size(g_sr_dictionary, &array_size); if (DAT_SUCCESS != status) { goto bail; } if (array_size == 0) { status = DAT_SUCCESS; goto bail; } array = dat_os_alloc(array_size * sizeof(DAT_SR_ENTRY *)); if (array == NULL) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto bail; } dat_os_lock(&g_sr_lock); status = dat_dictionary_enumerate(g_sr_dictionary, (DAT_DICTIONARY_DATA *) array, array_size); dat_os_unlock(&g_sr_lock); if (DAT_SUCCESS == status) { break; } else { dat_os_free(array, array_size * sizeof(DAT_SR_ENTRY *)); array = NULL; continue; } } for (i = 0; (i < max_to_return) && (i < array_size); i++) { if (NULL == dat_provider_list[i]) { status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); goto bail; } *dat_provider_list[i] = array[i]->info; } *entries_returned = i; bail: if (NULL != array) { dat_os_free(array, array_size * sizeof(DAT_SR_ENTRY *)); } return status; } //*********************************************************************** // Function: dat_sr_remove_all() //*********************************************************************** extern DAT_RETURN dat_sr_remove_all(IN DAT_DICTIONARY *p_dictionary) { int i; DAT_RETURN status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); DAT_COUNT entries = 0; DAT_PROVIDER_INFO **plist; /* get provider count */ dat_sr_size(&entries); /* need array of pointers to info */ plist = dat_os_alloc(entries * sizeof(DAT_PROVIDER_INFO *)); if (plist == NULL) goto bail; dat_os_memset(plist, 0, entries * sizeof(DAT_PROVIDER_INFO *)); for (i = 0; i < entries; i++ ) { plist[i] = dat_os_alloc(sizeof(DAT_PROVIDER_INFO)); if (plist[i] == NULL) goto bail; } /* remove and destroy each SR entry */ status = dat_sr_list(entries, &entries, plist); if (DAT_SUCCESS != status) goto bail; for (i=0;iia_name); goto bail; } dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, " libdat2 removed SR" " provider: IA %s\n", plist[i]->ia_name); } bail: for (i = 0; i < entries; i++ ) { if (plist[i] != NULL) dat_os_free(plist[i], sizeof(DAT_PROVIDER_INFO)); } dat_os_free(plist, entries * sizeof(DAT_PROVIDER_INFO *)); return status; } //*********************************************************************** // Function: dat_sr_provider_open //*********************************************************************** extern DAT_RETURN dat_sr_provider_open(IN const DAT_PROVIDER_INFO * info) { DAT_RETURN status; DAT_SR_ENTRY *data; DAT_DICTIONARY_DATA dict_data; dat_os_lock(&g_sr_lock); status = dat_dictionary_search(g_sr_dictionary, info, &dict_data); if (DAT_SUCCESS == status) { data = (DAT_SR_ENTRY *) dict_data; while (data != NULL) { if (0 == data->ref_count) { /* * Try to open the path. If it fails, try the next * path in the chain. Only the first successful library * open matters, the others will be unused. */ dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: IA %s, trying to load library %s\n", data->info.ia_name, data->lib_path); status = dat_os_library_load(data->lib_path, &data->lib_handle); if (status == DAT_SUCCESS) { #ifdef DAT_DBG dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT2 Registry: IA %s, loaded library %s\n", data->info.ia_name, data->lib_path); #endif data->ref_count++; data->init_func = dat_os_library_sym(data->lib_handle, DAT_PROVIDER_INIT_FUNC_STR); data->fini_func = dat_os_library_sym(data->lib_handle, DAT_PROVIDER_FINI_FUNC_STR); /* Warning: DAT and DAPL libraries not ext compatible */ #ifdef DAT_EXTENSIONS { void *fncptr; fncptr = dat_os_library_sym(data-> lib_handle, "dapl_extensions"); if ((dat_os_library_error() != NULL) || (fncptr == NULL)) { dat_os_dbg_print (DAT_OS_DBG_TYPE_SR, "DAT Registry: WARNING: library %s, " "extended DAT expected extended uDAPL: %s\n", data->lib_path, strerror(errno)); } } #endif if (NULL != data->init_func) { (*data->init_func) (&data->info, data-> ia_params); } else { dat_os_dbg_print (DAT_OS_DBG_TYPE_SR, "DAT Registry: Cannot find library init func (%s)\n", DAT_PROVIDER_INIT_FUNC_STR); } /* exit after we find the first valid entry */ break; } else { dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: static registry unable to " "load library %s\n", data->lib_path); } } else { data->ref_count++; break; } data = data->next; } } dat_os_unlock(&g_sr_lock); return status; } //*********************************************************************** // Function: dat_sr_provider_close //*********************************************************************** extern DAT_RETURN dat_sr_provider_close(IN const DAT_PROVIDER_INFO * info) { DAT_RETURN status; DAT_SR_ENTRY *data; DAT_DICTIONARY_DATA dict_data; dat_os_lock(&g_sr_lock); status = dat_dictionary_search(g_sr_dictionary, info, &dict_data); if (DAT_SUCCESS == status) { data = (DAT_SR_ENTRY *) dict_data; while (data != NULL) { if (1 == data->ref_count) { dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: IA %s, unloading library %s\n", data->info.ia_name, data->lib_path); if (NULL != data->fini_func) { (*data->fini_func) (&data->info); } status = dat_os_library_unload(data->lib_handle); if (status == DAT_SUCCESS) { data->ref_count--; } break; } else if (data->ref_count > 0) { data->ref_count--; break; } data = data->next; } } dat_os_unlock(&g_sr_lock); return status; } dapl-2.1.5/dat/common/dat_sr.h000066400000000000000000000070511255317474200161410ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_sr.h * * PURPOSE: static registry (SR) inteface declarations * * $Id: dat_sr.h,v 1.12 2005/03/24 05:58:28 jlentini Exp $ **********************************************************************/ #ifndef _DAT_SR_H_ #define _DAT_SR_H_ #include #include #include "dat_osd.h" #include "dat_dictionary.h" /********************************************************************* * * * Strucutres * * * *********************************************************************/ typedef struct DAT_SR_ENTRY { DAT_PROVIDER_INFO info; char * lib_path; char * ia_params; DAT_OS_SIZE lib_path_size; DAT_OS_SIZE ia_params_size; DAT_OS_LIBRARY_HANDLE lib_handle; DAT_PROVIDER_INIT_FUNC init_func; DAT_PROVIDER_FINI_FUNC fini_func; DAT_COUNT ref_count; struct DAT_SR_ENTRY *next; } DAT_SR_ENTRY; /********************************************************************* * * * Function Declarations * * * *********************************************************************/ extern DAT_RETURN dat_sr_init ( void ); extern DAT_RETURN dat_sr_fini ( void ); extern DAT_RETURN dat_sr_insert ( IN const DAT_PROVIDER_INFO *info, IN DAT_SR_ENTRY *entry ); extern DAT_RETURN dat_sr_remove( IN const DAT_PROVIDER_INFO *info); extern DAT_RETURN dat_sr_size ( OUT DAT_COUNT *size); extern DAT_RETURN dat_sr_list ( IN DAT_COUNT max_to_return, OUT DAT_COUNT *entries_returned, OUT DAT_PROVIDER_INFO * (dat_provider_list[]) ); extern DAT_RETURN dat_sr_remove_all( IN DAT_DICTIONARY *p_dictionary); extern DAT_RETURN dat_sr_provider_open ( IN const DAT_PROVIDER_INFO *info ); extern DAT_RETURN dat_sr_provider_close ( IN const DAT_PROVIDER_INFO *info ); #endif dapl-2.1.5/dat/common/dat_strerror.c000066400000000000000000000406001255317474200173670ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_strerror.c * * PURPOSE: Convert DAT_RETURN values to humman readable string * * $Id: dat_strerror.c,v 1.10 2005/03/24 05:58:28 jlentini Exp $ **********************************************************************/ #ifdef __KDAPL__ #include #else /*__UDAPL__*/ #include #endif /* __UDAPL__ */ /********************************************************************* * * * Internal Function Declarations * * * *********************************************************************/ static DAT_RETURN dat_strerror_major(IN DAT_RETURN value, OUT const char **message); static DAT_RETURN dat_strerror_minor(IN DAT_RETURN value, OUT const char **message); /********************************************************************* * * * Internal Function Definitions * * * *********************************************************************/ static DAT_RETURN dat_strerror_major(IN DAT_RETURN value, OUT const char **message) { switch (DAT_GET_TYPE(value)) { case DAT_SUCCESS: { *message = "DAT_SUCCESS"; return DAT_SUCCESS; } case DAT_ABORT: { *message = "DAT_ABORT"; return DAT_SUCCESS; } case DAT_CONN_QUAL_IN_USE: { *message = "DAT_CONN_QUAL_IN_USE"; return DAT_SUCCESS; } case DAT_INSUFFICIENT_RESOURCES: { *message = "DAT_INSUFFICIENT_RESOURCES"; return DAT_SUCCESS; } case DAT_INTERNAL_ERROR: { *message = "DAT_INTERNAL_ERROR"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE: { *message = "DAT_INVALID_HANDLE"; return DAT_SUCCESS; } case DAT_INVALID_PARAMETER: { *message = "DAT_INVALID_PARAMETER"; return DAT_SUCCESS; } case DAT_INVALID_STATE: { *message = "DAT_INVALID_STATE"; return DAT_SUCCESS; } case DAT_LENGTH_ERROR: { *message = "DAT_LENGTH_ERROR"; return DAT_SUCCESS; } case DAT_MODEL_NOT_SUPPORTED: { *message = "DAT_MODEL_NOT_SUPPORTED"; return DAT_SUCCESS; } case DAT_PROVIDER_NOT_FOUND: { *message = "DAT_PROVIDER_NOT_FOUND"; return DAT_SUCCESS; } case DAT_PRIVILEGES_VIOLATION: { *message = "DAT_PRIVILEGES_VIOLATION"; return DAT_SUCCESS; } case DAT_PROTECTION_VIOLATION: { *message = "DAT_PROTECTION_VIOLATION"; return DAT_SUCCESS; } case DAT_QUEUE_EMPTY: { *message = "DAT_QUEUE_EMPTY"; return DAT_SUCCESS; } case DAT_QUEUE_FULL: { *message = "DAT_QUEUE_FULL"; return DAT_SUCCESS; } case DAT_TIMEOUT_EXPIRED: { *message = "DAT_TIMEOUT_EXPIRED"; return DAT_SUCCESS; } case DAT_PROVIDER_ALREADY_REGISTERED: { *message = "DAT_PROVIDER_ALREADY_REGISTERED"; return DAT_SUCCESS; } case DAT_PROVIDER_IN_USE: { *message = "DAT_PROVIDER_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_ADDRESS: { *message = "DAT_INVALID_ADDRESS"; return DAT_SUCCESS; } case DAT_INTERRUPTED_CALL: { *message = "DAT_INTERRUPTED_CALL"; return DAT_SUCCESS; } case DAT_NOT_IMPLEMENTED: { *message = "DAT_NOT_IMPLEMENTED"; return DAT_SUCCESS; } default: { *message = "unknown error"; return DAT_INVALID_PARAMETER; } } } static DAT_RETURN dat_strerror_minor(IN DAT_RETURN value, OUT const char **message) { switch (DAT_GET_SUBTYPE(value)) { case DAT_NO_SUBTYPE: /* NO subtype */ { *message = ""; return DAT_SUCCESS; } case DAT_SUB_INTERRUPTED: { *message = "DAT_SUB_INTERRUPTED"; return DAT_SUCCESS; } case DAT_RESOURCE_MEMORY: { *message = "DAT_RESOURCE_MEMORY"; return DAT_SUCCESS; } case DAT_RESOURCE_DEVICE: { *message = "DAT_RESOURCE_DEVICE"; return DAT_SUCCESS; } case DAT_RESOURCE_TEP: { *message = "DAT_RESOURCE_TEP"; return DAT_SUCCESS; } case DAT_RESOURCE_TEVD: { *message = "DAT_RESOURCE_TEVD"; return DAT_SUCCESS; } case DAT_RESOURCE_PROTECTION_DOMAIN: { *message = "DAT_RESOURCE_PROTECTION_DOMAIN"; return DAT_SUCCESS; } case DAT_RESOURCE_MEMORY_REGION: { *message = "DAT_RESOURCE_MEMORY_REGION"; return DAT_SUCCESS; } case DAT_RESOURCE_ERROR_HANDLER: { *message = "DAT_RESOURCE_ERROR_HANDLER"; return DAT_SUCCESS; } case DAT_RESOURCE_CREDITS: { *message = "DAT_RESOURCE_CREDITS"; return DAT_SUCCESS; } case DAT_RESOURCE_SRQ: { *message = "DAT_RESOURCE_SRQ"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_IA: { *message = "DAT_INVALID_HANDLE_IA"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EP: { *message = "DAT_INVALID_HANDLE_EP"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_LMR: { *message = "DAT_INVALID_HANDLE_LMR"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_RMR: { *message = "DAT_INVALID_HANDLE_RMR"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_PZ: { *message = "DAT_INVALID_HANDLE_PZ"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_PSP: { *message = "DAT_INVALID_HANDLE_PSP"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_RSP: { *message = "DAT_INVALID_HANDLE_RSP"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_CR: { *message = "DAT_INVALID_HANDLE_CR"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_CNO: { *message = "DAT_INVALID_HANDLE_CNO"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EVD_CR: { *message = "DAT_INVALID_HANDLE_EVD_CR"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EVD_REQUEST: { *message = "DAT_INVALID_HANDLE_EVD_REQUEST"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EVD_RECV: { *message = "DAT_INVALID_HANDLE_EVD_RECV"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EVD_CONN: { *message = "DAT_INVALID_HANDLE_EVD_CONN"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_EVD_ASYNC: { *message = "DAT_INVALID_HANDLE_EVD_ASYNC"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_SRQ: { *message = "DAT_INVALID_HANDLE_SRQ"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE_CSP: { *message = "DAT_INVALID_HANDLE_CSP"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE1: { *message = "DAT_INVALID_HANDLE1"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE2: { *message = "DAT_INVALID_HANDLE2"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE3: { *message = "DAT_INVALID_HANDLE3"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE4: { *message = "DAT_INVALID_HANDLE4"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE5: { *message = "DAT_INVALID_HANDLE5"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE6: { *message = "DAT_INVALID_HANDLE6"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE7: { *message = "DAT_INVALID_HANDLE7"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE8: { *message = "DAT_INVALID_HANDLE8"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE9: { *message = "DAT_INVALID_HANDLE9"; return DAT_SUCCESS; } case DAT_INVALID_HANDLE10: { *message = "DAT_INVALID_HANDLE10"; return DAT_SUCCESS; } case DAT_INVALID_ARG1: { *message = "DAT_INVALID_ARG1"; return DAT_SUCCESS; } case DAT_INVALID_ARG2: { *message = "DAT_INVALID_ARG2"; return DAT_SUCCESS; } case DAT_INVALID_ARG3: { *message = "DAT_INVALID_ARG3"; return DAT_SUCCESS; } case DAT_INVALID_ARG4: { *message = "DAT_INVALID_ARG4"; return DAT_SUCCESS; } case DAT_INVALID_ARG5: { *message = "DAT_INVALID_ARG5"; return DAT_SUCCESS; } case DAT_INVALID_ARG6: { *message = "DAT_INVALID_ARG6"; return DAT_SUCCESS; } case DAT_INVALID_ARG7: { *message = "DAT_INVALID_ARG7"; return DAT_SUCCESS; } case DAT_INVALID_ARG8: { *message = "DAT_INVALID_ARG8"; return DAT_SUCCESS; } case DAT_INVALID_ARG9: { *message = "DAT_INVALID_ARG9"; return DAT_SUCCESS; } case DAT_INVALID_ARG10: { *message = "DAT_INVALID_ARG10"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_UNCONNECTED: { *message = "DAT_INVALID_STATE_EP_UNCONNECTED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_ACTCONNPENDING: { *message = "DAT_INVALID_STATE_EP_ACTCONNPENDING"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_PASSCONNPENDING: { *message = "DAT_INVALID_STATE_EP_PASSCONNPENDING"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_TENTCONNPENDING: { *message = "DAT_INVALID_STATE_EP_TENTCONNPENDING"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_CONNECTED: { *message = "DAT_INVALID_STATE_EP_CONNECTED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_DISCONNECTED: { *message = "DAT_INVALID_STATE_EP_DISCONNECTED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_RESERVED: { *message = "DAT_INVALID_STATE_EP_RESERVED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_COMPLPENDING: { *message = "DAT_INVALID_STATE_EP_COMPLPENDING"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_DISCPENDING: { *message = "DAT_INVALID_STATE_EP_DISCPENDING"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_PROVIDERCONTROL: { *message = "DAT_INVALID_STATE_EP_PROVIDERCONTROL"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_NOTREADY: { *message = "DAT_INVALID_STATE_EP_NOTREADY"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_RECV_WATERMARK: { *message = "DAT_INVALID_STATE_EP_RECV_WATERMARK"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_PZ: { *message = "DAT_INVALID_STATE_EP_PZ"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_EVD_REQUEST: { *message = "DAT_INVALID_STATE_EP_EVD_REQUEST"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_EVD_RECV: { *message = "DAT_INVALID_STATE_EP_EVD_RCV"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_EVD_CONNECT: { *message = "DAT_INVALID_STATE_EP_EVD_CONNECT"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_UNCONFIGURED: { *message = "DAT_INVALID_STATE_EP_UNCONFIGURED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_UNCONFRESERVED: { *message = "DAT_INVALID_STATE_EP_UNCONFRESERVED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_UNCONFPASSIVE: { *message = "DAT_INVALID_STATE_EP_UNCONFPASSIVE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EP_UNCONFTENTATIVE: { *message = "DAT_INVALID_STATE_EP_UNCONFTENTATIVE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_CNO_IN_USE: { *message = "DAT_INVALID_STATE_CNO_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_CNO_DEAD: { *message = "DAT_INVALID_STATE_CNO_DEAD"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_OPEN: { *message = "DAT_INVALID_STATE_EVD_OPEN"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_ENABLED: { *message = "DAT_INVALID_STATE_EVD_ENABLED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_DISABLED: { *message = "DAT_INVALID_STATE_EVD_DISABLED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_WAITABLE: { *message = "DAT_INVALID_STATE_EVD_WAITABLE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_UNWAITABLE: { *message = "DAT_INVALID_STATE_EVD_UNWAITABLE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_IN_USE: { *message = "DAT_INVALID_STATE_EVD_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_CONFIG_NOTIFY: { *message = "DAT_INVALID_STATE_EVD_CONFIG_NOTIFY"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_CONFIG_SOLICITED: { *message = "DAT_INVALID_STATE_EVD_CONFIG_SOLICITED"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_CONFIG_THRESHOLD: { *message = "DAT_INVALID_STATE_EVD_CONFIG_THRESHOLD"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_WAITER: { *message = "DAT_INVALID_STATE_EVD_WAITER"; return DAT_SUCCESS; } case DAT_INVALID_STATE_EVD_ASYNC: { *message = "DAT_INVALID_STATE_EVD_ASYNC"; return DAT_SUCCESS; } case DAT_INVALID_STATE_IA_IN_USE: { *message = "DAT_INVALID_STATE_IA_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_LMR_IN_USE: { *message = "DAT_INVALID_STATE_LMR_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_LMR_FREE: { *message = "DAT_INVALID_STATE_LMR_FREE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_PZ_IN_USE: { *message = "DAT_INVALID_STATE_PZ_IN_USE"; return DAT_SUCCESS; } case DAT_INVALID_STATE_PZ_FREE: { *message = "DAT_INVALID_STATE_PZ_FREE"; return DAT_SUCCESS; } case DAT_PRIVILEGES_READ: { *message = "DAT_PRIVILEGES_READ"; return DAT_SUCCESS; } case DAT_PRIVILEGES_WRITE: { *message = "DAT_PRIVILEGES_WRITE"; return DAT_SUCCESS; } case DAT_PRIVILEGES_RDMA_READ: { *message = "DAT_PRIVILEGES_RDMA_READ"; return DAT_SUCCESS; } case DAT_PRIVILEGES_RDMA_WRITE: { *message = "DAT_PRIVILEGES_RDMA_WRITE"; return DAT_SUCCESS; } case DAT_PROTECTION_READ: { *message = "DAT_PROTECTION_READ"; return DAT_SUCCESS; } case DAT_PROTECTION_WRITE: { *message = "DAT_PROTECTION_WRITE"; return DAT_SUCCESS; } case DAT_PROTECTION_RDMA_READ: { *message = "DAT_PROTECTION_RDMA_READ"; return DAT_SUCCESS; } case DAT_PROTECTION_RDMA_WRITE: { *message = "DAT_PROTECTION_RDMA_WRITE"; return DAT_SUCCESS; } case DAT_INVALID_ADDRESS_UNSUPPORTED: { *message = "DAT_INVALID_ADDRESS_UNSUPPORTED"; return DAT_SUCCESS; } case DAT_INVALID_ADDRESS_UNREACHABLE: { *message = "DAT_INVALID_ADDRESS_UNREACHABLE"; return DAT_SUCCESS; } case DAT_INVALID_ADDRESS_MALFORMED: { *message = "DAT_INVALID_ADDRESS_MALFORMED"; return DAT_SUCCESS; } case DAT_NAME_NOT_REGISTERED: { *message = "DAT_NAME_NOT_REGISTERED"; return DAT_SUCCESS; } case DAT_MAJOR_NOT_FOUND: { *message = "DAT_MAJOR_NOT_FOUND"; return DAT_SUCCESS; } case DAT_MINOR_NOT_FOUND: { *message = "DAT_MINOR_NOT_FOUND"; return DAT_SUCCESS; } case DAT_THREAD_SAFETY_NOT_FOUND: { *message = "DAT_THREAD_SAFETY_NOT_FOUND"; return DAT_SUCCESS; } default: { *message = "unknown minor error"; return DAT_INVALID_PARAMETER; } } } /********************************************************************* * * * External Function Definitions * * * *********************************************************************/ DAT_RETURN DAT_API dat_strerror(IN DAT_RETURN value, OUT const char **major_message, OUT const char **minor_message) { /* * The DAT specification contains a note to implementers * suggesting that the consumer's DAT_RETURN value be used * as an index into a table of text strings. However, * the DAT_RETURN values are not consecutive. Therefore this * implementation does not follow the suggested implementation. */ if (DAT_SUCCESS != dat_strerror_major(value, major_message)) { return DAT_INVALID_PARAMETER; } else if (minor_message != NULL) { if (DAT_SUCCESS != dat_strerror_minor(value, minor_message)) { return DAT_INVALID_PARAMETER; } } return DAT_SUCCESS; } dapl-2.1.5/dat/include/000077500000000000000000000000001255317474200146445ustar00rootroot00000000000000dapl-2.1.5/dat/include/dat2/000077500000000000000000000000001255317474200154765ustar00rootroot00000000000000dapl-2.1.5/dat/include/dat2/dat.h000077500000000000000000001444611255317474200164340ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /*************************************************************** * * HEADER: dat.h * * PURPOSE: defines the common DAT API for uDAPL and kDAPL. * * Description: Header file for "DAPL: Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * All global symbols are prepended with DAT_ or dat_ * All DAT objects have an 'api' tag which, such as 'EP' or 'LMR' * The method table is in the provider definition structure. * * ***************************************************************/ #ifndef _DAT_H_ #define _DAT_H_ #include #ifdef __cplusplus extern "C" { #endif /* Generic DAT types */ typedef char * DAT_NAME_PTR; /* Format for ia_name and attributes */ #define DAT_NAME_MAX_LENGTH 256 /* * Used for provider, vendor, transport, hardware-specific attributes * definitions. */ typedef struct dat_named_attr { const char * name; /* Name of attribute */ const char * value; /* Value of attribute */ } DAT_NAMED_ATTR; typedef enum dat_boolean { DAT_FALSE = 0, DAT_TRUE = 1 } DAT_BOOLEAN; #ifdef DAT_EXTENSIONS #define DAT_IB_EXTENSION 1 #define DAT_IW_EXTENSION 2 #endif /* DAT_EXTENSIONS */ typedef DAT_UINT32 DAT_HA_LB; #define DAT_HA_LB_NONE (DAT_HA_LB)0 #define DAT_HA_LB_INTERCOMM (DAT_HA_LB)1 #define DAT_HA_LB_INTRACOMM (DAT_HA_LB)2 typedef union dat_context { DAT_PVOID as_ptr; DAT_UINT64 as_64; DAT_UVERYLONG as_index; } DAT_CONTEXT; typedef DAT_CONTEXT DAT_DTO_COOKIE; typedef DAT_CONTEXT DAT_RMR_COOKIE; typedef enum dat_completion_flags { /* Completes with notification */ DAT_COMPLETION_DEFAULT_FLAG = 0x00, /* Completions suppressed if successful */ DAT_COMPLETION_SUPPRESS_FLAG = 0x01, /* Sender controlled notification for recv completion */ DAT_COMPLETION_SOLICITED_WAIT_FLAG = 0x02, /* Completions with unsignaled notifications */ DAT_COMPLETION_UNSIGNALLED_FLAG = 0x04, /* Do not start processing until all previous RDMA reads complete. */ DAT_COMPLETION_BARRIER_FENCE_FLAG = 0x08, /* Only valid for uDAPL as EP attribute for Recv Completion flags. * Waiter unblocking is controlled by the Threshold value of * dat_evd_wait. UNSIGNALLED for RECV is not allowed when EP has * this attribute. */ DAT_COMPLETION_EVD_THRESHOLD_FLAG = 0x10, /* Only valid for kDAPL * Do not start processing LMR invalidate until all * previously posted DTOs to the EP Request Queue * have been completed. * The value for LMR Invalidate Fence does not * conflict with uDAPL so it can be extended * to uDAPL usage later. */ DAT_COMPLETION_LMR_INVALIDATE_FENCE_FLAG = 0x20 } DAT_COMPLETION_FLAGS; typedef DAT_UINT32 DAT_TIMEOUT; /* microseconds */ /* timeout = infinity */ #define DAT_TIMEOUT_INFINITE ((DAT_TIMEOUT) ~0) /* dat handles */ typedef DAT_PVOID DAT_HANDLE; typedef DAT_HANDLE DAT_CR_HANDLE; typedef DAT_HANDLE DAT_EP_HANDLE; typedef DAT_HANDLE DAT_EVD_HANDLE; typedef DAT_HANDLE DAT_IA_HANDLE; typedef DAT_HANDLE DAT_LMR_HANDLE; typedef DAT_HANDLE DAT_PSP_HANDLE; typedef DAT_HANDLE DAT_PZ_HANDLE; typedef DAT_HANDLE DAT_RMR_HANDLE; typedef DAT_HANDLE DAT_RSP_HANDLE; typedef DAT_HANDLE DAT_SRQ_HANDLE; typedef DAT_HANDLE DAT_CSP_HANDLE; typedef enum dat_dtos { DAT_DTO_SEND, DAT_DTO_RDMA_WRITE, DAT_DTO_RDMA_READ, DAT_DTO_RECEIVE, DAT_DTO_RECEIVE_WITH_INVALIDATE, DAT_DTO_BIND_MW, /* DAT 2.0 review, binds are reported via DTO events */ DAT_DTO_LMR_FMR, /* kdat specific */ DAT_DTO_LMR_INVALIDATE /* kdat specific */ #ifdef DAT_EXTENSIONS ,DAT_DTO_EXTENSION_BASE /* To be used by DAT extensions as a starting point of extension DTOs */ #endif /* DAT_EXTENSIONS */ } DAT_DTOS; /* dat NULL handles */ #define DAT_HANDLE_NULL ((DAT_HANDLE)NULL) typedef DAT_SOCK_ADDR* DAT_IA_ADDRESS_PTR; typedef DAT_UINT64 DAT_CONN_QUAL; typedef DAT_UINT64 DAT_PORT_QUAL; /* QOS definitions */ typedef enum dat_qos { DAT_QOS_BEST_EFFORT = 0x00, DAT_QOS_HIGH_THROUGHPUT = 0x01, DAT_QOS_LOW_LATENCY = 0x02, /* not low latency, nor high throughput */ DAT_QOS_ECONOMY = 0x04, /* both low latency and high throughput */ DAT_QOS_PREMIUM = 0x08 } DAT_QOS; /* * FLAGS */ /* for backward compatibility */ #define DAT_CONNECT_MULTIPATH_REQUESTED_FLAG DAT_CONNECT_MULTIPATH_FLAG typedef enum dat_connect_flags { DAT_CONNECT_DEFAULT_FLAG = 0x00, DAT_CONNECT_MULTIPATH_REQUESTED_FLAG = 0x01, DAT_CONNECT_MULTIPATH_REQUIRED_FLAG = 0x02 } DAT_CONNECT_FLAGS; typedef enum dat_close_flags { DAT_CLOSE_ABRUPT_FLAG = 0x00, DAT_CLOSE_GRACEFUL_FLAG = 0x01 } DAT_CLOSE_FLAGS; #define DAT_CLOSE_DEFAULT DAT_CLOSE_ABRUPT_FLAG typedef enum dat_evd_flags { DAT_EVD_SOFTWARE_FLAG = 0x001, DAT_EVD_CR_FLAG = 0x010, DAT_EVD_DTO_FLAG = 0x020, DAT_EVD_CONNECTION_FLAG = 0x040, DAT_EVD_RMR_BIND_FLAG = 0x080, DAT_EVD_ASYNC_FLAG = 0x100, /* DAT events only, no software events */ DAT_EVD_DEFAULT_FLAG = 0x1F0 #ifdef DAT_EXTENSIONS /* To be used by DAT extensions as a starting point for extended evd flags */ ,DAT_EVD_EXTENSION_BASE = 0x200 #endif /* DAT_EXTENSIONS */ } DAT_EVD_FLAGS; typedef enum dat_psp_flags { DAT_PSP_CONSUMER_FLAG = 0x00, /* Consumer creates an Endpoint */ DAT_PSP_PROVIDER_FLAG = 0x01 /* Provider creates an Endpoint */ } DAT_PSP_FLAGS; /* * Memory Buffers * * Both LMR and RMR triplets specify 64-bit addresses in the local host's byte * order, even when that exceeds the size of a DAT_PVOID for the host * architecture. */ /* * Both LMR and RMR Triplets specify 64-bit addresses in the local host * order, even when that exceeds the size of a void pointer for the host * architecture. The DAT_VADDR type that represents addresses is in the * native byte-order of the local host. Helper macros that allow Consumers * to convert DAT_VADDR into various orders that might be useful for * inclusion of RMR Triplets into a payload of a message follow. * * DAT defines the following macros to convert the fields on an RMR Triplet * to defined byte orders to allow their export by the Consumer over wire * protocols. DAT does not define how the two peers decide which byte should be * used. * * DAT_LMRC_TO_LSB(lmrc) returns the supplied LMR Context in ls-byte * order. * DAT_LMRC_TO_MSB(lmrc) returns the supplied LMR Context in ms-byte * order. * DAT_RMRC_TO_LSB(rmrc) returns the supplied RMR Context in ls-byte * order. * DAT_RMRC_TO_MSB(rmrc) returns the supplied RMR Context in ms-byte * order. * DAT_VADDR_TO_LSB(vaddr) returns the supplied Virtual Address in ls-byte * order. * DAT_VADDR_TO_MSB(vaddr) returns the supplied Virtual Address in * ms-byte order. * DAT_VLEN_TO_LSB(vlen) returns the supplied length in ls-byte order. * DAT_VLEN_TO_MSB(vlen) returns the supplied length in ms-byte order. * * Consumers are free to use 64-bit or 32-bit arithmetic for local or remote * memory address and length manipulation in their preferred byte-order. Only the * LMR and RMR Triplets passed to a Provider as part of a Posted DTO are * required to be in 64-bit address and local host order formats. Providers shall * convert RMR_Triplets to a Transport-required wire format. * * For the best performance, Consumers should align each buffer segment to * the boundary specified by the dat_optimal_alignment. */ typedef DAT_UINT32 DAT_LMR_CONTEXT; typedef DAT_UINT32 DAT_RMR_CONTEXT; typedef DAT_UINT64 DAT_VLEN; typedef DAT_UINT64 DAT_VADDR; typedef DAT_UINT32 DAT_SEG_LENGTH; /* The maximum data segment length */ typedef struct dat_provider_attr DAT_PROVIDER_ATTR; typedef struct dat_evd_param DAT_EVD_PARAM; typedef struct dat_lmr_param DAT_LMR_PARAM; typedef enum dat_lmr_param_mask DAT_LMR_PARAM_MASK; /* It is legal for the Consumer to specify zero for segment_length * of the dat_lmr_triplet. When 0 is specified for the * segment_length then the other two elements of the * dat_lmr_triplet are irrelevant and can be invalid. */ typedef struct dat_lmr_triplet { DAT_VADDR virtual_address;/* 64-bit address */ DAT_SEG_LENGTH segment_length; /* 32-bit length */ DAT_LMR_CONTEXT lmr_context; /* 32-bit lmr_context */ } DAT_LMR_TRIPLET; typedef struct dat_rmr_triplet { DAT_VADDR virtual_address;/* 64-bit address */ DAT_SEG_LENGTH segment_length; /* 32-bit length */ DAT_RMR_CONTEXT rmr_context; /* 32-bit rmr_context */ } DAT_RMR_TRIPLET; /* Memory privileges */ typedef enum dat_mem_priv_flags { DAT_MEM_PRIV_NONE_FLAG = 0x00, DAT_MEM_PRIV_LOCAL_READ_FLAG = 0x01, DAT_MEM_PRIV_REMOTE_READ_FLAG = 0x02, DAT_MEM_PRIV_LOCAL_WRITE_FLAG = 0x10, DAT_MEM_PRIV_REMOTE_WRITE_FLAG = 0x20, DAT_MEM_PRIV_ALL_FLAG = 0x33 #ifdef DAT_EXTENSIONS /* To be used by DAT extensions as a starting point of extension memory privileges */ ,DAT_MEM_PRIV_EXTENSION_BASE = 0x40 #endif /* DAT_EXTENSIONS */ } DAT_MEM_PRIV_FLAGS; /* For backward compatibility with DAT-1.0, memory privileges values are * supported */ #define DAT_MEM_PRIV_READ_FLAG (DAT_MEM_PRIV_LOCAL_READ_FLAG | DAT_MEM_PRIV_REMOTE_READ_FLAG) #define DAT_MEM_PRIV_WRITE_FLAG (DAT_MEM_PRIV_LOCAL_WRITE_FLAG | DAT_MEM_PRIV_REMOTE_WRITE_FLAG) /* LMR VA types */ typedef enum dat_va_type { DAT_VA_TYPE_VA = 0x0, DAT_VA_TYPE_ZB = 0x1 } DAT_VA_TYPE; /* RMR Arguments & RMR Arguments Mask */ /* DAPL 2.0 addition */ /* Defines RMR protection scope */ typedef enum dat_rmr_scope { DAT_RMR_SCOPE_EP, /* bound to at most one EP at a time. */ DAT_RMR_SCOPE_PZ, /* bound to a Protection Zone */ DAT_RMR_SCOPE_ANY /* Supports all types */ } DAT_RMR_SCOPE; typedef struct dat_rmr_param { DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_LMR_TRIPLET lmr_triplet; DAT_MEM_PRIV_FLAGS mem_priv; DAT_RMR_CONTEXT rmr_context; DAT_RMR_SCOPE rmr_scope; DAT_VA_TYPE va_type; } DAT_RMR_PARAM; typedef enum dat_rmr_param_mask { DAT_RMR_FIELD_IA_HANDLE = 0x01, DAT_RMR_FIELD_PZ_HANDLE = 0x02, DAT_RMR_FIELD_LMR_TRIPLET = 0x04, DAT_RMR_FIELD_MEM_PRIV = 0x08, DAT_RMR_FIELD_RMR_CONTEXT = 0x10, DAT_RMR_FIELD_RMR_SCOPE = 0x20, DAT_RMR_FIELD_VA_TYPE = 0x40, DAT_RMR_FIELD_ALL = 0x7F } DAT_RMR_PARAM_MASK; /* Provider attributes */ typedef enum dat_iov_ownership { /* Not a modification by the Provider; the Consumer can use anytime. */ DAT_IOV_CONSUMER = 0x0, /* Provider does not modify returned IOV DTO on completion. */ DAT_IOV_PROVIDER_NOMOD = 0x1, /* Provider can modify IOV DTO on completion; can't trust it. */ DAT_IOV_PROVIDER_MOD = 0x2 } DAT_IOV_OWNERSHIP; typedef enum dat_ep_creator_for_psp { DAT_PSP_CREATES_EP_NEVER, /* Provider never creates Endpoint. */ DAT_PSP_CREATES_EP_IFASKED, /* Provider creates Endpoint if asked. */ DAT_PSP_CREATES_EP_ALWAYS /* Provider always creates Endpoint. */ } DAT_EP_CREATOR_FOR_PSP; /* General Interface Adapter attributes. These apply to both udat and kdat. */ /* To support backwards compatibility for DAPL-1.0 */ #define max_rdma_read_per_ep max_rdma_read_per_ep_in #define DAT_IA_FIELD_IA_MAX_DTO_PER_OP DAT_IA_FIELD_IA_MAX_DTO_PER_EP_IN /* To support backwards compatibility for DAPL-1.0 & DAPL-1.1 */ #define max_mtu_size max_message_size /* Query for provider IA extension support */ typedef enum dat_extension { DAT_EXTENSION_NONE,/* no extension supported. */ DAT_EXTENSION_IB, /* IB extension. */ DAT_EXTENSION_IW /* iWARP extension. */ } DAT_EXTENSION; typedef struct dat_ia_attr DAT_IA_ATTR; /* To support backwards compatibility for DAPL-1.0 & DAPL-1.1 */ #define DAT_IA_FIELD_IA_MAX_MTU_SIZE DAT_IA_FIELD_IA_MAX_MESSAGE_SIZE typedef DAT_UINT64 DAT_IA_ATTR_MASK; #define DAT_IA_FIELD_IA_ADAPTER_NAME UINT64_C(0x000000001) #define DAT_IA_FIELD_IA_VENDOR_NAME UINT64_C(0x000000002) #define DAT_IA_FIELD_IA_HARDWARE_MAJOR_VERSION UINT64_C(0x000000004) #define DAT_IA_FIELD_IA_HARDWARE_MINOR_VERSION UINT64_C(0x000000008) #define DAT_IA_FIELD_IA_FIRMWARE_MAJOR_VERSION UINT64_C(0x000000010) #define DAT_IA_FIELD_IA_FIRMWARE_MINOR_VERSION UINT64_C(0x000000020) #define DAT_IA_FIELD_IA_ADDRESS_PTR UINT64_C(0x000000040) #define DAT_IA_FIELD_IA_MAX_EPS UINT64_C(0x000000080) #define DAT_IA_FIELD_IA_MAX_DTO_PER_EP UINT64_C(0x000000100) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_PER_EP_IN UINT64_C(0x000000200) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_PER_EP_OUT UINT64_C(0x000000400) #define DAT_IA_FIELD_IA_MAX_EVDS UINT64_C(0x000000800) #define DAT_IA_FIELD_IA_MAX_EVD_QLEN UINT64_C(0x000001000) #define DAT_IA_FIELD_IA_MAX_IOV_SEGMENTS_PER_DTO UINT64_C(0x000002000) #define DAT_IA_FIELD_IA_MAX_LMRS UINT64_C(0x000004000) #define DAT_IA_FIELD_IA_MAX_LMR_BLOCK_SIZE UINT64_C(0x000008000) #define DAT_IA_FIELD_IA_MAX_LMR_VIRTUAL_ADDRESS UINT64_C(0x000010000) #define DAT_IA_FIELD_IA_MAX_PZS UINT64_C(0x000020000) #define DAT_IA_FIELD_IA_MAX_MESSAGE_SIZE UINT64_C(0x000040000) #define DAT_IA_FIELD_IA_MAX_RDMA_SIZE UINT64_C(0x000080000) #define DAT_IA_FIELD_IA_MAX_RMRS UINT64_C(0x000100000) #define DAT_IA_FIELD_IA_MAX_RMR_TARGET_ADDRESS UINT64_C(0x000200000) #define DAT_IA_FIELD_IA_MAX_SRQS UINT64_C(0x000400000) #define DAT_IA_FIELD_IA_MAX_EP_PER_SRQ UINT64_C(0x000800000) #define DAT_IA_FIELD_IA_MAX_RECV_PER_SRQ UINT64_C(0x001000000) #define DAT_IA_FIELD_IA_MAX_IOV_SEGMENTS_PER_RDMA_READ UINT64_C(0x002000000) #define DAT_IA_FIELD_IA_MAX_IOV_SEGMENTS_PER_RDMA_WRITE UINT64_C(0x004000000) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_IN UINT64_C(0x008000000) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_OUT UINT64_C(0x010000000) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_PER_EP_IN_GUARANTEED UINT64_C(0x020000000) #define DAT_IA_FIELD_IA_MAX_RDMA_READ_PER_EP_OUT_GUARANTEED UINT64_C(0x040000000) #define DAT_IA_FIELD_IA_ZB_SUPPORTED UINT64_C(0x080000000) #define DAT_IA_FIELD_IA_EXTENSIONS_SUPPORTED UINT64_C(0x100000000) /* To support backwards compatibility for DAPL-1.0 & DAPL-1.1 */ #define DAT_IA_ALL DAT_IA_FIELD_ALL #define DAT_IA_FIELD_NONE UINT64_C(0x0) /* Endpoint attributes */ typedef enum dat_service_type { DAT_SERVICE_TYPE_RC /* reliable connections */ #ifdef DAT_EXTENSIONS ,DAT_SERVICE_TYPE_EXTENSION_BASE /* To be used by DAT extensions as a starting point of extension services */ #endif /* DAT_EXTENSIONS */ } DAT_SERVICE_TYPE; typedef struct dat_ep_attr { DAT_SERVICE_TYPE service_type; DAT_SEG_LENGTH max_message_size; DAT_SEG_LENGTH max_rdma_size; DAT_QOS qos; DAT_COMPLETION_FLAGS recv_completion_flags; DAT_COMPLETION_FLAGS request_completion_flags; DAT_COUNT max_recv_dtos; DAT_COUNT max_request_dtos; DAT_COUNT max_recv_iov; DAT_COUNT max_request_iov; DAT_COUNT max_rdma_read_in; DAT_COUNT max_rdma_read_out; DAT_COUNT srq_soft_hw; DAT_COUNT max_rdma_read_iov; DAT_COUNT max_rdma_write_iov; DAT_COUNT ep_transport_specific_count; DAT_NAMED_ATTR * ep_transport_specific; DAT_COUNT ep_provider_specific_count; DAT_NAMED_ATTR * ep_provider_specific; } DAT_EP_ATTR; /* Endpoint Parameters */ /* For backwards compatibility */ #define DAT_EP_STATE_ERROR DAT_EP_STATE_DISCONNECTED typedef enum dat_ep_state { DAT_EP_STATE_UNCONNECTED, /* quiescent state */ DAT_EP_STATE_UNCONFIGURED_UNCONNECTED, DAT_EP_STATE_RESERVED, DAT_EP_STATE_UNCONFIGURED_RESERVED, DAT_EP_STATE_PASSIVE_CONNECTION_PENDING, DAT_EP_STATE_UNCONFIGURED_PASSIVE, DAT_EP_STATE_ACTIVE_CONNECTION_PENDING, DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING, DAT_EP_STATE_UNCONFIGURED_TENTATIVE, DAT_EP_STATE_CONNECTED, DAT_EP_STATE_DISCONNECT_PENDING, DAT_EP_STATE_DISCONNECTED, DAT_EP_STATE_COMPLETION_PENDING, DAT_EP_STATE_CONNECTED_SINGLE_PATH, DAT_EP_STATE_CONNECTED_MULTI_PATH } DAT_EP_STATE; typedef struct dat_ep_param { DAT_IA_HANDLE ia_handle; DAT_EP_STATE ep_state; DAT_COMM comm; DAT_IA_ADDRESS_PTR local_ia_address_ptr; DAT_PORT_QUAL local_port_qual; DAT_IA_ADDRESS_PTR remote_ia_address_ptr; DAT_PORT_QUAL remote_port_qual; DAT_PZ_HANDLE pz_handle; DAT_EVD_HANDLE recv_evd_handle; DAT_EVD_HANDLE request_evd_handle; DAT_EVD_HANDLE connect_evd_handle; DAT_SRQ_HANDLE srq_handle; DAT_EP_ATTR ep_attr; } DAT_EP_PARAM; typedef DAT_UINT64 DAT_EP_PARAM_MASK; #define DAT_EP_FIELD_IA_HANDLE UINT64_C(0x00000001) #define DAT_EP_FIELD_EP_STATE UINT64_C(0x00000002) #define DAT_EP_FIELD_COMM UINT64_C(0x00000004) #define DAT_EP_FIELD_LOCAL_IA_ADDRESS_PTR UINT64_C(0x00000008) #define DAT_EP_FIELD_LOCAL_PORT_QUAL UINT64_C(0x00000010) #define DAT_EP_FIELD_REMOTE_IA_ADDRESS_PTR UINT64_C(0x00000020) #define DAT_EP_FIELD_REMOTE_PORT_QUAL UINT64_C(0x00000040) #define DAT_EP_FIELD_PZ_HANDLE UINT64_C(0x00000080) #define DAT_EP_FIELD_RECV_EVD_HANDLE UINT64_C(0x00000100) #define DAT_EP_FIELD_REQUEST_EVD_HANDLE UINT64_C(0x00000200) #define DAT_EP_FIELD_CONNECT_EVD_HANDLE UINT64_C(0x00000400) #define DAT_EP_FIELD_SRQ_HANDLE UINT64_C(0x00000800) /* Remainder of values from EP_ATTR, 0x00001000 and up */ #define DAT_EP_FIELD_EP_ATTR_SERVICE_TYPE UINT64_C(0x00001000) #define DAT_EP_FIELD_EP_ATTR_MAX_MESSAGE_SIZE UINT64_C(0x00002000) #define DAT_EP_FIELD_EP_ATTR_MAX_RDMA_SIZE UINT64_C(0x00004000) #define DAT_EP_FIELD_EP_ATTR_QOS UINT64_C(0x00008000) #define DAT_EP_FIELD_EP_ATTR_RECV_COMPLETION_FLAGS UINT64_C(0x00010000) #define DAT_EP_FIELD_EP_ATTR_REQUEST_COMPLETION_FLAGS UINT64_C(0x00020000) #define DAT_EP_FIELD_EP_ATTR_MAX_RECV_DTOS UINT64_C(0x00040000) #define DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_DTOS UINT64_C(0x00080000) #define DAT_EP_FIELD_EP_ATTR_MAX_RECV_IOV UINT64_C(0x00100000) #define DAT_EP_FIELD_EP_ATTR_MAX_REQUEST_IOV UINT64_C(0x00200000) #define DAT_EP_FIELD_EP_ATTR_MAX_RDMA_READ_IN UINT64_C(0x00400000) #define DAT_EP_FIELD_EP_ATTR_MAX_RDMA_READ_OUT UINT64_C(0x00800000) #define DAT_EP_FIELD_EP_ATTR_SRQ_SOFT_HW UINT64_C(0x01000000) #define DAT_EP_FIELD_EP_ATTR_MAX_RDMA_READ_IOV UINT64_C(0x02000000) #define DAT_EP_FIELD_EP_ATTR_MAX_RDMA_WRITE_IOV UINT64_C(0x04000000) #define DAT_EP_FIELD_EP_ATTR_NUM_TRANSPORT_ATTR UINT64_C(0x08000000) #define DAT_EP_FIELD_EP_ATTR_TRANSPORT_SPECIFIC_ATTR UINT64_C(0x10000000) #define DAT_EP_FIELD_EP_ATTR_NUM_PROVIDER_ATTR UINT64_C(0x20000000) #define DAT_EP_FIELD_EP_ATTR_PROVIDER_SPECIFIC_ATTR UINT64_C(0x40000000) #define DAT_EP_FIELD_EP_ATTR_ALL UINT64_C(0x7FFFF000) #define DAT_EP_FIELD_ALL UINT64_C(0x7FFFFFFF) #define DAT_WATERMARK_INFINITE ((DAT_COUNT)~0) #define DAT_HW_DEFAULT DAT_WATERMARK_INFINITE #define DAT_SRQ_LW_DEFAULT 0x0 typedef enum dat_srq_state { DAT_SRQ_STATE_ERROR, DAT_SRQ_STATE_OPERATIONAL, DAT_SRQ_STATE_SHUTDOWN } DAT_SRQ_STATE; #define DAT_VALUE_UNKNOWN (((DAT_COUNT) ~0)-1) typedef struct dat_srq_attr { DAT_COUNT max_recv_dtos; DAT_COUNT max_recv_iov; DAT_COUNT low_watermark; } DAT_SRQ_ATTR; typedef struct dat_srq_param { DAT_IA_HANDLE ia_handle; DAT_SRQ_STATE srq_state; DAT_PZ_HANDLE pz_handle; DAT_COUNT max_recv_dtos; DAT_COUNT max_recv_iov; DAT_COUNT low_watermark; DAT_COUNT available_dto_count; DAT_COUNT outstanding_dto_count; } DAT_SRQ_PARAM; typedef enum dat_srq_param_mask { DAT_SRQ_FIELD_IA_HANDLE = 0x001, DAT_SRQ_FIELD_SRQ_STATE = 0x002, DAT_SRQ_FIELD_PZ_HANDLE = 0x004, DAT_SRQ_FIELD_MAX_RECV_DTO = 0x008, DAT_SRQ_FIELD_MAX_RECV_IOV = 0x010, DAT_SRQ_FIELD_LOW_WATERMARK = 0x020, DAT_SRQ_FIELD_AVAILABLE_DTO_COUNT = 0x040, DAT_SRQ_FIELD_OUTSTANDING_DTO_COUNT = 0x080, DAT_SRQ_FIELD_ALL = 0x0FF } DAT_SRQ_PARAM_MASK; /* PZ Parameters */ typedef struct dat_pz_param { DAT_IA_HANDLE ia_handle; } DAT_PZ_PARAM; typedef enum dat_pz_param_mask { DAT_PZ_FIELD_IA_HANDLE = 0x01, DAT_PZ_FIELD_ALL = 0x01 } DAT_PZ_PARAM_MASK; /* PSP Parameters */ typedef struct dat_psp_param { DAT_IA_HANDLE ia_handle; DAT_CONN_QUAL conn_qual; DAT_EVD_HANDLE evd_handle; DAT_PSP_FLAGS psp_flags; } DAT_PSP_PARAM; typedef enum dat_psp_param_mask { DAT_PSP_FIELD_IA_HANDLE = 0x01, DAT_PSP_FIELD_CONN_QUAL = 0x02, DAT_PSP_FIELD_EVD_HANDLE = 0x04, DAT_PSP_FIELD_PSP_FLAGS = 0x08, DAT_PSP_FIELD_ALL = 0x0F } DAT_PSP_PARAM_MASK; /* RSP Parameters */ typedef struct dat_rsp_param { DAT_IA_HANDLE ia_handle; DAT_CONN_QUAL conn_qual; DAT_EVD_HANDLE evd_handle; DAT_EP_HANDLE ep_handle; } DAT_RSP_PARAM; typedef enum dat_rsp_param_mask { DAT_RSP_FIELD_IA_HANDLE = 0x01, DAT_RSP_FIELD_CONN_QUAL = 0x02, DAT_RSP_FIELD_EVD_HANDLE = 0x04, DAT_RSP_FIELD_EP_HANDLE = 0x08, DAT_RSP_FIELD_ALL = 0x0F } DAT_RSP_PARAM_MASK; /* CSP Parameters */ typedef struct dat_csp_param { DAT_IA_HANDLE ia_handle; DAT_COMM *comm; DAT_IA_ADDRESS_PTR address_ptr; DAT_EVD_HANDLE evd_handle; } DAT_CSP_PARAM; typedef enum dat_csp_param_mask { DAT_CSP_FIELD_IA_HANDLE = 0x01, DAT_CSP_FIELD_COMM = 0x02, DAT_CSP_FIELD_IA_ADDRESS = 0x04, DAT_CSP_FIELD_EVD_HANDLE = 0x08, DAT_CSP_FIELD_ALL = 0x0F } DAT_CSP_PARAM_MASK; /* Connection Request Parameters. * * The Connection Request does not provide Remote Endpoint attributes. * If a local Consumer needs this information, the remote Consumer should * encode it into Private Data. */ typedef struct dat_cr_param { /* Remote IA whose Endpoint requested the connection. */ DAT_IA_ADDRESS_PTR remote_ia_address_ptr; /* Port qualifier of the remote Endpoint of the requested connection.*/ DAT_PORT_QUAL remote_port_qual; /* Size of the Private Data. */ DAT_COUNT private_data_size; /* Pointer to the Private Data passed by remote side in the Connection * Request. */ DAT_PVOID private_data; /* The local Endpoint provided by the Service Point for the requested * connection. It is the only Endpoint that can accept a Connection * Request on this Service Point. The value DAT_HANDLE_NULL * represents that there is no associated local Endpoint for the * requested connection. */ DAT_EP_HANDLE local_ep_handle; } DAT_CR_PARAM; typedef enum dat_cr_param_mask { DAT_CR_FIELD_REMOTE_IA_ADDRESS_PTR = 0x01, DAT_CR_FIELD_REMOTE_PORT_QUAL = 0x02, DAT_CR_FIELD_PRIVATE_DATA_SIZE = 0x04, DAT_CR_FIELD_PRIVATE_DATA = 0x08, DAT_CR_FIELD_LOCAL_EP_HANDLE = 0x10, DAT_CR_FIELD_ALL = 0x1F } DAT_CR_PARAM_MASK; /************************** Events ******************************/ /* Completion status flags */ /* DTO completion status */ /* For backwards compatibility */ #define DAT_DTO_LENGTH_ERROR DAT_DTO_ERR_LOCAL_LENGTH #define DAT_DTO_FAILURE DAT_DTO_ERR_FLUSHED typedef enum dat_dto_completion_status { DAT_DTO_SUCCESS = 0, DAT_DTO_ERR_FLUSHED = 1, DAT_DTO_ERR_LOCAL_LENGTH = 2, DAT_DTO_ERR_LOCAL_EP = 3, DAT_DTO_ERR_LOCAL_PROTECTION = 4, DAT_DTO_ERR_BAD_RESPONSE = 5, DAT_DTO_ERR_REMOTE_ACCESS = 6, DAT_DTO_ERR_REMOTE_RESPONDER = 7, DAT_DTO_ERR_TRANSPORT = 8, DAT_DTO_ERR_RECEIVER_NOT_READY = 9, DAT_DTO_ERR_PARTIAL_PACKET = 10, DAT_RMR_OPERATION_FAILED = 11, DAT_DTO_ERR_LOCAL_MM_ERROR = 12 /* kdat specific */ } DAT_DTO_COMPLETION_STATUS; /* RMR completion status */ /* For backwards compatibility */ #define DAT_RMR_BIND_SUCCESS DAT_DTO_SUCCESS #define DAT_RMR_BIND_FAILURE DAT_DTO_ERR_FLUSHED /* RMR completion status */ #define DAT_RMR_BIND_COMPLETION_STATUS DAT_DTO_COMPLETION_STATUS /* Completion group structs (six total) */ /* DTO completion event data */ /* transfered_length is not defined if status is not DAT_SUCCESS */ /* invalidate_flag and rmr_context are not defined if status is not DAT_SUCCESS */ typedef struct dat_dto_completion_event_data { DAT_EP_HANDLE ep_handle; DAT_DTO_COOKIE user_cookie; DAT_DTO_COMPLETION_STATUS status; DAT_SEG_LENGTH transfered_length; DAT_DTOS operation; DAT_RMR_CONTEXT rmr_context; } DAT_DTO_COMPLETION_EVENT_DATA; /* RMR bind completion event data */ typedef struct dat_rmr_bind_completion_event_data { DAT_RMR_HANDLE rmr_handle; DAT_RMR_COOKIE user_cookie; DAT_RMR_BIND_COMPLETION_STATUS status; } DAT_RMR_BIND_COMPLETION_EVENT_DATA; typedef union dat_sp_handle { DAT_RSP_HANDLE rsp_handle; DAT_PSP_HANDLE psp_handle; DAT_CSP_HANDLE csp_handle; } DAT_SP_HANDLE; /* Connection Request Arrival event data */ typedef struct dat_cr_arrival_event_data { /* Handle to the Service Point that received the Connection Request * from the remote side. If the Service Point was Reserved, sp_handle is * DAT_HANDLE_NULL because the reserved Service Point is * automatically destroyed upon generating this event. Can be PSP, * CSP, or RSP. */ DAT_SP_HANDLE sp_handle; /* Address of the IA on which the Connection Request arrived. */ DAT_IA_ADDRESS_PTR local_ia_address_ptr; /* Connection Qualifier of the IA on which the Service Point received a * Connection Request. */ DAT_CONN_QUAL conn_qual; /* The Connection Request instance created by a Provider for the * arrived Connection Request. Consumers can find out private_data * passed by a remote Consumer from cr_handle. It is up to a Consumer * to dat_cr_accept or dat_cr_reject of the Connection Request. */ DAT_CR_HANDLE cr_handle; /* The binary indicator whether the arrived privata data was trancated * or not. * The default value of 0 means not truncation of received private data. */ DAT_BOOLEAN truncate_flag; } DAT_CR_ARRIVAL_EVENT_DATA; /* Connection event data */ typedef struct dat_connection_event_data { DAT_EP_HANDLE ep_handle; DAT_COUNT private_data_size; DAT_PVOID private_data; } DAT_CONNECTION_EVENT_DATA; /* Async Error event data */ /* For unaffiliated asynchronous event dat_handle is ia_handle. For * Endpoint affiliated asynchronous event dat_handle is ep_handle. For * EVD affiliated asynchronous event dat_handle is evd_handle. For SRQ * affiliated asynchronous event dat_handle is srq_handle. For Memory * affiliated asynchronous event dat_handle is either lmr_handle, * rmr_handle or pz_handle. */ typedef struct dat_asynch_error_event_data { DAT_HANDLE dat_handle; /* either IA, EP, EVD, SRQ, */ /* LMR, RMR, or PZ handle */ DAT_COUNT reason; /* object specific */ } DAT_ASYNCH_ERROR_EVENT_DATA; /* The reason is object type specific and its values are defined below. */ typedef enum ia_async_error_reason { DAT_IA_CATASTROPHIC_ERROR, DAT_IA_OTHER_ERROR } DAT_IA_ASYNC_ERROR_REASON; typedef enum ep_async_error_reason { DAT_EP_TRANSFER_TO_ERROR, DAT_EP_OTHER_ERROR, DAT_SRQ_SOFT_HIGH_WATERMARK_EVENT } DAT_EP_ASYNC_ERROR_REASON; typedef enum evd_async_error_reason { DAT_EVD_OVERFLOW_ERROR, DAT_EVD_OTHER_ERROR } DAT_EVD_ASYNC_ERROR_REASON; typedef enum srq_async_error_reason { DAT_SRQ_TRANSFER_TO_ERROR, DAT_SRQ_OTHER_ERROR, DAT_SRQ_LOW_WATERMARK_EVENT } DAT_SRQ_ASYNC_ERROR_REASON; typedef enum lmr_async_error_reason { DAT_LMR_OTHER_ERROR } DAT_LMR_ASYNC_ERROR_REASON; typedef enum rmr_async_error_reason { DAT_RMR_OTHER_ERROR } DAT_RMR_ASYNC_ERROR_REASON; typedef enum pz_async_error_reason { DAT_PZ_OTHER_ERROR } DAT_PZ_ASYNC_ERROR_REASON; /* Software event data */ typedef struct dat_software_event_data { DAT_PVOID pointer; } DAT_SOFTWARE_EVENT_DATA; typedef enum dat_event_number { DAT_DTO_COMPLETION_EVENT = 0x00001, DAT_RMR_BIND_COMPLETION_EVENT = 0x01001, DAT_CONNECTION_REQUEST_EVENT = 0x02001, DAT_CONNECTION_EVENT_ESTABLISHED = 0x04001, DAT_CONNECTION_EVENT_PEER_REJECTED = 0x04002, DAT_CONNECTION_EVENT_NON_PEER_REJECTED = 0x04003, DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR = 0x04004, DAT_CONNECTION_EVENT_DISCONNECTED = 0x04005, DAT_CONNECTION_EVENT_BROKEN = 0x04006, DAT_CONNECTION_EVENT_TIMED_OUT = 0x04007, DAT_CONNECTION_EVENT_UNREACHABLE = 0x04008, DAT_ASYNC_ERROR_EVD_OVERFLOW = 0x08001, DAT_ASYNC_ERROR_IA_CATASTROPHIC = 0x08002, DAT_ASYNC_ERROR_EP_BROKEN = 0x08003, DAT_ASYNC_ERROR_TIMED_OUT = 0x08004, DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR = 0x08005, DAT_HA_DOWN_TO_1 = 0x08101, DAT_HA_UP_TO_MULTI_PATH = 0x08102, DAT_SOFTWARE_EVENT = 0x10001 #ifdef DAT_EXTENSIONS ,DAT_EXTENSION_EVENT = 0x20000, DAT_IB_EXTENSION_RANGE_BASE = 0x40000, DAT_IW_EXTENSION_RANGE_BASE = 0x80000 #endif /* DAT_EXTENSIONS */ } DAT_EVENT_NUMBER; /* Union for event Data */ typedef union dat_event_data { DAT_DTO_COMPLETION_EVENT_DATA dto_completion_event_data; DAT_RMR_BIND_COMPLETION_EVENT_DATA rmr_completion_event_data; DAT_CR_ARRIVAL_EVENT_DATA cr_arrival_event_data; DAT_CONNECTION_EVENT_DATA connect_event_data; DAT_ASYNCH_ERROR_EVENT_DATA asynch_error_event_data; DAT_SOFTWARE_EVENT_DATA software_event_data; } DAT_EVENT_DATA; /* Event struct that holds all event information */ typedef struct dat_event { DAT_EVENT_NUMBER event_number; DAT_EVD_HANDLE evd_handle; DAT_EVENT_DATA event_data; DAT_UINT64 event_extension_data[8]; } DAT_EVENT; /* Provider/registration info */ typedef struct dat_provider_info { char ia_name[DAT_NAME_MAX_LENGTH]; DAT_UINT32 dapl_version_major; DAT_UINT32 dapl_version_minor; DAT_BOOLEAN is_thread_safe; } DAT_PROVIDER_INFO; /*************************************************************** * * FUNCTION PROTOTYPES ***************************************************************/ /* * IA functions * * Note that there are actual 'dat_ia_open' and 'dat_ia_close' * functions, it is not just a re-directing #define. That is * because the functions may have to ensure that the provider * library is loaded before it can call it, and may choose to * unload the library after the last close. */ extern DAT_RETURN DAT_API dat_ia_openv ( IN const DAT_NAME_PTR, /* provider */ IN DAT_COUNT, /* asynch_evd_min_qlen */ INOUT DAT_EVD_HANDLE *, /* asynch_evd_handle */ OUT DAT_IA_HANDLE *, /* ia_handle */ IN DAT_UINT32, /* dat major version number */ IN DAT_UINT32, /* dat minor version number */ IN DAT_BOOLEAN); /* dat thread safety */ #define dat_ia_open(name, qlen, async_evd, ia) \ dat_ia_openv((name), (qlen), (async_evd), (ia), \ DAT_VERSION_MAJOR, DAT_VERSION_MINOR, \ DAT_THREADSAFE) extern DAT_RETURN DAT_API dat_ia_query ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_EVD_HANDLE *, /* async_evd_handle */ IN DAT_IA_ATTR_MASK, /* ia_attr_mask */ OUT DAT_IA_ATTR *, /* ia_attr */ IN DAT_PROVIDER_ATTR_MASK, /* provider_attr_mask */ OUT DAT_PROVIDER_ATTR * ); /* provider_attr */ extern DAT_RETURN DAT_API dat_ia_close ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CLOSE_FLAGS ); /* close_flags */ /* helper functions */ extern DAT_RETURN DAT_API dat_set_consumer_context ( IN DAT_HANDLE, /* dat_handle */ IN DAT_CONTEXT); /* context */ extern DAT_RETURN DAT_API dat_get_consumer_context ( IN DAT_HANDLE, /* dat_handle */ OUT DAT_CONTEXT * ); /* context */ extern DAT_RETURN DAT_API dat_get_handle_type ( IN DAT_HANDLE, /* dat_handle */ OUT DAT_HANDLE_TYPE * ); /* handle_type */ /* CR functions */ extern DAT_RETURN DAT_API dat_cr_query ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CR_PARAM_MASK, /* cr_param_mask */ OUT DAT_CR_PARAM * ); /* cr_param */ extern DAT_RETURN DAT_API dat_cr_accept ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ extern DAT_RETURN DAT_API dat_cr_reject ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ /* For DAT-1.1 and above, this function is defined for both uDAPL and * kDAPL. For DAT-1.0, it is only defined for uDAPL. */ extern DAT_RETURN DAT_API dat_cr_handoff ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CONN_QUAL); /* handoff */ /* EVD functions */ extern DAT_RETURN DAT_API dat_evd_resize ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_COUNT ); /* evd_min_qlen */ extern DAT_RETURN DAT_API dat_evd_post_se ( IN DAT_EVD_HANDLE, /* evd_handle */ IN const DAT_EVENT * ); /* event */ extern DAT_RETURN DAT_API dat_evd_dequeue ( IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_EVENT * ); /* event */ extern DAT_RETURN DAT_API dat_evd_query ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_EVD_PARAM_MASK, /* evd_param_mask */ OUT DAT_EVD_PARAM * ); /* evd_param */ extern DAT_RETURN DAT_API dat_evd_free ( IN DAT_EVD_HANDLE ); /* evd_handle */ /* EP functions */ extern DAT_RETURN DAT_API dat_ep_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* recv_completion_evd_handle */ IN DAT_EVD_HANDLE, /* request_completion_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN const DAT_EP_ATTR *, /* ep_attributes */ OUT DAT_EP_HANDLE * ); /* ep_handle */ extern DAT_RETURN DAT_API dat_ep_query ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_param_mask */ OUT DAT_EP_PARAM * ); /* ep_param */ extern DAT_RETURN DAT_API dat_ep_modify ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_param_mask */ IN const DAT_EP_PARAM * ); /* ep_param */ extern DAT_RETURN DAT_API dat_ep_connect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_IA_ADDRESS_PTR, /* remote_ia_address */ IN DAT_CONN_QUAL, /* remote_conn_qual */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS, /* quality_of_service */ IN DAT_CONNECT_FLAGS ); /* connect_flags */ extern DAT_RETURN DAT_API dat_ep_dup_connect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_HANDLE, /* ep_dup_handle */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS); /* quality_of_service */ extern DAT_RETURN DAT_API dat_ep_common_connect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_IA_ADDRESS_PTR, /* remote_ia_address */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ extern DAT_RETURN DAT_API dat_ep_disconnect ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_CLOSE_FLAGS ); /* close_flags */ extern DAT_RETURN DAT_API dat_ep_post_send ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dat_ep_post_send_with_invalidate ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ IN DAT_BOOLEAN, /* invalidate_flag */ IN DAT_RMR_CONTEXT ); /* RMR to invalidate */ extern DAT_RETURN DAT_API dat_ep_post_recv ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dat_ep_post_rdma_read ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dat_ep_post_rdma_read_to_rmr ( IN DAT_EP_HANDLE, /* ep_handle */ IN const DAT_RMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dat_ep_post_rdma_write ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ extern DAT_RETURN DAT_API dat_ep_get_status ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_EP_STATE *, /* ep_state */ OUT DAT_BOOLEAN *, /* recv_idle */ OUT DAT_BOOLEAN * ); /* request_idle */ extern DAT_RETURN DAT_API dat_ep_free ( IN DAT_EP_HANDLE); /* ep_handle */ extern DAT_RETURN DAT_API dat_ep_reset ( IN DAT_EP_HANDLE); /* ep_handle */ extern DAT_RETURN DAT_API dat_ep_create_with_srq ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* recv_evd_handle */ IN DAT_EVD_HANDLE, /* request_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN DAT_SRQ_HANDLE, /* srq_handle */ IN const DAT_EP_ATTR *, /* ep_attributes */ OUT DAT_EP_HANDLE *); /* ep_handle */ extern DAT_RETURN DAT_API dat_ep_recv_query ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_COUNT *, /* nbufs_allocated */ OUT DAT_COUNT *); /* bufs_alloc_span */ extern DAT_RETURN DAT_API dat_ep_set_watermark ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* soft_high_watermark */ IN DAT_COUNT); /* hard_high_watermark */ /* LMR functions */ extern DAT_RETURN DAT_API dat_lmr_free ( IN DAT_LMR_HANDLE); /* lmr_handle */ /* Non-coherent memory functions */ extern DAT_RETURN DAT_API dat_lmr_sync_rdma_read ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *, /* local_segments */ IN DAT_VLEN); /* num_segments */ extern DAT_RETURN DAT_API dat_lmr_sync_rdma_write ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *, /* local_segments */ IN DAT_VLEN); /* num_segments */ /* RMR functions */ extern DAT_RETURN DAT_API dat_rmr_create ( IN DAT_PZ_HANDLE, /* pz_handle */ OUT DAT_RMR_HANDLE *); /* rmr_handle */ extern DAT_RETURN DAT_API dat_rmr_create_for_ep ( IN DAT_PZ_HANDLE, /* pz_handle */ OUT DAT_RMR_HANDLE *); /* rmr_handle */ extern DAT_RETURN DAT_API dat_rmr_query ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_RMR_PARAM_MASK, /* rmr_param_mask */ OUT DAT_RMR_PARAM *); /* rmr_param */ extern DAT_RETURN DAT_API dat_rmr_bind ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_LMR_HANDLE, /* lmr_handle */ IN const DAT_LMR_TRIPLET *,/* lmr_triplet */ IN DAT_MEM_PRIV_FLAGS, /* mem_priv */ IN DAT_VA_TYPE, /* va_type */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_RMR_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ OUT DAT_RMR_CONTEXT * ); /* context */ extern DAT_RETURN DAT_API dat_rmr_free ( IN DAT_RMR_HANDLE); /* rmr_handle */ /* PSP functions */ extern DAT_RETURN DAT_API dat_psp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE * ); /* psp_handle */ extern DAT_RETURN DAT_API dat_psp_create_any ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_CONN_QUAL *, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE * ); /* psp_handle */ extern DAT_RETURN DAT_API dat_psp_query ( IN DAT_PSP_HANDLE, /* psp_handle */ IN DAT_PSP_PARAM_MASK, /* psp_param_mask */ OUT DAT_PSP_PARAM * ); /* psp_param */ extern DAT_RETURN DAT_API dat_psp_free ( IN DAT_PSP_HANDLE ); /* psp_handle */ /* RSP functions */ extern DAT_RETURN DAT_API dat_rsp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_RSP_HANDLE * ); /* rsp_handle */ extern DAT_RETURN DAT_API dat_rsp_query ( IN DAT_RSP_HANDLE, /* rsp_handle */ IN DAT_RSP_PARAM_MASK, /* rsp_param_mask */ OUT DAT_RSP_PARAM * ); /* rsp_param */ extern DAT_RETURN DAT_API dat_rsp_free ( IN DAT_RSP_HANDLE ); /* rsp_handle */ /* CSP functions */ extern DAT_RETURN DAT_API dat_csp_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COMM *, /* communicator */ IN DAT_IA_ADDRESS_PTR, /* address */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_CSP_HANDLE * ); /* csp_handle */ extern DAT_RETURN DAT_API dat_csp_query ( IN DAT_CSP_HANDLE, /* csp_handle */ IN DAT_CSP_PARAM_MASK, /* csp_param_mask */ OUT DAT_CSP_PARAM * ); /* csp_param */ extern DAT_RETURN DAT_API dat_csp_free ( IN DAT_CSP_HANDLE ); /* csp_handle */ /* PZ functions */ extern DAT_RETURN DAT_API dat_pz_create ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_PZ_HANDLE * ); /* pz_handle */ extern DAT_RETURN DAT_API dat_pz_query ( IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_PZ_PARAM_MASK, /* pz_param_mask */ OUT DAT_PZ_PARAM *); /* pz_param */ extern DAT_RETURN DAT_API dat_pz_free ( IN DAT_PZ_HANDLE ); /* pz_handle */ /* SRQ functions */ extern DAT_RETURN DAT_API dat_srq_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_SRQ_ATTR *, /* srq_attr */ OUT DAT_SRQ_HANDLE *); /* srq_handle */ extern DAT_RETURN DAT_API dat_srq_free ( IN DAT_SRQ_HANDLE); /* srq_handle */ extern DAT_RETURN DAT_API dat_srq_post_recv ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE); /* user_cookie */ extern DAT_RETURN DAT_API dat_srq_query ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_SRQ_PARAM_MASK, /* srq_param_mask */ OUT DAT_SRQ_PARAM *); /* srq_param */ extern DAT_RETURN DAT_API dat_srq_resize ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT); /* srq_max_recv_dto */ extern DAT_RETURN DAT_API dat_srq_set_lw ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT); /* low_watermark */ #ifdef DAT_EXTENSIONS #define DAT_OPEN_EXTENSION_BASE 0x1000 #define DAT_CLOSE_EXTENSION_BASE 0x2000 typedef int DAT_EXTENDED_OP; extern DAT_RETURN DAT_API dat_extension_op( IN DAT_HANDLE, /* handle */ IN DAT_EXTENDED_OP, /* operation */ IN ... ); /* args */ #endif /* * DAT registry functions. * * Note the dat_ia_open and dat_ia_close functions are linked to * registration code which "redirects" to the appropriate provider. */ extern DAT_RETURN DAT_API dat_registry_list_providers ( IN DAT_COUNT, /* max_to_return */ OUT DAT_COUNT *, /* entries_returned */ OUT DAT_PROVIDER_INFO *(dat_provider_list[]) ); /* dat_provider_list */ /* * DAT error functions. */ extern DAT_RETURN DAT_API dat_strerror ( IN DAT_RETURN, /* dat function return */ OUT const char ** , /* major message string */ OUT const char ** ); /* minor message string */ #ifdef __cplusplus } #endif #endif /* _DAT_H_ */ dapl-2.1.5/dat/include/dat2/dat_error.h000066400000000000000000000336241255317474200176400ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /*********************************************************** * * HEADER: dat_error.h * * PURPOSE: DAT return codes * * Description: Header file for "DAPL: Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * Error types are compound types, as mapped out below. * *********************************************************/ #ifndef _DAT_ERROR_H_ #define _DAT_ERROR_H_ /* * * All return codes are actually a 3-way tuple: * * type: DAT_RETURN_CLASS DAT_RETURN_TYPE DAT_RETURN_SUBTYPE * bits: 31-30 29-16 15-0 * * 3 2 1 * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | C | DAT_RETURN_TYPE | DAT_RETURN_SUBTYPE | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * */ /* * Class Bits */ #define DAT_CLASS_ERROR 0x80000000 #define DAT_CLASS_WARNING 0x40000000 #define DAT_CLASS_SUCCESS 0x00000000 /* * DAT Error bits */ #define DAT_TYPE_MASK 0x3fff0000 /* mask for DAT_TYPE_STATUS bits */ #define DAT_SUBTYPE_MASK 0x0000FFFF /* mask for DAT_SUBTYPE_STATUS bits */ /* * Determining the success of an operation is best done with a macro; * each of these returns a boolean value. */ #define DAT_IS_WARNING(status) ((DAT_UINT32)(status) & DAT_CLASS_WARNING) #define DAT_GET_TYPE(status) ((DAT_UINT32)(status) & DAT_TYPE_MASK) #define DAT_GET_SUBTYPE(status) ((DAT_UINT32)(status) & DAT_SUBTYPE_MASK) /* * DAT return types. The ERROR bit is enabled for these definitions */ typedef enum dat_return_type { /* The operation was successful. */ DAT_SUCCESS = 0x00000000, /* The operation was aborted because IA was closed or EVD was * * destroyed. */ DAT_ABORT = 0x00010000, /* The specified Connection Qualifier was in use. */ DAT_CONN_QUAL_IN_USE = 0x00020000, /* The operation failed due to resource limitations. */ DAT_INSUFFICIENT_RESOURCES = 0x00030000, /* Provider internal error. This error can be returned by any * * operation when the Provider has detected an internal error.* * This error does not mask any error caused by the Consumer. */ DAT_INTERNAL_ERROR = 0x00040000, /* One of the DAT handles was invalid. */ DAT_INVALID_HANDLE = 0x00050000, /* One of the parameters was invalid. */ DAT_INVALID_PARAMETER = 0x00060000, /* One of the parameters was invalid for this operation. There* * are Event Streams associated with the Event Dispatcher * * feeding it. */ DAT_INVALID_STATE = 0x00070000, /* The size of the receiving buffer is too small for sending * * buffer data. The size of the local buffer is too small for* * the data of the remote buffer. */ DAT_LENGTH_ERROR = 0x00080000, /* The requested Model was not supported by the Provider. */ DAT_MODEL_NOT_SUPPORTED = 0x00090000, /* The specified IA name was not found in the list of * * registered Providers. */ DAT_PROVIDER_NOT_FOUND = 0x000A0000, /* Protection violation for local or remote memory access * * Protection Zone mismatch between an LMR of one of the * * local_iov segments and the local Endpoint. */ DAT_PRIVILEGES_VIOLATION = 0x000B0000, /* Privileges violation for local or remote memory access. One* * of the LMRs used in local_iov was either invalid or did not* * have local read privileges. */ DAT_PROTECTION_VIOLATION = 0x000C0000, /* The operation timed out without a notification. */ DAT_QUEUE_EMPTY = 0x000D0000, /* The Event Dispatcher queue is full. */ DAT_QUEUE_FULL = 0x000E0000, /* The operation timed out. uDAPL ONLY */ DAT_TIMEOUT_EXPIRED = 0x000F0000, /* The provider name was already registered */ DAT_PROVIDER_ALREADY_REGISTERED = 0x00100000, /* The provider is "in-use" and cannot be closed at this time */ DAT_PROVIDER_IN_USE = 0x00110000, /* The requested remote address is not valid or not reachable */ DAT_INVALID_ADDRESS = 0x00120000, /* [Unix only] dat_evd_wait or dat_cno_wait has been * * interrupted. */ DAT_INTERRUPTED_CALL = 0x00130000, /* No Connection Qualifiers are available */ DAT_CONN_QUAL_UNAVAILABLE = 0x00140000, /* kDAPL reserved LMR */ DAT_RESERVED_LMR = 0x00150000, /* kdapl only */ /* The specified IP Port was in use. */ DAT_PORT_IN_USE = 0x00160000, /* The specified COMM not supported. */ DAT_COMM_NOT_SUPPORTED = 0x00170000, #ifdef DAT_EXTENSIONS /* The DAT extensions support. */ DAT_EXTENSION_BASE = 0x10000000, /* range 0x10000000 - 0x3FFF0000 is reserved for extensions */ #endif /* DAT_EXTENSIONS */ /* Provider does not support the operation yet. */ DAT_NOT_IMPLEMENTED = 0x3FFF0000 } DAT_RETURN_TYPE; typedef DAT_UINT32 DAT_RETURN; /* Backward compatibility with DAT 1.0 */ #define DAT_NAME_NOT_FOUND DAT_PROVIDER_NOT_FOUND /* * DAT_RETURN_SUBTYPE listing */ typedef enum dat_return_subtype { /* First element is no subtype */ DAT_NO_SUBTYPE, /* ABORT sub types */ /* call was interrupted by a signal, or otherwise */ DAT_SUB_INTERRUPTED, /* DAT_CONN_QUAL_IN_USE has no subtypes */ /* INSUFFICIENT_RESOURCES subtypes */ DAT_RESOURCE_MEMORY, DAT_RESOURCE_DEVICE, DAT_RESOURCE_TEP, /* transport endpoint, e.g. QP */ DAT_RESOURCE_TEVD, /* transport EVD, e.g. CQ */ DAT_RESOURCE_PROTECTION_DOMAIN, DAT_RESOURCE_MEMORY_REGION, /* HCA memory for LMR or RMR */ DAT_RESOURCE_ERROR_HANDLER, DAT_RESOURCE_CREDITS, /* e.g outstanding RDMA Read credit as target */ DAT_RESOURCE_SRQ, /* DAT_INTERNAL_ERROR has no subtypes */ /* INVALID_HANDLE subtypes */ DAT_INVALID_HANDLE_IA, DAT_INVALID_HANDLE_EP, DAT_INVALID_HANDLE_LMR, DAT_INVALID_HANDLE_RMR, DAT_INVALID_HANDLE_PZ, DAT_INVALID_HANDLE_PSP, DAT_INVALID_HANDLE_RSP, DAT_INVALID_HANDLE_CR, DAT_INVALID_HANDLE_CNO, DAT_INVALID_HANDLE_EVD_CR, DAT_INVALID_HANDLE_EVD_REQUEST, DAT_INVALID_HANDLE_EVD_RECV, DAT_INVALID_HANDLE_EVD_CONN, DAT_INVALID_HANDLE_EVD_ASYNC, DAT_INVALID_HANDLE_SRQ, DAT_INVALID_HANDLE_CSP, DAT_INVALID_HANDLE1, DAT_INVALID_HANDLE2, DAT_INVALID_HANDLE3, DAT_INVALID_HANDLE4, DAT_INVALID_HANDLE5, DAT_INVALID_HANDLE6, DAT_INVALID_HANDLE7, DAT_INVALID_HANDLE8, DAT_INVALID_HANDLE9, DAT_INVALID_HANDLE10, /* DAT_INVALID_PARAMETER subtypes */ DAT_INVALID_ARG1, DAT_INVALID_ARG2, DAT_INVALID_ARG3, DAT_INVALID_ARG4, DAT_INVALID_ARG5, DAT_INVALID_ARG6, DAT_INVALID_ARG7, DAT_INVALID_ARG8, DAT_INVALID_ARG9, DAT_INVALID_ARG10, /* DAT_INVALID_EP_STATE subtypes */ DAT_INVALID_STATE_EP_UNCONNECTED, DAT_INVALID_STATE_EP_ACTCONNPENDING, DAT_INVALID_STATE_EP_PASSCONNPENDING, DAT_INVALID_STATE_EP_TENTCONNPENDING, DAT_INVALID_STATE_EP_CONNECTED, DAT_INVALID_STATE_EP_DISCONNECTED, DAT_INVALID_STATE_EP_RESERVED, DAT_INVALID_STATE_EP_COMPLPENDING, DAT_INVALID_STATE_EP_DISCPENDING, DAT_INVALID_STATE_EP_PROVIDERCONTROL, DAT_INVALID_STATE_EP_NOTREADY, DAT_INVALID_STATE_EP_RECV_WATERMARK, DAT_INVALID_STATE_EP_PZ, DAT_INVALID_STATE_EP_EVD_REQUEST, DAT_INVALID_STATE_EP_EVD_RECV, DAT_INVALID_STATE_EP_EVD_CONNECT, DAT_INVALID_STATE_EP_UNCONFIGURED, DAT_INVALID_STATE_EP_UNCONFRESERVED, DAT_INVALID_STATE_EP_UNCONFPASSIVE, DAT_INVALID_STATE_EP_UNCONFTENTATIVE, DAT_INVALID_STATE_CNO_IN_USE, DAT_INVALID_STATE_CNO_DEAD, /* EVD states. Enabled/Disabled, Waitable/Unwaitable, * * and Notify/Solicited/Threshold are 3 orthogonal * * bands of EVD state.The Threshold one is uDAPL specific. */ DAT_INVALID_STATE_EVD_OPEN, /* EVD can be either in enabled or disabled but not both * * or neither at the same time */ DAT_INVALID_STATE_EVD_ENABLED, DAT_INVALID_STATE_EVD_DISABLED, /* EVD can be either in waitable or unwaitable but not * * both or neither at the same time */ DAT_INVALID_STATE_EVD_WAITABLE, DAT_INVALID_STATE_EVD_UNWAITABLE, /* Do not release an EVD if it is in use */ DAT_INVALID_STATE_EVD_IN_USE, /* EVD can be either in notify or solicited or threshold * * but not any pair, or all, or none at the same time. * * The threshold one is for uDAPL only */ DAT_INVALID_STATE_EVD_CONFIG_NOTIFY, DAT_INVALID_STATE_EVD_CONFIG_SOLICITED, DAT_INVALID_STATE_EVD_CONFIG_THRESHOLD, DAT_INVALID_STATE_EVD_WAITER, DAT_INVALID_STATE_EVD_ASYNC, /* Async EVD required */ DAT_INVALID_STATE_IA_IN_USE, DAT_INVALID_STATE_LMR_IN_USE, DAT_INVALID_STATE_LMR_FREE, DAT_INVALID_STATE_PZ_IN_USE, DAT_INVALID_STATE_PZ_FREE, /* DAT_INVALID_STATE_SRQ subtypes */ DAT_INVALID_STATE_SRQ_OPERATIONAL, DAT_INVALID_STATE_SRQ_ERROR, DAT_INVALID_STATE_SRQ_IN_USE, DAT_INVALID_STATE_SRQ_SHUTDOWN, /* DAT_LENGTH_ERROR has no subtypes */ /* DAT_MODEL_NOT_SUPPORTED has no subtypes */ /* DAT_PRIVILEGES_VIOLATION subtypes */ DAT_PRIVILEGES_READ, DAT_PRIVILEGES_WRITE, DAT_PRIVILEGES_RDMA_READ, DAT_PRIVILEGES_RDMA_WRITE, /* DAT_PROTECTION_VIOLATION subtypes */ DAT_PROTECTION_READ, DAT_PROTECTION_WRITE, DAT_PROTECTION_RDMA_READ, DAT_PROTECTION_RDMA_WRITE, /* DAT_QUEUE_EMPTY has no subtypes */ /* DAT_QUEUE_FULL has no subtypes */ /* DAT_TIMEOUT_EXPIRED has no subtypes */ /* DAT_PROVIDER_ALREADY_REGISTERED has no subtypes */ /* DAT_PROVIDER_IN_USE has no subtypes */ /* DAT_INVALID_ADDRESS subtypes */ /* Unsupported addresses - those that are not Malformed, but * * are incorrect for use in DAT (regardless of local routing * * capabilities): IPv6 Multicast Addresses (ff/8) IPv4 * * Broadcast/Multicast Addresses */ DAT_INVALID_ADDRESS_UNSUPPORTED, /* Unreachable addresses - A Provider might know that certain * * addresses are unreachable immediately. One example would be * * an IPv6 addresses on an IPv4-only system. This can also be * * returned if it is known that there is no route to the host. * * A Provider is not obligated to check for this condition. */ DAT_INVALID_ADDRESS_UNREACHABLE, /* Malformed addresses -- these cannot be valid in any context.* * Those listed in RFC1884 section 2.3 as "Reserved" or * * "Unassigned". */ DAT_INVALID_ADDRESS_MALFORMED, /* DAT_INTERRUPTED_CALL has no subtypes */ /* DAT_CONN_QUAL_UNAVAILABLE has no subtypes */ /* DAT_PROVIDER_NOT_FOUND subtypes. Erratta to the 1.1 spec */ DAT_NAME_NOT_REGISTERED, DAT_MAJOR_NOT_FOUND, DAT_MINOR_NOT_FOUND, DAT_THREAD_SAFETY_NOT_FOUND } DAT_RETURN_SUBTYPE; #endif /* _DAT_ERROR_H_ */ dapl-2.1.5/dat/include/dat2/dat_ib_extensions.h000077500000000000000000001237101255317474200213570ustar00rootroot00000000000000/* * Copyright (c) 2007-2011 Intel Corporation. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_ib_extensions.h * * PURPOSE: extensions to the DAT API for IB transport specific services * NOTE: Prototyped IB extension support in openib-cma 1.2 provider. * Applications MUST recompile with new dat.h definitions * and include this file. * * Description: Header file for "uDAPL: User Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * All global symbols are prepended with "DAT_" or "dat_" * All DAT objects have an 'api' tag which, such as 'ep' or 'lmr' * The method table is in the provider definition structure. * * **********************************************************************/ #ifndef _DAT_IB_EXTENSIONS_H_ #define _DAT_IB_EXTENSIONS_H_ /* * Provider specific attribute strings for extension support * returned with dat_ia_query() and * DAT_PROVIDER_ATTR_MASK == DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR * * DAT_NAMED_ATTR name == extended operations and version, * version_value = version number of extension API */ /* 2.0.1 - Initial IB extension support, atomic and immed data * dat_ib_post_fetch_and_add() * dat_ib_post_cmp_and_swap() * dat_ib_post_rdma_write_immed() * * 2.0.2 - Add UD support, post send and remote_ah via connect events * dat_ib_post_send_ud() * * 2.0.3 - Add query/print counter support for IA, EP, and EVD's * dat_query_counters(), dat_print_counters() * * 2.0.4 - Add DAT_IB_UD_CONNECTION_REJECT_EVENT extended UD event * 2.0.5 - Add DAT_IB_UD extended UD connection error events * 2.0.6 - Add MPI over IB collective extensions * 2.0.7 - Add new IA counters for dapl CM, device LINK, device DIAG * 2.0.8 - Add DAT_IB_OPEN_QUERY_OP, DAT_IB_CLOSE_QUERY_OP, fast provider query interface * 2.0.9 - Add DAT_IB_UD_CM_FREE and DAT_IB_UD_AH_FREE */ #define DAT_IB_EXTENSION_VERSION 209 /* 2.0.9 */ #define DAT_IB_ATTR_COUNTERS "DAT_COUNTERS" #define DAT_IB_ATTR_FETCH_AND_ADD "DAT_IB_FETCH_AND_ADD" #define DAT_IB_ATTR_CMP_AND_SWAP "DAT_IB_CMP_AND_SWAP" #define DAT_IB_ATTR_IMMED_DATA "DAT_IB_IMMED_DATA" #define DAT_IB_ATTR_UD "DAT_IB_UD" #define DAT_IB_COLL_SET_CLOCK "DAT_COLL_SET_CLOCK" #define DAT_IB_COLL_READ_CLOCK "DAT_COLL_READ_CLOCK" #define DAT_IB_COLL_BROADCAST "DAT_COLL_BROADCAST" #define DAT_IB_COLL_BARRIER "DAT_COLL_BARRIER" #define DAT_IB_COLL_SCATTER "DAT_COLL_SCATTER" #define DAT_IB_COLL_SCATTERV "DAT_COLL_SCATTERV" #define DAT_IB_COLL_GATHER "DAT_COLL_GATHER" #define DAT_IB_COLL_GATHERV "DAT_COLL_GATHERV" #define DAT_IB_COLL_ALLGATHER "DAT_COLL_ALLGATHER" #define DAT_IB_COLL_ALLGATHERV "DAT_COLL_ALLGATHERV" #define DAT_IB_COLL_ALLTOALL "DAT_COLL_ALLTOALL" #define DAT_IB_COLL_ALLTOALLV "DAT_COLL_ALLTOALLV" #define DAT_IB_COLL_REDUCE "DAT_COLL_REDUCE" #define DAT_IB_COLL_ALLREDUCE "DAT_COLL_ALLREDUCE" #define DAT_IB_COLL_REDUCE_SCATTER "DAT_COLL_REDUCE_SCATTER" #define DAT_IB_COLL_SCAN "DAT_COLL_SCAN" /* Collective handle */ typedef DAT_HANDLE DAT_IB_COLLECTIVE_HANDLE; /* * Definition for extended EVENT numbers, DAT_IB_EXTENSION_BASE_RANGE * is used by these extensions as a starting point for extended event numbers * * DAT_IB_DTO_EVENT - All extended data transfers - req/recv evd * DAT_IB_AH_EVENT - address handle resolution - connect evd */ typedef enum dat_ib_event_number { DAT_IB_DTO_EVENT = DAT_IB_EXTENSION_RANGE_BASE, DAT_IB_UD_CONNECTION_REQUEST_EVENT, DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED, DAT_IB_UD_CONNECTION_REJECT_EVENT, DAT_IB_UD_CONNECTION_ERROR_EVENT, DAT_IB_COLLECTIVE_EVENT, } DAT_IB_EVENT_NUMBER; /* * Extension operations */ typedef enum dat_ib_op { DAT_IB_FETCH_AND_ADD_OP, DAT_IB_CMP_AND_SWAP_OP, DAT_IB_RDMA_WRITE_IMMED_OP, DAT_IB_UD_SEND_OP, DAT_IB_QUERY_COUNTERS_OP, DAT_IB_PRINT_COUNTERS_OP, DAT_IB_COLLECTIVE_CREATE_MEMBER_OP, DAT_IB_COLLECTIVE_FREE_MEMBER_OP, DAT_IB_COLLECTIVE_CREATE_GROUP_OP, DAT_IB_COLLECTIVE_FREE_GROUP_OP, DAT_IB_COLLECTIVE_SET_CLOCK_OP, DAT_IB_COLLECTIVE_READ_CLOCK_OP, DAT_IB_COLLECTIVE_SCATTER_OP, DAT_IB_COLLECTIVE_SCATTERV_OP, DAT_IB_COLLECTIVE_GATHER_OP, DAT_IB_COLLECTIVE_GATHERV_OP, DAT_IB_COLLECTIVE_ALLGATHER_OP, DAT_IB_COLLECTIVE_ALLGATHERV_OP, DAT_IB_COLLECTIVE_ALLTOALL_OP, DAT_IB_COLLECTIVE_ALLTOALLV_OP, DAT_IB_COLLECTIVE_REDUCE_OP, DAT_IB_COLLECTIVE_ALLREDUCE_OP, DAT_IB_COLLECTIVE_REDUCE_SCATTER_OP, DAT_IB_COLLECTIVE_SCAN_OP, DAT_IB_COLLECTIVE_BROADCAST_OP, DAT_IB_COLLECTIVE_BARRIER_OP, DAT_IB_START_COUNTERS_OP, DAT_IB_STOP_COUNTERS_OP, DAT_IB_UD_CM_FREE_OP, DAT_IB_UD_AH_FREE_OP, /* OPEN and CLOSE extensions require DAT support, set proper range */ DAT_IB_OPEN_QUERY_OP = DAT_OPEN_EXTENSION_BASE, DAT_IB_CLOSE_QUERY_OP = DAT_CLOSE_EXTENSION_BASE, } DAT_IB_OP; /* * The DAT_IB_EXT_TYPE enum specifies the type of extension operation that just * completed. All IB extended completion types both, DTO and NON-DTO, are * reported in the extended operation type with the single DAT_IB_DTO_EVENT type. * The specific extended DTO operation is reported with a DAT_IB_DTOS type in the * operation field of the base DAT_EVENT structure. All other extended events are * identified by unique DAT_IB_EVENT_NUMBER types. */ typedef enum dat_ib_ext_type { DAT_IB_FETCH_AND_ADD, // 0 DAT_IB_CMP_AND_SWAP, // 1 DAT_IB_RDMA_WRITE_IMMED, // 2 DAT_IB_RDMA_WRITE_IMMED_DATA, // 3 DAT_IB_RECV_IMMED_DATA, // 4 DAT_IB_UD_CONNECT_REQUEST, // 5 DAT_IB_UD_REMOTE_AH, // 6 DAT_IB_UD_PASSIVE_REMOTE_AH, // 7 DAT_IB_UD_SEND, // 8 DAT_IB_UD_RECV, // 9 DAT_IB_UD_CONNECT_REJECT, // 10 DAT_IB_UD_CONNECT_ERROR, // 11 DAT_IB_COLLECTIVE_CREATE_STATUS, // 12 DAT_IB_COLLECTIVE_CREATE_DATA, // 13 DAT_IB_COLLECTIVE_CLOCK_SET_STATUS, // 14 DAT_IB_COLLECTIVE_SCATTER_STATUS, // 15 DAT_IB_COLLECTIVE_SCATTERV_STATUS, // 16 DAT_IB_COLLECTIVE_GATHER_STATUS, // 17 DAT_IB_COLLECTIVE_GATHERV_STATUS, // 18 DAT_IB_COLLECTIVE_ALLGATHER_STATUS, // 19 DAT_IB_COLLECTIVE_ALLGATHERV_STATUS, // 20 DAT_IB_COLLECTIVE_ALLTOALL_STATUS, // 21 DAT_IB_COLLECTIVE_ALLTOALLV_STATUS, // 22 DAT_IB_COLLECTIVE_REDUCE_STATUS, // 23 DAT_IB_COLLECTIVE_ALLREDUCE_STATUS, // 24 DAT_IB_COLLECTIVE_REDUCE_SCATTER_STATUS,// 25 DAT_IB_COLLECTIVE_SCAN_STATUS, // 26 DAT_IB_COLLECTIVE_BROADCAST_STATUS, // 27 DAT_IB_COLLECTIVE_BARRIER_STATUS, // 28 } DAT_IB_EXT_TYPE; /* * Extension event status */ typedef enum dat_ib_status { DAT_OP_SUCCESS = DAT_SUCCESS, DAT_IB_OP_ERR, DAT_IB_COLL_COMP_ERR, } DAT_IB_STATUS; /* * Definitions for additional extension type RETURN codes above * standard DAT types. Included with standard DAT_TYPE_STATUS * bits using a DAT_EXTENSION BASE as a starting point. */ typedef enum dat_ib_return { DAT_IB_ERR = DAT_EXTENSION_BASE, DAT_IB_COLLECTIVE_ERR } DAT_IB_RETURN; /* * Definition for extended IB DTO operations, DAT_DTO_EXTENSION_BASE * is used by DAT extensions as a starting point of extension DTOs */ typedef enum dat_ib_dtos { DAT_IB_DTO_RDMA_WRITE_IMMED = DAT_DTO_EXTENSION_BASE, DAT_IB_DTO_RECV_IMMED, DAT_IB_DTO_FETCH_ADD, DAT_IB_DTO_CMP_SWAP, DAT_IB_DTO_RECV_MSG_IMMED, DAT_IB_DTO_SEND_UD, DAT_IB_DTO_RECV_UD, DAT_IB_DTO_RECV_UD_IMMED, DAT_IB_DTO_COLLECTIVES, } DAT_IB_DTOS; /* * Definitions for additional extension handle types beyond * standard DAT handle. New Bit definitions MUST start at * DAT_HANDLE_TYPE_EXTENSION_BASE */ typedef enum dat_ib_handle_type { DAT_IB_HANDLE_TYPE_EXT = DAT_HANDLE_TYPE_EXTENSION_BASE, DAT_IB_HANDLE_TYPE_COLLECTIVE } DAT_IB_HANDLE_TYPE; /* * The DAT_IB_EVD_EXTENSION_FLAGS enum specifies the EVD extension flags that * do not map directly to existing DAT_EVD_FLAGS. This new EVD flag has been * added to identify an extended EVD that does not fit the existing stream * types. */ typedef enum dat_ib_evd_extension_flags { DAT_IB_EVD_EXTENSION_FLAG = DAT_EVD_EXTENSION_BASE, } DAT_IB_EVD_EXTENSION_FLAGS; /* * Definition for memory privilege extension flags. * New privileges required for new atomic DTO type extensions. * New Bit definitions MUST start at DAT_MEM_PRIV_EXTENSION */ typedef enum dat_ib_mem_priv_flags { DAT_IB_MEM_PRIV_REMOTE_ATOMIC = DAT_MEM_PRIV_EXTENSION_BASE, } DAT_IB_MEM_PRIV_FLAGS; /* * Definition for IB address handle, unreliable datagram. */ typedef struct dat_ib_addr_handle { struct ibv_ah *ah; DAT_UINT32 qpn; DAT_SOCK_ADDR6 ia_addr; } DAT_IB_ADDR_HANDLE; /* * Definition for the value filed of extended event that contains immediate data */ typedef struct dat_ib_immed_data { DAT_UINT32 data; } DAT_IB_IMMED_DATA; /* definition for IB collective event data */ typedef struct dat_ib_collective_event_data { DAT_HANDLE handle; DAT_CONTEXT context; } DAT_IB_COLLECTIVE_EVENT_DATA; /* * Definitions for extended event data: * When dat_event->event_number >= DAT_IB_EXTENSION_BASE_RANGE * then dat_event->extension_data == DAT_IB_EXTENSION_EVENT_DATA type * and ((DAT_IB_EXTENSION_EVENT_DATA*)dat_event->extension_data)->type * specifies extension data values. * NOTE: DAT_IB_EXTENSION_EVENT_DATA cannot exceed 64 bytes as defined by * "DAT_UINT64 extension_data[8]" in DAT_EVENT (dat.h) * * DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED * UD address and CM handles via extended UD connect establishment. * ia_addr provided with extended conn events for reference. * CM handle provided via context, for dat_ib_ud_cm_release(). * AH provided via remote_ah, for dat_ib_ud_ah_destroy(). * NOTE: if CM released, AH must be destroy before dat_ep_free. */ typedef struct dat_ib_extension_event_data { DAT_IB_EXT_TYPE type; DAT_IB_STATUS status; union { DAT_IB_IMMED_DATA immed; } val; union { DAT_IB_ADDR_HANDLE remote_ah; DAT_IB_COLLECTIVE_EVENT_DATA coll; }; DAT_CONTEXT context; } DAT_IB_EXTENSION_EVENT_DATA; /* * Definitions for additional extension handle types beyond * standard DAT handle. New Bit definitions MUST start at * DAT_HANDLE_TYPE_EXTENSION_BASE */ typedef enum dat_ib_service_type { DAT_IB_SERVICE_TYPE_UD = DAT_SERVICE_TYPE_EXTENSION_BASE, } DAT_IB_SERVICE_TYPE; /* * Definitions for 64-bit IA Counters */ typedef enum dat_ia_counters { DCNT_IA_PZ_CREATE, DCNT_IA_PZ_FREE, DCNT_IA_LMR_CREATE, DCNT_IA_LMR_FREE, DCNT_IA_RMR_CREATE, DCNT_IA_RMR_FREE, DCNT_IA_PSP_CREATE, DCNT_IA_PSP_CREATE_ANY, DCNT_IA_PSP_FREE, DCNT_IA_RSP_CREATE, DCNT_IA_RSP_FREE, DCNT_IA_EVD_CREATE, DCNT_IA_EVD_FREE, DCNT_IA_EP_CREATE, DCNT_IA_EP_FREE, DCNT_IA_SRQ_CREATE, DCNT_IA_SRQ_FREE, DCNT_IA_SP_CR, DCNT_IA_SP_CR_ACCEPTED, DCNT_IA_SP_CR_REJECTED, DCNT_IA_MEM_ALLOC, DCNT_IA_MEM_ALLOC_DATA, DCNT_IA_MEM_FREE, DCNT_IA_ASYNC_ERROR, DCNT_IA_ASYNC_QP_ERROR, DCNT_IA_ASYNC_CQ_ERROR, DCNT_IA_CM_LISTEN, DCNT_IA_CM_REQ_TX, DCNT_IA_CM_REQ_RX, DCNT_IA_CM_REP_TX, DCNT_IA_CM_REP_RX, DCNT_IA_CM_RTU_TX, DCNT_IA_CM_RTU_RX, DCNT_IA_CM_USER_REJ_TX, DCNT_IA_CM_USER_REJ_RX, DCNT_IA_CM_ACTIVE_EST, DCNT_IA_CM_PASSIVE_EST, DCNT_IA_CM_AH_REQ_TX, DCNT_IA_CM_AH_REQ_RX, DCNT_IA_CM_AH_RESOLVED, DCNT_IA_CM_DREQ_TX, DCNT_IA_CM_DREQ_RX, DCNT_IA_CM_DREP_TX, DCNT_IA_CM_DREP_RX, DCNT_IA_CM_MRA_TX, DCNT_IA_CM_MRA_RX, DCNT_IA_CM_REQ_FULLQ_POLL, DCNT_IA_CM_ERR, DCNT_IA_CM_ERR_REQ_FULLQ, DCNT_IA_CM_ERR_REQ_DUP, DCNT_IA_CM_ERR_REQ_RETRY, DCNT_IA_CM_ERR_REP_DUP, DCNT_IA_CM_ERR_REP_RETRY, DCNT_IA_CM_ERR_RTU_DUP, DCNT_IA_CM_ERR_RTU_RETRY, DCNT_IA_CM_ERR_REFUSED, DCNT_IA_CM_ERR_RESET, DCNT_IA_CM_ERR_TIMEOUT, DCNT_IA_CM_ERR_REJ_TX, DCNT_IA_CM_ERR_REJ_RX, DCNT_IA_CM_ERR_DREQ_DUP, DCNT_IA_CM_ERR_DREQ_RETRY, DCNT_IA_CM_ERR_DREP_DUP, DCNT_IA_CM_ERR_DREP_RETRY, DCNT_IA_CM_ERR_MRA_DUP, DCNT_IA_CM_ERR_MRA_RETRY, DCNT_IA_CM_ERR_UNEXPECTED, DCNT_IA_LNK_ERR_RCV, DCNT_IA_LNK_ERR_RCV_REM_PHYS, DCNT_IA_LNK_ERR_RCV_CONSTRAINT, DCNT_IA_LNK_ERR_XMT_DISCARDS, DCNT_IA_LNK_ERR_XMT_CONTRAINT, DCNT_IA_LNK_ERR_INTEGRITY, DCNT_IA_LNK_ERR_EXC_BUF_OVERRUN, DCNT_IA_LNK_WARN_RCV_SW_RELAY, DCNT_IA_LNK_WARN_XMT_WAIT, DCNT_IA_DIAG_ERR_RQ_RAE, DCNT_IA_DIAG_ERR_RQ_OOS, DCNT_IA_DIAG_ERR_RQ_RIRE, DCNT_IA_DIAG_ERR_RQ_UDSDPRD, DCNT_IA_DIAG_ERR_SQ_RAE, DCNT_IA_DIAG_ERR_SQ_OOS, DCNT_IA_DIAG_ERR_SQ_RIRE, DCNT_IA_DIAG_ERR_SQ_RREE, DCNT_IA_DIAG_ERR_SQ_TREE, DCNT_IA_ALL_COUNTERS, /* MUST be last */ } DAT_IA_COUNTERS; /* * Definitions for 64-bit EP Counters */ typedef enum dat_ep_counters { DCNT_EP_CONNECT, DCNT_EP_DISCONNECT, DCNT_EP_POST_SEND, DCNT_EP_POST_SEND_DATA, DCNT_EP_POST_SEND_UD, DCNT_EP_POST_SEND_UD_DATA, DCNT_EP_POST_RECV, DCNT_EP_POST_RECV_DATA, DCNT_EP_POST_WRITE, DCNT_EP_POST_WRITE_DATA, DCNT_EP_POST_WRITE_IMM, DCNT_EP_POST_WRITE_IMM_DATA, DCNT_EP_POST_READ, DCNT_EP_POST_READ_DATA, DCNT_EP_POST_CMP_SWAP, DCNT_EP_POST_FETCH_ADD, DCNT_EP_RECV, DCNT_EP_RECV_DATA, DCNT_EP_RECV_UD, DCNT_EP_RECV_UD_DATA, DCNT_EP_RECV_IMM, DCNT_EP_RECV_IMM_DATA, DCNT_EP_RECV_RDMA_IMM, DCNT_EP_RECV_RDMA_IMM_DATA, DCNT_EP_ALL_COUNTERS, /* MUST be last */ } DAT_EP_COUNTERS; /* * Definitions for 64-bit EVD Counters */ typedef enum dat_evd_counters { DCNT_EVD_WAIT, DCNT_EVD_WAIT_BLOCKED, DCNT_EVD_WAIT_NOTIFY, DCNT_EVD_DEQUEUE, DCNT_EVD_DEQUEUE_FOUND, DCNT_EVD_DEQUEUE_NOT_FOUND, DCNT_EVD_DEQUEUE_POLL, DCNT_EVD_DEQUEUE_POLL_FOUND, DCNT_EVD_CONN_CALLBACK, DCNT_EVD_DTO_CALLBACK, DCNT_EVD_ALL_COUNTERS, /* MUST be last */ } DAT_EVD_COUNTERS; /* * Definitions IA Counter Types * for sampling running counters * */ typedef enum dat_ia_counter_type { DCNT_IA_CM, DCNT_IA_LNK, DCNT_IA_DIAG, } DAT_IA_COUNTER_TYPE; /* * Data type for reduce operations */ typedef enum dat_ib_collective_data_type { DAT_IB_COLLECTIVE_TYPE_INT8, DAT_IB_COLLECTIVE_TYPE_UINT8, DAT_IB_COLLECTIVE_TYPE_INT16, DAT_IB_COLLECTIVE_TYPE_UINT16, DAT_IB_COLLECTIVE_TYPE_INT32, DAT_IB_COLLECTIVE_TYPE_UINT32, DAT_IB_COLLECTIVE_TYPE_INT64, DAT_IB_COLLECTIVE_TYPE_UINT64, DAT_IB_COLLECTIVE_TYPE_FLOAT, DAT_IB_COLLECTIVE_TYPE_DOUBLE, DAT_IB_COLLECTIVE_TYPE_LONG_DOUBLE, DAT_IB_COLLECTIVE_TYPE_SHORT_INT, DAT_IB_COLLECTIVE_TYPE_2INT, DAT_IB_COLLECTIVE_TYPE_FLOAT_INT, DAT_IB_COLLECTIVE_TYPE_LONG_INT, DAT_IB_COLLECTIVE_TYPE_DOUBLE_INT, } DAT_IB_COLLECTIVE_DATA_TYPE; /* * Opcode for reduce operations */ typedef enum dat_ib_collective_reduce_data_op { DAT_IB_COLLECTIVE_REDUCE_OP_MAX, DAT_IB_COLLECTIVE_REDUCE_OP_MIN, DAT_IB_COLLECTIVE_REDUCE_OP_SUM, DAT_IB_COLLECTIVE_REDUCE_OP_PROD, DAT_IB_COLLECTIVE_REDUCE_OP_LAND, DAT_IB_COLLECTIVE_REDUCE_OP_BAND, DAT_IB_COLLECTIVE_REDUCE_OP_LOR, DAT_IB_COLLECTIVE_REDUCE_OP_BOR, DAT_IB_COLLECTIVE_REDUCE_OP_LXOR, DAT_IB_COLLECTIVE_REDUCE_OP_BXOR, DAT_IB_COLLECTIVE_REDUCE_OP_MAXLOC, DAT_IB_COLLECTIVE_REDUCE_OP_MINLOC } DAT_IB_COLLECTIVE_REDUCE_DATA_OP; /* * For group creation */ typedef unsigned int DAT_IB_COLLECTIVE_RANK; typedef unsigned int DAT_IB_COLLECTIVE_ID; typedef void * DAT_IB_COLLECTIVE_MEMBER; typedef struct dat_ib_collective_group { int local_size; /* # of processes on this node */ int local_rank; /* my rank within the node */ int *local_ranks; /* global rank for each local process */ int external_size; /* # of nodes, each node has exactly one external process (local root) */ int external_rank; /* my rank among all external processes if one of them, otherwise -1 */ int *external_ranks; /* global rank for each external process */ int *intranode_table; /* mapping from global rank to local rank. -1 if the process is on a different node */ int *internode_table; /* mapping from global rank to external rank. -1 if the process is >not external */ int is_comm_world; } DAT_IB_COLLECTIVE_GROUP; /* Extended RETURN and EVENT STATUS string helper functions */ /* DAT_EXT_RETURN error to string */ static __inline__ DAT_RETURN DAT_API dat_strerror_extension ( IN DAT_IB_RETURN value, OUT const char **message ) { switch( DAT_GET_TYPE(value) ) { case DAT_IB_ERR: *message = "DAT_IB_ERR"; return DAT_SUCCESS; default: /* standard DAT return type */ return(dat_strerror(value, message, NULL)); } } /* DAT_EXT_STATUS error to string */ static __inline__ DAT_RETURN DAT_API dat_strerror_ext_status ( IN DAT_IB_STATUS value, OUT const char **message ) { switch(value) { case 0: *message = " "; return DAT_SUCCESS; case DAT_IB_OP_ERR: *message = "DAT_IB_OP_ERR"; return DAT_SUCCESS; default: *message = "unknown extension status"; return DAT_INVALID_PARAMETER; } } /* * Extended IB transport specific APIs * redirection via DAT extension function * va_arg function: DAT_HANDLE and OP type MUST be first 2 parameters * * RETURN VALUE: DAT_RETURN */ /* * This asynchronous call is modeled after the InfiniBand atomic * Fetch and Add operation. The add_value is added to the 64 bit * value stored at the remote memory location specified in remote_iov * and the result is stored in the local_iov. */ #define dat_ib_post_fetch_and_add(ep, add_val, lbuf, cookie, rbuf, flgs) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_FETCH_AND_ADD_OP, \ IN (DAT_UINT64) (add_val), \ IN (DAT_LMR_TRIPLET *) (lbuf), \ IN (cookie), \ IN (DAT_RMR_TRIPLET *) (rbuf), \ IN (DAT_COMPLETION_FLAGS) (flgs)) /* * This asynchronous call is modeled after the InfiniBand atomic * Compare and Swap operation. The cmp_value is compared to the 64 bit * value stored at the remote memory location specified in remote_iov. * If the two values are equal, the 64 bit swap_value is stored in * the remote memory location. In all cases, the original 64 bit * value stored in the remote memory location is copied to the local_iov. */ #define dat_ib_post_cmp_and_swap(ep, cmp_val, swap_val, lbuf, cookie, rbuf, flgs) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_CMP_AND_SWAP_OP, \ IN (DAT_UINT64) (cmp_val), \ IN (DAT_UINT64) (swap_val), \ IN (DAT_LMR_TRIPLET *) (lbuf), \ IN (cookie), \ IN (DAT_RMR_TRIPLET *) (rbuf), \ IN (DAT_COMPLETION_FLAGS) (flgs)) /* * RDMA Write with IMMEDIATE: * * This asynchronous call is modeled after the InfiniBand rdma write with * immediate data operation. Event completion for the request completes as an * DAT_EXTENSION with extension type set to DAT_DTO_EXTENSION_IMMED_DATA. * Event completion on the remote endpoint completes as receive DTO operation * type of DAT_EXTENSION with operation set to DAT_DTO_EXTENSION_IMMED_DATA. * The immediate data will be provided in the extented DTO event data structure. * * Note to Consumers: the immediate data will consume a receive * buffer at the Data Sink. * * Other extension flags: * n/a */ #define dat_ib_post_rdma_write_immed(ep, size, lbuf, cookie, rbuf, idata, flgs) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_RDMA_WRITE_IMMED_OP, \ IN (DAT_COUNT) (size), \ IN (DAT_LMR_TRIPLET *) (lbuf), \ IN (cookie), \ IN (DAT_RMR_TRIPLET *) (rbuf), \ IN (DAT_UINT32) (idata), \ IN (DAT_COMPLETION_FLAGS) (flgs)) /* * Unreliable datagram: msg send * * This asynchronous call is modeled after the InfiniBand UD message send * Event completion for the request completes as an * DAT_EXTENSION with extension type set to DAT_DTO_EXTENSION_UD_SEND. * Event completion on the remote endpoint completes as receive DTO operation * type of DAT_EXTENSION with operation set to DAT_DTO_EXTENSION_UD_RECV. * * Other extension flags: * n/a */ #define dat_ib_post_send_ud(ep, segments, lbuf, ah_ptr, cookie, flgs) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_UD_SEND_OP, \ IN (DAT_COUNT) (segments), \ IN (DAT_LMR_TRIPLET *) (lbuf), \ IN (DAT_IB_ADDR_HANDLE *) (ah_ptr), \ IN (cookie), \ IN (DAT_COMPLETION_FLAGS) (flgs)) /* * Unreliable datagram: msg recv * * Mapping to standard EP post call. */ #define dat_ib_post_recv_ud dat_ep_post_recv /* * Unreliable datagram: free CM * * This call frees CM object after AH and private data are copied * and stored by consumer. Provider will destroy internal object * and memory associated with CM and AH resolution. MAY be called * after CM establishment and before EP destroyed * * Other extension flags: * n/a */ #define dat_ib_ud_cm_free(ep, cm) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_UD_CM_FREE_OP, \ IN (DAT_CONTEXT) (cm)) /* * Unreliable datagram: free AH * * This call frees UD Address Handle (AH). MUST be called after all UD sends * are complete and before UD EP is destroyed. * * Other extension flags: * n/a */ #define dat_ib_ud_ah_free(ep, ah) \ dat_extension_op(\ IN (DAT_EP_HANDLE) (ep), \ IN (DAT_IB_OP) DAT_IB_UD_AH_FREE_OP, \ IN (DAT_IB_ADDR_HANDLE *) (ah)) /* * Query counter(s): * Provide IA, EP, or EVD and call will return appropriate counters * DAT_HANDLE dat_handle, enum cntr, *DAT_UINT64 p_cntrs_out, int reset * * use _ALL_COUNTERS to query all */ #define dat_ib_query_counters(dat_handle, cntr, p_cntrs_out, reset) \ dat_extension_op(\ IN (DAT_HANDLE) dat_handle, \ IN (DAT_IB_OP) DAT_QUERY_COUNTERS_OP, \ IN (int) (cntr), \ IN (DAT_UINT64 *) (p_cntrs_out), \ IN (int) (reset)) /* * Print counter(s): * Provide IA, EP, or EVD and call will print appropriate counters * DAT_HANDLE dat_handle, int cntr, int reset * * use _ALL_COUNTERS to print all */ #define dat_ib_print_counters(dat_handle, cntr, reset) \ dat_extension_op(\ IN (DAT_HANDLE) dat_handle, \ IN (DAT_IB_OP) DAT_PRINT_COUNTERS_OP, \ IN (int) (cntr), \ IN (int) (reset)) /* * Start and stop counter(s): * Provide IA, call will start sampling running IB counters * DAT_HANDLE dat_handle, counter type (link, diag) * */ #define dat_ib_start_counter(dat_handle, type) \ dat_extension_op(\ IN (DAT_HANDLE) dat_handle, \ IN (DAT_IB_OP) DAT_IB_START_COUNTERS_OP, \ IN (DAT_COUNTER_TYPE) (type)) #define dat_ib_stop_counter(dat_handle, type) \ dat_extension_op(\ IN (DAT_HANDLE) dat_handle, \ IN (DAT_IB_OP) DAT_IB_STOP_COUNTERS_OP, \ IN (DAT_COUNTER_TYPE) (type)) /* * dat_ib_open_query: * dat_ib_close_query: * * Given IA name, open appropriate provider for fast attribute query * * OUT: * ia_handle * ia_attr * pr_attr * * RETURN VALUE: * * DAT_SUCCESS * DAT_INVALID_HANDLE * DAT_NOT_IMPLEMENTED * */ #define dat_ib_open_query(name, ia_handle, ia_mask, ia_attr, prov_mask, prov_attr) \ dat_extension_op(\ IN (DAT_HANDLE) (NULL), \ IN (DAT_IB_OP) DAT_IB_OPEN_QUERY_OP, \ IN (const DAT_NAME_PTR) (name), \ OUT (DAT_HANDLE *) (ia_handle), \ IN (DAT_IA_ATTR_MASK) (ia_mask), \ OUT (DAT_IA_ATTR *) (ia_attr), \ IN (DAT_PROVIDER_ATTR_MASK) (prov_mask), \ OUT (DAT_PROVIDER_ATTR *) (prov_attr)) #define dat_ib_close_query(ia_handle) \ dat_extension_op(\ IN (DAT_HANDLE) (ia_handle), \ IN (DAT_IB_OP) DAT_IB_CLOSE_QUERY_OP) /* ************************ MPI IB Collective Functions *********************** */ /* MPI collective member and group setup functions */ /* * This synchronous call creates and returns local member * address information for a collective device or provider * for each rank. The size of the member address information * is dependent on the collective device or provider. * This address information, for each rank, must be exchanged * and used for group creation on all ranks. */ #define dat_ib_collective_create_member(ia_handle, progress_func, member, member_size) \ dat_extension_op(\ IN (DAT_IA_HANDLE) (ia_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_CREATE_MEMBER_OP, \ IN (void *) (progress_func), \ OUT (DAT_IB_COLLECTIVE_MEMBER *) (member), \ OUT (DAT_UINT32 *) (member_size)) /* * This synchronous call destroys a previously created member * information associated with the this device ia_handle argument. */ #define dat_ib_collective_free_member(ia_handle, member) \ dat_extension_op(\ IN (DAT_IA_HANDLE) (ia_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_FREE_MEMBER_OP, \ IN (DAT_IB_COLLECTIVE_MEMBER) (member)) /* * This asynchronous call initiates the process of creating a collective * group and must be called by all group members. The collective_group * argument points to an array of address/connection qualifier pairs that * identify the members of the group in rank order. The group_size argument * specifies the size of the group and therefore the size of the coll_group * array. The self argument identifies the rank of the caller. * The group_id argument specifies a network-unique identifier for this * instance of the collective group. The group_info provides global and local * rank and process information. All members of the group must specify * the same group_id value for the same collective instance. The evd_handle * argument specifies the EVD used for all asynchronous collective completions * including this call. The user_context argument will be returned in the * DAT_EXT_COLLECTIVE_CREATE_DATA event. * * On a successful completion, each group member will receive a * DAT_EXT_COLLECTIVE_CREATE_DATA event on the EVD specified by evd_handle. * The event contains the collective handle, the rank of the receiving * Endpoint within the collective group, the size of the group, and the * caller specified user_context. The returned collective handle can be used * in network clock, Multicast, and other collective operations. * * RETURN VALUE: DAT_RETURN */ #define dat_ib_collective_create_group(members, group_size, self, group_id, group_info, evd, pd, user_context) \ dat_extension_op(\ IN (DAT_EVD_HANDLE) (evd), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_CREATE_GROUP_OP, \ IN (DAT_IB_COLLECTIVE_MEMBER *) (members), \ IN (DAT_COUNT) (group_size), \ IN (DAT_IB_COLLECTIVE_RANK) (self), \ IN (DAT_IB_COLLECTIVE_ID) (group_id), \ IN (DAT_IB_COLLECTIVE_GROUP *) (group_info), \ IN (DAT_PZ_HANDLE) (pd), \ IN (DAT_CONTEXT) (user_context)) /* * This synchronous call destroys a previously created collective group * associated with the collective_handle argument. Any pending or * in-process requests associated with the collective group will be * terminated and be posted to the appropriate EVD. * * RETURN VALUE: DAT_RETURN */ #define dat_ib_collective_free_group(coll_handle) \ dat_extension_op(\ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_FREE_GROUP_OP) /* MPI collective data operations */ /* * This call sets the network clock associated with * collective_handle. A provider implementation may keep a single * global clock for all collective handles. When this is the case, * this call sets an adjustment for the given handle so that * subsequent calls to read the clock will be relative to the value * specified by clock_value. This is an asynchronous call that * completes on the collective EVD. The network clock will not be * synchronized until the request is completed. Any member of the * collective can set the clock and only one member should make * this call on behave of the entire collective. */ #define dat_ib_collective_set_clock(coll_handle, clock_value, user_context ) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_READ_CLOCK_OP, \ IN (DAT_UINT64) (clock_value), \ IN (DAT_CONTEXT) (user_contex)) /* * This synchronous call returns the current value of the network clock * associated with the given collective handle. This is a light weight * call to minimize skew */ #define dat_ib_collective_read_clock(coll_handle, clock_value ) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_READ_CLOCK_OP, \ OUT (DAT_UINT64 *) clock_value)) /* * This call performs a scatter of the data specified by the * send_buffer argument to the collective group specified by coll_handle. * Data is received in the buffer specified by the recv_buffer argument. * The recv_byte_count argument specifies the size of the receive buffer. * Data from the root send_buffer will be divided by the number of members * in the collective group to form equal and contiguous memory partitions. * Each member of the collective group will receive its rank relative * partition. An error is returned if the send_byte_count does not describe * memory that can be evenly divided by the size of the collective group. * An "in place" transfer for the root rank can be indicated by passing NULL * as the recv_buffer argument. The send_buffer and send_byte_count * arguments are ignored on non-root members. The operation is completed on * the collective EVD unless completions are suppressed through the * completion flags. */ #define dat_ib_collective_scatter(coll_handle, sendbuf, sendsize, recvbuf, recvsize, root, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_SCATTER_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call performs a non-uniform scatter of the data * specified by the send_buffers array argument to the collective group * specified by coll_handle. The send_buffers array contains one buffer * pointer for each member of the collective group, in rank order. * The send_byte_counts array contains a byte count for each corresponding * send buffer pointer. The recv_buffer and recev_byte_count arguments * specify where received portions of the scatter are to be received. * An "in place" transfer for the root rank can be indicated by passing * NULL as the recv_buffer argument. The send_buffers and send_byte_counts * arguments are ignored on non-root members. The operation is completed * on the collective EVD unless completions are suppressed through the * completion flags. * */ #define dat_ib_collective_scatterv(coll_handle, sendbuf, sendsizes, displs, recvbuf, recvsize, root, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_SCATTERV_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT *) (sendsizes), \ IN (DAT_COUNT *) (displs), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call performs a gather of the data sent by all * members of the collective specified by the collective_handle argument. * The data to be sent is specified by the send_buffer and send_byte_count * arguments. Data is received by the collective member specified by the * root argument in the buffer specified by the recv_buffer and * recv_byte_count arguments. Data is placed into the receive buffer in * collective rank order. An "in place" transfer for the root rank can * be indicated by passing NULL as the send_buffer argument. * The recv_buffer and recv_byte_count arguments are ignored on non-root * members. The operation is completed on the collective EVD unless * completions are suppressed through the completion flags. */ #define dat_ib_collective_gather(coll_handle, sendbuf, sendsize, recvbuf, recvsize, root, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_GATHER_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS)(flags)) /* * This call performs a non-uniform gather of the data sent by * all members of the collective specified by the collective_handle argument. * The data to be sent is specified by the send_buffer and send_byte_count * arguments. Data is received by the collective member specified by the * root argument into the buffers specified by the recv_buffers and * recv_byte_counts array arguments. Data is placed into the receive buffer * associated with the rank that sent it. An "in place" transfer for the root * rank can be indicated by passing NULL as the send_buffer argument. * The recv_buffers and recv_byte_counts arguments are ignored on non-root * members. The operation is completed on the collective EVD unless * completions are suppressed through the completion flags. */ #define dat_ib_collective_gatherv(coll_handle, sendbuf, sendsize, recvbufs, recvsizes, displs, root, user_context, flags) \ dat_extension_op( \ (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_GATHERV_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT *) (recvsizes), \ IN (DAT_COUNT *) (displs), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call is equivalent to having all members of a collective * group perform a dat_collective_gather() as the root. This results in all * members of the collective having identical contents in their receive buffer */ #define dat_ib_collective_allgather(coll_handle, sendbuf, sendsize, recvbuf, recvsize, user_context, flags) \ dat_extension_op( \ (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_ALLGATHER_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call performs a non-uniform dat_collective_allgather() * operation. It is equivalent to having all members of a collective group * perform a dat_collective_gatherv() as the root. This results in all * members of the collective having identical contents in their receive * buffer. */ #define dat_ib_collective_allgatherv(coll_handle, sendbuf, sendsize, recvbuf, recvsizes, displs, user_context, flags) \ dat_extension_op( \ (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_ALLGATHERV_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT *) (recvsizes), \ IN (DAT_COUNT *) (displs), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call is an extension of dat_collective_allgather() * to the case where each member sends distinct data specified by send_buffer * to each of the other members. The jth block sent from rank i is received * by rank j and is placed in the ith block of recv_buffer. */ #define dat_ib_collective_alltoall(coll_handle, sendbuf, sendsize, recvbuf, recvsize, user_context, flags) \ dat_extension_op( \ (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_ALLTOALL_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call performs a non-uniform dat_collective_alltoall() operation */ #define dat_ib_collective_alltoallv(coll_handle, sendbuf, sendsizes, senddspls, recvbuf, recvsizes, recvdispls, user_context, flags) \ dat_extension_op( \ (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_ALLTOALLV_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT *) (sendsizes), \ IN (DAT_COUNT *) (senddispls), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT *) (recvsizes), \ IN (DAT_COUNT *) (recvdispls), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call combines the elements of the data type specified * by data_type from the buffer specified by send_buffer of all members of * the collective by performing the operation specified by reduce_operation * and placing the result into the buffer of the root member specified by * recv_buffer. It is an error to specify a floating point type with * any of the logical reduction operators.When using the REDUCE_OP_MINLOC * and REDUCE_OP _MAXLOC operations, it is assumed that the input and output * buffers contain pair values where the first member of the pair is of the * type specified by data_type followed by a COLLECTIVE_TYPE_UINT32 type. * When the reduction is complete, the receive buffer will contain the * MIN/MAX value in the first member of the pair with the first member rank * that contained it in the second member of the pair. The tables below * show the result of a REDUCE_OP_SUM reduce operation. */ #define dat_ib_collective_reduce(coll_handle, sendbuf, sendsize, recvbuf, recvsize, op, type, root, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE)(coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_REDUCE_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_REDUCE_DATA_OP) (op), \ IN (DAT_IB_COLLECTIVE_DATA_TYPE) (type), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call is identical to the dat_collective_reduce() * call with the exception that the recv_buffer and recv_byte_count arguments * are valid for all members of the collective and all members of will * receive the reduction results. */ #define dat_ib_collective_allreduce(coll_handle, sendbuf, sendsize, recvbuf, recvsize, op, type, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_ALLREDUCE_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_REDUCE_DATA_OP) (op), \ IN (DAT_IB_COLLECTIVE_DATA_TYPE) (type), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call is identical to rank 0 of the collective calling * this dat_collective_reduce() followed by dat_collective_scatterv(). * The number of bytes received in the scatter for each rank is determined * by rank offset into the recv_byte_counts array. */ #define dat_ib_collective_reduce_scatter(coll_handle, sendbuf, sendsize, recvbuf, recvsizes, op, type, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_REDUCE_SCATTER_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT *) (recvsizes), \ IN (DAT_IB_COLLECTIVE_REDUCE_DATA_OP) (op), \ IN (DAT_IB_COLLECTIVE_DATA_TYPE) (type), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call is used to perform a prefix reduction on data * distributed across the group. The operation returns, in recv_buffer of * the member with rank i, the reduction of the values in send_buffer of * members with ranks 0,...,i (inclusive). The tables below show the * result of a REDUCE_OP_SUM scan operation. */ #define dat_ib_collective_scan(coll_handle, sendbuf, sendsize, recvbuf, recvsize, op, type, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_SCAN_OP, \ IN (DAT_PVOID) (sendbuf), \ IN (DAT_COUNT) (sendsize), \ IN (DAT_PVOID) (recvbuf), \ IN (DAT_COUNT) (recvsize), \ IN (DAT_IB_COLLECTIVE_REDUCE_DATA_OP) (op), \ IN (DAT_IB_COLLECTIVE_DATA_TYPE) (type), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call performs a broadcast send operation that transfers * data specified by the buffer argument of the root into the buffer argument * of all other Endpoints in the collective group specified by coll_handle. * The operation is completed on the collective EVD unless completions are * suppressed through the completion flags. All broadcasts are considered * �in place� transfers. The tables below show the result of a broadcast * operation. */ #define dat_ib_collective_broadcast(coll_handle, buf, size, root, user_context, flags) \ dat_extension_op(\ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_BROADCAST_OP, \ IN (DAT_PVOID) (buf), \ IN (DAT_COUNT) (size), \ IN (DAT_IB_COLLECTIVE_RANK) (root), \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* * This call will synchronize all endpoints of the collective * group specified by coll_handle. This is an asynchronous call that * will post a completion to the collective EVD when all endpoints * have synchronized. */ #define dat_ib_collective_barrier(coll_handle, user_context, flags) \ dat_extension_op( \ IN (DAT_IB_COLLECTIVE_HANDLE) (coll_handle), \ IN (DAT_IB_OP) DAT_IB_COLLECTIVE_BARRIER_OP, \ IN (DAT_CONTEXT) (user_context), \ IN (DAT_COMPLETION_FLAGS) (flags)) /* Backward compatibility */ #define DAT_ATTR_COUNTERS DAT_IB_ATTR_COUNTERS #define dat_query_counters dat_ib_query_counters #define dat_print_counters dat_ib_print_counters #define DAT_QUERY_COUNTERS_OP DAT_IB_QUERY_COUNTERS_OP #define DAT_PRINT_COUNTERS_OP DAT_IB_PRINT_COUNTERS_OP #endif /* _DAT_IB_EXTENSIONS_H_ */ dapl-2.1.5/dat/include/dat2/dat_platform_specific.h000066400000000000000000000206631255317474200221770ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /*************************************************************** * * HEADER: dat_platform_specific.h * * PURPOSE: defines Platform-specific types. * * Description: Header file for "DAPL: Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * ***************************************************************/ #ifndef _DAT_PLATFORM_SPECIFIC_H_ #define _DAT_PLATFORM_SPECIFIC_H_ /* OS, processor, compiler type definitions. Add OSes as needed. */ /* * This captures the alignment for the bus transfer from the HCA/IB chip * to the main memory. */ #ifndef DAT_OPTIMAL_ALIGNMENT #define DAT_OPTIMAL_ALIGNMENT 256 /* Performance optimal alignment */ #endif /* DAT_OPTIMAL_ALIGNMENT */ /* Assume all OSes use sockaddr, for address family: IPv4 == AF_INET, * IPv6 == AF_INET6. Use of "namelen" field indicated. * * The Interface Adapter Address names an Interface Adapter local or * remote, that is used for connection management and Name * Service. The format of the dat_ia_address_ptr follows the normal * socket programming practice of struct sockaddr *. DAT supports both * IPv4 and IPv6 address families. Allocation and initialization of * DAT IA address structures must follow normal Sockets programming * procedures. The underlying type of the DAT IA address is the native * struct sockaddr for each target operating system. In all cases, * storage appropriate for the address family in use by the target * Provider must be allocated. For instance, when IPv6 addressing is * in use, this should be allocated as struct sockaddr_net6. The * sockaddr sa_family and, if present, sa_len fields must be * initialized appropriately, as well as the address information. * When passed across the DAPL API this storage is cast to the * DAT_IA_ADDRESS_PTR type. It is the responsibility of the callee to * verify that the sockaddr contains valid data for the requested * operation. It is always the responsibility of the caller to manage * the storage. * * uDAPL code example for Linux (kdapl would be similar): * * #include * #include * #include * #include * * struct sockaddr_in6 addr; * DAT_IA_ADDRESS_PTR ia_addr; * * // Note: linux pton requires explicit encoding of IPv4 in IPv6 * * addr.sin6_family = AF_INET6; * if (inet_pton(AF_INET6, "0:0:0:0:0:FFFF:192.168.0.1", * &addr.sin6_addr) <= 0) * return(-1); // Bad address or no address family support * * // initialize other necessary fields such as port, flow, etc * * ia_addr = (DAT_IA_ADDRESS_PTR) &addr; * dat_ep_connect(ep_handle, ia_addr, conn_qual, timeout, 0, NULL, * qos, DAT_CONNECT_DEFAULT_FLAG); * */ /* Solaris begins */ #if defined (sun) || defined(__sun) || defined(_sun_) || defined (__solaris__) #include #include /* needed for UINT64_C() macro */ typedef uint32_t DAT_UINT32; /* Unsigned host order, 32 bits */ typedef uint64_t DAT_UINT64; /* unsigned host order, 64 bits */ typedef unsigned long long DAT_UVERYLONG; /* unsigned longest native to compiler */ typedef void * DAT_PVOID; typedef int DAT_COUNT; #define DAT_IA_HANDLE_TO_UL(a) (unsigned long)(a) #define DAT_UL_TO_IA_HANDLE(a) (DAT_IA_HANDLE)(a) #include #include typedef struct sockaddr DAT_SOCK_ADDR; /* Socket address header native to OS */ typedef struct sockaddr_in6 DAT_SOCK_ADDR6; /* Socket address header native to OS */ #define DAT_AF_INET AF_INET #define DAT_AF_INET6 AF_INET6 typedef DAT_UINT64 DAT_PADDR; #define DAT_API #define DAT_EXPORT extern /* Solaris ends */ /* Linux begins */ #elif defined(__linux__) /* Linux */ #if defined(__KERNEL__) #include #else #include #include #include #endif /* defined(__KERNEL__) */ typedef u_int32_t DAT_UINT32; /* unsigned host order, 32 bits */ typedef u_int64_t DAT_UINT64; /* unsigned host order, 64 bits */ typedef unsigned long long DAT_UVERYLONG; /* unsigned longest native to compiler */ typedef void * DAT_PVOID; typedef int DAT_COUNT; typedef DAT_UINT64 DAT_PADDR; #ifndef UINT64_C #define UINT64_C(c) c ## ULL #endif /* UINT64_C */ #define DAT_IA_HANDLE_TO_UL(a) (unsigned long)(a) #define DAT_UL_TO_IA_HANDLE(a) (DAT_IA_HANDLE)(a) #if defined(__KERNEL__) #include #include #include #else #include #endif /* defined(__KERNEL__) */ typedef struct dat_comm { int domain; int type; int protocol; } DAT_COMM; typedef int DAT_FD; /* DAT File Descriptor */ typedef struct sockaddr DAT_SOCK_ADDR; /* Socket address header native to OS */ typedef struct sockaddr_in6 DAT_SOCK_ADDR6; /* Socket address header native to OS */ #define DAT_AF_INET AF_INET #define DAT_AF_INET6 AF_INET6 #define DAT_API #define DAT_EXPORT extern /* Linux ends */ /* Win32/64 begins */ #elif defined(_MSC_VER) || defined(_WIN32) || defined(_WIN64) /* NT. MSC compiler, Win32/64 platform */ #include #include typedef unsigned __int32 DAT_UINT32; /* Unsigned host order, 32 bits */ typedef unsigned __int64 DAT_UINT64; /* unsigned host order, 64 bits */ typedef unsigned long DAT_UVERYLONG; /* unsigned longest native to compiler */ #if defined(_WIN64) #define DAT_IA_HANDLE_TO_UL(a) (unsigned long)((DAT_UINT64)(a)) #define DAT_UL_TO_IA_HANDLE(a) (DAT_IA_HANDLE)((DAT_UINT64)(a)) #else // _WIN32 #define DAT_IA_HANDLE_TO_UL(a) (unsigned long)(a) #define DAT_UL_TO_IA_HANDLE(a) (DAT_IA_HANDLE)(a) #endif typedef void * DAT_PVOID; typedef int DAT_COUNT; typedef DAT_UINT64 DAT_PADDR; typedef struct dat_comm { int domain; int type; int protocol; } DAT_COMM; typedef int DAT_FD; /* DAT File Descriptor */ typedef struct sockaddr DAT_SOCK_ADDR; /* Sock addr header native to OS */ typedef struct sockaddr_in6 DAT_SOCK_ADDR6;/* Sock addr header native to OS */ #ifndef UINT64_C #define UINT64_C(c) c ## i64 #endif /* UINT64_C */ #define DAT_AF_INET AF_INET #define DAT_AF_INET6 AF_INET6 #if defined(EXPORT_DAT_SYMBOLS) #define DAT_EXPORT __declspec(dllexport) #else #define DAT_EXPORT __declspec(dllimport) #endif #define DAT_API __stdcall #ifndef __inline__ #define __inline__ __inline #endif #ifndef INLINE #define INLINE __inline #endif #if defined(__KDAPL__) /* must have the DDK for this definition */ typedef PHYSICAL_ADDRESS DAT_PADDR; #endif /* __KDAPL__ */ /* Windoze ends */ #else #error dat_platform_specific.h : OS type not defined #endif #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif #ifndef INOUT #define INOUT #endif #endif /* _DAT_PLATFORM_SPECIFIC_H_ */ dapl-2.1.5/dat/include/dat2/dat_redirection.h000077500000000000000000000706471255317474200210270ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /**************************************************************** * * HEADER: dat_redirection.h * * PURPOSE: Defines the common redirection macros * * Description: Macros to invoke DAPL functions from the dat_registry * * Mapping rules: * All global symbols are prepended with DAT_ or dat_ * All DAT objects have an 'api' tag which, such as 'ep' or 'lmr' * The method table is in the provider definition structure. * **********************************************************/ #ifndef _DAT_REDIRECTION_H_ #define _DAT_REDIRECTION_H_ typedef struct dat_provider DAT_PROVIDER; #ifndef DAT_HANDLE_TO_PROVIDER /* A utility macro to fetch the Provider Library for any object * * An alternate version could be defined for single library systems. * it would look something like: * extern const struct dat_ia my_single_ia_provider; * #define DAT_HANDLE_TO_PROVIDER(ignore) &my_single_ia_provider * * This would allow a good compiler to avoid indirection overhead when * making function calls. */ #define DAT_HANDLE_TO_PROVIDER(handle) (*(DAT_PROVIDER **)(handle)) #endif #define DAT_IA_QUERY(ia, evd, ia_msk, ia_ptr, p_msk, p_ptr) \ (*DAT_HANDLE_TO_PROVIDER (ia)->ia_query_func) (\ (ia), \ (evd), \ (ia_msk), \ (ia_ptr), \ (p_msk), \ (p_ptr)) #define DAT_SET_CONSUMER_CONTEXT(handle, context) \ (*DAT_HANDLE_TO_PROVIDER (handle)->set_consumer_context_func) (\ (handle), \ (context)) #define DAT_GET_CONSUMER_CONTEXT(handle, context) \ (*DAT_HANDLE_TO_PROVIDER (handle)->get_consumer_context_func) (\ (handle), \ (context)) #define DAT_GET_HANDLE_TYPE(handle, handle_type) \ (*DAT_HANDLE_TO_PROVIDER (handle)->get_handle_type_func) (\ (handle), \ (handle_type)) #define DAT_CR_QUERY(cr, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (cr)->cr_query_func) (\ (cr), \ (mask), \ (param)) #define DAT_CR_ACCEPT(cr, ep, size, pdata) \ (*DAT_HANDLE_TO_PROVIDER (cr)->cr_accept_func) (\ (cr), \ (ep), \ (size), \ (pdata)) #define DAT_CR_REJECT(cr, size, pdata) \ (*DAT_HANDLE_TO_PROVIDER (cr)->cr_reject_func) (\ (cr), \ (size), \ (pdata)) #define DAT_CR_HANDOFF(cr,qual) \ (*DAT_HANDLE_TO_PROVIDER(cr)->cr_handoff_func)(\ (cr), \ (qual)) #define DAT_EVD_QUERY(evd, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (evd)->evd_query_func) (\ (evd), \ (mask), \ (param)) #define DAT_EVD_RESIZE(evd, qsize) \ (*DAT_HANDLE_TO_PROVIDER (evd)->evd_resize_func) (\ (evd), \ (qsize)) #define DAT_EVD_POST_SE(evd, event) \ (*DAT_HANDLE_TO_PROVIDER (evd)->evd_post_se_func) (\ (evd), \ (event)) #define DAT_EVD_DEQUEUE(evd, event) \ (*DAT_HANDLE_TO_PROVIDER (evd)->evd_dequeue_func) (\ (evd), \ (event)) #define DAT_EVD_FREE(evd)\ (*DAT_HANDLE_TO_PROVIDER (evd)->evd_free_func) (\ (evd)) #define DAT_EP_CREATE(ia, pz, in_evd, out_evd, connect_evd, attr, ep) \ (*DAT_HANDLE_TO_PROVIDER (ia)->ep_create_func) (\ (ia), \ (pz), \ (in_evd), \ (out_evd), \ (connect_evd), \ (attr), \ (ep)) #define DAT_EP_CREATE_WITH_SRQ(ia, pz, in_evd, out_evd, \ connect_evd, srq, attr, ep) \ (*DAT_HANDLE_TO_PROVIDER (ia)->ep_create_with_srq_func) (\ (ia), \ (pz), \ (in_evd), \ (out_evd), \ (connect_evd), \ (srq), \ (attr), \ (ep)) #define DAT_EP_QUERY(ep, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_query_func) (\ (ep), \ (mask), \ (param)) #define DAT_EP_MODIFY(ep, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_modify_func) (\ (ep), \ (mask), \ (param)) #define DAT_EP_CONNECT(ep, ia_addr, conn_qual, \ timeout, psize, pdata, qos, flags) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_connect_func) (\ (ep), \ (ia_addr), \ (conn_qual), \ (timeout), \ (psize), \ (pdata), \ (qos), \ (flags)) #define DAT_EP_COMMON_CONNECT(ep, addr, timeout, psize, pdata) \ (*DAT_HANDLE_TO_PROVIDER(ep)->ep_common_connect_func)(\ (ep), \ (addr), \ (timeout), \ (psize), \ (pdata)) #define DAT_EP_DUP_CONNECT(ep, dup, timeout, psize, pdata, qos) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_dup_connect_func) (\ (ep), \ (dup), \ (timeout), \ (psize), \ (pdata), \ (qos)) #define DAT_EP_DISCONNECT(ep, flags) \ (*DAT_HANDLE_TO_PROVIDER(ep)->ep_disconnect_func) (\ (ep), \ (flags)) #define DAT_EP_POST_SEND(ep, size, lbuf, cookie, flags) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_post_send_func) (\ (ep), \ (size), \ (lbuf), \ (cookie), \ (flags)) #define DAT_EP_POST_SEND_WITH_INVALIDATE( \ ep,size,lbuf,cookie,flags,inv_flag,rmr_context) \ (*DAT_HANDLE_TO_PROVIDER(ep)-> \ ep_post_send_with_invalidate_func)(\ (ep), \ (size), \ (lbuf), \ (cookie), \ (flags), \ (inv_flag), \ (rmr_context)) #define DAT_EP_POST_RECV(ep, size, lbuf, cookie, flags) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_post_recv_func) (\ (ep), \ (size), \ (lbuf), \ (cookie), \ (flags)) #define DAT_EP_POST_RDMA_READ(ep, size, lbuf, cookie, rbuf, flags) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_post_rdma_read_func) (\ (ep), \ (size), \ (lbuf), \ (cookie), \ (rbuf), \ (flags)) #define DAT_EP_POST_RDMA_READ_TO_RMR(ep, lbuf, cookie, rbuf, flags) \ (*DAT_HANDLE_TO_PROVIDER(ep)->ep_post_rdma_read_to_rmr_func)(\ (ep), \ (lbuf), \ (cookie), \ (rbuf), \ (flags)) #define DAT_EP_POST_RDMA_WRITE(ep, size, lbuf, cookie, rbuf, flags) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_post_rdma_write_func) (\ (ep), \ (size), \ (lbuf), \ (cookie), \ (rbuf), \ (flags)) #define DAT_EP_GET_STATUS(ep, ep_state, recv_idle, request_idle) \ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_get_status_func) (\ (ep), \ (ep_state), \ (recv_idle), \ (request_idle)) #define DAT_EP_FREE(ep)\ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_free_func) (\ (ep)) #define DAT_EP_RESET(ep)\ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_reset_func) (\ (ep)) #define DAT_EP_RECV_QUERY(ep, nbuf_alloc, buf_span)\ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_recv_query_func) (\ (ep), \ (nbuf_alloc), \ (buf_span)) #define DAT_EP_SET_WATERMARK(ep, soft_wm, hard_wm)\ (*DAT_HANDLE_TO_PROVIDER (ep)->ep_set_watermark_func) (\ (ep), \ (soft_wm), \ (hard_wm)) #define DAT_LMR_QUERY(lmr, mask, param)\ (*DAT_HANDLE_TO_PROVIDER (lmr)->lmr_query_func) (\ (lmr), \ (mask), \ (param)) #define DAT_LMR_FREE(lmr)\ (*DAT_HANDLE_TO_PROVIDER (lmr)->lmr_free_func) (\ (lmr)) #define DAT_LMR_SYNC_RDMA_READ(ia, lbuf, size)\ (*DAT_HANDLE_TO_PROVIDER (ia)->lmr_sync_rdma_read_func) (\ (ia), \ (lbuf), \ (size)) #define DAT_LMR_SYNC_RDMA_WRITE(ia, lbuf, size)\ (*DAT_HANDLE_TO_PROVIDER (ia)->lmr_sync_rdma_write_func) (\ (ia), \ (lbuf), \ (size)) #define DAT_RMR_CREATE(pz, rmr) \ (*DAT_HANDLE_TO_PROVIDER (pz)->rmr_create_func) (\ (pz), \ (rmr)) #define DAT_RMR_CREATE_FOR_EP(pz, rmr) \ (*DAT_HANDLE_TO_PROVIDER (pz)->rmr_create_for_ep_func) (\ (pz), \ (rmr)) #define DAT_RMR_QUERY(rmr, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (rmr)->rmr_query_func) (\ (rmr), \ (mask), \ (param)) #define DAT_RMR_BIND(rmr, lmr, lmr_triplet, mem_priv, \ va_type, ep, cookie, flags, context) \ (*DAT_HANDLE_TO_PROVIDER (rmr)->rmr_bind_func) (\ (rmr), \ (lmr), \ (lmr_triplet), \ (mem_priv), \ (va_type), \ (ep), \ (cookie), \ (flags), \ (context)) #define DAT_RMR_FREE(rmr)\ (*DAT_HANDLE_TO_PROVIDER (rmr)->rmr_free_func) (\ (rmr)) #define DAT_PSP_CREATE(ia, conn_qual, evd, flags, handle) \ (*DAT_HANDLE_TO_PROVIDER (ia)->psp_create_func) (\ (ia), \ (conn_qual), \ (evd), \ (flags), \ (handle)) #define DAT_PSP_CREATE_ANY(ia, conn_qual, evd, flags, handle) \ (*DAT_HANDLE_TO_PROVIDER (ia)->psp_create_any_func) (\ (ia), \ (conn_qual), \ (evd), \ (flags), \ (handle)) #define DAT_PSP_QUERY(psp, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (psp)->psp_query_func) (\ (psp), \ (mask), \ (param)) #define DAT_PSP_FREE(psp)\ (*DAT_HANDLE_TO_PROVIDER (psp)->psp_free_func) (\ (psp)) #define DAT_RSP_CREATE(ia, conn_qual, ep, evd, handle) \ (*DAT_HANDLE_TO_PROVIDER (ia)->rsp_create_func) (\ (ia), \ (conn_qual), \ (ep), \ (evd), \ (handle)) #define DAT_RSP_QUERY(rsp, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (rsp)->rsp_query_func) (\ (rsp), \ (mask), \ (param)) #define DAT_RSP_FREE(rsp)\ (*DAT_HANDLE_TO_PROVIDER (rsp)->rsp_free_func) (\ (rsp)) #define DAT_CSP_CREATE(ia, comm, addr, evd, handle) \ (*DAT_HANDLE_TO_PROVIDER(ia)->csp_create_func)(\ (ia),\ (comm),\ (addr),\ (evd),\ (handle)) #define DAT_CSP_QUERY(csp, mask, param) \ (*DAT_HANDLE_TO_PROVIDER(csp)->csp_query_func)(\ (csp),\ (mask),\ (param)) #define DAT_CSP_FREE(csp)\ (*DAT_HANDLE_TO_PROVIDER(csp)->csp_free_func)(\ (csp)) #define DAT_PZ_CREATE(ia, pz) \ (*DAT_HANDLE_TO_PROVIDER (ia)->pz_create_func) (\ (ia), \ (pz)) #define DAT_PZ_QUERY(pz, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (pz)->pz_query_func) (\ (pz), \ (mask), \ (param)) #define DAT_PZ_FREE(pz) \ (*DAT_HANDLE_TO_PROVIDER (pz)->pz_free_func) (\ (pz)) #define DAT_SRQ_CREATE(ia, pz, attr, srq) \ (*DAT_HANDLE_TO_PROVIDER (ia)->srq_create_func) (\ (ia), \ (pz), \ (attr), \ (srq)) #define DAT_SRQ_SET_LW(srq, lw) \ (*DAT_HANDLE_TO_PROVIDER (srq)->srq_set_lw_func) (\ (srq), \ (lw)) #define DAT_SRQ_FREE(srq) \ (*DAT_HANDLE_TO_PROVIDER (srq)->srq_free_func) (\ (srq)) #define DAT_SRQ_QUERY(srq, mask, param) \ (*DAT_HANDLE_TO_PROVIDER (srq)->srq_query_func) (\ (srq), \ (mask), \ (param)) #define DAT_SRQ_RESIZE(srq, qsize) \ (*DAT_HANDLE_TO_PROVIDER (srq)->srq_resize_func) (\ (srq), \ (qsize)) #define DAT_SRQ_POST_RECV(srq, size, lbuf, cookie) \ (*DAT_HANDLE_TO_PROVIDER (srq)->srq_post_recv_func) (\ (srq), \ (size), \ (lbuf), \ (cookie)) #define DAT_IA_HA_RELATED (ia, name, answer) \ (*DAT_HANDLE_TO_PROVIDER(ia)->ia_ha_related) (\ (ia), \ (name), \ (answer)) #ifdef DAT_EXTENSIONS #define DAT_HANDLE_EXTENDEDOP(handle, op, args) \ (*DAT_HANDLE_TO_PROVIDER (handle)->handle_extendedop_func) (\ (handle), \ (op), \ (args)) #endif /*************************************************************** * * FUNCTION PROTOTYPES ****************************************************************/ typedef DAT_RETURN (DAT_API *DAT_IA_OPEN_FUNC) ( IN const DAT_NAME_PTR, /* provider */ IN DAT_COUNT, /* asynch_evd_min_qlen */ INOUT DAT_EVD_HANDLE *, /* asynch_evd_handle */ OUT DAT_IA_HANDLE *); /* ia_handle */ typedef DAT_RETURN (DAT_API *DAT_IA_OPENV_FUNC) ( IN const DAT_NAME_PTR, /* provider */ IN DAT_COUNT, /* asynch_evd_min_qlen */ INOUT DAT_EVD_HANDLE *, /* asynch_evd_handle */ OUT DAT_IA_HANDLE *, /* ia_handle */ IN DAT_UINT32, /* dat_major_version number */ IN DAT_UINT32, /* dat_minor_version number */ IN DAT_BOOLEAN); /* dat_thread_safety */ typedef DAT_RETURN (DAT_API *DAT_IA_CLOSE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CLOSE_FLAGS ); /* close_flags */ typedef DAT_RETURN (DAT_API *DAT_IA_QUERY_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_EVD_HANDLE *, /* async_evd_handle */ IN DAT_IA_ATTR_MASK, /* ia_attr_mask */ OUT DAT_IA_ATTR *, /* ia_attr */ IN DAT_PROVIDER_ATTR_MASK, /* provider_attr_mask */ OUT DAT_PROVIDER_ATTR * ); /* provider_attr */ /* helper functions */ typedef DAT_RETURN (DAT_API *DAT_SET_CONSUMER_CONTEXT_FUNC) ( IN DAT_HANDLE, /* dat_handle */ IN DAT_CONTEXT); /* context */ typedef DAT_RETURN (DAT_API *DAT_GET_CONSUMER_CONTEXT_FUNC) ( IN DAT_HANDLE, /* dat_handle */ OUT DAT_CONTEXT * ); /* context */ typedef DAT_RETURN (DAT_API *DAT_GET_HANDLE_TYPE_FUNC) ( IN DAT_HANDLE, /* dat_handle */ OUT DAT_HANDLE_TYPE * ); /* dat_handle_type */ /* CR functions */ typedef DAT_RETURN (DAT_API *DAT_CR_QUERY_FUNC) ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CR_PARAM_MASK, /* cr_param_mask */ OUT DAT_CR_PARAM * ); /* cr_param */ typedef DAT_RETURN (DAT_API *DAT_CR_ACCEPT_FUNC) ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ typedef DAT_RETURN (DAT_API *DAT_CR_REJECT_FUNC) ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ /* For DAT-1.1 this function is defined for both uDAPL and kDAPL. * For DAT-1.0 it was only defined for uDAPL. */ typedef DAT_RETURN (DAT_API *DAT_CR_HANDOFF_FUNC) ( IN DAT_CR_HANDLE, /* cr_handle */ IN DAT_CONN_QUAL); /* handoff */ /* EVD functions */ typedef DAT_RETURN (DAT_API *DAT_EVD_RESIZE_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_COUNT ); /* evd_min_qlen */ typedef DAT_RETURN (DAT_API *DAT_EVD_POST_SE_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ IN const DAT_EVENT * ); /* event */ typedef DAT_RETURN (DAT_API *DAT_EVD_DEQUEUE_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_EVENT * ); /* event */ typedef DAT_RETURN (DAT_API *DAT_EVD_FREE_FUNC) ( IN DAT_EVD_HANDLE ); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_QUERY_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_EVD_PARAM_MASK, /* evd_param_mask */ OUT DAT_EVD_PARAM * ); /* evd_param */ /* EP functions */ typedef DAT_RETURN (DAT_API *DAT_EP_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* recv_completion_evd_handle */ IN DAT_EVD_HANDLE, /* request_completion_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN const DAT_EP_ATTR *, /* ep_attributes */ OUT DAT_EP_HANDLE * ); /* ep_handle */ typedef DAT_RETURN (DAT_API *DAT_EP_CREATE_WITH_SRQ_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_EVD_HANDLE, /* recv_completion_evd_handle */ IN DAT_EVD_HANDLE, /* request_completion_evd_handle */ IN DAT_EVD_HANDLE, /* connect_evd_handle */ IN DAT_SRQ_HANDLE, /* srq_handle */ IN const DAT_EP_ATTR *, /* ep_attributes */ OUT DAT_EP_HANDLE * ); /* ep_handle */ typedef DAT_RETURN (DAT_API *DAT_EP_QUERY_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_param_mask */ OUT DAT_EP_PARAM * ); /* ep_param */ typedef DAT_RETURN (DAT_API *DAT_EP_MODIFY_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_PARAM_MASK, /* ep_param_mask */ IN const DAT_EP_PARAM * ); /* ep_param */ typedef DAT_RETURN (DAT_API *DAT_EP_CONNECT_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_IA_ADDRESS_PTR, /* remote_ia_address */ IN DAT_CONN_QUAL, /* remote_conn_qual */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS, /* quality_of_service */ IN DAT_CONNECT_FLAGS ); /* connect_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_COMMON_CONNECT_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_IA_ADDRESS_PTR, /* remote_ia_address */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID ); /* private_data */ typedef DAT_RETURN (DAT_API *DAT_EP_DUP_CONNECT_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EP_HANDLE, /* ep_dup_handle */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* private_data_size */ IN const DAT_PVOID, /* private_data */ IN DAT_QOS); /* quality_of_service */ typedef DAT_RETURN (DAT_API *DAT_EP_DISCONNECT_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_CLOSE_FLAGS ); /* close_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_SEND_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_SEND_WITH_INVALIDATE_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ IN DAT_BOOLEAN, /* invalidate_flag */ IN DAT_RMR_CONTEXT ); /* RMR context */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_RECV_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_RDMA_READ_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_RDMA_READ_TO_RMR_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN const DAT_RMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_POST_RDMA_WRITE_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE, /* user_cookie */ IN const DAT_RMR_TRIPLET *,/* remote_iov */ IN DAT_COMPLETION_FLAGS ); /* completion_flags */ typedef DAT_RETURN (DAT_API *DAT_EP_GET_STATUS_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_EP_STATE *, /* ep_state */ OUT DAT_BOOLEAN *, /* recv_idle */ OUT DAT_BOOLEAN * ); /* request_idle */ typedef DAT_RETURN (DAT_API *DAT_EP_FREE_FUNC) ( IN DAT_EP_HANDLE); /* ep_handle */ typedef DAT_RETURN (DAT_API *DAT_EP_RESET_FUNC) ( IN DAT_EP_HANDLE); /* ep_handle */ typedef DAT_RETURN (DAT_API *DAT_EP_RECV_QUERY_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ OUT DAT_COUNT *, /* nbufs_allocated */ OUT DAT_COUNT *); /* bufs_alloc_span */ typedef DAT_RETURN (DAT_API *DAT_EP_SET_WATERMARK_FUNC) ( IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_COUNT, /* ep_soft_high_watermark*/ IN DAT_COUNT ); /* ep_hard_high_watermark*/ /* LMR functions */ typedef DAT_RETURN (DAT_API *DAT_LMR_FREE_FUNC) ( IN DAT_LMR_HANDLE ); /* lmr_handle */ typedef DAT_RETURN (DAT_API *DAT_LMR_SYNC_RDMA_READ_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *,/* local segments */ IN DAT_VLEN ); /* num_segments */ typedef DAT_RETURN (DAT_API *DAT_LMR_SYNC_RDMA_WRITE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_LMR_TRIPLET *, /* local_segments */ IN DAT_VLEN ); /* num_segments */ /* RMR functions */ typedef DAT_RETURN (DAT_API *DAT_RMR_CREATE_FUNC) ( IN DAT_PZ_HANDLE, /* pz_handle */ OUT DAT_RMR_HANDLE *); /* rmr_handle */ typedef DAT_RETURN (DAT_API *DAT_RMR_CREATE_FOR_EP_FUNC) ( IN DAT_PZ_HANDLE, /* pz_handle */ OUT DAT_RMR_HANDLE *); /* rmr_handle */ typedef DAT_RETURN (DAT_API *DAT_RMR_QUERY_FUNC) ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_RMR_PARAM_MASK, /* rmr_param_mask */ OUT DAT_RMR_PARAM *); /* rmr_param */ typedef DAT_RETURN (DAT_API *DAT_RMR_BIND_FUNC) ( IN DAT_RMR_HANDLE, /* rmr_handle */ IN DAT_LMR_HANDLE, /* lmr_handle */ IN const DAT_LMR_TRIPLET *,/* lmr_triplet */ IN DAT_MEM_PRIV_FLAGS, /* mem_priv */ IN DAT_VA_TYPE, /* va_type */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_RMR_COOKIE, /* user_cookie */ IN DAT_COMPLETION_FLAGS, /* completion_flags */ OUT DAT_RMR_CONTEXT * ); /* context */ typedef DAT_RETURN (DAT_API *DAT_RMR_FREE_FUNC) ( IN DAT_RMR_HANDLE); /* rmr_handle */ /* PSP functions */ typedef DAT_RETURN (DAT_API *DAT_PSP_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE * ); /* psp_handle */ typedef DAT_RETURN (DAT_API *DAT_PSP_CREATE_ANY_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_CONN_QUAL *, /* conn_qual */ IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_PSP_FLAGS, /* psp_flags */ OUT DAT_PSP_HANDLE * ); /* psp_handle */ typedef DAT_RETURN (DAT_API *DAT_PSP_QUERY_FUNC) ( IN DAT_PSP_HANDLE, /* psp_handle */ IN DAT_PSP_PARAM_MASK, /* psp_param_mask */ OUT DAT_PSP_PARAM * ); /* psp_param */ typedef DAT_RETURN (DAT_API *DAT_PSP_FREE_FUNC) ( IN DAT_PSP_HANDLE ); /* psp_handle */ /* RSP functions */ typedef DAT_RETURN (DAT_API *DAT_RSP_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_CONN_QUAL, /* conn_qual */ IN DAT_EP_HANDLE, /* ep_handle */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_RSP_HANDLE * ); /* rsp_handle */ typedef DAT_RETURN (DAT_API *DAT_RSP_QUERY_FUNC) ( IN DAT_RSP_HANDLE, /* rsp_handle */ IN DAT_RSP_PARAM_MASK, /* rsp_param_mask */ OUT DAT_RSP_PARAM * ); /* rsp_param */ typedef DAT_RETURN (DAT_API *DAT_RSP_FREE_FUNC) ( IN DAT_RSP_HANDLE ); /* rsp_handle */ /* CSP functions functions - DAT 2.0 */ typedef DAT_RETURN (DAT_API *DAT_CSP_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COMM *, /* communicator */ IN DAT_IA_ADDRESS_PTR, /* address */ IN DAT_EVD_HANDLE, /* evd_handle */ OUT DAT_CSP_HANDLE * ); /* csp_handle */ typedef DAT_RETURN (DAT_API *DAT_CSP_QUERY_FUNC) ( IN DAT_CSP_HANDLE, /* csp_handle */ IN DAT_CSP_PARAM_MASK, /* csp_param_mask */ OUT DAT_CSP_PARAM * ); /* csp_param */ typedef DAT_RETURN (DAT_API *DAT_CSP_FREE_FUNC) ( IN DAT_CSP_HANDLE ); /* csp_handle */ /* PZ functions */ typedef DAT_RETURN (DAT_API *DAT_PZ_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_PZ_HANDLE * ); /* pz_handle */ typedef DAT_RETURN (DAT_API *DAT_PZ_QUERY_FUNC) ( IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_PZ_PARAM_MASK, /* pz_param_mask */ OUT DAT_PZ_PARAM *); /* pz_param */ typedef DAT_RETURN (DAT_API *DAT_PZ_FREE_FUNC) ( IN DAT_PZ_HANDLE ); /* pz_handle */ /* SRQ functions */ typedef DAT_RETURN (DAT_API *DAT_SRQ_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_SRQ_ATTR *, /* srq_attributes */ OUT DAT_SRQ_HANDLE *); /* srq_handle */ typedef DAT_RETURN (DAT_API *DAT_SRQ_SET_LW_FUNC) ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT ); /* srq_low_watermark */ typedef DAT_RETURN (DAT_API *DAT_SRQ_FREE_FUNC) ( IN DAT_SRQ_HANDLE); /* srq_handle */ typedef DAT_RETURN (DAT_API *DAT_SRQ_QUERY_FUNC) ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_SRQ_PARAM_MASK, /* srq_param_mask */ OUT DAT_SRQ_PARAM *); /* srq_param */ typedef DAT_RETURN (DAT_API *DAT_SRQ_RESIZE_FUNC) ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT ); /* srq_queue_length */ typedef DAT_RETURN (DAT_API *DAT_SRQ_POST_RECV_FUNC) ( IN DAT_SRQ_HANDLE, /* srq_handle */ IN DAT_COUNT, /* num_segments */ IN DAT_LMR_TRIPLET *, /* local_iov */ IN DAT_DTO_COOKIE ); /* user_cookie */ typedef DAT_RETURN (DAT_API *DAT_IA_HA_RELATED_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN const DAT_NAME_PTR, /* provider */ OUT DAT_BOOLEAN *); /* answer */ #ifdef DAT_EXTENSIONS #include typedef DAT_RETURN (DAT_API *DAT_HANDLE_EXTENDEDOP_FUNC)( IN DAT_HANDLE, /* handle */ IN DAT_EXTENDED_OP, /* extended op */ IN va_list); /* argument list */ #endif /* DAT_EXTENSIONS */ #endif /* _DAT_REDIRECTION_H_ */ dapl-2.1.5/dat/include/dat2/dat_registry.h000066400000000000000000000107311255317474200203510ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /**************************************************************** * * HEADER: dat_registry.h * * PURPOSE: DAT registration API signatures * * Description: Header file for "DAPL: Direct Access Programming * Library, Version: 2.0" * * Contains registration external reference signatures * for dat registry functions. This file is *only* * included by providers, not consumers. * * Mapping rules: * All global symbols are prepended with DAT_ or dat_ * All DAT objects have an 'api' tag which, such as 'ep' or 'lmr' * The method table is in the provider definition structure. * **********************************************************/ #ifndef _DAT_REGISTRY_H_ #define _DAT_REGISTRY_H_ #ifdef __cplusplus extern "C" { #endif #if defined(_UDAT_H_) #include #elif defined(_KDAT_H_) #include #else #error Must include udat.h or kdat.h #endif /* * dat registration API. * * Technically the dat_ia_open is part of the registration API. This * is so the registration module can map the device name to a provider * structure and then call the provider dat_ia_open function. * dat_is_close is also part of the registration API so that the * registration code can be aware when an ia is no longer in use. * */ extern DAT_RETURN DAT_API dat_registry_add_provider ( IN const DAT_PROVIDER *, /* provider */ IN const DAT_PROVIDER_INFO* ); /* provider info */ extern DAT_RETURN DAT_API dat_registry_remove_provider ( IN const DAT_PROVIDER *, /* provider */ IN const DAT_PROVIDER_INFO* ); /* provider info */ /* * Provider initialization APIs. * * Providers that support being automatically loaded by the Registry must * implement these APIs and export them as public symbols. */ #define DAT_PROVIDER_INIT_FUNC_NAME dat_provider_init #define DAT_PROVIDER_FINI_FUNC_NAME dat_provider_fini #define DAT_PROVIDER_INIT_FUNC_STR "dat_provider_init" #define DAT_PROVIDER_FINI_FUNC_STR "dat_provider_fini" typedef void ( DAT_API *DAT_PROVIDER_INIT_FUNC) ( IN const DAT_PROVIDER_INFO *, /* provider info */ IN const char *); /* instance data */ typedef void ( DAT_API *DAT_PROVIDER_FINI_FUNC) ( IN const DAT_PROVIDER_INFO *); /* provider info */ typedef enum dat_ha_relationship { DAT_HA_FALSE, /* two IAs are not related */ DAT_HA_TRUE, /* two IAs are related */ DAT_HA_UNKNOWN, /* relationship is not known */ DAT_HA_CONFLICTING, /* 2 IAs do not agree on the relationship */ DAT_HA_EXTENSION_BASE } DAT_HA_RELATIONSHIP; extern DAT_RETURN DAT_API dat_registry_providers_related ( IN const DAT_NAME_PTR, IN const DAT_NAME_PTR, OUT DAT_HA_RELATIONSHIP * ); #ifdef __cplusplus } #endif #endif /* _DAT_REGISTRY_H_ */ dapl-2.1.5/dat/include/dat2/dat_vendor_specific.h000066400000000000000000000042541255317474200216460ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /*************************************************************** * * HEADER: dat_vendor_specific.h * * PURPOSE: * * Description: Header file for "DAPL: Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * ***************************************************************/ #ifndef _DAT_VENDOR_SPECIFIC_H_ #define _DAT_VENDOR_SPECIFIC_H_ /* Vendor-specific extensions */ #if defined(_AMMASSO) #elif defined(_BROADCOM) #elif defined(_CISCO) #elif defined(_IBM) #elif defined(_INTEL) #elif defined(_JNI) #elif defined(_MELLANOX) #elif defined(_MYRINET) #elif defined(_NETEFFECT) #elif defined(_QLOGIC) #elif defined(_SILVERSTORM) #elif defined(_VOLTAIRE) #endif #endif /* _DAT_VENDOR_SPECIFIC_H_ */ dapl-2.1.5/dat/include/dat2/udat.h000077500000000000000000000446651255317474200166260ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /**************************************************************** * * HEADER: udat.h * * PURPOSE: defines the user DAT API * * Description: Header file for "uDAPL: User Direct Access Programming * Library, Version: 2.0" * * Mapping rules: * All global symbols are prepended with DAT_ or dat_ * All DAT objects have an 'api' tag which, such as 'ep' or 'lmr' * The method table is in the provider definition structure. * ***************************************************************/ #ifndef _UDAT_H_ #define _UDAT_H_ #include #include #ifdef __cplusplus extern "C" { #endif typedef enum dat_mem_type { /* Shared between udat and kdat */ DAT_MEM_TYPE_VIRTUAL = 0x00, DAT_MEM_TYPE_LMR = 0x01, /* udat specific */ DAT_MEM_TYPE_SHARED_VIRTUAL = 0x02 } DAT_MEM_TYPE; /* dat handle types */ typedef enum dat_handle_type { DAT_HANDLE_TYPE_CR, DAT_HANDLE_TYPE_EP, DAT_HANDLE_TYPE_EVD, DAT_HANDLE_TYPE_IA, DAT_HANDLE_TYPE_LMR, DAT_HANDLE_TYPE_PSP, DAT_HANDLE_TYPE_PZ, DAT_HANDLE_TYPE_RMR, DAT_HANDLE_TYPE_RSP, DAT_HANDLE_TYPE_CNO, DAT_HANDLE_TYPE_SRQ, DAT_HANDLE_TYPE_CSP #ifdef DAT_EXTENSIONS ,DAT_HANDLE_TYPE_EXTENSION_BASE #endif } DAT_HANDLE_TYPE; /* EVD state consists of three orthogonal substates. One for * enabled/disabled,one for waitable/unwaitable, and one for * configuration. Within each substate the values are mutually * exclusive. */ typedef enum dat_evd_state { DAT_EVD_STATE_ENABLED = 0x01, DAT_EVD_STATE_DISABLED = 0x02, DAT_EVD_STATE_WAITABLE = 0x04, DAT_EVD_STATE_UNWAITABLE = 0x08, DAT_EVD_STATE_CONFIG_NOTIFY = 0x10, DAT_EVD_STATE_CONFIG_SOLICITED = 0x20, DAT_EVD_STATE_CONFIG_THRESHOLD = 0x30 } DAT_EVD_STATE; typedef enum dat_evd_param_mask { DAT_EVD_FIELD_IA_HANDLE = 0x01, DAT_EVD_FIELD_EVD_QLEN = 0x02, DAT_EVD_FIELD_EVD_STATE = 0x04, DAT_EVD_FIELD_CNO = 0x08, DAT_EVD_FIELD_EVD_FLAGS = 0x10, DAT_EVD_FIELD_ALL = 0x1F } DAT_EVD_PARAM_MASK; typedef DAT_UINT64 DAT_PROVIDER_ATTR_MASK; enum dat_lmr_param_mask { DAT_LMR_FIELD_IA_HANDLE = 0x001, DAT_LMR_FIELD_MEM_TYPE = 0x002, DAT_LMR_FIELD_REGION_DESC = 0x004, DAT_LMR_FIELD_LENGTH = 0x008, DAT_LMR_FIELD_PZ_HANDLE = 0x010, DAT_LMR_FIELD_MEM_PRIV = 0x020, DAT_LMR_FIELD_VA_TYPE = 0x040, DAT_LMR_FIELD_LMR_CONTEXT = 0x080, DAT_LMR_FIELD_RMR_CONTEXT = 0x100, DAT_LMR_FIELD_REGISTERED_SIZE = 0x200, DAT_LMR_FIELD_REGISTERED_ADDRESS = 0x400, DAT_LMR_FIELD_ALL = 0x7FF }; #include typedef DAT_HANDLE DAT_CNO_HANDLE; struct dat_evd_param { DAT_IA_HANDLE ia_handle; DAT_COUNT evd_qlen; DAT_EVD_STATE evd_state; DAT_CNO_HANDLE cno_handle; DAT_EVD_FLAGS evd_flags; }; #define DAT_LMR_COOKIE_SIZE 40 /* size of DAT_LMR_COOKIE in bytes */ typedef char (* DAT_LMR_COOKIE)[DAT_LMR_COOKIE_SIZE]; /* Format for OS wait proxy agent function */ typedef void (DAT_API *DAT_AGENT_FUNC) ( DAT_PVOID, /* instance data */ DAT_EVD_HANDLE /* Event Dispatcher*/ ); /* Definition */ typedef struct dat_os_wait_proxy_agent { DAT_PVOID instance_data; DAT_AGENT_FUNC proxy_agent_func; } DAT_OS_WAIT_PROXY_AGENT; /* Define NULL Proxy agent */ #define DAT_OS_WAIT_PROXY_AGENT_NULL \ (DAT_OS_WAIT_PROXY_AGENT) { \ (DAT_PVOID) NULL, \ (DAT_AGENT_FUNC) NULL} /* Flags */ /* The value specified by the uDAPL Consumer for dat_ia_open to indicate * that no async EVD should be created for the opening instance of an IA. * The same IA has been open before that has the only async EVD to * handle async errors for all open instances of the IA. */ #define DAT_EVD_ASYNC_EXISTS (DAT_EVD_HANDLE) 0x1 /* * The value returned by the dat_ia_query for the case when there is no * async EVD for the IA instance. The Consumer specified the value of * DAT_EVD_ASYNC_EXISTS for the async_evd_handle for dat_ia_open. */ #define DAT_EVD_OUT_OF_SCOPE (DAT_EVD_HANDLE) 0x2 /* * Memory types * * Specifying memory type for LMR create. A Consumer must use a single * value when registering memory. The union of any of these * flags is used in the Provider parameters to indicate what memory * type Provider supports for LMR memory creation. */ /* For udapl only */ typedef struct dat_shared_memory { DAT_PVOID virtual_address; DAT_LMR_COOKIE shared_memory_id; } DAT_SHARED_MEMORY; typedef union dat_region_description { DAT_PVOID for_va; DAT_LMR_HANDLE for_lmr_handle; DAT_SHARED_MEMORY for_shared_memory; /* For udapl only */ } DAT_REGION_DESCRIPTION; /* LMR Arguments */ struct dat_lmr_param { DAT_IA_HANDLE ia_handle; DAT_MEM_TYPE mem_type; DAT_REGION_DESCRIPTION region_desc; DAT_VLEN length; DAT_PZ_HANDLE pz_handle; DAT_MEM_PRIV_FLAGS mem_priv; DAT_VA_TYPE va_type; DAT_LMR_CONTEXT lmr_context; DAT_RMR_CONTEXT rmr_context; DAT_VLEN registered_size; DAT_VADDR registered_address; }; typedef enum dat_proxy_type { DAT_PROXY_TYPE_NONE = 0x0, DAT_PROXY_TYPE_AGENT = 0x1, DAT_PROXY_TYPE_FD = 0x2 } DAT_PROXY_TYPE; typedef struct dat_cno_param { DAT_IA_HANDLE ia_handle; DAT_PROXY_TYPE proxy_type; union { DAT_OS_WAIT_PROXY_AGENT agent; DAT_FD fd; DAT_PVOID none; } proxy; } DAT_CNO_PARAM; typedef enum dat_cno_param_mask { DAT_CNO_FIELD_IA_HANDLE = 0x1, DAT_CNO_FIELD_PROXY_TYPE = 0x2, DAT_CNO_FIELD_PROXY = 0x3, DAT_CNO_FIELD_ALL = 0x4 } DAT_CNO_PARAM_MASK; struct dat_ia_attr { char adapter_name[DAT_NAME_MAX_LENGTH]; char vendor_name[DAT_NAME_MAX_LENGTH]; DAT_UINT32 hardware_version_major; DAT_UINT32 hardware_version_minor; DAT_UINT32 firmware_version_major; DAT_UINT32 firmware_version_minor; DAT_IA_ADDRESS_PTR ia_address_ptr; DAT_COUNT max_eps; DAT_COUNT max_dto_per_ep; DAT_COUNT max_rdma_read_per_ep_in; DAT_COUNT max_rdma_read_per_ep_out; DAT_COUNT max_evds; DAT_COUNT max_evd_qlen; DAT_COUNT max_iov_segments_per_dto; DAT_COUNT max_lmrs; DAT_SEG_LENGTH max_lmr_block_size; DAT_VADDR max_lmr_virtual_address; DAT_COUNT max_pzs; DAT_SEG_LENGTH max_message_size; DAT_SEG_LENGTH max_rdma_size; DAT_COUNT max_rmrs; DAT_VADDR max_rmr_target_address; DAT_COUNT max_srqs; DAT_COUNT max_ep_per_srq; DAT_COUNT max_recv_per_srq; DAT_COUNT max_iov_segments_per_rdma_read; DAT_COUNT max_iov_segments_per_rdma_write; DAT_COUNT max_rdma_read_in; DAT_COUNT max_rdma_read_out; DAT_BOOLEAN max_rdma_read_per_ep_in_guaranteed; DAT_BOOLEAN max_rdma_read_per_ep_out_guaranteed; DAT_BOOLEAN zb_supported; DAT_EXTENSION extension_supported; DAT_COUNT extension_version; DAT_COUNT num_transport_attr; DAT_NAMED_ATTR *transport_attr; DAT_COUNT num_vendor_attr; DAT_NAMED_ATTR *vendor_attr; }; #define DAT_IA_FIELD_IA_EXTENSION UINT64_C(0x100000000) #define DAT_IA_FIELD_IA_EXTENSION_VERSION UINT64_C(0x200000000) #define DAT_IA_FIELD_IA_NUM_TRANSPORT_ATTR UINT64_C(0x400000000) #define DAT_IA_FIELD_IA_TRANSPORT_ATTR UINT64_C(0x800000000) #define DAT_IA_FIELD_IA_NUM_VENDOR_ATTR UINT64_C(0x1000000000) #define DAT_IA_FIELD_IA_VENDOR_ATTR UINT64_C(0x2000000000) #define DAT_IA_FIELD_ALL UINT64_C(0x3FFFFFFFFF) /* General Provider attributes. udat specific. */ typedef enum dat_pz_support { DAT_PZ_UNIQUE, DAT_PZ_SHAREABLE } DAT_PZ_SUPPORT; #include /* Provider should support merging of all event stream types. Provider * attribute specify support for merging different event stream types. * It is a 2D binary matrix where each row and column represents an event * stream type. Each binary entry is 1 if the event streams of its raw * and column can fed the same EVD, and 0 otherwise. The order of event * streams in row and column is the same as in the definition of * DAT_EVD_FLAGS: index 0 - Software Event, 1- Connection Request, * 2 - DTO Completion, 3 - Connection event, 4 - RMR Bind Completion, * 5 - Asynchronous event. By definition each diagonal entry is 1. * Consumer allocates an array for it and passes it IN as a pointer * for the array that Provider fills. Provider must fill the array * that Consumer passes. */ struct dat_provider_attr { char provider_name[DAT_NAME_MAX_LENGTH]; DAT_UINT32 provider_version_major; DAT_UINT32 provider_version_minor; DAT_UINT32 dapl_version_major; DAT_UINT32 dapl_version_minor; DAT_MEM_TYPE lmr_mem_types_supported; DAT_IOV_OWNERSHIP iov_ownership_on_return; DAT_QOS dat_qos_supported; DAT_COMPLETION_FLAGS completion_flags_supported; DAT_BOOLEAN is_thread_safe; DAT_COUNT max_private_data_size; DAT_BOOLEAN supports_multipath; DAT_EP_CREATOR_FOR_PSP ep_creator; DAT_PZ_SUPPORT pz_support; DAT_UINT32 optimal_buffer_alignment; const DAT_BOOLEAN evd_stream_merging_supported[6][6]; DAT_BOOLEAN srq_supported; DAT_COUNT srq_watermarks_supported; DAT_BOOLEAN srq_ep_pz_difference_supported; DAT_COUNT srq_info_supported; DAT_COUNT ep_recv_info_supported; DAT_BOOLEAN lmr_sync_req; DAT_BOOLEAN dto_async_return_guaranteed; DAT_BOOLEAN rdma_write_for_rdma_read_req; DAT_BOOLEAN rdma_read_lmr_rmr_context_exposure; DAT_RMR_SCOPE rmr_scope_supported; DAT_BOOLEAN is_signal_safe; DAT_BOOLEAN ha_supported; DAT_HA_LB ha_loadbalancing; DAT_COUNT num_provider_specific_attr; DAT_NAMED_ATTR * provider_specific_attr; }; #define DAT_PROVIDER_FIELD_PROVIDER_NAME UINT64_C(0x00000001) #define DAT_PROVIDER_FIELD_PROVIDER_VERSION_MAJOR UINT64_C(0x00000002) #define DAT_PROVIDER_FIELD_PROVIDER_VERSION_MINOR UINT64_C(0x00000004) #define DAT_PROVIDER_FIELD_DAPL_VERSION_MAJOR UINT64_C(0x00000008) #define DAT_PROVIDER_FIELD_DAPL_VERSION_MINOR UINT64_C(0x00000010) #define DAT_PROVIDER_FIELD_LMR_MEM_TYPE_SUPPORTED UINT64_C(0x00000020) #define DAT_PROVIDER_FIELD_IOV_OWNERSHIP UINT64_C(0x00000040) #define DAT_PROVIDER_FIELD_DAT_QOS_SUPPORTED UINT64_C(0x00000080) #define DAT_PROVIDER_FIELD_COMPLETION_FLAGS_SUPPORTED UINT64_C(0x00000100) #define DAT_PROVIDER_FIELD_IS_THREAD_SAFE UINT64_C(0x00000200) #define DAT_PROVIDER_FIELD_MAX_PRIVATE_DATA_SIZE UINT64_C(0x00000400) #define DAT_PROVIDER_FIELD_SUPPORTS_MULTIPATH UINT64_C(0x00000800) #define DAT_PROVIDER_FIELD_EP_CREATOR UINT64_C(0x00001000) #define DAT_PROVIDER_FIELD_PZ_SUPPORT UINT64_C(0x00002000) #define DAT_PROVIDER_FIELD_OPTIMAL_BUFFER_ALIGNMENT UINT64_C(0x00004000) #define DAT_PROVIDER_FIELD_EVD_STREAM_MERGING_SUPPORTED UINT64_C(0x00008000) #define DAT_PROVIDER_FIELD_SRQ_SUPPORTED UINT64_C(0x00010000) #define DAT_PROVIDER_FIELD_SRQ_WATERMARKS_SUPPORTED UINT64_C(0x00020000) #define DAT_PROVIDER_FIELD_SRQ_EP_PZ_DIFFERENCE_SUPPORTED UINT64_C(0x00040000) #define DAT_PROVIDER_FIELD_SRQ_INFO_SUPPORTED UINT64_C(0x00080000) #define DAT_PROVIDER_FIELD_EP_RECV_INFO_SUPPORTED UINT64_C(0x00100000) #define DAT_PROVIDER_FIELD_LMR_SYNC_REQ UINT64_C(0x00200000) #define DAT_PROVIDER_FIELD_DTO_ASYNC_RETURN_GUARANTEED UINT64_C(0x00400000) #define DAT_PROVIDER_FIELD_RDMA_WRITE_FOR_RDMA_READ_REQ UINT64_C(0x00800000) #define DAT_PROVIDER_FIELD_RDMA_READ_LMR_RMR_CONTEXT_EXPOSURE UINT64_C(0x01000000) #define DAT_PROVIDER_FIELD_RMR_SCOPE_SUPPORTED UINT64_C(0x02000000) #define DAT_PROVIDER_FIELD_IS_SIGNAL_SAFE UINT64_C(0x04000000) #define DAT_PROVIDER_FIELD_HA_SUPPORTED UINT64_C(0x08000000) #define DAT_PROVIDER_FIELD_HA_LB UINT64_C(0x10000000) #define DAT_PROVIDER_FIELD_NUM_PROVIDER_SPECIFIC_ATTR UINT64_C(0x20000000) #define DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR UINT64_C(0x40000000) #define DAT_PROVIDER_FIELD_ALL UINT64_C(0x7FFFFFFF) #define DAT_PROVIDER_FIELD_NONE UINT64_C(0x0) /**************************************************************/ /* * User DAT function call definitions, */ extern DAT_RETURN DAT_API dat_lmr_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_MEM_TYPE, /* mem_type */ IN DAT_REGION_DESCRIPTION, /* region_description */ IN DAT_VLEN, /* length */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_MEM_PRIV_FLAGS, /* privileges */ IN DAT_VA_TYPE, /* va_type */ OUT DAT_LMR_HANDLE *, /* lmr_handle */ OUT DAT_LMR_CONTEXT *, /* lmr_context */ OUT DAT_RMR_CONTEXT *, /* rmr_context */ OUT DAT_VLEN *, /* registered_length */ OUT DAT_VADDR * ); /* registered_address */ extern DAT_RETURN DAT_API dat_lmr_query ( IN DAT_LMR_HANDLE, /* lmr_handle */ IN DAT_LMR_PARAM_MASK, /* lmr_param_mask */ OUT DAT_LMR_PARAM * ); /* lmr_param */ /* Event Functions */ extern DAT_RETURN DAT_API dat_evd_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COUNT, /* evd_min_qlen */ IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_EVD_FLAGS, /* evd_flags */ OUT DAT_EVD_HANDLE * ); /* evd_handle */ extern DAT_RETURN DAT_API dat_evd_modify_cno ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_CNO_HANDLE); /* cno_handle */ extern DAT_RETURN DAT_API dat_cno_create ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_OS_WAIT_PROXY_AGENT,/* agent */ OUT DAT_CNO_HANDLE *); /* cno_handle */ extern DAT_RETURN DAT_API dat_cno_modify_agent ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_OS_WAIT_PROXY_AGENT);/* agent */ extern DAT_RETURN DAT_API dat_cno_query ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_CNO_PARAM_MASK, /* cno_param_mask */ OUT DAT_CNO_PARAM * ); /* cno_param */ extern DAT_RETURN DAT_API dat_cno_free ( IN DAT_CNO_HANDLE); /* cno_handle */ extern DAT_RETURN DAT_API dat_cno_wait ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_TIMEOUT, /* timeout */ OUT DAT_EVD_HANDLE *); /* evd_handle */ extern DAT_RETURN DAT_API dat_evd_enable ( IN DAT_EVD_HANDLE); /* evd_handle */ extern DAT_RETURN DAT_API dat_evd_wait ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_TIMEOUT, /* timeout */ IN DAT_COUNT, /* threshold */ OUT DAT_EVENT *, /* event */ OUT DAT_COUNT * ); /* n_more_events */ extern DAT_RETURN DAT_API dat_evd_disable ( IN DAT_EVD_HANDLE); /* evd_handle */ extern DAT_RETURN DAT_API dat_evd_set_unwaitable ( IN DAT_EVD_HANDLE); /* evd_handle */ extern DAT_RETURN DAT_API dat_evd_clear_unwaitable ( IN DAT_EVD_HANDLE); /* evd_handle */ extern DAT_RETURN DAT_API dat_cno_fd_create ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_FD *, /* file descriptor */ OUT DAT_CNO_HANDLE * ); /* cno_handle */ extern DAT_RETURN DAT_API dat_cno_trigger ( IN DAT_CNO_HANDLE, /* cno_handle */ OUT DAT_EVD_HANDLE * ); /* evd_handle */ #ifdef __cplusplus } #endif #endif /* _UDAT_H_ */ dapl-2.1.5/dat/include/dat2/udat_config.h000066400000000000000000000061311255317474200201320ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /*************************************************************** * * HEADER: udat_config.h * * PURPOSE: provides uDAPL configuration information. * * Description: Header file for "uDAPL: User Direct Access Programming * Library, Version: 2.0" * ***************************************************************/ #ifndef _UDAT_CONFIG_H_ #define _UDAT_CONFIG_H_ #define DAT_VERSION_MAJOR 2 #define DAT_VERSION_MINOR 0 /* * The official header files will default DAT_THREADSAFE to DAT_TRUE. If * your project does not wish to use this default, you must ensure that * DAT_THREADSAFE will be set to DAT_FALSE. This may be done by an * explicit #define in a common project header file that is included * before any DAT header files, or through command line directives to the * compiler (presumably controlled by the make environment). */ /* * A site, project or platform may consider setting an alternate default * via their make rules, but are discouraged from doing so by editing * the official header files. */ /* * The Reference Implementation is not Thread Safe. The Reference * Implementation has chosen to go with the first method and define it * explicitly in the header file. */ #define DAT_THREADSAFE DAT_FALSE #ifndef DAT_THREADSAFE #define DAT_THREADSAFE DAT_TRUE #endif /* DAT_THREADSAFE */ /* * Enable DAT Extensions */ #ifndef DAT_EXTENSIONS #define DAT_EXTENSIONS 1 #endif #endif /* _UDAT_CONFIG_H_ */ dapl-2.1.5/dat/include/dat2/udat_redirection.h000077500000000000000000000331631255317474200212040ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /**************************************************************** * * HEADER: udat_redirection.h * * PURPOSE: User DAT macro definitions * * Description: Macros to invoke DAPL functions from the dat_registry * * Mapping rules: * All global symbols are prepended with DAT_ or dat_ * All DAT objects have an 'api' tag which, such as 'ep' or 'lmr' * The method table is in the provider definition structure. * **********************************************************/ #ifndef _UDAT_REDIRECTION_H_ #define _UDAT_REDIRECTION_H_ #define DAT_LMR_CREATE(ia, mem_type, reg_desc, len, pz, priv, va_type, \ lmr, lmr_context, rmr_context, reg_len, reg_addr) \ (*DAT_HANDLE_TO_PROVIDER(ia)->lmr_create_func)(\ (ia), \ (mem_type), \ (reg_desc), \ (len), \ (pz), \ (priv), \ (va_type), \ (lmr), \ (lmr_context), \ (rmr_context), \ (reg_len), \ (reg_addr)) #define DAT_EVD_CREATE(ia, qlen, cno, flags, handle) \ (*DAT_HANDLE_TO_PROVIDER(ia)->evd_create_func)(\ (ia), \ (qlen), \ (cno), \ (flags), \ (handle)) #define DAT_EVD_ENABLE(evd) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_enable_func)(\ (evd)) #define DAT_EVD_WAIT(evd, timeout, threshold, event, nmore) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_wait_func)(\ (evd), \ (timeout), \ (threshold), \ (event), \ (nmore)) #define DAT_EVD_DISABLE(evd) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_disable_func)(\ (evd)) #define DAT_EVD_SET_UNWAITABLE(evd) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_set_unwaitable_func)(\ (evd)) #define DAT_EVD_CLEAR_UNWAITABLE(evd) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_clear_unwaitable_func)(\ (evd)) #define DAT_EVD_MODIFY_CNO(evd, cno) \ (*DAT_HANDLE_TO_PROVIDER(evd)->evd_modify_cno_func)(\ (evd), \ (cno)) #define DAT_CNO_CREATE(ia, proxy, cno) \ (*DAT_HANDLE_TO_PROVIDER(ia)->cno_create_func)(\ (ia), \ (proxy), \ (cno)) #define DAT_CNO_FD_CREATE(ia, fd, cno) \ (*DAT_HANDLE_TO_PROVIDER(ia)->cno_fd_create_func)(\ (ia), \ (fd), \ (cno)) #define DAT_CNO_TRIGGER(cno, evd) \ (*DAT_HANDLE_TO_PROVIDER(cno)->cno_trigger_func)(\ (cno), \ (evd)) #define DAT_CNO_MODIFY_AGENT(cno, proxy) \ (*DAT_HANDLE_TO_PROVIDER(cno)->cno_modify_agent_func)(\ (cno), \ (proxy)) #define DAT_CNO_QUERY(cno, mask, param) \ (*DAT_HANDLE_TO_PROVIDER(cno)->cno_query_func)(\ (cno), \ (mask), \ (param)) #define DAT_CNO_FREE(cno) \ (*DAT_HANDLE_TO_PROVIDER(cno)->cno_free_func)(\ (cno)) #define DAT_CNO_WAIT(cno,timeout,evd) \ (*DAT_HANDLE_TO_PROVIDER(cno)->cno_wait_func)(\ (cno), \ (timeout), \ (evd)) /*************************************************************** * FUNCTION PROTOTYPES * * User DAT function call definitions, * ****************************************************************/ typedef DAT_RETURN (DAT_API *DAT_LMR_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_MEM_TYPE, /* mem_type */ IN DAT_REGION_DESCRIPTION, /* region_description */ IN DAT_VLEN, /* length */ IN DAT_PZ_HANDLE, /* pz_handle */ IN DAT_MEM_PRIV_FLAGS, /* privileges */ IN DAT_VA_TYPE, /* va_type */ OUT DAT_LMR_HANDLE *, /* lmr_handle */ OUT DAT_LMR_CONTEXT *, /* lmr_context */ OUT DAT_RMR_CONTEXT *, /* rmr_context */ OUT DAT_VLEN *, /* registered_length */ OUT DAT_VADDR * ); /* registered_address */ typedef DAT_RETURN (DAT_API *DAT_LMR_QUERY_FUNC) ( IN DAT_LMR_HANDLE, /* lmr_handle */ IN DAT_LMR_PARAM_MASK, /* lmr_param_mask */ OUT DAT_LMR_PARAM *); /* lmr_param */ /* Event functions */ typedef DAT_RETURN (DAT_API *DAT_EVD_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_COUNT, /* evd_min_qlen */ IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_EVD_FLAGS, /* evd_flags */ OUT DAT_EVD_HANDLE * ); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_MODIFY_CNO_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_CNO_HANDLE); /* cno_handle */ typedef DAT_RETURN (DAT_API *DAT_CNO_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ IN DAT_OS_WAIT_PROXY_AGENT,/* agent */ OUT DAT_CNO_HANDLE *); /* cno_handle */ typedef DAT_RETURN (DAT_API *DAT_CNO_FD_CREATE_FUNC) ( IN DAT_IA_HANDLE, /* ia_handle */ OUT DAT_FD *, /* file_descriptor */ OUT DAT_CNO_HANDLE *); /* cno_handle */ typedef DAT_RETURN (DAT_API *DAT_CNO_TRIGGER_FUNC) ( IN DAT_CNO_HANDLE, /* cno_handle */ OUT DAT_EVD_HANDLE *); /* trigger */ typedef DAT_RETURN (DAT_API *DAT_CNO_MODIFY_AGENT_FUNC) ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_OS_WAIT_PROXY_AGENT);/* agent */ typedef DAT_RETURN (DAT_API *DAT_CNO_QUERY_FUNC) ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_CNO_PARAM_MASK, /* cno_param_mask */ OUT DAT_CNO_PARAM * ); /* cno_param */ typedef DAT_RETURN (DAT_API *DAT_CNO_FREE_FUNC) ( IN DAT_CNO_HANDLE); /* cno_handle */ typedef DAT_RETURN (DAT_API *DAT_CNO_WAIT_FUNC) ( IN DAT_CNO_HANDLE, /* cno_handle */ IN DAT_TIMEOUT, /* timeout */ OUT DAT_EVD_HANDLE *); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_ENABLE_FUNC) ( IN DAT_EVD_HANDLE); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_WAIT_FUNC) ( IN DAT_EVD_HANDLE, /* evd_handle */ IN DAT_TIMEOUT, /* Timeout */ IN DAT_COUNT, /* Threshold */ OUT DAT_EVENT *, /* event */ OUT DAT_COUNT * ); /* N more events */ typedef DAT_RETURN (DAT_API *DAT_EVD_DISABLE_FUNC) ( IN DAT_EVD_HANDLE); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_SET_UNWAITABLE_FUNC) ( IN DAT_EVD_HANDLE); /* evd_handle */ typedef DAT_RETURN (DAT_API *DAT_EVD_CLEAR_UNWAITABLE_FUNC) ( IN DAT_EVD_HANDLE); /* evd_handle */ #include struct dat_provider { const char * device_name; DAT_PVOID extension; DAT_IA_OPEN_FUNC ia_open_func; DAT_IA_QUERY_FUNC ia_query_func; DAT_IA_CLOSE_FUNC ia_close_func; DAT_SET_CONSUMER_CONTEXT_FUNC set_consumer_context_func; DAT_GET_CONSUMER_CONTEXT_FUNC get_consumer_context_func; DAT_GET_HANDLE_TYPE_FUNC get_handle_type_func; DAT_CNO_CREATE_FUNC cno_create_func; /* udat only */ DAT_CNO_MODIFY_AGENT_FUNC cno_modify_agent_func; /* udat only */ DAT_CNO_QUERY_FUNC cno_query_func; /* udat only */ DAT_CNO_FREE_FUNC cno_free_func; /* udat only */ DAT_CNO_WAIT_FUNC cno_wait_func; /* udat only */ DAT_CR_QUERY_FUNC cr_query_func; DAT_CR_ACCEPT_FUNC cr_accept_func; DAT_CR_REJECT_FUNC cr_reject_func; DAT_CR_HANDOFF_FUNC cr_handoff_func; DAT_EVD_CREATE_FUNC evd_create_func; DAT_EVD_QUERY_FUNC evd_query_func; DAT_EVD_MODIFY_CNO_FUNC evd_modify_cno_func; /* udat only */ DAT_EVD_ENABLE_FUNC evd_enable_func; /* udat only */ DAT_EVD_DISABLE_FUNC evd_disable_func; /* udat only */ DAT_EVD_WAIT_FUNC evd_wait_func; /* udat only */ DAT_EVD_RESIZE_FUNC evd_resize_func; DAT_EVD_POST_SE_FUNC evd_post_se_func; DAT_EVD_DEQUEUE_FUNC evd_dequeue_func; DAT_EVD_FREE_FUNC evd_free_func; DAT_EP_CREATE_FUNC ep_create_func; DAT_EP_QUERY_FUNC ep_query_func; DAT_EP_MODIFY_FUNC ep_modify_func; DAT_EP_CONNECT_FUNC ep_connect_func; DAT_EP_DUP_CONNECT_FUNC ep_dup_connect_func; DAT_EP_DISCONNECT_FUNC ep_disconnect_func; DAT_EP_POST_SEND_FUNC ep_post_send_func; DAT_EP_POST_RECV_FUNC ep_post_recv_func; DAT_EP_POST_RDMA_READ_FUNC ep_post_rdma_read_func; DAT_EP_POST_RDMA_WRITE_FUNC ep_post_rdma_write_func; DAT_EP_GET_STATUS_FUNC ep_get_status_func; DAT_EP_FREE_FUNC ep_free_func; DAT_LMR_CREATE_FUNC lmr_create_func; DAT_LMR_QUERY_FUNC lmr_query_func; DAT_LMR_FREE_FUNC lmr_free_func; DAT_RMR_CREATE_FUNC rmr_create_func; DAT_RMR_QUERY_FUNC rmr_query_func; DAT_RMR_BIND_FUNC rmr_bind_func; DAT_RMR_FREE_FUNC rmr_free_func; DAT_PSP_CREATE_FUNC psp_create_func; DAT_PSP_QUERY_FUNC psp_query_func; DAT_PSP_FREE_FUNC psp_free_func; DAT_RSP_CREATE_FUNC rsp_create_func; DAT_RSP_QUERY_FUNC rsp_query_func; DAT_RSP_FREE_FUNC rsp_free_func; DAT_PZ_CREATE_FUNC pz_create_func; DAT_PZ_QUERY_FUNC pz_query_func; DAT_PZ_FREE_FUNC pz_free_func; /* dat-1.1 */ DAT_PSP_CREATE_ANY_FUNC psp_create_any_func; /* dat-1.1 */ DAT_EP_RESET_FUNC ep_reset_func; /* dat-1.1 */ /* udat-1.1 */ DAT_EVD_SET_UNWAITABLE_FUNC evd_set_unwaitable_func; /* udat-1.1 */ DAT_EVD_CLEAR_UNWAITABLE_FUNC evd_clear_unwaitable_func; /* udat-1.1 */ /* dat-1.2 */ DAT_LMR_SYNC_RDMA_READ_FUNC lmr_sync_rdma_read_func; DAT_LMR_SYNC_RDMA_WRITE_FUNC lmr_sync_rdma_write_func; DAT_EP_CREATE_WITH_SRQ_FUNC ep_create_with_srq_func; DAT_EP_RECV_QUERY_FUNC ep_recv_query_func; DAT_EP_SET_WATERMARK_FUNC ep_set_watermark_func; DAT_SRQ_CREATE_FUNC srq_create_func; DAT_SRQ_FREE_FUNC srq_free_func; DAT_SRQ_POST_RECV_FUNC srq_post_recv_func; DAT_SRQ_QUERY_FUNC srq_query_func; DAT_SRQ_RESIZE_FUNC srq_resize_func; DAT_SRQ_SET_LW_FUNC srq_set_lw_func; /* DAT 2.0 functions */ DAT_CSP_CREATE_FUNC csp_create_func; DAT_CSP_QUERY_FUNC csp_query_func; DAT_CSP_FREE_FUNC csp_free_func; DAT_EP_COMMON_CONNECT_FUNC ep_common_connect_func; DAT_RMR_CREATE_FOR_EP_FUNC rmr_create_for_ep_func; DAT_EP_POST_SEND_WITH_INVALIDATE_FUNC ep_post_send_with_invalidate_func; DAT_EP_POST_RDMA_READ_TO_RMR_FUNC ep_post_rdma_read_to_rmr_func; DAT_CNO_FD_CREATE_FUNC cno_fd_create_func; DAT_CNO_TRIGGER_FUNC cno_trigger_func; DAT_IA_HA_RELATED_FUNC ia_ha_related_func; #ifdef DAT_EXTENSIONS DAT_HANDLE_EXTENDEDOP_FUNC handle_extendedop_func; #endif /* DAT_EXTENSIONS */ }; #endif /* _UDAT_REDIRECTION_H_ */ dapl-2.1.5/dat/include/dat2/udat_vendor_specific.h000066400000000000000000000047101255317474200220300ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain both the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /*************************************************************** * * HEADER: udat_vendor_specific.h * * PURPOSE: Vendor defined macros & support. * * Description: Header file for "uDAPL: User Direct Access Programming * Library, Version: 2.0" * ***************************************************************/ #ifndef _UDAT_VENDOR_SPECIFIC_H_ #define _UDAT_VENDOR_SPECIFIC_H_ #include /* Vendor-specific extensions */ #if defined(_AMMASSO) #elif defined(_BROADCOM) #elif defined(_CISCO) #elif defined(_IBM) #elif defined(_INTEL) #elif defined(_JNI) #elif defined(_MELLANOX) #elif defined(_MYRINET) #elif defined(_NETEFFECT) #elif defined(_QLOGIC) #elif defined(_SILVERSTORM) #elif defined(_VOLTAIRE) #endif #endif /* _UDAT_VENDOR_SPECIFIC_H_ */ dapl-2.1.5/dat/udat/000077500000000000000000000000001255317474200141565ustar00rootroot00000000000000dapl-2.1.5/dat/udat/libdat2.map000077500000000000000000000027201255317474200162020ustar00rootroot00000000000000DAT_2.0 { global: dat_cno_create; dat_cno_free; dat_cno_modify_agent; dat_cno_query; dat_cno_wait; dat_cr_accept; dat_cr_handoff; dat_cr_query; dat_cr_reject; dat_ep_connect; dat_ep_create; dat_ep_create_with_srq; dat_ep_disconnect; dat_ep_dup_connect; dat_ep_free; dat_ep_get_status; dat_ep_modify; dat_ep_post_rdma_read; dat_ep_post_rdma_write; dat_ep_post_recv; dat_ep_post_send; dat_ep_query; dat_ep_recv_query; dat_ep_reset; dat_ep_set_watermark; dat_evd_clear_unwaitable; dat_evd_create; dat_evd_dequeue; dat_evd_disable; dat_evd_enable; dat_evd_free; dat_evd_modify_cno; dat_evd_post_se; dat_evd_query; dat_evd_resize; dat_evd_set_unwaitable; dat_evd_wait; dat_get_consumer_context; dat_get_handle_type; dat_ia_close; dat_ia_openv; dat_ia_query; dat_lmr_create; dat_lmr_free; dat_lmr_query; dat_lmr_sync_rdma_read; dat_lmr_sync_rdma_write; dat_psp_create; dat_psp_create_any; dat_psp_free; dat_psp_query; dat_pz_create; dat_pz_free; dat_pz_query; dat_registry_add_provider; dat_registry_list_providers; dat_registry_remove_provider; dat_rmr_bind; dat_rmr_create; dat_rmr_free; dat_rmr_query; dat_rsp_create; dat_rsp_free; dat_rsp_query; dat_set_consumer_context; dat_srq_create; dat_srq_free; dat_srq_post_recv; dat_srq_query; dat_srq_resize; dat_srq_set_lw; dats_get_ia_handle; dat_strerror; dat_extension_op; local: *; }; dapl-2.1.5/dat/udat/linux/000077500000000000000000000000001255317474200153155ustar00rootroot00000000000000dapl-2.1.5/dat/udat/linux/dat_osd.c000066400000000000000000000125361255317474200171050ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_osd.c * * PURPOSE: Operating System Dependent layer * Description: * Provide OS dependent functions with a canonical DAPL * interface. Designed to be portable and hide OS specific quirks * of common functions. * * $Id: dat_osd.c,v 1.14 2005/04/25 17:29:41 jlentini Exp $ **********************************************************************/ #include "dat_osd.h" /********************************************************************* * * * Constants * * * *********************************************************************/ #define DAT_DBG_TYPE_ENV "DAT_DBG_TYPE" #define DAT_DBG_DEST_ENV "DAT_DBG_DEST" /********************************************************************* * * * Enumerations * * * *********************************************************************/ typedef int DAT_OS_DBG_DEST; typedef enum { DAT_OS_DBG_DEST_STDOUT = 0x1, DAT_OS_DBG_DEST_SYSLOG = 0x2, DAT_OS_DBG_DEST_ALL = 0x3 } DAT_OS_DBG_DEST_TYPE; /********************************************************************* * * * Global Variables * * * *********************************************************************/ static DAT_OS_DBG_TYPE_VAL g_dbg_type = DAT_OS_DBG_TYPE_ERROR; static DAT_OS_DBG_DEST g_dbg_dest = DAT_OS_DBG_DEST_STDOUT; /*********************************************************************** * Function: dat_os_dbg_init ***********************************************************************/ void dat_os_dbg_init ( void ) { char *dbg_type; char *dbg_dest; if ( NULL != (dbg_type = dat_os_getenv (DAT_DBG_TYPE_ENV)) ) { g_dbg_type = dat_os_strtol (dbg_type, NULL, 0); } if ( NULL != (dbg_dest = dat_os_getenv (DAT_DBG_DEST_ENV)) ) { g_dbg_dest = dat_os_strtol (dbg_dest, NULL, 0); } } /*********************************************************************** * Function: dat_os_dbg_print ***********************************************************************/ void dat_os_dbg_print ( DAT_OS_DBG_TYPE_VAL type, const char * fmt, ...) { if (type & g_dbg_type) { va_list args; if ( DAT_OS_DBG_DEST_STDOUT & g_dbg_dest ) { va_start (args, fmt); vfprintf (stdout, fmt, args); fflush (stdout); va_end (args); } if ( DAT_OS_DBG_DEST_SYSLOG & g_dbg_dest ) { va_start (args, fmt); vsyslog (LOG_USER | LOG_DEBUG, fmt, args); va_end (args); } } } /*********************************************************************** * Function: dat_os_library_load ***********************************************************************/ DAT_RETURN dat_os_library_load ( const char *library_path, DAT_OS_LIBRARY_HANDLE *library_handle_ptr) { DAT_OS_LIBRARY_HANDLE library_handle; if ( NULL != (library_handle = dlopen (library_path, RTLD_NOW | RTLD_GLOBAL)) ) { if ( NULL != library_handle_ptr ) { *library_handle_ptr = library_handle; } return DAT_SUCCESS; } else { dat_os_dbg_print (DAT_OS_DBG_TYPE_GENERIC, "DAT: library load failure: %s\n", dlerror ()); return DAT_INTERNAL_ERROR; } } /*********************************************************************** * Function: dat_os_library_unload ***********************************************************************/ DAT_RETURN dat_os_library_unload ( const DAT_OS_LIBRARY_HANDLE library_handle) { if ( 0 != dlclose (library_handle) ) { return DAT_INTERNAL_ERROR; } else { return DAT_SUCCESS; } } dapl-2.1.5/dat/udat/linux/dat_osd.h000066400000000000000000000214511255317474200171060ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_osd.h * * PURPOSE: Operating System Dependent layer * Description: * Provide OS dependent data structures & functions with * a canonical DAT interface. Designed to be portable * and hide OS specific quirks of common functions. * * $Id: dat_osd.h,v 1.18 2005/03/24 05:58:36 jlentini Exp $ **********************************************************************/ #ifndef _DAT_OSD_H_ #define _DAT_OSD_H_ /* * This file is defined for Linux systems only, including it on any * other build will cause an error */ #ifndef __linux__ #error "UNDEFINED OS TYPE" #endif /* __linux__ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef STATIC #define STATIC static #endif /* STATIC */ #ifndef INLINE #define INLINE __inline__ #endif /* INLINE */ /********************************************************************* * * * Debuging * * * *********************************************************************/ #define dat_os_assert(expr) assert(expr) typedef int DAT_OS_DBG_TYPE_VAL; typedef enum { DAT_OS_DBG_TYPE_ERROR = 0x1, DAT_OS_DBG_TYPE_GENERIC = 0x2, DAT_OS_DBG_TYPE_SR = 0x4, DAT_OS_DBG_TYPE_DR = 0x8, DAT_OS_DBG_TYPE_PROVIDER_API = 0x10, DAT_OS_DBG_TYPE_CONSUMER_API = 0x20, DAT_OS_DBG_TYPE_ALL = 0xff } DAT_OS_DBG_TYPE; extern void dat_os_dbg_init ( void ); extern void dat_os_dbg_print ( DAT_OS_DBG_TYPE_VAL type, const char * fmt, ...); /********************************************************************* * * * Utility Functions * * * *********************************************************************/ #define DAT_ERROR(Type, SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType)) #define dat_os_library_error() dlerror() typedef size_t DAT_OS_SIZE; typedef void * DAT_OS_LIBRARY_HANDLE; extern DAT_RETURN dat_os_library_load ( const char *library_path, DAT_OS_LIBRARY_HANDLE *library_handle_ptr ); STATIC INLINE void * dat_os_library_sym ( DAT_OS_LIBRARY_HANDLE library_handle, char *sym) { return dlsym (library_handle, sym); } extern DAT_RETURN dat_os_library_unload ( const DAT_OS_LIBRARY_HANDLE library_handle ); STATIC INLINE char * dat_os_getenv ( const char *name) { return getenv (name); } STATIC INLINE long int dat_os_strtol ( const char *nptr, char **endptr, int base) { return strtol (nptr, endptr, base); } STATIC INLINE DAT_OS_SIZE dat_os_strlen ( const char *s ) { return strlen (s); } STATIC INLINE int dat_os_strncmp ( const char *s1, const char *s2, DAT_OS_SIZE n) { return strncmp (s1, s2, n); } STATIC INLINE void * dat_os_strncpy ( char *dest, const char *src, DAT_OS_SIZE len) { return strncpy (dest, src, len); } STATIC INLINE DAT_BOOLEAN dat_os_isblank ( int c) { if ( (' ' == c) || ('\t' == c) ) { return DAT_TRUE; } else { return DAT_FALSE; } } STATIC INLINE DAT_BOOLEAN dat_os_isdigit ( int c) { if ( isdigit (c) ) { return DAT_TRUE; } else { return DAT_FALSE; } } STATIC INLINE void dat_os_usleep ( unsigned long usec) { usleep (usec); } /********************************************************************* * * * Memory Functions * * * *********************************************************************/ STATIC INLINE void * dat_os_alloc ( int size) { return malloc (size); } STATIC INLINE void dat_os_free ( void *ptr, int size) { free (ptr); } STATIC INLINE void * dat_os_memset (void *loc, int c, DAT_OS_SIZE size) { return memset (loc, c, size); } /********************************************************************* * * * File I/O * * * *********************************************************************/ typedef FILE DAT_OS_FILE; typedef fpos_t DAT_OS_FILE_POS; STATIC INLINE DAT_OS_FILE * dat_os_fopen ( const char * path) { /* always open files in read only mode*/ return fopen (path, "r"); } STATIC INLINE DAT_RETURN dat_os_fgetpos ( DAT_OS_FILE *file, DAT_OS_FILE_POS *pos) { if ( 0 == fgetpos (file, pos) ) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } STATIC INLINE DAT_RETURN dat_os_fsetpos ( DAT_OS_FILE *file, DAT_OS_FILE_POS *pos) { if ( 0 == fsetpos (file, pos) ) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } /* dat_os_fgetc() returns EOF on error or end of file. */ STATIC INLINE int dat_os_fgetc ( DAT_OS_FILE *file) { return fgetc (file); } /* dat_os_ungetc() returns EOF on error or char 'c'. * Push char 'c' back into specified stream for subsequent read. */ STATIC INLINE int dat_os_ungetc ( DAT_OS_FILE *file, int c) { return ungetc(c, file); } /* dat_os_fgetc() returns EOF on error or end of file. */ STATIC INLINE int dat_os_fputc ( DAT_OS_FILE *file, int c) { return fputc (c, file); } /* dat_os_fread returns the number of bytes read from the file. */ STATIC INLINE DAT_OS_SIZE dat_os_fread ( DAT_OS_FILE *file, char *buf, DAT_OS_SIZE len) { return fread (buf, sizeof (char), len, file); } STATIC INLINE DAT_RETURN dat_os_fclose ( DAT_OS_FILE *file) { if ( 0 == fclose (file) ) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } /********************************************************************* * * * Locks * * * *********************************************************************/ typedef pthread_mutex_t DAT_OS_LOCK; /* lock functions */ STATIC INLINE DAT_RETURN dat_os_lock_init ( IN DAT_OS_LOCK *m) { /* pthread_mutex_init always returns 0 */ pthread_mutex_init (m, NULL); return DAT_SUCCESS; } STATIC INLINE DAT_RETURN dat_os_lock ( IN DAT_OS_LOCK *m) { if (0 == pthread_mutex_lock (m)) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } STATIC INLINE DAT_RETURN dat_os_unlock ( IN DAT_OS_LOCK *m) { if (0 == pthread_mutex_unlock (m)) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } STATIC INLINE DAT_RETURN dat_os_lock_destroy ( IN DAT_OS_LOCK *m) { if (0 == pthread_mutex_destroy (m)) { return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } #endif /* _DAT_OSD_H_ */ /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/udat/udat.c000077500000000000000000000377121255317474200152740ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: udat.c * * PURPOSE: DAT Provider and Consumer registry functions. * * $Id: udat.c,v 1.22 2005/03/24 05:58:35 jlentini Exp $ **********************************************************************/ #include #include /* Provider API function prototypes */ #include "dat_dr.h" #include "dat_init.h" #include "dat_osd.h" #ifndef DAT_NO_STATIC_REGISTRY #include "dat_sr.h" #endif #define UDAT_IS_BAD_POINTER(p) ( NULL == (p) ) /********************************************************************* * * * Internal Function Declarations * * * *********************************************************************/ DAT_BOOLEAN udat_check_state(void); /********************************************************************* * * * External Function Definitions * * * *********************************************************************/ /* * Use a global to get an unresolved when run with pre-extension library */ int g_dat_extensions = 0; /* * * Provider API * */ /*********************************************************************** * Function: dat_registry_add_provider ***********************************************************************/ DAT_RETURN DAT_API dat_registry_add_provider(IN const DAT_PROVIDER * provider, IN const DAT_PROVIDER_INFO * provider_info) { DAT_DR_ENTRY entry; dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "DAT Registry: %s (%s,%x:%x,%x)\n", __FUNCTION__, provider_info->ia_name, provider_info->dapl_version_major, provider_info->dapl_version_minor, provider_info->is_thread_safe); if (UDAT_IS_BAD_POINTER(provider)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } if (UDAT_IS_BAD_POINTER(provider_info)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); } if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } entry.ref_count = 0; entry.ia_open_func = provider->ia_open_func; entry.info = *provider_info; #ifdef DAT_EXTENSIONS entry.ia_ext_func = provider->handle_extendedop_func; #endif return dat_dr_insert(provider_info, &entry); } //*********************************************************************** // Function: dat_registry_remove_provider //*********************************************************************** DAT_RETURN DAT_API dat_registry_remove_provider(IN const DAT_PROVIDER * provider, IN const DAT_PROVIDER_INFO * provider_info) { dat_os_dbg_print(DAT_OS_DBG_TYPE_PROVIDER_API, "DAT Registry: dat_registry_remove_provider () called\n"); if (UDAT_IS_BAD_POINTER(provider)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } return dat_dr_remove(provider_info); } /* * * Consumer API * */ /*********************************************************************** * Function: dat_ia_open ***********************************************************************/ DAT_RETURN DAT_API dat_ia_openv(IN const DAT_NAME_PTR name, IN DAT_COUNT async_event_qlen, INOUT DAT_EVD_HANDLE * async_event_handle, OUT DAT_IA_HANDLE * ia_handle, IN DAT_UINT32 dapl_major, IN DAT_UINT32 dapl_minor, IN DAT_BOOLEAN thread_safety) { DAT_IA_OPEN_FUNC ia_open_func; DAT_PROVIDER_INFO info; DAT_OS_SIZE len; DAT_RETURN dat_status; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dat_ia_openv (%s,%x:%x,%x) called\n", name, dapl_major, dapl_minor, thread_safety); if (UDAT_IS_BAD_POINTER(name)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } len = dat_os_strlen(name); if (DAT_NAME_MAX_LENGTH <= len) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } if (UDAT_IS_BAD_POINTER(ia_handle)) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); } if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } dat_os_strncpy(info.ia_name, name, len + 1); info.dapl_version_major = dapl_major; info.dapl_version_minor = dapl_minor; info.is_thread_safe = thread_safety; /* * Since DAT allows providers to be loaded by either the static * registry or explicitly through OS dependent methods, do not * return an error if no providers are loaded via the static registry. * Don't even bother calling the static registry if DAT is compiled * with no static registry support. */ #ifndef DAT_NO_STATIC_REGISTRY (void)dat_sr_provider_open(&info); #endif dat_status = dat_dr_provider_open(&info, &ia_open_func); if (dat_status != DAT_SUCCESS) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dat_ia_open () provider information " "for IA name %s not found in dynamic registry\n", name); return dat_status; } dat_status = (*ia_open_func) (name, async_event_qlen, async_event_handle, ia_handle); if (dat_status == DAT_SUCCESS) { *ia_handle = (DAT_IA_HANDLE) dats_set_ia_handle(*ia_handle); } else { (void)dat_dr_provider_close(&info); #ifndef DAT_NO_STATIC_REGISTRY (void)dat_sr_provider_close(&info); #endif return dat_status; } /* * See if provider supports extensions */ if (dat_status == DAT_SUCCESS) { DAT_IA_ATTR ia_attr; if (dat_ia_query(*ia_handle, NULL, DAT_IA_ALL, &ia_attr, 0, NULL) == DAT_SUCCESS) { if (ia_attr.extension_supported) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dat_ia_open () " "Extensions (Type=%d, ver=%d) supported!\n", ia_attr.extension_supported, ia_attr.extension_version); g_dat_extensions = 1; } } } return dat_status; } /************************************************************************ * Function: dat_ia_close ***********************************************************************/ DAT_RETURN DAT_API dat_ia_close(IN DAT_IA_HANDLE ia_handle, IN DAT_CLOSE_FLAGS ia_flags) { DAT_PROVIDER *provider; DAT_PROVIDER_ATTR provider_attr; DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; const char *ia_name; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dat_ia_close () called\n"); dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status != DAT_SUCCESS) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); } if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } provider = DAT_HANDLE_TO_PROVIDER(dapl_ia_handle); ia_name = provider->device_name; if (DAT_SUCCESS != (dat_status = dat_ia_query(ia_handle, NULL, 0, NULL, DAT_PROVIDER_FIELD_ALL, &provider_attr))) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: query function for %s provider failed\n", ia_name); } else if (DAT_SUCCESS != (dat_status = (*provider->ia_close_func) (dapl_ia_handle, ia_flags))) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: close function for %s provider failed\n", ia_name); } else { DAT_PROVIDER_INFO info; DAT_OS_SIZE len; len = dat_os_strlen(ia_name); dat_os_assert(len < DAT_NAME_MAX_LENGTH); dat_os_strncpy(info.ia_name, ia_name, len + 1); info.dapl_version_major = provider_attr.dapl_version_major; info.dapl_version_minor = provider_attr.dapl_version_minor; info.is_thread_safe = provider_attr.is_thread_safe; dat_status = dat_dr_provider_close(&info); if (DAT_SUCCESS != dat_status) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dynamic registry unable to close " "provider for IA name %s\n", ia_name); } /* Remove the handle from the handle table */ (void)dats_free_ia_handle(ia_handle); #ifndef DAT_NO_STATIC_REGISTRY dat_status = dat_sr_provider_close(&info); if (DAT_SUCCESS != dat_status) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: static registry unable to close " "provider for IA name %s\n", ia_name); } #endif } return dat_status; } //*********************************************************************** // Function: dat_registry_list_providers //*********************************************************************** DAT_RETURN DAT_API dat_registry_list_providers(IN DAT_COUNT max_to_return, OUT DAT_COUNT * entries_returned, OUT DAT_PROVIDER_INFO * (dat_provider_list[])) { DAT_RETURN dat_status; dat_status = DAT_SUCCESS; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "DAT Registry: dat_registry_list_providers () called\n"); if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } if ((UDAT_IS_BAD_POINTER(entries_returned))) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); } if (0 != max_to_return && (UDAT_IS_BAD_POINTER(dat_provider_list))) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); } if (0 == max_to_return) { /* the user is allowed to call with max_to_return set to zero. * in which case we simply return (in *entries_returned) the * number of providers currently installed. We must also * (per spec) return an error */ #ifndef DAT_NO_STATIC_REGISTRY (void)dat_sr_size(entries_returned); #else (void)dat_dr_size(entries_returned); #endif return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } else { #ifndef DAT_NO_STATIC_REGISTRY dat_status = dat_sr_list(max_to_return, entries_returned, dat_provider_list); #else dat_status = dat_dr_list(max_to_return, entries_returned, dat_provider_list); #endif } return dat_status; } /********************************************************************* * * * Internal Function Definitions * * * *********************************************************************/ //*********************************************************************** // Function: udat_check_state //*********************************************************************** /* * This function returns TRUE if the DAT registry is in a state capable * of handling DAT API calls and false otherwise. */ DAT_BOOLEAN udat_check_state(void) { DAT_MODULE_STATE state; DAT_BOOLEAN status; state = dat_module_get_state(); if (DAT_MODULE_STATE_UNINITIALIZED == state) { dat_init(); status = DAT_TRUE; } else if (DAT_MODULE_STATE_DEINITIALIZED == state) { status = DAT_FALSE; } else { status = DAT_TRUE; } return status; } #ifdef DAT_EXTENSIONS /*********************************************************************** * Function: udat_extension_open - provider name supplied ***********************************************************************/ DAT_RETURN DAT_API udat_extension_open(IN const DAT_NAME_PTR name, IN DAT_EXTENDED_OP ext_op, IN va_list args) { DAT_HANDLE_EXTENDEDOP_FUNC prov_ext_func; DAT_PROVIDER_INFO info; DAT_OS_SIZE len; DAT_RETURN dat_status; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " udat_extenstion_op(%s,%x:%x,%x,%d) called\n", name, ext_op, DAT_VERSION_MAJOR, DAT_VERSION_MINOR, DAT_THREADSAFE); if (UDAT_IS_BAD_POINTER(name)) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } len = dat_os_strlen(name); if (DAT_NAME_MAX_LENGTH <= len) { return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1); } if (DAT_FALSE == udat_check_state()) { return DAT_ERROR(DAT_INVALID_STATE, 0); } dat_os_strncpy(info.ia_name, name, len + 1); info.dapl_version_major = DAT_VERSION_MAJOR; info.dapl_version_minor = DAT_VERSION_MINOR; info.is_thread_safe = DAT_THREADSAFE; #ifndef DAT_NO_STATIC_REGISTRY (void)dat_sr_provider_open(&info); #endif dat_status = dat_dr_provider_open_ext(&info, &prov_ext_func); if (dat_status != DAT_SUCCESS) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " DAT Registry: udat_ext_op () provider information " "for IA name %s not found in dynamic registry\n", name); return dat_status; } g_dat_extensions = 1; dat_status = (*prov_ext_func) (name, ext_op, args); dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " udat_extension_op () return = 0x%x for IA name %s\n", dat_status, name); if (dat_status != DAT_SUCCESS) { (void)dat_dr_provider_close(&info); #ifndef DAT_NO_STATIC_REGISTRY (void)dat_sr_provider_close(&info); #endif } return dat_status; } /*********************************************************************** * Function: udat_extension_close - provider handle supplied ***********************************************************************/ DAT_RETURN DAT_API udat_extension_close(IN DAT_IA_HANDLE ia_handle, IN DAT_EXTENDED_OP ext_op, IN va_list args) { DAT_PROVIDER *provider; DAT_PROVIDER_INFO info; DAT_OS_SIZE len; DAT_RETURN dat_status; const char* ia_name; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " udat_ext_close_op(ia=%p,op=%x) called\n", ia_handle, ext_op); if (ia_handle == NULL) return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); if (DAT_FALSE == udat_check_state()) return DAT_ERROR(DAT_INVALID_STATE, 0); provider = DAT_HANDLE_TO_PROVIDER(ia_handle); ia_name = provider->device_name; dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " udat_ext_close_op(ia=%p,op=%x,name=%s) called\n", ia_handle, ext_op, ia_name); dat_status = (*provider->handle_extendedop_func) (ia_handle, ext_op, args); dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, " udat_extension_op () return = 0x%x for IA name %s\n", dat_status, ia_name); if (dat_status != DAT_SUCCESS) return dat_status; len = dat_os_strlen(ia_name); dat_os_assert(len < DAT_NAME_MAX_LENGTH); dat_os_strncpy(info.ia_name, ia_name, len + 1); info.dapl_version_major = DAT_VERSION_MAJOR; info.dapl_version_minor = DAT_VERSION_MINOR; info.is_thread_safe = DAT_THREADSAFE; dat_status = dat_dr_provider_close(&info); if (DAT_SUCCESS != dat_status) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "udat_ext_close_op: dynamic registry unable to close " "provider for IA name %s\n", ia_name); } #ifndef DAT_NO_STATIC_REGISTRY dat_status = dat_sr_provider_close(&info); if (DAT_SUCCESS != dat_status) { dat_os_dbg_print(DAT_OS_DBG_TYPE_CONSUMER_API, "udat_ext_close_op: static registry unable to close " "provider for IA name %s\n", ia_name); } #endif return dat_status; } #endif /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/udat/udat_api.c000066400000000000000000000166231255317474200161200ustar00rootroot00000000000000/* * Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved. * * This Software is licensed under all of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. * * Neither the name of Network Appliance, Inc. nor the names of other DAT * Collaborative contributors may be used to endorse or promote * products derived from this software without specific prior written * permission. */ /********************************************************************** * * MODULE: udat.c * * PURPOSE: DAT Provider and Consumer registry functions. * * $Id: udat_api.c 1301 2005-03-24 05:58:55Z jlentini $ **********************************************************************/ #include #include #include "dat_osd.h" #include "dat_init.h" #define UDAT_IS_BAD_HANDLE(h) ( NULL == (p) ) DAT_RETURN DAT_API dat_lmr_create(IN DAT_IA_HANDLE ia_handle, IN DAT_MEM_TYPE mem_type, IN DAT_REGION_DESCRIPTION region_description, IN DAT_VLEN length, IN DAT_PZ_HANDLE pz_handle, IN DAT_MEM_PRIV_FLAGS privileges, IN DAT_VA_TYPE va_type, OUT DAT_LMR_HANDLE * lmr_handle, OUT DAT_LMR_CONTEXT * lmr_context, OUT DAT_RMR_CONTEXT * rmr_context, OUT DAT_VLEN * registered_length, OUT DAT_VADDR * registered_address) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_LMR_CREATE(dapl_ia_handle, mem_type, region_description, length, pz_handle, privileges, va_type, lmr_handle, lmr_context, rmr_context, registered_length, registered_address); } return dat_status; } DAT_RETURN DAT_API dat_evd_create(IN DAT_IA_HANDLE ia_handle, IN DAT_COUNT evd_min_qlen, IN DAT_CNO_HANDLE cno_handle, IN DAT_EVD_FLAGS evd_flags, OUT DAT_EVD_HANDLE * evd_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_EVD_CREATE(dapl_ia_handle, evd_min_qlen, cno_handle, evd_flags, evd_handle); } return dat_status; } DAT_RETURN DAT_API dat_evd_modify_cno(IN DAT_EVD_HANDLE evd_handle, IN DAT_CNO_HANDLE cno_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_MODIFY_CNO(evd_handle, cno_handle); } DAT_RETURN DAT_API dat_cno_create(IN DAT_IA_HANDLE ia_handle, IN DAT_OS_WAIT_PROXY_AGENT agent, OUT DAT_CNO_HANDLE * cno_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_CNO_CREATE(dapl_ia_handle, agent, cno_handle); } return dat_status; } DAT_RETURN DAT_API dat_cno_fd_create(IN DAT_IA_HANDLE ia_handle, OUT DAT_FD * fd, OUT DAT_CNO_HANDLE * cno_handle) { DAT_IA_HANDLE dapl_ia_handle; DAT_RETURN dat_status; dat_status = dats_get_ia_handle(ia_handle, &dapl_ia_handle); if (dat_status == DAT_SUCCESS) { dat_status = DAT_CNO_FD_CREATE(dapl_ia_handle, (DAT_FD *) fd, cno_handle); } return dat_status; } DAT_RETURN DAT_API dat_cno_modify_agent(IN DAT_CNO_HANDLE cno_handle, IN DAT_OS_WAIT_PROXY_AGENT agent) { if (cno_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); } return DAT_CNO_MODIFY_AGENT(cno_handle, agent); } DAT_RETURN DAT_API dat_cno_query(IN DAT_CNO_HANDLE cno_handle, IN DAT_CNO_PARAM_MASK cno_param_mask, OUT DAT_CNO_PARAM * cno_param) { if (cno_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); } return DAT_CNO_QUERY(cno_handle, cno_param_mask, cno_param); } DAT_RETURN DAT_API dat_cno_free(IN DAT_CNO_HANDLE cno_handle) { if (cno_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); } return DAT_CNO_FREE(cno_handle); } DAT_RETURN DAT_API dat_cno_wait(IN DAT_CNO_HANDLE cno_handle, IN DAT_TIMEOUT timeout, OUT DAT_EVD_HANDLE * evd_handle) { if (cno_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CNO); } return DAT_CNO_WAIT(cno_handle, timeout, evd_handle); } DAT_RETURN DAT_API dat_evd_enable(IN DAT_EVD_HANDLE evd_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_ENABLE(evd_handle); } DAT_RETURN DAT_API dat_evd_wait(IN DAT_EVD_HANDLE evd_handle, IN DAT_TIMEOUT Timeout, IN DAT_COUNT Threshold, OUT DAT_EVENT * event, OUT DAT_COUNT * n_more_events) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_WAIT(evd_handle, Timeout, Threshold, event, n_more_events); } DAT_RETURN DAT_API dat_evd_disable(IN DAT_EVD_HANDLE evd_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_DISABLE(evd_handle); } DAT_RETURN DAT_API dat_evd_set_unwaitable(IN DAT_EVD_HANDLE evd_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_SET_UNWAITABLE(evd_handle); } DAT_RETURN DAT_API dat_evd_clear_unwaitable(IN DAT_EVD_HANDLE evd_handle) { if (evd_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_REQUEST); } return DAT_EVD_CLEAR_UNWAITABLE(evd_handle); } DAT_RETURN DAT_API dat_cr_handoff(IN DAT_CR_HANDLE cr_handle, IN DAT_CONN_QUAL handoff) { if (cr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_CR); } return DAT_CR_HANDOFF(cr_handle, handoff); } DAT_RETURN DAT_API dat_lmr_query(IN DAT_LMR_HANDLE lmr_handle, IN DAT_LMR_PARAM_MASK lmr_param_mask, OUT DAT_LMR_PARAM * lmr_param) { if (lmr_handle == NULL) { return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR); } return DAT_LMR_QUERY(lmr_handle, lmr_param_mask, lmr_param); } /* * Local variables: * c-indent-level: 4 * c-basic-offset: 4 * tab-width: 8 * End: */ dapl-2.1.5/dat/udat/udat_sr_parser.c000066400000000000000000001016541255317474200173460ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * MODULE: dat_sr_parser.c * * PURPOSE: static registry parser * * $Id: udat_sr_parser.c,v 1.6 2005/03/24 05:58:36 jlentini Exp $ **********************************************************************/ #include #include "udat_sr_parser.h" #include "dat_sr.h" /********************************************************************* * * * Constants * * * *********************************************************************/ #define DAT_SR_CONF_ENV "DAT_OVERRIDE" #if defined(_WIN32) || defined(_WIN64) #define DAT_SR_CONF_DEFAULT "C:\\DAT\\dat.conf" #else #define DAT_SR_CONF_DEFAULT "/etc/dat.conf" #endif #define DAT_SR_TOKEN_THREADSAFE "threadsafe" #define DAT_SR_TOKEN_NONTHREADSAFE "nonthreadsafe" #define DAT_SR_TOKEN_DEFAULT "default" #define DAT_SR_TOKEN_NONDEFAULT "nondefault" #define DAT_SR_CHAR_NEWLINE '\n' #define DAT_SR_CHAR_COMMENT '#' #define DAT_SR_CHAR_QUOTE '"' #define DAT_SR_CHAR_BACKSLASH '\\' /********************************************************************* * * * Enumerations * * * *********************************************************************/ typedef enum { DAT_SR_TOKEN_STRING, /* text field (both quoted or unquoted) */ DAT_SR_TOKEN_EOR, /* end of record (newline) */ DAT_SR_TOKEN_EOF /* end of file */ } DAT_SR_TOKEN_TYPE; typedef enum { DAT_SR_API_UDAT, DAT_SR_API_KDAT } DAT_SR_API_TYPE; /********************************************************************* * * * Structures * * * *********************************************************************/ typedef struct { DAT_SR_TOKEN_TYPE type; char *value; /* valid if type is DAT_SR_TOKEN_STRING */ DAT_OS_SIZE value_len; } DAT_SR_TOKEN; typedef struct DAT_SR_STACK_NODE { DAT_SR_TOKEN token; struct DAT_SR_STACK_NODE *next; } DAT_SR_STACK_NODE; typedef struct { DAT_UINT32 major; DAT_UINT32 minor; } DAT_SR_VERSION; typedef struct { char *id; DAT_SR_VERSION version; } DAT_SR_PROVIDER_VERSION; typedef struct { DAT_SR_API_TYPE type; DAT_SR_VERSION version; } DAT_SR_API_VERSION; typedef struct { char *ia_name; DAT_SR_API_VERSION api_version; DAT_BOOLEAN is_thread_safe; DAT_BOOLEAN is_default; char *lib_path; DAT_SR_PROVIDER_VERSION provider_version; char *ia_params; char *platform_params; } DAT_SR_CONF_ENTRY; /********************************************************************* * * * Internal Function Declarations * * * *********************************************************************/ static DAT_RETURN dat_sr_load_entry(DAT_SR_CONF_ENTRY * entry); static DAT_BOOLEAN dat_sr_is_valid_entry(DAT_SR_CONF_ENTRY * entry); static char *dat_sr_type_to_str(DAT_SR_TOKEN_TYPE type); static DAT_RETURN dat_sr_parse_eof(DAT_OS_FILE * file); static DAT_RETURN dat_sr_parse_entry(DAT_OS_FILE * file); static DAT_RETURN dat_sr_parse_ia_name(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_api(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_thread_safety(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_default(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_lib_path(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_provider_version(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_ia_params(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_platform_params(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_parse_eoe(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry); static DAT_RETURN dat_sr_convert_api(char *str, DAT_SR_API_VERSION * api_version); static DAT_RETURN dat_sr_convert_thread_safety(char *str, DAT_BOOLEAN * is_thread_safe); static DAT_RETURN dat_sr_convert_default(char *str, DAT_BOOLEAN * is_default); static DAT_RETURN dat_sr_convert_provider_version(char *str, DAT_SR_PROVIDER_VERSION * provider_version); static DAT_RETURN dat_sr_get_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token); static DAT_RETURN dat_sr_put_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token); static DAT_RETURN dat_sr_read_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token); static DAT_RETURN dat_sr_read_str(DAT_OS_FILE * file, DAT_SR_TOKEN * token, DAT_OS_SIZE token_len); static DAT_RETURN dat_sr_read_quoted_str(DAT_OS_FILE * file, DAT_SR_TOKEN * token, DAT_OS_SIZE token_len, DAT_COUNT num_escape_seq); static void dat_sr_read_comment(DAT_OS_FILE * file); /********************************************************************* * * * Global Variables * * * *********************************************************************/ static DAT_SR_STACK_NODE *g_token_stack = NULL; /********************************************************************* * * * External Function Definitions * * * *********************************************************************/ /*********************************************************************** * Function: dat_sr_load ***********************************************************************/ DAT_RETURN dat_sr_load(void) { char *sr_path; DAT_OS_FILE *sr_file; sr_path = dat_os_getenv(DAT_SR_CONF_ENV); /* environment override */ if ((sr_path != NULL) && ((sr_file = dat_os_fopen(sr_path)) == NULL)) { dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, "DAT Registry: DAT_OVERRIDE, " "bad filename - %s, aborting\n", sr_path); goto bail; } if (sr_path == NULL) { #ifdef DAT_CONF sr_path = DAT_CONF; #else sr_path = DAT_SR_CONF_DEFAULT; #endif sr_file = dat_os_fopen(sr_path); if (sr_file == NULL) { #ifdef DAT_CONF dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: sysconfdir, " "bad filename - %s, retry default at %s\n", sr_path, DAT_SR_CONF_DEFAULT); /* try default after sysconfdir fails */ sr_path = DAT_SR_CONF_DEFAULT; sr_file = dat_os_fopen(sr_path); if (sr_file == NULL) { #endif dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, "DAT Registry: default, " "bad filename - %s, aborting\n", sr_path); goto bail; #ifdef DAT_CONF } #endif } } dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC, "DAT Registry: using config file %s\n", sr_path); for (;;) { if (DAT_SUCCESS == dat_sr_parse_eof(sr_file)) { break; } else if (DAT_SUCCESS == dat_sr_parse_entry(sr_file)) { continue; } else { dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, "DAT Registry: ERROR parsing - %s\n", sr_path); goto cleanup; } } if (0 != dat_os_fclose(sr_file)) { dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, "DAT Registry: ERROR closing - %s\n", sr_path); goto bail; } return DAT_SUCCESS; cleanup: dat_os_fclose(sr_file); bail: return DAT_INTERNAL_ERROR; } /********************************************************************* * * * Internal Function Definitions * * * *********************************************************************/ /*********************************************************************** * Function: dat_sr_is_valid_entry ***********************************************************************/ DAT_BOOLEAN dat_sr_is_valid_entry(DAT_SR_CONF_ENTRY * entry) { if ((DAT_SR_API_UDAT == entry->api_version.type) && (entry->is_default)) { return DAT_TRUE; } else { return DAT_FALSE; } } /*********************************************************************** * Function: dat_sr_load_entry ***********************************************************************/ DAT_RETURN dat_sr_load_entry(DAT_SR_CONF_ENTRY * conf_entry) { DAT_SR_ENTRY entry; if (DAT_NAME_MAX_LENGTH < (strlen(conf_entry->ia_name) + 1)) { dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: ia name %s is longer than " "DAT_NAME_MAX_LENGTH (%i)\n", conf_entry->ia_name, DAT_NAME_MAX_LENGTH); return DAT_INSUFFICIENT_RESOURCES; } dat_os_strncpy(entry.info.ia_name, conf_entry->ia_name, DAT_NAME_MAX_LENGTH); entry.info.dapl_version_major = conf_entry->api_version.version.major; entry.info.dapl_version_minor = conf_entry->api_version.version.minor; entry.info.is_thread_safe = conf_entry->is_thread_safe; entry.lib_path = conf_entry->lib_path; entry.ia_params = conf_entry->ia_params; entry.lib_handle = NULL; entry.ref_count = 0; dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "DAT Registry: loading provider for %s\n", conf_entry->ia_name); return dat_sr_insert(&entry.info, &entry); } /*********************************************************************** * Function: dat_sr_type_to_str ***********************************************************************/ char *dat_sr_type_to_str(DAT_SR_TOKEN_TYPE type) { static char *str_array[] = { "string", "eor", "eof" }; if ((type < 0) || (2 < type)) { return "error: invalid token type"; } return str_array[type]; } /*********************************************************************** * Function: dat_sr_parse_eof ***********************************************************************/ DAT_RETURN dat_sr_parse_eof(DAT_OS_FILE * file) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) { return DAT_INTERNAL_ERROR; } if (DAT_SR_TOKEN_EOF == token.type) { return DAT_SUCCESS; } else { dat_sr_put_token(file, &token); return DAT_INTERNAL_ERROR; } } /*********************************************************************** * Function: dat_sr_parse_ia_name ***********************************************************************/ DAT_RETURN dat_sr_parse_entry(DAT_OS_FILE * file) { DAT_SR_CONF_ENTRY entry; DAT_RETURN status; dat_os_memset(&entry, 0, sizeof(DAT_SR_CONF_ENTRY)); if ((DAT_SUCCESS == dat_sr_parse_ia_name(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_api(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_thread_safety(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_default(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_lib_path(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_provider_version(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_ia_params(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_platform_params(file, &entry)) && (DAT_SUCCESS == dat_sr_parse_eoe(file, &entry))) { dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "\n" "DAT Registry: entry \n" " ia_name %s\n" " api_version\n" " type 0x%X\n" " major.minor %d.%d\n" " is_thread_safe %d\n" " is_default %d\n" " lib_path %s\n" " provider_version\n" " id %s\n" " major.minor %d.%d\n" " ia_params %s\n" "\n", entry.ia_name, entry.api_version.type, entry.api_version.version.major, entry.api_version.version.minor, entry.is_thread_safe, entry.is_default, entry.lib_path, entry.provider_version.id, entry.provider_version.version.major, entry.provider_version.version.minor, entry.ia_params); if (DAT_TRUE == dat_sr_is_valid_entry(&entry)) { /* * The static registry configuration file may have multiple * entries with the same IA name. The first entry will be * installed in the static registry causing subsequent attempts * to register the same IA name to fail. Therefore the return code * from dat_sr_load_entry() is ignored. */ (void)dat_sr_load_entry(&entry); } status = DAT_SUCCESS; } else { /* resync */ DAT_SR_TOKEN token; /* * The static registry format is specified in the DAT specification. * While the registry file's contents may change between revisions of * the specification, there is no way to determine the specification * version to which the configuration file conforms. If an entry is * found that does not match the expected format, the entry is discarded * and the parsing of the file continues. There is no way to determine if * the entry was an error or an entry confirming to an alternate version * of specification. */ for (;;) { if (DAT_SUCCESS != dat_sr_get_token(file, &token)) { status = DAT_INTERNAL_ERROR; break; } if (DAT_SR_TOKEN_STRING != token.type) { status = DAT_SUCCESS; break; } else { dat_os_free(token.value, (sizeof(char) * dat_os_strlen(token.value)) + 1); continue; } } } /* free resources */ if (NULL != entry.ia_name) { dat_os_free(entry.ia_name, sizeof(char) * (dat_os_strlen(entry.ia_name) + 1)); } if (NULL != entry.lib_path) { dat_os_free(entry.lib_path, sizeof(char) * (dat_os_strlen(entry.lib_path) + 1)); } if (NULL != entry.provider_version.id) { dat_os_free(entry.provider_version.id, sizeof(char) * (dat_os_strlen(entry.provider_version.id) + 1)); } if (NULL != entry.ia_params) { dat_os_free(entry.ia_params, sizeof(char) * (dat_os_strlen(entry.ia_params) + 1)); } if (NULL != entry.platform_params) { dat_os_free(entry.platform_params, sizeof(char) * (dat_os_strlen(entry.platform_params) + 1)); } return status; } /*********************************************************************** * Function: dat_sr_parse_ia_name ***********************************************************************/ DAT_RETURN dat_sr_parse_ia_name(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) { dat_sr_put_token(file, &token); goto bail; } entry->ia_name = token.value; return DAT_SUCCESS; bail: return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_ia_name ***********************************************************************/ DAT_RETURN dat_sr_parse_api(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) goto cleanup; if (DAT_SUCCESS != dat_sr_convert_api(token.value, &entry->api_version)) goto cleanup; dat_os_free(token.value, (sizeof(char) * dat_os_strlen(token.value)) + 1); return DAT_SUCCESS; cleanup: dat_sr_put_token(file, &token); bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " api_ver, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_thread_safety ***********************************************************************/ static DAT_RETURN dat_sr_parse_thread_safety(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) goto cleanup; if (DAT_SUCCESS != dat_sr_convert_thread_safety(token.value, &entry->is_thread_safe)) goto cleanup; dat_os_free(token.value, (sizeof(char) * dat_os_strlen(token.value)) + 1); return DAT_SUCCESS; cleanup: dat_sr_put_token(file, &token); bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " thread_safety, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_default ***********************************************************************/ DAT_RETURN dat_sr_parse_default(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) goto cleanup; if (DAT_SUCCESS != dat_sr_convert_default(token.value, &entry->is_default)) goto cleanup; dat_os_free(token.value, (sizeof(char) * dat_os_strlen(token.value)) + 1); return DAT_SUCCESS; cleanup: dat_sr_put_token(file, &token); bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " default section, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_lib_path ***********************************************************************/ DAT_RETURN dat_sr_parse_lib_path(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) { dat_sr_put_token(file, &token); goto bail; } entry->lib_path = token.value; return DAT_SUCCESS; bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " lib_path, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_provider_version ***********************************************************************/ DAT_RETURN dat_sr_parse_provider_version(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) goto cleanup; if (DAT_SUCCESS != dat_sr_convert_provider_version(token.value, &entry->provider_version)) goto cleanup; dat_os_free(token.value, (sizeof(char) * dat_os_strlen(token.value)) + 1); return DAT_SUCCESS; cleanup: dat_sr_put_token(file, &token); bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " provider_ver, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_ia_params ***********************************************************************/ DAT_RETURN dat_sr_parse_ia_params(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) { dat_sr_put_token(file, &token); goto bail; } entry->ia_params = token.value; return DAT_SUCCESS; bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " ia_params, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_platform_params ***********************************************************************/ DAT_RETURN dat_sr_parse_platform_params(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if (DAT_SR_TOKEN_STRING != token.type) { dat_sr_put_token(file, &token); goto bail; } entry->platform_params = token.value; return DAT_SUCCESS; bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " platform_params, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_parse_eoe ***********************************************************************/ DAT_RETURN dat_sr_parse_eoe(DAT_OS_FILE * file, DAT_SR_CONF_ENTRY * entry) { DAT_SR_TOKEN token; if (DAT_SUCCESS != dat_sr_get_token(file, &token)) goto bail; if ((DAT_SR_TOKEN_EOF != token.type) && (DAT_SR_TOKEN_EOR != token.type)) { dat_sr_put_token(file, &token); goto bail; } return DAT_SUCCESS; bail: dat_os_dbg_print(DAT_OS_DBG_TYPE_ERROR, " ERR: corrupt dat.conf entry field:" " EOR, EOF, file offset=%ld\n", ftell(file)); return DAT_INTERNAL_ERROR; } /*********************************************************************** * Function: dat_sr_convert_api ***********************************************************************/ DAT_RETURN dat_sr_convert_api(char *str, DAT_SR_API_VERSION * api_version) { int i; int minor_i; if (dat_os_strlen(str) <= 0) return DAT_INTERNAL_ERROR; if ('u' == str[0]) { api_version->type = DAT_SR_API_UDAT; } else if ('k' == str[0]) { api_version->type = DAT_SR_API_KDAT; } else { return DAT_INTERNAL_ERROR; } for (i = 1 /* move past initial [u|k] */ ; '\0' != str[i]; i++) { if ('.' == str[i]) { break; } else if (DAT_TRUE != dat_os_isdigit(str[i])) { return DAT_INTERNAL_ERROR; } } api_version->version.major = (DAT_UINT32) dat_os_strtol(str + 1, NULL, 10); /* move past '.' */ minor_i = ++i; for (; '\0' != str[i]; i++) { if (DAT_TRUE != dat_os_isdigit(str[i])) { return DAT_INTERNAL_ERROR; } } api_version->version.minor = (DAT_UINT32) dat_os_strtol(str + minor_i, NULL, 10); if ('\0' != str[i]) { return DAT_INTERNAL_ERROR; } return DAT_SUCCESS; } /*********************************************************************** * Function: dat_sr_convert_thread_safety ***********************************************************************/ static DAT_RETURN dat_sr_convert_thread_safety(char *str, DAT_BOOLEAN * is_thread_safe) { if (!dat_os_strncmp(str, DAT_SR_TOKEN_THREADSAFE, dat_os_strlen(DAT_SR_TOKEN_THREADSAFE))) { *is_thread_safe = DAT_TRUE; return DAT_SUCCESS; } else if (!dat_os_strncmp(str, DAT_SR_TOKEN_NONTHREADSAFE, dat_os_strlen(DAT_SR_TOKEN_NONTHREADSAFE))) { *is_thread_safe = DAT_FALSE; return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } /*********************************************************************** * Function: dat_sr_convert_default ***********************************************************************/ static DAT_RETURN dat_sr_convert_default(char *str, DAT_BOOLEAN * is_default) { if (!dat_os_strncmp(str, DAT_SR_TOKEN_DEFAULT, dat_os_strlen(DAT_SR_TOKEN_DEFAULT))) { *is_default = DAT_TRUE; return DAT_SUCCESS; } else if (!dat_os_strncmp(str, DAT_SR_TOKEN_NONDEFAULT, dat_os_strlen(DAT_SR_TOKEN_NONDEFAULT))) { *is_default = DAT_FALSE; return DAT_SUCCESS; } else { return DAT_INTERNAL_ERROR; } } /*********************************************************************** * Function: dat_sr_convert_provider_version ***********************************************************************/ DAT_RETURN dat_sr_convert_provider_version(char *str, DAT_SR_PROVIDER_VERSION * provider_version) { DAT_RETURN status; int i; int decimal_i; if ((dat_os_strlen(str) <= 0) || (NULL != provider_version->id)) return DAT_INTERNAL_ERROR; status = DAT_SUCCESS; for (i = 0; '\0' != str[i]; i++) { if ('.' == str[i]) { break; } } /* if no id value was found */ if (0 == i) { status = DAT_INTERNAL_ERROR; goto exit; } if (NULL == (provider_version->id = dat_os_alloc(sizeof(char) * (i + 1)))) { status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto exit; } dat_os_strncpy(provider_version->id, str, i); provider_version->id[i] = '\0'; /* move past '.' */ decimal_i = ++i; for (; '\0' != str[i]; i++) { if ('.' == str[i]) { break; } else if (DAT_TRUE != dat_os_isdigit(str[i])) { status = DAT_INTERNAL_ERROR; goto exit; } } /* if no version value was found */ if (decimal_i == i) { status = DAT_INTERNAL_ERROR; goto exit; } provider_version->version.major = (DAT_UINT32) dat_os_strtol(str + decimal_i, NULL, 10); /* move past '.' */ decimal_i = ++i; for (; '\0' != str[i]; i++) { if (DAT_TRUE != dat_os_isdigit(str[i])) { status = DAT_INTERNAL_ERROR; goto exit; } } /* if no version value was found */ if (decimal_i == i) { status = DAT_INTERNAL_ERROR; goto exit; } provider_version->version.minor = (DAT_UINT32) dat_os_strtol(str + decimal_i, NULL, 10); if ('\0' != str[i]) { status = DAT_INTERNAL_ERROR; goto exit; } exit: if (DAT_SUCCESS != status) { if (NULL != provider_version->id) { dat_os_free(provider_version->id, sizeof(char) * (dat_os_strlen(provider_version->id) + 1)); provider_version->id = NULL; } } return status; } /*********************************************************************** * Function: dat_sr_get_token ***********************************************************************/ DAT_RETURN dat_sr_get_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token) { if (NULL == g_token_stack) { return dat_sr_read_token(file, token); } else { DAT_SR_STACK_NODE *top; top = g_token_stack; *token = top->token; g_token_stack = top->next; dat_os_free(top, sizeof(DAT_SR_STACK_NODE)); return DAT_SUCCESS; } } /*********************************************************************** * Function: dat_sr_put_token ***********************************************************************/ DAT_RETURN dat_sr_put_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token) { DAT_SR_STACK_NODE *top; if (NULL == (top = dat_os_alloc(sizeof(DAT_SR_STACK_NODE)))) { return DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY; } top->token = *token; top->next = g_token_stack; g_token_stack = top; return DAT_SUCCESS; } /*********************************************************************** * Function: dat_sr_read_token ***********************************************************************/ DAT_RETURN dat_sr_read_token(DAT_OS_FILE * file, DAT_SR_TOKEN * token) { DAT_OS_FILE_POS pos; DAT_OS_SIZE token_len; DAT_COUNT num_escape_seq; DAT_BOOLEAN is_quoted_str; DAT_BOOLEAN is_prev_char_backslash; /* * The DAT standard does not specify a maximum size for quoted strings. * Therefore the tokenizer must be able to read in a token of arbitrary * size. Instead of allocating a fixed length buffer, the tokenizer first * scans the input a single character at a time looking for the begining * and end of the token. Once the these positions are found, the entire * token is read into memory. By using this algorithm,the implementation * does not place an arbitrary maximum on the token size. */ token_len = 0; num_escape_seq = 0; is_quoted_str = DAT_FALSE; is_prev_char_backslash = DAT_FALSE; for (;;) { DAT_OS_FILE_POS cur_pos; int c; /* if looking for start of the token */ if (0 == token_len) { if (DAT_SUCCESS != dat_os_fgetpos(file, &cur_pos)) { return DAT_INTERNAL_ERROR; } } c = dat_os_fgetc(file); /* if looking for start of the token */ if (0 == token_len) { if (EOF == c) { token->type = DAT_SR_TOKEN_EOF; token->value = NULL; token->value_len = 0; goto success; } else if (DAT_SR_CHAR_NEWLINE == c) { token->type = DAT_SR_TOKEN_EOR; token->value = NULL; token->value_len = 0; goto success; } else if (dat_os_isblank(c)) { continue; } else if (DAT_SR_CHAR_COMMENT == c) { dat_sr_read_comment(file); continue; } else { if (DAT_SR_CHAR_QUOTE == c) { is_quoted_str = DAT_TRUE; } pos = cur_pos; token_len++; } } else { /* looking for the end of the token */ if (EOF == c) { break; } else if (DAT_SR_CHAR_NEWLINE == c) { /* put back the newline */ dat_os_fputc(file, c); break; } else if (!is_quoted_str && dat_os_isblank(c)) { break; } else { token_len++; if ((DAT_SR_CHAR_QUOTE == c) && !is_prev_char_backslash) { break; } else if ((DAT_SR_CHAR_BACKSLASH == c) && !is_prev_char_backslash) { is_prev_char_backslash = DAT_TRUE; num_escape_seq++; } else { is_prev_char_backslash = DAT_FALSE; } } } } /* the token was a string */ if (DAT_SUCCESS != dat_os_fsetpos(file, &pos)) { return DAT_INTERNAL_ERROR; } if (is_quoted_str) { if (DAT_SUCCESS != dat_sr_read_quoted_str(file, token, token_len, num_escape_seq)) { return DAT_INTERNAL_ERROR; } } else { if (DAT_SUCCESS != dat_sr_read_str(file, token, token_len)) { return DAT_INTERNAL_ERROR; } } success: dat_os_dbg_print(DAT_OS_DBG_TYPE_SR, "\n" "DAT Registry: token\n" " type %s\n" " value <%s>\n" "\n", dat_sr_type_to_str(token->type), ((DAT_SR_TOKEN_STRING == token->type) ? token->value : "")); return DAT_SUCCESS; } /*********************************************************************** * Function: dat_sr_read_str ***********************************************************************/ DAT_RETURN dat_sr_read_str(DAT_OS_FILE * file, DAT_SR_TOKEN * token, DAT_OS_SIZE token_len) { token->type = DAT_SR_TOKEN_STRING; token->value_len = sizeof(char) * (token_len + 1); /* +1 for null termination */ if (NULL == (token->value = dat_os_alloc(token->value_len))) { return DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY; } if (token_len != dat_os_fread(file, token->value, token_len)) { dat_os_free(token->value, token->value_len); token->value = NULL; return DAT_INTERNAL_ERROR; } token->value[token->value_len - 1] = '\0'; return DAT_SUCCESS; } /*********************************************************************** * Function: dat_sr_read_quoted_str ***********************************************************************/ DAT_RETURN dat_sr_read_quoted_str(DAT_OS_FILE * file, DAT_SR_TOKEN * token, DAT_OS_SIZE token_len, DAT_COUNT num_escape_seq) { DAT_OS_SIZE str_len; DAT_OS_SIZE i; DAT_OS_SIZE j; int c; DAT_RETURN status; DAT_BOOLEAN is_prev_char_backslash; str_len = token_len - 2; /* minus 2 " characters */ is_prev_char_backslash = DAT_FALSE; status = DAT_SUCCESS; token->type = DAT_SR_TOKEN_STRING; /* +1 for null termination */ token->value_len = sizeof(char) * (str_len - num_escape_seq + 1); if (NULL == (token->value = dat_os_alloc(token->value_len))) { status = DAT_INSUFFICIENT_RESOURCES | DAT_RESOURCE_MEMORY; goto exit; } /* throw away " */ if (DAT_SR_CHAR_QUOTE != dat_os_fgetc(file)) { status = DAT_INTERNAL_ERROR; goto exit; } for (i = 0, j = 0; i < str_len; i++) { c = dat_os_fgetc(file); if (EOF == c) { status = DAT_INTERNAL_ERROR; goto exit; } else if ((DAT_SR_CHAR_BACKSLASH == c) && !is_prev_char_backslash) { is_prev_char_backslash = DAT_TRUE; } else { token->value[j] = (char)c; j++; is_prev_char_backslash = DAT_FALSE; } } /* throw away " */ if (DAT_SR_CHAR_QUOTE != dat_os_fgetc(file)) { status = DAT_INTERNAL_ERROR; goto exit; } token->value[token->value_len - 1] = '\0'; exit: if (DAT_SUCCESS != status) { if (NULL != token->value) { dat_os_free(token->value, token->value_len); token->value = NULL; } } return status; } /*********************************************************************** * Function: dat_sr_read_comment ***********************************************************************/ void dat_sr_read_comment(DAT_OS_FILE * file) { int c; /* read up to an EOR or EOF to move past the comment */ do { c = dat_os_fgetc(file); } while ((DAT_SR_CHAR_NEWLINE != c) && (EOF != c)); /* put back the newline */ dat_os_ungetc(file, c); } dapl-2.1.5/dat/udat/udat_sr_parser.h000066400000000000000000000044131255317474200173460ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ /********************************************************************** * * HEADER: dat_sr_parser.h * * PURPOSE: static registry (SR) parser inteface declarations * * $Id: udat_sr_parser.h,v 1.4 2005/03/24 05:58:36 jlentini Exp $ **********************************************************************/ #ifndef _DAT_SR_PARSER_H_ #define _DAT_SR_PARSER_H_ #include "dat_osd.h" /********************************************************************* * * * Function Declarations * * * *********************************************************************/ /* * The static registry exports the same interface regardless of * platform. The particular implementation of dat_sr_load() is * found with other platform dependent sources. */ extern DAT_RETURN dat_sr_load (void); #endif /* _DAT_SR_PARSER_H_ */ dapl-2.1.5/doc/000077500000000000000000000000001255317474200132165ustar00rootroot00000000000000dapl-2.1.5/doc/dat.conf000066400000000000000000000112661255317474200146430ustar00rootroot00000000000000# DAT v2.0 # # Note: Both API and Provider versions are based on DAT specification, v2.0 # # Each entry should have the following fields: # # \ # # # For uDAPL cma provder, is one of the following: # network address, network hostname, or netdev name and 0 for port # # For uDAPL scm provider, is device name and port # For uDAPL ucm provider, is device name and port # For uDAPL iWARP provider, is netdev device name and 0 # For uDAPL iWARP provider, is netdev device name and 0 # For uDAPL RoCE provider, is device name and 0 # ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "ib0 0" "" ofa-v2-ib1 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "ib1 0" "" ofa-v2-mthca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mthca0 1" "" ofa-v2-mthca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mthca0 2" "" ofa-v2-ipath0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ipath0 1" "" ofa-v2-ipath0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ipath0 2" "" ofa-v2-ehca0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ehca0 1" "" ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mthca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mthca0 1" "" ofa-v2-mthca0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mthca0 2" "" ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" "" ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-scm-roe-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mcm-1 u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mcm-2 u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-scif0 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "scif0 1" "" ofa-v2-scif0-u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "scif0 1" "" ofa-v2-mic0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "mic0:ib 1" "" ofa-v2-mlx4_0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mlx4_1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx4_1-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx4_0-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mlx4_1-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-mlx4_1-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx4_1 2" "" ofa-v2-mlx5_0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-mlx5_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-mlx5_0-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_0 1" "" ofa-v2-mlx5_0-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_0 2" "" ofa-v2-mlx5_1-1m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_1 1" "" ofa-v2-mlx5_1-2m u2.0 nonthreadsafe default libdaplomcm.so.2 dapl.2.0 "mlx5_1 2" "" ofa-v2-qib0-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib0 1" "" ofa-v2-qib0-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib0 2" "" ofa-v2-qib1-1s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib1 1" "" ofa-v2-qib1-2s u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "qib1 2" "" dapl-2.1.5/doc/mpxyd.conf000066400000000000000000000125571255317474200152400ustar00rootroot00000000000000# MIC SCIF/DAPL RDMA proxy server configuration file # # Entry format is: # name value # log_file: # Specifies the location of the MPXYD service output. The log file is used to # assist with MPXYD service debugging and troubleshooting. The log_file can # be set to 'stdout', 'stderr', or the name of a file. # Examples: # log_file stdout # log_file stderr # log_file /var/log/mpxyd.log log_file /var/log/mpxyd.log # log_level: # Indicates the amount of detailed data written to the log file. Log levels # are bit mapped as follow: 0xf for full verbose # 0x0 - errors always reported # 0x1 - warnings # 0x2 - cm operations # 0x4 - data operations # 0x8 - info # 0x10 - perf # 0x20 - threads # 0x40 - verbose log_level 0 # lock_file: # Specifies the location of the MPXYD lock file used to ensure that only a # single instance of MPXYD is running. lock_file /var/run/mpxyd.pid # scif_port_id: # SCIF port number that the server listens on. # If this value is changed, then a corresponding change is required for # client MIC DAPL provider. Default is SCIF_OFED_PORT_8 (i.e. 68) scif_port_id 68 # scif_listen_qlen: # The queue length for the server side scif_listen() call. It affects how # many clients can connect to the server simultaneously. Default is 240. scif_listen_qlen 240 # mcm_affinity: # Specifies CPU affinity and binding level used for mpxyd threads # If 0, normal O/S scheduling is used for all threads. # If 1, CPU affinity is set for OP,CM,TX and RX threads, multi core binding. # If 2, CPU affinity is set for OP,CM,TX and RX threads, single core binding. # # Note: mcm_affinity = 2, best performance, op thread continously polls # when devices are active/open. # # The default is 1 mcm_affinity 1 # mcm_affinity_base_mic: # Specifies a hard binding for CPU id base value used for affinity support of # mpxyd data proxy threads. Default = 0, which specifies use of # dynamic affinity binding based on adapter locality. For specific bindings, # set to CPU id value desired. For example, mcm_affinity_base_mic = 8, # would bind proxy threads across CPU 8,9,10, and 11 # # NOTE: if mcm_affinity = 2, mcm_affinity_base_mic specifies single core # id for ALL threads across all MIC adapters. If specifying a single core_id it # is best to specify a CPU located in the remote socket, away from IB adapter. # If mcm_affinity = 2 && mcm_affinity_base_mic = 0, then a single core per MIC adapter # is configured based on locality of MIC adapter. See mpxyd.log for resulting bindings. # # The default is 0 (best performance) mcm_affinity_base_mic 0 # mcm_depth: # Specifies the number of request queue entries available for CM messages. # A larger depth consumes more system resources, 256 * mcm_depth * ib devices mcm_depth 500 # mcm_rw_signal_rate: # mcm_rr_signal_rate: # mcm_rr_max_pending: # Specifies the number of RDMA write/read segments posted before signaling for completions. # Larger the value reduces interrupts but could increase reserve times on buffer resources. # Default = 1 for signaling, 40 for RDMA READ's outstanding mcm_rw_signal_rate 1 mcm_rr_signal_rate 1 mcm_rr_max_pending 40 # max_message_mb: # Specifies the maximum message size. The default is 16 (MB). max_message_mb 16 # buffer_pool_shared: # Specifies if the pre-allocated and pinned buffer is shared between # connections from the same client, or is private to each connection. buffer_pool_shared 1 # buffer_pool_mb: # Specifies the amount of memory pre-allocated and pinned for SCIF to uDAPL # RDMA proxy services. Per client or per connection depending on the setting # of "buffer_pool_shared". Recommend to increase the size if shared. buffer_pool_mb 32 # buffer_segment_size: # Specifies the segment size of large DMA transfers. Default is 128KB. # The size must be a multiple of 4096. buffer_segment_size 131072 # buffer_alignment: # Specifies the alignment of the RDMA buffer. Default is 64 bytes. buffer_alignment 64 # buffer_inline_threshold: # Specifies the max IO size for scif_recv inline before switch # to scif_readfrom DMA. Default is 256 bytes. buffer_inline_threshold 256 # proxy_tx_depth: # Specifies the work request queue depth for the outbound proxy service # Default is 1024 work requests. proxy_tx_depth 512 # proxy_rx_depth: # Specifies the work request queue depth for the outbound proxy service # Default is 1024 work requests. proxy_rx_depth 512 # CM connect request timeout ms: # Specifies the amout of time a request waits for reply before retry. # Default is 2000 ms mcm_req_timeout_ms 4000 # CM connect reply timeout ms: # Specifies the amout of time a reply waits for RTU before retry. # Default is 1000 ms mcm_rep_timeout_ms 2000 # CM retry count # Specifies the amount of retries for CM messages expecting replies. # Default is 10. mcm_retry_count 10 # mcm_perf_profile: # 1 or 0, specifies if performance profiling is enabled/disabled for RDMA operations # Default is 0, disabled # mcm_perf_profile 0 # mcm_eager_completion: # complete and signal write request after scif_readfrom has moved all data, otherwise wait for IB completions. # Default is enabled. mcm_eager_completion 1 # mcm_counters # log and print device CM, DTO, and event counters. Output any non-zero results at device close. # Default is disabled. mcm_counters 0 # mcm_proxy_in # Override for proxy-in services. If disabled, mpxyd will fallback to previous version of proxy-out only. # Default is enabled. mcm_proxy_in 1 dapl-2.1.5/m4/000077500000000000000000000000001255317474200127715ustar00rootroot00000000000000dapl-2.1.5/m4/libtool.m4000066400000000000000000010572161255317474200147130ustar00rootroot00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS dapl-2.1.5/m4/ltoptions.m4000066400000000000000000000300731255317474200152710ustar00rootroot00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) dapl-2.1.5/m4/ltsugar.m4000066400000000000000000000104241255317474200147150ustar00rootroot00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) dapl-2.1.5/m4/ltversion.m4000066400000000000000000000012621255317474200152610ustar00rootroot00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) dapl-2.1.5/m4/lt~obsolete.m4000066400000000000000000000137561255317474200156210ustar00rootroot00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) dapl-2.1.5/man/000077500000000000000000000000001255317474200132245ustar00rootroot00000000000000dapl-2.1.5/man/dapltest.1000066400000000000000000000300111255317474200151210ustar00rootroot00000000000000." Text automatically generated by txt2man .TH dapltest 1 "July 16, 2013" "uDAPL 2.0" "USER COMMANDS" .SH NAME \fB \fBdapltest \fP- test for the Direct Access Programming Library (DAPL) \fB .SH DESCRIPTION Dapltest is a set of tests developed to exercise, characterize, and verify the DAPL interfaces during development and porting. At least two instantiations of the test must be run. One acts as the server, fielding requests and spawning server-side test threads as needed. Other client invocations connect to the server and issue test requests. The server side of the test, once invoked, listens continuously for client connection requests, until quit or killed. Upon receipt of a connection request, the connection is established, the server and client sides swap version numbers to verify that they are able to communicate, and the client sends the test request to the server. If the version numbers match, and the test request is well-formed, the server spawns the threads needed to run the test before awaiting further connections. .SH USAGE dapltest [ -f script_file_name ] [ -T S|Q|T|P|L ] [ -D device_name ] [-n port_number] [ -d ] [ -R HT|LL|EC|PM|BE ] .PP With no arguments, dapltest runs as a server using default values, and loops accepting requests from clients. The -f option allows all arguments to be placed in a file, to ease test automation. The following arguments are common to all tests: .TP .B [ -T S|Q|T|P|L ] Test function to be performed: .RS .TP .B S - server loop .TP .B Q - quit, client requests that server wait for any outstanding tests to complete, then clean up and exit .TP .B T - transaction test, transfers data between client and server .TP .B P - performance test, times DTO operations .TP .B L - limit test, exhausts various resources, runs in client w/o server interaction Default: S .RE .TP .B [ -D device_name ] Specifies the interface adapter name as documented in the /etc/dat.conf static configuration file. This name corresponds to the provider library to open. Default: none .TP .B [ -n server_port_number] Specifies the starting server port for all tests. Default: 45278 .TP .B [ -d ] Enables extra debug verbosity, primarily tracing of the various DAPL operations as they progress. Repeating this parameter increases debug spew. Errors encountered result in the test spewing some explanatory text and stopping; this flag provides more detail about what lead up to the error. Default: zero .TP .B [ -R BE ] Indicate the quality of service (QoS) desired. Choices are: .RS .TP .B HT - high throughput .TP .B LL - low latency .TP .B EC - economy (neither HT nor LL) .TP .B PM - premium .TP .B BE - best effort Default: BE .RE .RE .PP .B Usage - Quit test client .PP .nf .fam C dapltest [Common_Args] [ -s server_name ] Quit testing (-T Q) connects to the server to ask it to clean up and exit (after it waits for any outstanding test runs to complete). In addition to being more polite than simply killing the server, this test exercises the DAPL object teardown code paths. There is only one argument other than those supported by all tests: -s server_name Specifies the name of the server interface. No default. .fam T .fi .B Usage - Transaction test client .PP .nf .fam C dapltest [Common_Args] [ -s server_name ] [ -t threads ] [ -w endpoints ] [ -i iterations ] [ -Q ] [ -V ] [ -P ] OPclient OPserver [ op3, Transaction testing (-T T) transfers a variable amount of data between client and server. The data transfer can be described as a sequence of individual operations; that entire sequence is transferred 'iterations' times by each thread over all of its endpoint(s). The following parameters determine the behavior of the transaction test: -s server_name Specifies the name or IP address of the server interface. No default. [ -t threads ] Specify the number of threads to be used. Default: 1 [ -w endpoints ] Specify the number of connected endpoints per thread. Default: 1 [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -Q ] Funnel completion events into a CNO. Default: use EVDs [ -V ] Validate the data being transferred. Default: ignore the data [ -P ] Turn on DTO completion polling Default: off OP1 OP2 [ OP3, \.\.\. ] A single transaction (OPx) consists of: server|client Indicates who initiates the data transfer. SR|RR|RW Indicates the type of transfer: SR send/recv RR RDMA read RW RDMA write Defaults: none [ seg_size [ num_segs ] ] Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) [ -f ] For SR transfers only, indicates that a client's send transfer completion should be reaped when the next recv completion is reaped. Sends and receives must be paired (one client, one server, and in that order) for this option to be used. Restrictions: Due to the flow control algorithm used by the transaction test, there must be at least one SR OP for both the client and the server. Requesting data validation (-V) causes the test to automatically append three OPs to those specified. These additional operations provide synchronization points during each iteration, at which all user-specified transaction buffers are checked. These three appended operations satisfy the "one SR in each direction" requirement. The transaction OP list is printed out if -d is supplied. .fam T .fi .B Usage - Performance test client .PP .nf .fam C dapltest [Common_Args] -s server_name [ -m p|b ] [ -i iterations ] [ -p pipeline ] OP Performance testing (-T P) times the transfer of an operation. The operation is posted 'iterations' times. The following parameters determine the behavior of the transaction test: -s server_name Specifies the name or IP address of the server interface. No default. -m b|p Used to choose either blocking (b) or polling (p) Default: blocking (b) [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -p pipeline ] Specify the pipline length, valid arguments are in the range [0,MAX_SEND_DTOS]. If a value greater than MAX_SEND_DTOS is requested the value will be adjusted down to MAX_SEND_DTOS. Default: MAX_SEND_DTOS OP Specifies the operation as follow: RR|RW Indicates the type of transfer: RR RDMA read RW RDMA write Defaults: none [ seg_size [ num_segs ] ] Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) .fam T .RE .RE .PP .B Usage - Limit test client .PP .nf .fam C Limit testing (-T L) neither requires nor connects to any server instance. The client runs one or more tests which attempt to exhaust various resources to determine DAPL limits and exercise DAPL error paths. If no arguments are given, all tests are run. Limit testing creates the sequence of DAT objects needed to move data back and forth, attempting to find the limits supported for the DAPL object requested. For example, if the LMR creation limit is being examined, the test will create a set of {IA, PZ, CNO, EVD, EP} before trying to run dat_lmr_create() to failure using that set of DAPL objects. The 'width' parameter can be used to control how many of these parallel DAPL object sets are created before beating upon the requested constructor. Use of -m limits the number of dat_*_create() calls that will be attempted, which can be helpful if the DAPL in use supports essentailly unlimited numbers of some objects. The limit test arguments are: [ -m maximum ] Specify the maximum number of dapl_*_create() attempts. Default: run to object creation failure [ -w width ] Specify the number of DAPL object sets to create while initializing. Default: 1 [ limit_ia ] Attempt to exhaust dat_ia_open() [ limit_pz ] Attempt to exhaust dat_pz_create() [ limit_cno ] Attempt to exhaust dat_cno_create() [ limit_evd ] Attempt to exhaust dat_evd_create() [ limit_ep ] Attempt to exhaust dat_ep_create() [ limit_rsp ] Attempt to exhaust dat_rsp_create() [ limit_psp ] Attempt to exhaust dat_psp_create() [ limit_lmr ] Attempt to exhaust dat_lmr_create(4KB) [ limit_rpost ] Attempt to exhaust dat_ep_post_recv(4KB) [ limit_size_lmr ] Probe maximum size dat_lmr_create() .nf .fam C Default: run all tests .fam T .fi .SH EXAMPLES dapltest -T S -d -D OpenIB-cma -n 53000 .PP .nf .fam C Starts a server process with debug verbosity, on server port 53000. .fam T .fi dapltest -T T -d -s host1-ib0 -D OpenIB-cma -n 53000 -i 100 client SR 4096 2 server SR 4096 2 .PP .nf .fam C Runs a transaction test, with both sides sending one buffer with two 4KB segments, one hundred times. To server host1-ib0 on port 53000 .fam T .fi dapltest -T P -d -s host1-ib0 -D OpenIB-cma -i 100 RW 4096 2 .PP .nf .fam C Runs a performance test, with the client sending one buffer with two 4KB segments, one hundred times. .fam T .fi dapltest -T Q -s host1-ib0 -D OpenIB-cma .PP .nf .fam C Asks the server to clean up and exit. .fam T .fi dapltest -T L -D OpenIB-cma -d -w 16 -m 1000 .PP .nf .fam C Runs all of the limit tests, setting up 16 complete sets of DAPL objects, and creating at most a thousand instances when trying to exhaust resources. .fam T .fi dapltest -T T -V -d -t 2 -w 4 -i 55555 -s linux3 -D OpenIB-cma client RW 4096 1 server RW 2048 4 client SR 1024 4 server SR 4096 2 client SR 1024 3 -f server SR 2048 1 -f .PP .nf .fam C Runs a more complicated transaction test, with two thread using four EPs each, sending a more complicated buffer pattern for a larger number of iterations, validating the data received. .fam T .fi .RE .TP .B BUGS (and To Do List) .PP .nf .fam C Use of CNOs (-Q) is not yet supported. Further limit tests could be added. dapl-2.1.5/man/dat.conf.5000066400000000000000000000137411255317474200150140ustar00rootroot00000000000000.TH "DAT.CONF" "5" "25 March 2008" "" "" .SH NAME dat.conf \- configuration file for static registration of user-level DAT rdma providers .SH "DESCRIPTION" .PP The DAT (direct access transport) architecture supports the use of multiple DAT providers within a single consumer application. Consumers implicitly select a provider using the Interface Adapter name parameter passed to dat_ia_open(). .PP The subsystem that maps Interface Adapter names to provider implementations is known as the DAT registry. When a consumer calls dat_ia_open(), the appropriate provider is found and notified of the consumer's request to access the IA. After this point, all DAT API calls acting on DAT objects are automatically directed to the appropriate provider entry points. .PP A persistent, administratively configurable database is used to store mappings from IA names to provider information. This provider information includes: the file system path to the provider library object, version information, and thread safety information. The location and format of the registry is platform dependent. This database is known as the Static Registry (SR) and is provided via entries in the \fIdat.conf\fR file. The process of adding a provider entry is termed Static Registration. .PP .SH "Registry File Format" \br * All characters after # on a line are ignored (comments). * Lines on which there are no characters other than whitespace and comments are considered blank lines and are ignored. * Non-blank lines must have seven whitespace separated fields. These fields may contain whitespace if the field is quoted with double quotes. Within fields quoated with double quotes, the backslash or qoute are valid escape sequences: * Each non-blank line will contain the following fields: - The IA Name. - The API version of the library: [k|u]major.minor where "major" and "minor" are both integers in decimal format. User-level examples: "u1.2", and "u2.0". - Whether the library is thread-safe: [threadsafe|nonthreadsafe] - Whether this is the default section: [default|nondefault] - The library image, version included, to be loaded. - The vendor id and version of DAPL provider: id.major.minor - ia params, IA specific parameters - device name and port - platform params, (not used) .PP .SH OpenFabrics RDMA providers: \br Provider options for both 1.2 and 2.0, each using different CM services 1. cma - OpenFabrics rdma_cm - uses rdma_cm services for connections - requires IPoIB and SA/SM services for IB - netdev used for device name, without port designation (ia_params) - Supports any transport rdma_cm supports including IB, iWARP, RoCEE - libdaplcma.so (1.2), libdaplofa (2.0) 2. scm - uDAPL socket based CM - exchanges CM information over sockets - eliminates the need for rdma_cm, IPoIB, and SA for IB - verbs device used for device name with port designation (ia_param) - Supports IB, RoCEE. Doesn't support iWARP - libdaplscm.so (1.2), libdaploscm (2.0) 3. ucm - uDAPL unreliable IB CM - exchanges CM information via IB UD QP's - eliminates the need for sockets or rdma_cm - verbs device used for device name with port designation (ia_param) - Supports IB only, no name service. - libdaplucm.so (1.2), libdaploucm (2.0) .PP .SH Example entries for each OpenFabrics provider \br 1. cma - OpenFarbrics rdma_cm (v1.2 and v2.0 examples) OpenIB-cma u1.2 nonthreadsafe default libdaplcma.so.1 dapl.1.2 "ib0 0" "" ofa-v2-ib0 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "ib0 0" "" ofa-v2-iwarp u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-cma-roe-eth2 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth2 0" "" ofa-v2-cma-roe-eth3 u2.0 nonthreadsafe default libdaplofa.so.2 dapl.2.0 "eth3 0" "" NOTE: The OpenFabrics CMA providers use to specify the device with one of the following: network address, network hostname, or netdev name; along with port number. 2. scm - uDAPL socket based CM (v1.2 and v2.0 examples) OpenIB-mlx4_0-1 u1.2 nonthreadsafe default libdaplscm.so.1 dapl.1.2 "mlx4_0 1" "" OpenIB-ipath0-1 u1.2 nonthreadsafe default libdaplscm.so.1 dapl.1.2 "ipath0 1" "" ofa-v2-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-mlx4_1-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_1 1" "" ofa-v2-ehca0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "ehca0 1" "" ofa-v2-scm-roe-mlx4_0-1 u2.0 nonthreadsafe default libdaploscm.so.2 dapl.2.0 "mlx4_0 1" "" 3. ucm - uDAPL unreliable IB CM (not supported in 1.2, v2.0 examples) ofa-v2-mlx4_0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 1" "" ofa-v2-mlx4_0-2u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "mlx4_0 2" "" ofa-v2-ipath0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "ipath0 1" "" ofa-v2-ehca0-1u u2.0 nonthreadsafe default libdaploucm.so.2 dapl.2.0 "ehca0 1" "" Note: OpenIB- and ofa-v2- IA names are unique mappings, reserved for OpenFabrics providers. .PP The default location for this configuration file is /etc/dat.conf. .PP The file location may be overridden with the environment variable DAT_OVERRIDE=/your_own_directory/your_dat.conf. .PP .SH "SEE ALSO" rdma_cm verbs socket .PP dapl-2.1.5/man/dtest.1000077500000000000000000000035421255317474200144400ustar00rootroot00000000000000.TH dtest 1 "February 23, 2007" "uDAPL 1.2" "USER COMMANDS" .SH NAME dtest \- simple uDAPL send/receive and RDMA test .SH SYNOPSIS .B dtest [\-P provider] [\-b buf size] [\-B burst count][\-v] [\-c] [\-p] [\-d]\fB [-s]\fR .B dtest [\-P provider] [\-b buf size] [\-B burst count][\-v] [\-c] [\-p] [\-d]\fB [-h HOSTNAME]\fR .SH DESCRIPTION .PP dtest is a simple test used to exercise and verify the uDAPL interfaces. At least two instantiations of the test must be run. One acts as the server and the other the client. The server side of the test, once invoked listens for connection requests, until timing out or killed. Upon receipt of a cd connection request, the connection is established, the server and client sides exchange information necessary to perform RDMA writes and reads. .SH OPTIONS .PP .TP \fB\-P\fR=\fIPROVIDER\fR use \fIPROVIDER\fR to specify uDAPL interface using /etc/dat.conf (default OpenIB-cma) .TP \fB\-b\fR=\fIBUFFER_SIZE\fR use buffer size \fIBUFFER_SIZE\fR for RDMA(default 64) .TP \fB\-B\fR=\fIBURST_COUNT\fR use busrt count \fIBURST_COUNT\fR for interations (default 10) .TP \fB\-v\fR, verbose output(default off) .TP \fB\-c\fR, use consumer notification events (default off) .TP \fB\-p\fR, use polling (default wait for event) .TP \fB\-d\fR, delay in seconds before close (default off) .TP \fB\-s\fR, run as server (default - run as server) .TP \fB\-h\fR=\fIHOSTNAME\fR use \fIHOSTNAME\fR to specify server hostname or IP address (default - none) .SH EXAMPLES dtest -P OpenIB-cma -v -s .PP .nf .fam C Starts a server process with debug verbosity using provider OpenIB-cma. .fam T .fi dtest -P OpenIB-cma -h server1-ib0 .PP .nf .fam C Starts a client process, using OpenIB-cma provider to connect to hostname server1-ib0. .fam T .SH SEE ALSO .BR dapltest(1) .SH AUTHORS .TP Arlin Davis .RI < ardavis@ichips.intel.com > .SH BUGS dapl-2.1.5/mpxyd.init.in000066400000000000000000000040361255317474200151070ustar00rootroot00000000000000#!/bin/bash # # Bring up/down the mpxyd daemon # # chkconfig: 2345 25 75 # description: Starts/Stops MIC SCIF/DAPL RDMA proxy server # ### BEGIN INIT INFO # Provides: mpxyd # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Required-Start: # Required-Stop: # Should-Start: # Should-Stop: # Short-Description: Starts and stops the MIC SCIF/DAPL RDMA proxy server # Description: The DAPL proxy RDMA server provides a user space implementation # that enables MIC clients to proxy InfiniBand RDMA over to large core resources ### END INIT INFO ulimit -n 16000 prog=mpxyd execpath=@prefix@/sbin/${prog} pidfile=`grep ^lock_file @sysconfdir@/mpxyd.conf | awk '{print $2}'` subsys=/var/lock/subsys/${prog} # Source function library. if [ -f /etc/init.d/functions ]; then # RHEL . /etc/init.d/functions _status='status -p "$pidfile" -l $subsys' _start='daemon --check $prog --pidfile "$pidfile"' _ret='echo; return $RC' elif [ -f /etc/rc.status ]; then # SLES . /etc/rc.status _status=checkproc _start='start_daemon -p "$pidfile"' _ret='rc_status -v' else # other echo "Could not source init function library, exiting" return 1 fi start() { echo -n "Starting mpxyd daemon: " eval $_start $execpath RC=$? [ "$RC" -eq "0" ] && touch $subsys 2>/dev/null eval $_ret } stop() { echo -n "Stopping mpxyd daemon: " killproc -p $pidfile $execpath RC=$? rm -f $subsys eval $_ret } sstatus() { eval $_status $execpath RC=$? eval $_ret } restart () { stop start } condrestart () { [ -e $subsys ] && restart || return 0 } usage () { echo echo "Usage: `basename $0` {start|stop|restart|condrestart|try-restart|force-reload|status}" echo return 2 } case $1 in start) start; RC=$? ;; stop) stop; RC=$? ;; restart) restart; RC=$? ;; reload) RC=3 ;; condrestart) condrestart; RC=$? ;; try-restart) condrestart; RC=$? ;; force-reload) condrestart; RC=$? ;; status) sstatus; RC=$? ;; *) usage; RC=$? ;; esac exit $RC dapl-2.1.5/test/000077500000000000000000000000001255317474200134305ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/000077500000000000000000000000001255317474200152505ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/Makefile.am000077500000000000000000000032121255317474200173050ustar00rootroot00000000000000if EXT_TYPE_IB XFLAGS = -DDAT_EXTENSIONS else XFLAGS = endif AM_CFLAGS = -g -Wall -D_GNU_SOURCE dapltest_CFLAGS = $(AM_FLAGS) $(XFLAGS) INCLUDES = -I include \ -I mdep/linux \ -I $(srcdir)/../../dat/include bin_PROGRAMS = dapltest dapltest_SOURCES = \ cmd/dapl_main.c \ cmd/dapl_params.c \ cmd/dapl_fft_cmd.c \ cmd/dapl_getopt.c \ cmd/dapl_limit_cmd.c \ cmd/dapl_netaddr.c \ cmd/dapl_performance_cmd.c \ cmd/dapl_qos_util.c \ cmd/dapl_quit_cmd.c \ cmd/dapl_server_cmd.c \ cmd/dapl_transaction_cmd.c \ test/dapl_bpool.c \ test/dapl_client.c \ test/dapl_client_info.c \ test/dapl_cnxn.c \ test/dapl_execute.c \ test/dapl_fft_connmgt.c \ test/dapl_fft_endpoint.c \ test/dapl_fft_hwconn.c \ test/dapl_fft_mem.c \ test/dapl_fft_pz.c \ test/dapl_fft_queryinfo.c \ test/dapl_fft_test.c \ test/dapl_fft_util.c \ test/dapl_limit.c \ test/dapl_memlist.c \ test/dapl_performance_client.c \ test/dapl_performance_server.c \ test/dapl_performance_stats.c \ test/dapl_performance_util.c \ test/dapl_quit_util.c \ test/dapl_server.c \ test/dapl_server_info.c \ test/dapl_test_data.c \ test/dapl_test_util.c \ test/dapl_thread.c \ test/dapl_transaction_stats.c \ test/dapl_transaction_test.c \ test/dapl_transaction_util.c \ test/dapl_util.c \ common/dapl_endian.c \ common/dapl_global.c \ common/dapl_performance_cmd_util.c \ common/dapl_quit_cmd_util.c \ common/dapl_transaction_cmd_util.c \ udapl/udapl_tdep.c \ mdep/linux/dapl_mdep_user.c dapltest_LDADD = $(top_builddir)/dat/udat/libdat2.la dapltest_LDFLAGS = -lpthread dapl-2.1.5/test/dapltest/Makefile.in000066400000000000000000003646751255317474200173420ustar00rootroot00000000000000# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = dapltest$(EXEEXT) subdir = test/dapltest DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/config/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_dapltest_OBJECTS = dapltest-dapl_main.$(OBJEXT) \ dapltest-dapl_params.$(OBJEXT) dapltest-dapl_fft_cmd.$(OBJEXT) \ dapltest-dapl_getopt.$(OBJEXT) \ dapltest-dapl_limit_cmd.$(OBJEXT) \ dapltest-dapl_netaddr.$(OBJEXT) \ dapltest-dapl_performance_cmd.$(OBJEXT) \ dapltest-dapl_qos_util.$(OBJEXT) \ dapltest-dapl_quit_cmd.$(OBJEXT) \ dapltest-dapl_server_cmd.$(OBJEXT) \ dapltest-dapl_transaction_cmd.$(OBJEXT) \ dapltest-dapl_bpool.$(OBJEXT) dapltest-dapl_client.$(OBJEXT) \ dapltest-dapl_client_info.$(OBJEXT) \ dapltest-dapl_cnxn.$(OBJEXT) dapltest-dapl_execute.$(OBJEXT) \ dapltest-dapl_fft_connmgt.$(OBJEXT) \ dapltest-dapl_fft_endpoint.$(OBJEXT) \ dapltest-dapl_fft_hwconn.$(OBJEXT) \ dapltest-dapl_fft_mem.$(OBJEXT) dapltest-dapl_fft_pz.$(OBJEXT) \ dapltest-dapl_fft_queryinfo.$(OBJEXT) \ dapltest-dapl_fft_test.$(OBJEXT) \ dapltest-dapl_fft_util.$(OBJEXT) dapltest-dapl_limit.$(OBJEXT) \ dapltest-dapl_memlist.$(OBJEXT) \ dapltest-dapl_performance_client.$(OBJEXT) \ dapltest-dapl_performance_server.$(OBJEXT) \ dapltest-dapl_performance_stats.$(OBJEXT) \ dapltest-dapl_performance_util.$(OBJEXT) \ dapltest-dapl_quit_util.$(OBJEXT) \ dapltest-dapl_server.$(OBJEXT) \ dapltest-dapl_server_info.$(OBJEXT) \ dapltest-dapl_test_data.$(OBJEXT) \ dapltest-dapl_test_util.$(OBJEXT) \ dapltest-dapl_thread.$(OBJEXT) \ dapltest-dapl_transaction_stats.$(OBJEXT) \ dapltest-dapl_transaction_test.$(OBJEXT) \ dapltest-dapl_transaction_util.$(OBJEXT) \ dapltest-dapl_util.$(OBJEXT) dapltest-dapl_endian.$(OBJEXT) \ dapltest-dapl_global.$(OBJEXT) \ dapltest-dapl_performance_cmd_util.$(OBJEXT) \ dapltest-dapl_quit_cmd_util.$(OBJEXT) \ dapltest-dapl_transaction_cmd_util.$(OBJEXT) \ dapltest-udapl_tdep.$(OBJEXT) \ dapltest-dapl_mdep_user.$(OBJEXT) dapltest_OBJECTS = $(am_dapltest_OBJECTS) dapltest_DEPENDENCIES = $(top_builddir)/dat/udat/libdat2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dapltest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dapltest_CFLAGS) \ $(CFLAGS) $(dapltest_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dapltest_SOURCES) DIST_SOURCES = $(dapltest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @EXT_TYPE_IB_FALSE@XFLAGS = @EXT_TYPE_IB_TRUE@XFLAGS = -DDAT_EXTENSIONS AM_CFLAGS = -g -Wall -D_GNU_SOURCE dapltest_CFLAGS = $(AM_FLAGS) $(XFLAGS) INCLUDES = -I include \ -I mdep/linux \ -I $(srcdir)/../../dat/include dapltest_SOURCES = \ cmd/dapl_main.c \ cmd/dapl_params.c \ cmd/dapl_fft_cmd.c \ cmd/dapl_getopt.c \ cmd/dapl_limit_cmd.c \ cmd/dapl_netaddr.c \ cmd/dapl_performance_cmd.c \ cmd/dapl_qos_util.c \ cmd/dapl_quit_cmd.c \ cmd/dapl_server_cmd.c \ cmd/dapl_transaction_cmd.c \ test/dapl_bpool.c \ test/dapl_client.c \ test/dapl_client_info.c \ test/dapl_cnxn.c \ test/dapl_execute.c \ test/dapl_fft_connmgt.c \ test/dapl_fft_endpoint.c \ test/dapl_fft_hwconn.c \ test/dapl_fft_mem.c \ test/dapl_fft_pz.c \ test/dapl_fft_queryinfo.c \ test/dapl_fft_test.c \ test/dapl_fft_util.c \ test/dapl_limit.c \ test/dapl_memlist.c \ test/dapl_performance_client.c \ test/dapl_performance_server.c \ test/dapl_performance_stats.c \ test/dapl_performance_util.c \ test/dapl_quit_util.c \ test/dapl_server.c \ test/dapl_server_info.c \ test/dapl_test_data.c \ test/dapl_test_util.c \ test/dapl_thread.c \ test/dapl_transaction_stats.c \ test/dapl_transaction_test.c \ test/dapl_transaction_util.c \ test/dapl_util.c \ common/dapl_endian.c \ common/dapl_global.c \ common/dapl_performance_cmd_util.c \ common/dapl_quit_cmd_util.c \ common/dapl_transaction_cmd_util.c \ udapl/udapl_tdep.c \ mdep/linux/dapl_mdep_user.c dapltest_LDADD = $(top_builddir)/dat/udat/libdat2.la dapltest_LDFLAGS = -lpthread all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/dapltest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu test/dapltest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list dapltest$(EXEEXT): $(dapltest_OBJECTS) $(dapltest_DEPENDENCIES) $(EXTRA_dapltest_DEPENDENCIES) @rm -f dapltest$(EXEEXT) $(AM_V_CCLD)$(dapltest_LINK) $(dapltest_OBJECTS) $(dapltest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_bpool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_client_info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_cnxn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_endian.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_execute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_connmgt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_endpoint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_hwconn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_pz.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_queryinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_fft_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_global.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_limit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_limit_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_mdep_user.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_memlist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_netaddr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_params.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_cmd_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_performance_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_qos_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_quit_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_quit_cmd_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_quit_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_server_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_server_info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_test_data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_test_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_transaction_cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_transaction_cmd_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_transaction_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_transaction_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_transaction_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-dapl_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dapltest-udapl_tdep.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< dapltest-dapl_main.o: cmd/dapl_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_main.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_main.Tpo -c -o dapltest-dapl_main.o `test -f 'cmd/dapl_main.c' || echo '$(srcdir)/'`cmd/dapl_main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_main.Tpo $(DEPDIR)/dapltest-dapl_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_main.c' object='dapltest-dapl_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_main.o `test -f 'cmd/dapl_main.c' || echo '$(srcdir)/'`cmd/dapl_main.c dapltest-dapl_main.obj: cmd/dapl_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_main.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_main.Tpo -c -o dapltest-dapl_main.obj `if test -f 'cmd/dapl_main.c'; then $(CYGPATH_W) 'cmd/dapl_main.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_main.Tpo $(DEPDIR)/dapltest-dapl_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_main.c' object='dapltest-dapl_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_main.obj `if test -f 'cmd/dapl_main.c'; then $(CYGPATH_W) 'cmd/dapl_main.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_main.c'; fi` dapltest-dapl_params.o: cmd/dapl_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_params.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_params.Tpo -c -o dapltest-dapl_params.o `test -f 'cmd/dapl_params.c' || echo '$(srcdir)/'`cmd/dapl_params.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_params.Tpo $(DEPDIR)/dapltest-dapl_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_params.c' object='dapltest-dapl_params.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_params.o `test -f 'cmd/dapl_params.c' || echo '$(srcdir)/'`cmd/dapl_params.c dapltest-dapl_params.obj: cmd/dapl_params.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_params.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_params.Tpo -c -o dapltest-dapl_params.obj `if test -f 'cmd/dapl_params.c'; then $(CYGPATH_W) 'cmd/dapl_params.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_params.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_params.Tpo $(DEPDIR)/dapltest-dapl_params.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_params.c' object='dapltest-dapl_params.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_params.obj `if test -f 'cmd/dapl_params.c'; then $(CYGPATH_W) 'cmd/dapl_params.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_params.c'; fi` dapltest-dapl_fft_cmd.o: cmd/dapl_fft_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_cmd.Tpo -c -o dapltest-dapl_fft_cmd.o `test -f 'cmd/dapl_fft_cmd.c' || echo '$(srcdir)/'`cmd/dapl_fft_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_cmd.Tpo $(DEPDIR)/dapltest-dapl_fft_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_fft_cmd.c' object='dapltest-dapl_fft_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_cmd.o `test -f 'cmd/dapl_fft_cmd.c' || echo '$(srcdir)/'`cmd/dapl_fft_cmd.c dapltest-dapl_fft_cmd.obj: cmd/dapl_fft_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_cmd.Tpo -c -o dapltest-dapl_fft_cmd.obj `if test -f 'cmd/dapl_fft_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_fft_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_fft_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_cmd.Tpo $(DEPDIR)/dapltest-dapl_fft_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_fft_cmd.c' object='dapltest-dapl_fft_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_cmd.obj `if test -f 'cmd/dapl_fft_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_fft_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_fft_cmd.c'; fi` dapltest-dapl_getopt.o: cmd/dapl_getopt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_getopt.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_getopt.Tpo -c -o dapltest-dapl_getopt.o `test -f 'cmd/dapl_getopt.c' || echo '$(srcdir)/'`cmd/dapl_getopt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_getopt.Tpo $(DEPDIR)/dapltest-dapl_getopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_getopt.c' object='dapltest-dapl_getopt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_getopt.o `test -f 'cmd/dapl_getopt.c' || echo '$(srcdir)/'`cmd/dapl_getopt.c dapltest-dapl_getopt.obj: cmd/dapl_getopt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_getopt.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_getopt.Tpo -c -o dapltest-dapl_getopt.obj `if test -f 'cmd/dapl_getopt.c'; then $(CYGPATH_W) 'cmd/dapl_getopt.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_getopt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_getopt.Tpo $(DEPDIR)/dapltest-dapl_getopt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_getopt.c' object='dapltest-dapl_getopt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_getopt.obj `if test -f 'cmd/dapl_getopt.c'; then $(CYGPATH_W) 'cmd/dapl_getopt.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_getopt.c'; fi` dapltest-dapl_limit_cmd.o: cmd/dapl_limit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_limit_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_limit_cmd.Tpo -c -o dapltest-dapl_limit_cmd.o `test -f 'cmd/dapl_limit_cmd.c' || echo '$(srcdir)/'`cmd/dapl_limit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_limit_cmd.Tpo $(DEPDIR)/dapltest-dapl_limit_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_limit_cmd.c' object='dapltest-dapl_limit_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_limit_cmd.o `test -f 'cmd/dapl_limit_cmd.c' || echo '$(srcdir)/'`cmd/dapl_limit_cmd.c dapltest-dapl_limit_cmd.obj: cmd/dapl_limit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_limit_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_limit_cmd.Tpo -c -o dapltest-dapl_limit_cmd.obj `if test -f 'cmd/dapl_limit_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_limit_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_limit_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_limit_cmd.Tpo $(DEPDIR)/dapltest-dapl_limit_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_limit_cmd.c' object='dapltest-dapl_limit_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_limit_cmd.obj `if test -f 'cmd/dapl_limit_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_limit_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_limit_cmd.c'; fi` dapltest-dapl_netaddr.o: cmd/dapl_netaddr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_netaddr.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_netaddr.Tpo -c -o dapltest-dapl_netaddr.o `test -f 'cmd/dapl_netaddr.c' || echo '$(srcdir)/'`cmd/dapl_netaddr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_netaddr.Tpo $(DEPDIR)/dapltest-dapl_netaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_netaddr.c' object='dapltest-dapl_netaddr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_netaddr.o `test -f 'cmd/dapl_netaddr.c' || echo '$(srcdir)/'`cmd/dapl_netaddr.c dapltest-dapl_netaddr.obj: cmd/dapl_netaddr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_netaddr.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_netaddr.Tpo -c -o dapltest-dapl_netaddr.obj `if test -f 'cmd/dapl_netaddr.c'; then $(CYGPATH_W) 'cmd/dapl_netaddr.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_netaddr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_netaddr.Tpo $(DEPDIR)/dapltest-dapl_netaddr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_netaddr.c' object='dapltest-dapl_netaddr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_netaddr.obj `if test -f 'cmd/dapl_netaddr.c'; then $(CYGPATH_W) 'cmd/dapl_netaddr.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_netaddr.c'; fi` dapltest-dapl_performance_cmd.o: cmd/dapl_performance_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_cmd.Tpo -c -o dapltest-dapl_performance_cmd.o `test -f 'cmd/dapl_performance_cmd.c' || echo '$(srcdir)/'`cmd/dapl_performance_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_cmd.Tpo $(DEPDIR)/dapltest-dapl_performance_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_performance_cmd.c' object='dapltest-dapl_performance_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_cmd.o `test -f 'cmd/dapl_performance_cmd.c' || echo '$(srcdir)/'`cmd/dapl_performance_cmd.c dapltest-dapl_performance_cmd.obj: cmd/dapl_performance_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_cmd.Tpo -c -o dapltest-dapl_performance_cmd.obj `if test -f 'cmd/dapl_performance_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_performance_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_performance_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_cmd.Tpo $(DEPDIR)/dapltest-dapl_performance_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_performance_cmd.c' object='dapltest-dapl_performance_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_cmd.obj `if test -f 'cmd/dapl_performance_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_performance_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_performance_cmd.c'; fi` dapltest-dapl_qos_util.o: cmd/dapl_qos_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_qos_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_qos_util.Tpo -c -o dapltest-dapl_qos_util.o `test -f 'cmd/dapl_qos_util.c' || echo '$(srcdir)/'`cmd/dapl_qos_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_qos_util.Tpo $(DEPDIR)/dapltest-dapl_qos_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_qos_util.c' object='dapltest-dapl_qos_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_qos_util.o `test -f 'cmd/dapl_qos_util.c' || echo '$(srcdir)/'`cmd/dapl_qos_util.c dapltest-dapl_qos_util.obj: cmd/dapl_qos_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_qos_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_qos_util.Tpo -c -o dapltest-dapl_qos_util.obj `if test -f 'cmd/dapl_qos_util.c'; then $(CYGPATH_W) 'cmd/dapl_qos_util.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_qos_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_qos_util.Tpo $(DEPDIR)/dapltest-dapl_qos_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_qos_util.c' object='dapltest-dapl_qos_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_qos_util.obj `if test -f 'cmd/dapl_qos_util.c'; then $(CYGPATH_W) 'cmd/dapl_qos_util.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_qos_util.c'; fi` dapltest-dapl_quit_cmd.o: cmd/dapl_quit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_cmd.Tpo -c -o dapltest-dapl_quit_cmd.o `test -f 'cmd/dapl_quit_cmd.c' || echo '$(srcdir)/'`cmd/dapl_quit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_cmd.Tpo $(DEPDIR)/dapltest-dapl_quit_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_quit_cmd.c' object='dapltest-dapl_quit_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_cmd.o `test -f 'cmd/dapl_quit_cmd.c' || echo '$(srcdir)/'`cmd/dapl_quit_cmd.c dapltest-dapl_quit_cmd.obj: cmd/dapl_quit_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_cmd.Tpo -c -o dapltest-dapl_quit_cmd.obj `if test -f 'cmd/dapl_quit_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_quit_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_quit_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_cmd.Tpo $(DEPDIR)/dapltest-dapl_quit_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_quit_cmd.c' object='dapltest-dapl_quit_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_cmd.obj `if test -f 'cmd/dapl_quit_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_quit_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_quit_cmd.c'; fi` dapltest-dapl_server_cmd.o: cmd/dapl_server_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_server_cmd.Tpo -c -o dapltest-dapl_server_cmd.o `test -f 'cmd/dapl_server_cmd.c' || echo '$(srcdir)/'`cmd/dapl_server_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server_cmd.Tpo $(DEPDIR)/dapltest-dapl_server_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_server_cmd.c' object='dapltest-dapl_server_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server_cmd.o `test -f 'cmd/dapl_server_cmd.c' || echo '$(srcdir)/'`cmd/dapl_server_cmd.c dapltest-dapl_server_cmd.obj: cmd/dapl_server_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_server_cmd.Tpo -c -o dapltest-dapl_server_cmd.obj `if test -f 'cmd/dapl_server_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_server_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_server_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server_cmd.Tpo $(DEPDIR)/dapltest-dapl_server_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_server_cmd.c' object='dapltest-dapl_server_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server_cmd.obj `if test -f 'cmd/dapl_server_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_server_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_server_cmd.c'; fi` dapltest-dapl_transaction_cmd.o: cmd/dapl_transaction_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_cmd.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_cmd.Tpo -c -o dapltest-dapl_transaction_cmd.o `test -f 'cmd/dapl_transaction_cmd.c' || echo '$(srcdir)/'`cmd/dapl_transaction_cmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_cmd.Tpo $(DEPDIR)/dapltest-dapl_transaction_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_transaction_cmd.c' object='dapltest-dapl_transaction_cmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_cmd.o `test -f 'cmd/dapl_transaction_cmd.c' || echo '$(srcdir)/'`cmd/dapl_transaction_cmd.c dapltest-dapl_transaction_cmd.obj: cmd/dapl_transaction_cmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_cmd.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_cmd.Tpo -c -o dapltest-dapl_transaction_cmd.obj `if test -f 'cmd/dapl_transaction_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_transaction_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_transaction_cmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_cmd.Tpo $(DEPDIR)/dapltest-dapl_transaction_cmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmd/dapl_transaction_cmd.c' object='dapltest-dapl_transaction_cmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_cmd.obj `if test -f 'cmd/dapl_transaction_cmd.c'; then $(CYGPATH_W) 'cmd/dapl_transaction_cmd.c'; else $(CYGPATH_W) '$(srcdir)/cmd/dapl_transaction_cmd.c'; fi` dapltest-dapl_bpool.o: test/dapl_bpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_bpool.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_bpool.Tpo -c -o dapltest-dapl_bpool.o `test -f 'test/dapl_bpool.c' || echo '$(srcdir)/'`test/dapl_bpool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_bpool.Tpo $(DEPDIR)/dapltest-dapl_bpool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_bpool.c' object='dapltest-dapl_bpool.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_bpool.o `test -f 'test/dapl_bpool.c' || echo '$(srcdir)/'`test/dapl_bpool.c dapltest-dapl_bpool.obj: test/dapl_bpool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_bpool.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_bpool.Tpo -c -o dapltest-dapl_bpool.obj `if test -f 'test/dapl_bpool.c'; then $(CYGPATH_W) 'test/dapl_bpool.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_bpool.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_bpool.Tpo $(DEPDIR)/dapltest-dapl_bpool.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_bpool.c' object='dapltest-dapl_bpool.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_bpool.obj `if test -f 'test/dapl_bpool.c'; then $(CYGPATH_W) 'test/dapl_bpool.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_bpool.c'; fi` dapltest-dapl_client.o: test/dapl_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_client.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_client.Tpo -c -o dapltest-dapl_client.o `test -f 'test/dapl_client.c' || echo '$(srcdir)/'`test/dapl_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_client.Tpo $(DEPDIR)/dapltest-dapl_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_client.c' object='dapltest-dapl_client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_client.o `test -f 'test/dapl_client.c' || echo '$(srcdir)/'`test/dapl_client.c dapltest-dapl_client.obj: test/dapl_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_client.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_client.Tpo -c -o dapltest-dapl_client.obj `if test -f 'test/dapl_client.c'; then $(CYGPATH_W) 'test/dapl_client.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_client.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_client.Tpo $(DEPDIR)/dapltest-dapl_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_client.c' object='dapltest-dapl_client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_client.obj `if test -f 'test/dapl_client.c'; then $(CYGPATH_W) 'test/dapl_client.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_client.c'; fi` dapltest-dapl_client_info.o: test/dapl_client_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_client_info.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_client_info.Tpo -c -o dapltest-dapl_client_info.o `test -f 'test/dapl_client_info.c' || echo '$(srcdir)/'`test/dapl_client_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_client_info.Tpo $(DEPDIR)/dapltest-dapl_client_info.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_client_info.c' object='dapltest-dapl_client_info.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_client_info.o `test -f 'test/dapl_client_info.c' || echo '$(srcdir)/'`test/dapl_client_info.c dapltest-dapl_client_info.obj: test/dapl_client_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_client_info.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_client_info.Tpo -c -o dapltest-dapl_client_info.obj `if test -f 'test/dapl_client_info.c'; then $(CYGPATH_W) 'test/dapl_client_info.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_client_info.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_client_info.Tpo $(DEPDIR)/dapltest-dapl_client_info.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_client_info.c' object='dapltest-dapl_client_info.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_client_info.obj `if test -f 'test/dapl_client_info.c'; then $(CYGPATH_W) 'test/dapl_client_info.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_client_info.c'; fi` dapltest-dapl_cnxn.o: test/dapl_cnxn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_cnxn.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_cnxn.Tpo -c -o dapltest-dapl_cnxn.o `test -f 'test/dapl_cnxn.c' || echo '$(srcdir)/'`test/dapl_cnxn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_cnxn.Tpo $(DEPDIR)/dapltest-dapl_cnxn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_cnxn.c' object='dapltest-dapl_cnxn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_cnxn.o `test -f 'test/dapl_cnxn.c' || echo '$(srcdir)/'`test/dapl_cnxn.c dapltest-dapl_cnxn.obj: test/dapl_cnxn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_cnxn.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_cnxn.Tpo -c -o dapltest-dapl_cnxn.obj `if test -f 'test/dapl_cnxn.c'; then $(CYGPATH_W) 'test/dapl_cnxn.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_cnxn.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_cnxn.Tpo $(DEPDIR)/dapltest-dapl_cnxn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_cnxn.c' object='dapltest-dapl_cnxn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_cnxn.obj `if test -f 'test/dapl_cnxn.c'; then $(CYGPATH_W) 'test/dapl_cnxn.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_cnxn.c'; fi` dapltest-dapl_execute.o: test/dapl_execute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_execute.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_execute.Tpo -c -o dapltest-dapl_execute.o `test -f 'test/dapl_execute.c' || echo '$(srcdir)/'`test/dapl_execute.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_execute.Tpo $(DEPDIR)/dapltest-dapl_execute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_execute.c' object='dapltest-dapl_execute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_execute.o `test -f 'test/dapl_execute.c' || echo '$(srcdir)/'`test/dapl_execute.c dapltest-dapl_execute.obj: test/dapl_execute.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_execute.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_execute.Tpo -c -o dapltest-dapl_execute.obj `if test -f 'test/dapl_execute.c'; then $(CYGPATH_W) 'test/dapl_execute.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_execute.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_execute.Tpo $(DEPDIR)/dapltest-dapl_execute.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_execute.c' object='dapltest-dapl_execute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_execute.obj `if test -f 'test/dapl_execute.c'; then $(CYGPATH_W) 'test/dapl_execute.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_execute.c'; fi` dapltest-dapl_fft_connmgt.o: test/dapl_fft_connmgt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_connmgt.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_connmgt.Tpo -c -o dapltest-dapl_fft_connmgt.o `test -f 'test/dapl_fft_connmgt.c' || echo '$(srcdir)/'`test/dapl_fft_connmgt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_connmgt.Tpo $(DEPDIR)/dapltest-dapl_fft_connmgt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_connmgt.c' object='dapltest-dapl_fft_connmgt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_connmgt.o `test -f 'test/dapl_fft_connmgt.c' || echo '$(srcdir)/'`test/dapl_fft_connmgt.c dapltest-dapl_fft_connmgt.obj: test/dapl_fft_connmgt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_connmgt.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_connmgt.Tpo -c -o dapltest-dapl_fft_connmgt.obj `if test -f 'test/dapl_fft_connmgt.c'; then $(CYGPATH_W) 'test/dapl_fft_connmgt.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_connmgt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_connmgt.Tpo $(DEPDIR)/dapltest-dapl_fft_connmgt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_connmgt.c' object='dapltest-dapl_fft_connmgt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_connmgt.obj `if test -f 'test/dapl_fft_connmgt.c'; then $(CYGPATH_W) 'test/dapl_fft_connmgt.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_connmgt.c'; fi` dapltest-dapl_fft_endpoint.o: test/dapl_fft_endpoint.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_endpoint.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_endpoint.Tpo -c -o dapltest-dapl_fft_endpoint.o `test -f 'test/dapl_fft_endpoint.c' || echo '$(srcdir)/'`test/dapl_fft_endpoint.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_endpoint.Tpo $(DEPDIR)/dapltest-dapl_fft_endpoint.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_endpoint.c' object='dapltest-dapl_fft_endpoint.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_endpoint.o `test -f 'test/dapl_fft_endpoint.c' || echo '$(srcdir)/'`test/dapl_fft_endpoint.c dapltest-dapl_fft_endpoint.obj: test/dapl_fft_endpoint.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_endpoint.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_endpoint.Tpo -c -o dapltest-dapl_fft_endpoint.obj `if test -f 'test/dapl_fft_endpoint.c'; then $(CYGPATH_W) 'test/dapl_fft_endpoint.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_endpoint.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_endpoint.Tpo $(DEPDIR)/dapltest-dapl_fft_endpoint.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_endpoint.c' object='dapltest-dapl_fft_endpoint.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_endpoint.obj `if test -f 'test/dapl_fft_endpoint.c'; then $(CYGPATH_W) 'test/dapl_fft_endpoint.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_endpoint.c'; fi` dapltest-dapl_fft_hwconn.o: test/dapl_fft_hwconn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_hwconn.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_hwconn.Tpo -c -o dapltest-dapl_fft_hwconn.o `test -f 'test/dapl_fft_hwconn.c' || echo '$(srcdir)/'`test/dapl_fft_hwconn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_hwconn.Tpo $(DEPDIR)/dapltest-dapl_fft_hwconn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_hwconn.c' object='dapltest-dapl_fft_hwconn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_hwconn.o `test -f 'test/dapl_fft_hwconn.c' || echo '$(srcdir)/'`test/dapl_fft_hwconn.c dapltest-dapl_fft_hwconn.obj: test/dapl_fft_hwconn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_hwconn.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_hwconn.Tpo -c -o dapltest-dapl_fft_hwconn.obj `if test -f 'test/dapl_fft_hwconn.c'; then $(CYGPATH_W) 'test/dapl_fft_hwconn.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_hwconn.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_hwconn.Tpo $(DEPDIR)/dapltest-dapl_fft_hwconn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_hwconn.c' object='dapltest-dapl_fft_hwconn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_hwconn.obj `if test -f 'test/dapl_fft_hwconn.c'; then $(CYGPATH_W) 'test/dapl_fft_hwconn.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_hwconn.c'; fi` dapltest-dapl_fft_mem.o: test/dapl_fft_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_mem.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_mem.Tpo -c -o dapltest-dapl_fft_mem.o `test -f 'test/dapl_fft_mem.c' || echo '$(srcdir)/'`test/dapl_fft_mem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_mem.Tpo $(DEPDIR)/dapltest-dapl_fft_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_mem.c' object='dapltest-dapl_fft_mem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_mem.o `test -f 'test/dapl_fft_mem.c' || echo '$(srcdir)/'`test/dapl_fft_mem.c dapltest-dapl_fft_mem.obj: test/dapl_fft_mem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_mem.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_mem.Tpo -c -o dapltest-dapl_fft_mem.obj `if test -f 'test/dapl_fft_mem.c'; then $(CYGPATH_W) 'test/dapl_fft_mem.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_mem.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_mem.Tpo $(DEPDIR)/dapltest-dapl_fft_mem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_mem.c' object='dapltest-dapl_fft_mem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_mem.obj `if test -f 'test/dapl_fft_mem.c'; then $(CYGPATH_W) 'test/dapl_fft_mem.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_mem.c'; fi` dapltest-dapl_fft_pz.o: test/dapl_fft_pz.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_pz.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_pz.Tpo -c -o dapltest-dapl_fft_pz.o `test -f 'test/dapl_fft_pz.c' || echo '$(srcdir)/'`test/dapl_fft_pz.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_pz.Tpo $(DEPDIR)/dapltest-dapl_fft_pz.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_pz.c' object='dapltest-dapl_fft_pz.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_pz.o `test -f 'test/dapl_fft_pz.c' || echo '$(srcdir)/'`test/dapl_fft_pz.c dapltest-dapl_fft_pz.obj: test/dapl_fft_pz.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_pz.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_pz.Tpo -c -o dapltest-dapl_fft_pz.obj `if test -f 'test/dapl_fft_pz.c'; then $(CYGPATH_W) 'test/dapl_fft_pz.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_pz.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_pz.Tpo $(DEPDIR)/dapltest-dapl_fft_pz.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_pz.c' object='dapltest-dapl_fft_pz.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_pz.obj `if test -f 'test/dapl_fft_pz.c'; then $(CYGPATH_W) 'test/dapl_fft_pz.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_pz.c'; fi` dapltest-dapl_fft_queryinfo.o: test/dapl_fft_queryinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_queryinfo.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_queryinfo.Tpo -c -o dapltest-dapl_fft_queryinfo.o `test -f 'test/dapl_fft_queryinfo.c' || echo '$(srcdir)/'`test/dapl_fft_queryinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_queryinfo.Tpo $(DEPDIR)/dapltest-dapl_fft_queryinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_queryinfo.c' object='dapltest-dapl_fft_queryinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_queryinfo.o `test -f 'test/dapl_fft_queryinfo.c' || echo '$(srcdir)/'`test/dapl_fft_queryinfo.c dapltest-dapl_fft_queryinfo.obj: test/dapl_fft_queryinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_queryinfo.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_queryinfo.Tpo -c -o dapltest-dapl_fft_queryinfo.obj `if test -f 'test/dapl_fft_queryinfo.c'; then $(CYGPATH_W) 'test/dapl_fft_queryinfo.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_queryinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_queryinfo.Tpo $(DEPDIR)/dapltest-dapl_fft_queryinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_queryinfo.c' object='dapltest-dapl_fft_queryinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_queryinfo.obj `if test -f 'test/dapl_fft_queryinfo.c'; then $(CYGPATH_W) 'test/dapl_fft_queryinfo.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_queryinfo.c'; fi` dapltest-dapl_fft_test.o: test/dapl_fft_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_test.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_test.Tpo -c -o dapltest-dapl_fft_test.o `test -f 'test/dapl_fft_test.c' || echo '$(srcdir)/'`test/dapl_fft_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_test.Tpo $(DEPDIR)/dapltest-dapl_fft_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_test.c' object='dapltest-dapl_fft_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_test.o `test -f 'test/dapl_fft_test.c' || echo '$(srcdir)/'`test/dapl_fft_test.c dapltest-dapl_fft_test.obj: test/dapl_fft_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_test.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_test.Tpo -c -o dapltest-dapl_fft_test.obj `if test -f 'test/dapl_fft_test.c'; then $(CYGPATH_W) 'test/dapl_fft_test.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_test.Tpo $(DEPDIR)/dapltest-dapl_fft_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_test.c' object='dapltest-dapl_fft_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_test.obj `if test -f 'test/dapl_fft_test.c'; then $(CYGPATH_W) 'test/dapl_fft_test.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_test.c'; fi` dapltest-dapl_fft_util.o: test/dapl_fft_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_util.Tpo -c -o dapltest-dapl_fft_util.o `test -f 'test/dapl_fft_util.c' || echo '$(srcdir)/'`test/dapl_fft_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_util.Tpo $(DEPDIR)/dapltest-dapl_fft_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_util.c' object='dapltest-dapl_fft_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_util.o `test -f 'test/dapl_fft_util.c' || echo '$(srcdir)/'`test/dapl_fft_util.c dapltest-dapl_fft_util.obj: test/dapl_fft_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_fft_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_fft_util.Tpo -c -o dapltest-dapl_fft_util.obj `if test -f 'test/dapl_fft_util.c'; then $(CYGPATH_W) 'test/dapl_fft_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_fft_util.Tpo $(DEPDIR)/dapltest-dapl_fft_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_fft_util.c' object='dapltest-dapl_fft_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_fft_util.obj `if test -f 'test/dapl_fft_util.c'; then $(CYGPATH_W) 'test/dapl_fft_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_fft_util.c'; fi` dapltest-dapl_limit.o: test/dapl_limit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_limit.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_limit.Tpo -c -o dapltest-dapl_limit.o `test -f 'test/dapl_limit.c' || echo '$(srcdir)/'`test/dapl_limit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_limit.Tpo $(DEPDIR)/dapltest-dapl_limit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_limit.c' object='dapltest-dapl_limit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_limit.o `test -f 'test/dapl_limit.c' || echo '$(srcdir)/'`test/dapl_limit.c dapltest-dapl_limit.obj: test/dapl_limit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_limit.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_limit.Tpo -c -o dapltest-dapl_limit.obj `if test -f 'test/dapl_limit.c'; then $(CYGPATH_W) 'test/dapl_limit.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_limit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_limit.Tpo $(DEPDIR)/dapltest-dapl_limit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_limit.c' object='dapltest-dapl_limit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_limit.obj `if test -f 'test/dapl_limit.c'; then $(CYGPATH_W) 'test/dapl_limit.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_limit.c'; fi` dapltest-dapl_memlist.o: test/dapl_memlist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_memlist.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_memlist.Tpo -c -o dapltest-dapl_memlist.o `test -f 'test/dapl_memlist.c' || echo '$(srcdir)/'`test/dapl_memlist.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_memlist.Tpo $(DEPDIR)/dapltest-dapl_memlist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_memlist.c' object='dapltest-dapl_memlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_memlist.o `test -f 'test/dapl_memlist.c' || echo '$(srcdir)/'`test/dapl_memlist.c dapltest-dapl_memlist.obj: test/dapl_memlist.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_memlist.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_memlist.Tpo -c -o dapltest-dapl_memlist.obj `if test -f 'test/dapl_memlist.c'; then $(CYGPATH_W) 'test/dapl_memlist.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_memlist.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_memlist.Tpo $(DEPDIR)/dapltest-dapl_memlist.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_memlist.c' object='dapltest-dapl_memlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_memlist.obj `if test -f 'test/dapl_memlist.c'; then $(CYGPATH_W) 'test/dapl_memlist.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_memlist.c'; fi` dapltest-dapl_performance_client.o: test/dapl_performance_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_client.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_client.Tpo -c -o dapltest-dapl_performance_client.o `test -f 'test/dapl_performance_client.c' || echo '$(srcdir)/'`test/dapl_performance_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_client.Tpo $(DEPDIR)/dapltest-dapl_performance_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_client.c' object='dapltest-dapl_performance_client.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_client.o `test -f 'test/dapl_performance_client.c' || echo '$(srcdir)/'`test/dapl_performance_client.c dapltest-dapl_performance_client.obj: test/dapl_performance_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_client.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_client.Tpo -c -o dapltest-dapl_performance_client.obj `if test -f 'test/dapl_performance_client.c'; then $(CYGPATH_W) 'test/dapl_performance_client.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_client.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_client.Tpo $(DEPDIR)/dapltest-dapl_performance_client.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_client.c' object='dapltest-dapl_performance_client.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_client.obj `if test -f 'test/dapl_performance_client.c'; then $(CYGPATH_W) 'test/dapl_performance_client.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_client.c'; fi` dapltest-dapl_performance_server.o: test/dapl_performance_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_server.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_server.Tpo -c -o dapltest-dapl_performance_server.o `test -f 'test/dapl_performance_server.c' || echo '$(srcdir)/'`test/dapl_performance_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_server.Tpo $(DEPDIR)/dapltest-dapl_performance_server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_server.c' object='dapltest-dapl_performance_server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_server.o `test -f 'test/dapl_performance_server.c' || echo '$(srcdir)/'`test/dapl_performance_server.c dapltest-dapl_performance_server.obj: test/dapl_performance_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_server.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_server.Tpo -c -o dapltest-dapl_performance_server.obj `if test -f 'test/dapl_performance_server.c'; then $(CYGPATH_W) 'test/dapl_performance_server.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_server.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_server.Tpo $(DEPDIR)/dapltest-dapl_performance_server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_server.c' object='dapltest-dapl_performance_server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_server.obj `if test -f 'test/dapl_performance_server.c'; then $(CYGPATH_W) 'test/dapl_performance_server.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_server.c'; fi` dapltest-dapl_performance_stats.o: test/dapl_performance_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_stats.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_stats.Tpo -c -o dapltest-dapl_performance_stats.o `test -f 'test/dapl_performance_stats.c' || echo '$(srcdir)/'`test/dapl_performance_stats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_stats.Tpo $(DEPDIR)/dapltest-dapl_performance_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_stats.c' object='dapltest-dapl_performance_stats.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_stats.o `test -f 'test/dapl_performance_stats.c' || echo '$(srcdir)/'`test/dapl_performance_stats.c dapltest-dapl_performance_stats.obj: test/dapl_performance_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_stats.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_stats.Tpo -c -o dapltest-dapl_performance_stats.obj `if test -f 'test/dapl_performance_stats.c'; then $(CYGPATH_W) 'test/dapl_performance_stats.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_stats.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_stats.Tpo $(DEPDIR)/dapltest-dapl_performance_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_stats.c' object='dapltest-dapl_performance_stats.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_stats.obj `if test -f 'test/dapl_performance_stats.c'; then $(CYGPATH_W) 'test/dapl_performance_stats.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_stats.c'; fi` dapltest-dapl_performance_util.o: test/dapl_performance_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_util.Tpo -c -o dapltest-dapl_performance_util.o `test -f 'test/dapl_performance_util.c' || echo '$(srcdir)/'`test/dapl_performance_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_util.Tpo $(DEPDIR)/dapltest-dapl_performance_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_util.c' object='dapltest-dapl_performance_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_util.o `test -f 'test/dapl_performance_util.c' || echo '$(srcdir)/'`test/dapl_performance_util.c dapltest-dapl_performance_util.obj: test/dapl_performance_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_util.Tpo -c -o dapltest-dapl_performance_util.obj `if test -f 'test/dapl_performance_util.c'; then $(CYGPATH_W) 'test/dapl_performance_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_util.Tpo $(DEPDIR)/dapltest-dapl_performance_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_performance_util.c' object='dapltest-dapl_performance_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_util.obj `if test -f 'test/dapl_performance_util.c'; then $(CYGPATH_W) 'test/dapl_performance_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_performance_util.c'; fi` dapltest-dapl_quit_util.o: test/dapl_quit_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_util.Tpo -c -o dapltest-dapl_quit_util.o `test -f 'test/dapl_quit_util.c' || echo '$(srcdir)/'`test/dapl_quit_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_util.Tpo $(DEPDIR)/dapltest-dapl_quit_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_quit_util.c' object='dapltest-dapl_quit_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_util.o `test -f 'test/dapl_quit_util.c' || echo '$(srcdir)/'`test/dapl_quit_util.c dapltest-dapl_quit_util.obj: test/dapl_quit_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_util.Tpo -c -o dapltest-dapl_quit_util.obj `if test -f 'test/dapl_quit_util.c'; then $(CYGPATH_W) 'test/dapl_quit_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_quit_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_util.Tpo $(DEPDIR)/dapltest-dapl_quit_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_quit_util.c' object='dapltest-dapl_quit_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_util.obj `if test -f 'test/dapl_quit_util.c'; then $(CYGPATH_W) 'test/dapl_quit_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_quit_util.c'; fi` dapltest-dapl_server.o: test/dapl_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_server.Tpo -c -o dapltest-dapl_server.o `test -f 'test/dapl_server.c' || echo '$(srcdir)/'`test/dapl_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server.Tpo $(DEPDIR)/dapltest-dapl_server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_server.c' object='dapltest-dapl_server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server.o `test -f 'test/dapl_server.c' || echo '$(srcdir)/'`test/dapl_server.c dapltest-dapl_server.obj: test/dapl_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_server.Tpo -c -o dapltest-dapl_server.obj `if test -f 'test/dapl_server.c'; then $(CYGPATH_W) 'test/dapl_server.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_server.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server.Tpo $(DEPDIR)/dapltest-dapl_server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_server.c' object='dapltest-dapl_server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server.obj `if test -f 'test/dapl_server.c'; then $(CYGPATH_W) 'test/dapl_server.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_server.c'; fi` dapltest-dapl_server_info.o: test/dapl_server_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server_info.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_server_info.Tpo -c -o dapltest-dapl_server_info.o `test -f 'test/dapl_server_info.c' || echo '$(srcdir)/'`test/dapl_server_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server_info.Tpo $(DEPDIR)/dapltest-dapl_server_info.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_server_info.c' object='dapltest-dapl_server_info.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server_info.o `test -f 'test/dapl_server_info.c' || echo '$(srcdir)/'`test/dapl_server_info.c dapltest-dapl_server_info.obj: test/dapl_server_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_server_info.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_server_info.Tpo -c -o dapltest-dapl_server_info.obj `if test -f 'test/dapl_server_info.c'; then $(CYGPATH_W) 'test/dapl_server_info.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_server_info.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_server_info.Tpo $(DEPDIR)/dapltest-dapl_server_info.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_server_info.c' object='dapltest-dapl_server_info.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_server_info.obj `if test -f 'test/dapl_server_info.c'; then $(CYGPATH_W) 'test/dapl_server_info.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_server_info.c'; fi` dapltest-dapl_test_data.o: test/dapl_test_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_test_data.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_test_data.Tpo -c -o dapltest-dapl_test_data.o `test -f 'test/dapl_test_data.c' || echo '$(srcdir)/'`test/dapl_test_data.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_test_data.Tpo $(DEPDIR)/dapltest-dapl_test_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_test_data.c' object='dapltest-dapl_test_data.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_test_data.o `test -f 'test/dapl_test_data.c' || echo '$(srcdir)/'`test/dapl_test_data.c dapltest-dapl_test_data.obj: test/dapl_test_data.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_test_data.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_test_data.Tpo -c -o dapltest-dapl_test_data.obj `if test -f 'test/dapl_test_data.c'; then $(CYGPATH_W) 'test/dapl_test_data.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_test_data.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_test_data.Tpo $(DEPDIR)/dapltest-dapl_test_data.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_test_data.c' object='dapltest-dapl_test_data.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_test_data.obj `if test -f 'test/dapl_test_data.c'; then $(CYGPATH_W) 'test/dapl_test_data.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_test_data.c'; fi` dapltest-dapl_test_util.o: test/dapl_test_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_test_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_test_util.Tpo -c -o dapltest-dapl_test_util.o `test -f 'test/dapl_test_util.c' || echo '$(srcdir)/'`test/dapl_test_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_test_util.Tpo $(DEPDIR)/dapltest-dapl_test_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_test_util.c' object='dapltest-dapl_test_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_test_util.o `test -f 'test/dapl_test_util.c' || echo '$(srcdir)/'`test/dapl_test_util.c dapltest-dapl_test_util.obj: test/dapl_test_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_test_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_test_util.Tpo -c -o dapltest-dapl_test_util.obj `if test -f 'test/dapl_test_util.c'; then $(CYGPATH_W) 'test/dapl_test_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_test_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_test_util.Tpo $(DEPDIR)/dapltest-dapl_test_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_test_util.c' object='dapltest-dapl_test_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_test_util.obj `if test -f 'test/dapl_test_util.c'; then $(CYGPATH_W) 'test/dapl_test_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_test_util.c'; fi` dapltest-dapl_thread.o: test/dapl_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_thread.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_thread.Tpo -c -o dapltest-dapl_thread.o `test -f 'test/dapl_thread.c' || echo '$(srcdir)/'`test/dapl_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_thread.Tpo $(DEPDIR)/dapltest-dapl_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_thread.c' object='dapltest-dapl_thread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_thread.o `test -f 'test/dapl_thread.c' || echo '$(srcdir)/'`test/dapl_thread.c dapltest-dapl_thread.obj: test/dapl_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_thread.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_thread.Tpo -c -o dapltest-dapl_thread.obj `if test -f 'test/dapl_thread.c'; then $(CYGPATH_W) 'test/dapl_thread.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_thread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_thread.Tpo $(DEPDIR)/dapltest-dapl_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_thread.c' object='dapltest-dapl_thread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_thread.obj `if test -f 'test/dapl_thread.c'; then $(CYGPATH_W) 'test/dapl_thread.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_thread.c'; fi` dapltest-dapl_transaction_stats.o: test/dapl_transaction_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_stats.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_stats.Tpo -c -o dapltest-dapl_transaction_stats.o `test -f 'test/dapl_transaction_stats.c' || echo '$(srcdir)/'`test/dapl_transaction_stats.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_stats.Tpo $(DEPDIR)/dapltest-dapl_transaction_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_stats.c' object='dapltest-dapl_transaction_stats.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_stats.o `test -f 'test/dapl_transaction_stats.c' || echo '$(srcdir)/'`test/dapl_transaction_stats.c dapltest-dapl_transaction_stats.obj: test/dapl_transaction_stats.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_stats.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_stats.Tpo -c -o dapltest-dapl_transaction_stats.obj `if test -f 'test/dapl_transaction_stats.c'; then $(CYGPATH_W) 'test/dapl_transaction_stats.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_stats.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_stats.Tpo $(DEPDIR)/dapltest-dapl_transaction_stats.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_stats.c' object='dapltest-dapl_transaction_stats.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_stats.obj `if test -f 'test/dapl_transaction_stats.c'; then $(CYGPATH_W) 'test/dapl_transaction_stats.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_stats.c'; fi` dapltest-dapl_transaction_test.o: test/dapl_transaction_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_test.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_test.Tpo -c -o dapltest-dapl_transaction_test.o `test -f 'test/dapl_transaction_test.c' || echo '$(srcdir)/'`test/dapl_transaction_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_test.Tpo $(DEPDIR)/dapltest-dapl_transaction_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_test.c' object='dapltest-dapl_transaction_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_test.o `test -f 'test/dapl_transaction_test.c' || echo '$(srcdir)/'`test/dapl_transaction_test.c dapltest-dapl_transaction_test.obj: test/dapl_transaction_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_test.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_test.Tpo -c -o dapltest-dapl_transaction_test.obj `if test -f 'test/dapl_transaction_test.c'; then $(CYGPATH_W) 'test/dapl_transaction_test.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_test.Tpo $(DEPDIR)/dapltest-dapl_transaction_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_test.c' object='dapltest-dapl_transaction_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_test.obj `if test -f 'test/dapl_transaction_test.c'; then $(CYGPATH_W) 'test/dapl_transaction_test.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_test.c'; fi` dapltest-dapl_transaction_util.o: test/dapl_transaction_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_util.Tpo -c -o dapltest-dapl_transaction_util.o `test -f 'test/dapl_transaction_util.c' || echo '$(srcdir)/'`test/dapl_transaction_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_util.Tpo $(DEPDIR)/dapltest-dapl_transaction_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_util.c' object='dapltest-dapl_transaction_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_util.o `test -f 'test/dapl_transaction_util.c' || echo '$(srcdir)/'`test/dapl_transaction_util.c dapltest-dapl_transaction_util.obj: test/dapl_transaction_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_util.Tpo -c -o dapltest-dapl_transaction_util.obj `if test -f 'test/dapl_transaction_util.c'; then $(CYGPATH_W) 'test/dapl_transaction_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_util.Tpo $(DEPDIR)/dapltest-dapl_transaction_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_transaction_util.c' object='dapltest-dapl_transaction_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_util.obj `if test -f 'test/dapl_transaction_util.c'; then $(CYGPATH_W) 'test/dapl_transaction_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_transaction_util.c'; fi` dapltest-dapl_util.o: test/dapl_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_util.Tpo -c -o dapltest-dapl_util.o `test -f 'test/dapl_util.c' || echo '$(srcdir)/'`test/dapl_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_util.Tpo $(DEPDIR)/dapltest-dapl_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_util.c' object='dapltest-dapl_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_util.o `test -f 'test/dapl_util.c' || echo '$(srcdir)/'`test/dapl_util.c dapltest-dapl_util.obj: test/dapl_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_util.Tpo -c -o dapltest-dapl_util.obj `if test -f 'test/dapl_util.c'; then $(CYGPATH_W) 'test/dapl_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_util.Tpo $(DEPDIR)/dapltest-dapl_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test/dapl_util.c' object='dapltest-dapl_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_util.obj `if test -f 'test/dapl_util.c'; then $(CYGPATH_W) 'test/dapl_util.c'; else $(CYGPATH_W) '$(srcdir)/test/dapl_util.c'; fi` dapltest-dapl_endian.o: common/dapl_endian.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_endian.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_endian.Tpo -c -o dapltest-dapl_endian.o `test -f 'common/dapl_endian.c' || echo '$(srcdir)/'`common/dapl_endian.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_endian.Tpo $(DEPDIR)/dapltest-dapl_endian.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_endian.c' object='dapltest-dapl_endian.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_endian.o `test -f 'common/dapl_endian.c' || echo '$(srcdir)/'`common/dapl_endian.c dapltest-dapl_endian.obj: common/dapl_endian.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_endian.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_endian.Tpo -c -o dapltest-dapl_endian.obj `if test -f 'common/dapl_endian.c'; then $(CYGPATH_W) 'common/dapl_endian.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_endian.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_endian.Tpo $(DEPDIR)/dapltest-dapl_endian.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_endian.c' object='dapltest-dapl_endian.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_endian.obj `if test -f 'common/dapl_endian.c'; then $(CYGPATH_W) 'common/dapl_endian.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_endian.c'; fi` dapltest-dapl_global.o: common/dapl_global.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_global.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_global.Tpo -c -o dapltest-dapl_global.o `test -f 'common/dapl_global.c' || echo '$(srcdir)/'`common/dapl_global.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_global.Tpo $(DEPDIR)/dapltest-dapl_global.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_global.c' object='dapltest-dapl_global.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_global.o `test -f 'common/dapl_global.c' || echo '$(srcdir)/'`common/dapl_global.c dapltest-dapl_global.obj: common/dapl_global.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_global.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_global.Tpo -c -o dapltest-dapl_global.obj `if test -f 'common/dapl_global.c'; then $(CYGPATH_W) 'common/dapl_global.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_global.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_global.Tpo $(DEPDIR)/dapltest-dapl_global.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_global.c' object='dapltest-dapl_global.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_global.obj `if test -f 'common/dapl_global.c'; then $(CYGPATH_W) 'common/dapl_global.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_global.c'; fi` dapltest-dapl_performance_cmd_util.o: common/dapl_performance_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_cmd_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_cmd_util.Tpo -c -o dapltest-dapl_performance_cmd_util.o `test -f 'common/dapl_performance_cmd_util.c' || echo '$(srcdir)/'`common/dapl_performance_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_performance_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_performance_cmd_util.c' object='dapltest-dapl_performance_cmd_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_cmd_util.o `test -f 'common/dapl_performance_cmd_util.c' || echo '$(srcdir)/'`common/dapl_performance_cmd_util.c dapltest-dapl_performance_cmd_util.obj: common/dapl_performance_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_performance_cmd_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_performance_cmd_util.Tpo -c -o dapltest-dapl_performance_cmd_util.obj `if test -f 'common/dapl_performance_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_performance_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_performance_cmd_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_performance_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_performance_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_performance_cmd_util.c' object='dapltest-dapl_performance_cmd_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_performance_cmd_util.obj `if test -f 'common/dapl_performance_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_performance_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_performance_cmd_util.c'; fi` dapltest-dapl_quit_cmd_util.o: common/dapl_quit_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_cmd_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_cmd_util.Tpo -c -o dapltest-dapl_quit_cmd_util.o `test -f 'common/dapl_quit_cmd_util.c' || echo '$(srcdir)/'`common/dapl_quit_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_quit_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_quit_cmd_util.c' object='dapltest-dapl_quit_cmd_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_cmd_util.o `test -f 'common/dapl_quit_cmd_util.c' || echo '$(srcdir)/'`common/dapl_quit_cmd_util.c dapltest-dapl_quit_cmd_util.obj: common/dapl_quit_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_quit_cmd_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_quit_cmd_util.Tpo -c -o dapltest-dapl_quit_cmd_util.obj `if test -f 'common/dapl_quit_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_quit_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_quit_cmd_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_quit_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_quit_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_quit_cmd_util.c' object='dapltest-dapl_quit_cmd_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_quit_cmd_util.obj `if test -f 'common/dapl_quit_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_quit_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_quit_cmd_util.c'; fi` dapltest-dapl_transaction_cmd_util.o: common/dapl_transaction_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_cmd_util.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Tpo -c -o dapltest-dapl_transaction_cmd_util.o `test -f 'common/dapl_transaction_cmd_util.c' || echo '$(srcdir)/'`common/dapl_transaction_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_transaction_cmd_util.c' object='dapltest-dapl_transaction_cmd_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_cmd_util.o `test -f 'common/dapl_transaction_cmd_util.c' || echo '$(srcdir)/'`common/dapl_transaction_cmd_util.c dapltest-dapl_transaction_cmd_util.obj: common/dapl_transaction_cmd_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_transaction_cmd_util.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Tpo -c -o dapltest-dapl_transaction_cmd_util.obj `if test -f 'common/dapl_transaction_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_transaction_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_transaction_cmd_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Tpo $(DEPDIR)/dapltest-dapl_transaction_cmd_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/dapl_transaction_cmd_util.c' object='dapltest-dapl_transaction_cmd_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_transaction_cmd_util.obj `if test -f 'common/dapl_transaction_cmd_util.c'; then $(CYGPATH_W) 'common/dapl_transaction_cmd_util.c'; else $(CYGPATH_W) '$(srcdir)/common/dapl_transaction_cmd_util.c'; fi` dapltest-udapl_tdep.o: udapl/udapl_tdep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-udapl_tdep.o -MD -MP -MF $(DEPDIR)/dapltest-udapl_tdep.Tpo -c -o dapltest-udapl_tdep.o `test -f 'udapl/udapl_tdep.c' || echo '$(srcdir)/'`udapl/udapl_tdep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-udapl_tdep.Tpo $(DEPDIR)/dapltest-udapl_tdep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='udapl/udapl_tdep.c' object='dapltest-udapl_tdep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-udapl_tdep.o `test -f 'udapl/udapl_tdep.c' || echo '$(srcdir)/'`udapl/udapl_tdep.c dapltest-udapl_tdep.obj: udapl/udapl_tdep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-udapl_tdep.obj -MD -MP -MF $(DEPDIR)/dapltest-udapl_tdep.Tpo -c -o dapltest-udapl_tdep.obj `if test -f 'udapl/udapl_tdep.c'; then $(CYGPATH_W) 'udapl/udapl_tdep.c'; else $(CYGPATH_W) '$(srcdir)/udapl/udapl_tdep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-udapl_tdep.Tpo $(DEPDIR)/dapltest-udapl_tdep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='udapl/udapl_tdep.c' object='dapltest-udapl_tdep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-udapl_tdep.obj `if test -f 'udapl/udapl_tdep.c'; then $(CYGPATH_W) 'udapl/udapl_tdep.c'; else $(CYGPATH_W) '$(srcdir)/udapl/udapl_tdep.c'; fi` dapltest-dapl_mdep_user.o: mdep/linux/dapl_mdep_user.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_mdep_user.o -MD -MP -MF $(DEPDIR)/dapltest-dapl_mdep_user.Tpo -c -o dapltest-dapl_mdep_user.o `test -f 'mdep/linux/dapl_mdep_user.c' || echo '$(srcdir)/'`mdep/linux/dapl_mdep_user.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_mdep_user.Tpo $(DEPDIR)/dapltest-dapl_mdep_user.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mdep/linux/dapl_mdep_user.c' object='dapltest-dapl_mdep_user.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_mdep_user.o `test -f 'mdep/linux/dapl_mdep_user.c' || echo '$(srcdir)/'`mdep/linux/dapl_mdep_user.c dapltest-dapl_mdep_user.obj: mdep/linux/dapl_mdep_user.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -MT dapltest-dapl_mdep_user.obj -MD -MP -MF $(DEPDIR)/dapltest-dapl_mdep_user.Tpo -c -o dapltest-dapl_mdep_user.obj `if test -f 'mdep/linux/dapl_mdep_user.c'; then $(CYGPATH_W) 'mdep/linux/dapl_mdep_user.c'; else $(CYGPATH_W) '$(srcdir)/mdep/linux/dapl_mdep_user.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dapltest-dapl_mdep_user.Tpo $(DEPDIR)/dapltest-dapl_mdep_user.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mdep/linux/dapl_mdep_user.c' object='dapltest-dapl_mdep_user.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dapltest_CFLAGS) $(CFLAGS) -c -o dapltest-dapl_mdep_user.obj `if test -f 'mdep/linux/dapl_mdep_user.c'; then $(CYGPATH_W) 'mdep/linux/dapl_mdep_user.c'; else $(CYGPATH_W) '$(srcdir)/mdep/linux/dapl_mdep_user.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dapl-2.1.5/test/dapltest/README000066400000000000000000000273311255317474200161360ustar00rootroot00000000000000 NAME dapltest - test for the Direct Access Programming Library (DAPL) DESCRIPTION Dapltest is a set of tests developed to exercise, characterize, and verify the DAPL interfaces during development and porting. At least two instantiations of the test must be run. One acts as the server, fielding requests and spawning server-side test threads as needed. Other client invocations connect to the server and issue test requests. The server side of the test, once invoked, listens continuously for client connection requests, until quit or killed. Upon receipt of a connection request, the connection is established, the server and client sides swap version numbers to verify that they are able to communicate, and the client sends the test request to the server. If the version numbers match, and the test request is well-formed, the server spawns the threads needed to run the test before awaiting further connections. USAGE dapltest [ -f script_file_name ] [ -T S|Q|T|P|L ] [ -D device_name ] [ -d ] [ -R HT|LL|EC|PM|BE ] With no arguments, dapltest runs as a server using default values, and loops accepting requests from clients. The -f option allows all arguments to be placed in a file, to ease test automation. The following arguments are common to all tests: [ -T S|Q|T|P|L ] Test function to be performed: S - server loop Q - quit, client requests that server wait for any outstanding tests to complete, then clean up and exit T - transaction test, transfers data between client and server P - performance test, times DTO operations L - limit test, exhausts various resources, runs in client w/o server interaction Default: S [ -D device_name ] Specifies the name of the device (interface adapter). Default: host-specific, look for DT_MdepDeviceName in dapl_mdep.h [ -d ] Enables extra debug verbosity, primarily tracing of the various DAPL operations as they progress. Repeating this parameter increases debug spew. Errors encountered result in the test spewing some explanatory text and stopping; this flag provides more detail about what lead up to the error. Default: zero [ -R BE ] Indicate the quality of service (QoS) desired. Choices are: HT - high throughput LL - low latency EC - economy (neither HT nor LL) PM - premium BE - best effort Default: BE USAGE - Quit test client dapltest [Common_Args] [ -s server_name ] Quit testing (-T Q) connects to the server to ask it to clean up and exit (after it waits for any outstanding test runs to complete). In addition to being more polite than simply killing the server, this test exercises the DAPL object teardown code paths. There is only one argument other than those supported by all tests: -s server_name Specifies the name of the server interface. No default. USAGE - Transaction test client dapltest [Common_Args] [ -s server_name ] [ -t threads ] [ -w endpoints ] [ -i iterations ] [ -Q ] [ -V ] [ -P ] OPclient OPserver [ op3, Transaction testing (-T T) transfers a variable amount of data between client and server. The data transfer can be described as a sequence of individual operations; that entire sequence is transferred 'iterations' times by each thread over all of its endpoint(s). The following parameters determine the behavior of the transaction test: -s server_name Specifies the name of the server interface. No default. [ -t threads ] Specify the number of threads to be used. Default: 1 [ -w endpoints ] Specify the number of connected endpoints per thread. Default: 1 [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -Q ] Funnel completion events into a CNO. Default: use EVDs [ -V ] Validate the data being transferred. Default: ignore the data [ -P ] Turn on DTO completion polling Default: off OP1 OP2 [ OP3, ... ] A single transaction (OPx) consists of: server|client Indicates who initiates the data transfer. SR|RR|RW Indicates the type of transfer: SR send/recv RR RDMA read RW RDMA write Defaults: none [ seg_size [ num_segs ] ] Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) [ -f ] For SR transfers only, indicates that a client's send transfer completion should be reaped when the next recv completion is reaped. Sends and receives must be paired (one client, one server, and in that order) for this option to be used. Restrictions: Due to the flow control algorithm used by the transaction test, there must be at least one SR OP for both the client and the server. Requesting data validation (-V) causes the test to automatically append three OPs to those specified. These additional operations provide synchronization points during each iteration, at which all user-specified transaction buffers are checked. These three appended operations satisfy the "one SR in each direction" requirement. The transaction OP list is printed out if -d is supplied. USAGE - Performance test client dapltest [Common_Args] -s server_name [ -m p|b ] [ -i iterations ] [ -p pipeline ] OP Performance testing (-T P) times the transfer of an operation. The operation is posted 'iterations' times. The following parameters determine the behavior of the transaction test: -s server_name Specifies the name of the server interface. No default. -m b|p Used to choose either blocking (b) or polling (p) Default: blocking (b) [ -i iterations ] Specify the number of times the entire sequence of data transfers will be made over each endpoint. Default: 1000 [ -p pipeline ] Specify the pipline length, valid arguments are in the range [0,MAX_SEND_DTOS]. If a value greater than MAX_SEND_DTOS is requested the value will be adjusted down to MAX_SEND_DTOS. Default: MAX_SEND_DTOS OP An operation consists of: RR|RW Indicates the type of transfer: RR RDMA read RW RDMA write Default: none [ seg_size [ num_segs ] ] Indicates the amount and format of the data to be transferred. Default: 4096 1 (i.e., 1 4KB buffer) USAGE - Limit test client Limit testing (-T L) neither requires nor connects to any server instance. The client runs one or more tests which attempt to exhaust various resources to determine DAPL limits and exercise DAPL error paths. If no arguments are given, all tests are run. Limit testing creates the sequence of DAT objects needed to move data back and forth, attempting to find the limits supported for the DAPL object requested. For example, if the LMR creation limit is being examined, the test will create a set of {IA, PZ, CNO, EVD, EP} before trying to run dat_lmr_create() to failure using that set of DAPL objects. The 'width' parameter can be used to control how many of these parallel DAPL object sets are created before beating upon the requested constructor. Use of -m limits the number of dat_*_create() calls that will be attempted, which can be helpful if the DAPL in use supports essentailly unlimited numbers of some objects. The limit test arguments are: [ -m maximum ] Specify the maximum number of dapl_*_create() attempts. Default: run to object creation failure [ -w width ] Specify the number of DAPL object sets to create while initializing. Default: 1 [ limit_ia ] Attempt to exhaust dat_ia_open() [ limit_pz ] Attempt to exhaust dat_pz_create() [ limit_cno ] Attempt to exhaust dat_cno_create() [ limit_evd ] Attempt to exhaust dat_evd_create() [ limit_ep ] Attempt to exhaust dat_ep_create() [ limit_rsp ] Attempt to exhaust dat_rsp_create() [ limit_psp ] Attempt to exhaust dat_psp_create() [ limit_lmr ] Attempt to exhaust dat_lmr_create(4KB) [ limit_rpost ] Attempt to exhaust dat_ep_post_recv(4KB) [ limit_size_lmr ] Probe maximum size dat_lmr_create() Default: run all tests EXAMPLES dapltest -T S -d -D jni0a Starts a server process with debug verbosity. dapltest -T T -d -s linux3 -D jni0a -i 100 \ client SR 4096 2 server SR 4096 2 Runs a transaction test, with both sides sending one buffer with two 4KB segments, one hundred times. dapltest -T P -d -s linux3 -D JniIbdd0 -i 100 SR 4096 2 Runs a performance test, with the client sending one buffer with two 4KB segments, one hundred times. dapltest -T Q -s linux3 -D jni0a Asks the server to clean up and exit. dapltest -T L -D jni0a -d -w 16 -m 1000 Runs all of the limit tests, setting up 16 complete sets of DAPL objects, and creating at most a thousand instances when trying to exhaust resources. dapltest -T T -V -d -t 2 -w 4 -i 55555 -s linux3 -D jni0a \ client RW 4096 1 server RW 2048 4 \ client SR 1024 4 server SR 4096 2 \ client SR 1024 3 -f server SR 2048 1 -f Runs a more complicated transaction test, with two thread using four EPs each, sending a more complicated buffer pattern for a larger number of iterations, validating the data received. BUGS (and To Do List) Use of CNOs (-Q) is not yet supported. Further limit tests could be added. dapl-2.1.5/test/dapltest/cmd/000077500000000000000000000000001255317474200160135ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/cmd/dapl_fft_cmd.c000066400000000000000000000235421255317474200205670ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" //--------------------------------------------------------------------------- void DT_FFT_Cmd_Init(FFT_Cmd_t * cmd) { int i; memset((void *)cmd, 0, sizeof(FFT_Cmd_t)); cmd->fft_type = NONE; cmd->device_name[0] = '\0'; cmd->server_name[0] = '\0'; for (i = 0; i < MAXCASES; i++) { cmd->cases_flag[i] = false; } cmd->size = 0; cmd->num_iter = 1000; cmd->num_threads = 10; cmd->num_vis = 500; cmd->port = SERVER_PORT_NUMBER; cmd->ReliabilityLevel = DAT_QOS_BEST_EFFORT; } //------------------------------------------------------------------------------ bool DT_FFT_Cmd_Parse(FFT_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; int i, caseNum; unsigned int len; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "D:f:s:i:t:v:R:n:", opts); if (c == EOF) { break; } switch (c) { case 'D': //device name { strcpy(cmd->device_name, opts->optarg); break; } case 's': //server name { strcpy(cmd->server_name, opts->optarg); break; } case 'i': // num iterations { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -i option\n"); DT_FFT_Cmd_Usage(); return (false); } cmd->num_iter = atoi(opts->optarg); break; } case 't': // num threads { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -t option\n"); DT_FFT_Cmd_Usage(); return (false); } cmd->num_threads = atoi(opts->optarg); break; } case 'v': // num vis { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -v option\n"); DT_FFT_Cmd_Usage(); return (false); } cmd->num_vis = atoi(opts->optarg); break; } case 'f': //function feature { if (strcmp(opts->optarg, "hwconn") == 0) { cmd->fft_type = HWCONN; cmd->size = 4; //4 cases for hwconn break; } #if 0 // not yet implemented else if (strcmp(opts->optarg, "cqmgt") == 0) { cmd->fft_type = CQMGT; cmd->size = 10; //10 cases for cqmgt break; } #endif else if (strcmp(opts->optarg, "endpoint") == 0) { cmd->fft_type = ENDPOINT; cmd->size = 3; //13 cases for endpoint break; } else if (strcmp(opts->optarg, "pz") == 0) { cmd->fft_type = PTAGMGT; cmd->size = 3; //10 cases for Ptagmgt break; } else if (strcmp(opts->optarg, "mem") == 0) { cmd->fft_type = MEMMGT; cmd->size = 5; //12 cases for Memmgt break; } else if (strcmp(opts->optarg, "connmgt") == 0) { cmd->fft_type = CONNMGT; cmd->size = 2; //16 cases for connmgt break; } #if 0 // not yet implemented else if (strcmp(opts->optarg, "connmgt_client") == 0) { cmd->fft_type = CONNMGT_CLIENT; cmd->size = 16; //16 cases for connmgt_client break; } #endif else if (strcmp(opts->optarg, "queryinfo") == 0) { cmd->fft_type = QUERYINFO; #ifndef __KDAPLTEST__ cmd->size = 18; //18 cases for UDAPL queryinfo #else cmd->size = 16; //16 cases for KDAPL queryinfo #endif break; } #if 0 // not yet implemented else if (strcmp(opts->optarg, "ns") == 0) { cmd->fft_type = NS; cmd->size = 10; //10 cases for ns break; } else if (strcmp(opts->optarg, "errhand") == 0) { cmd->fft_type = ERRHAND; cmd->size = 2; //2 cases for errhand break; } else if (strcmp(opts->optarg, "unsupp") == 0) { cmd->fft_type = UNSUPP; cmd->size = 2; //2 cases for unsupp break; } else if (strcmp(opts->optarg, "stress") == 0) { cmd->fft_type = STRESS; cmd->size = 6; //6 cases for stress break; } else if (strcmp(opts->optarg, "stress_client") == 0) { cmd->fft_type = STRESS_CLIENT; cmd->size = 6; //6 cases for stress_client break; } #endif else { DT_Mdep_printf ("don't know this function feature: %s\n", opts->optarg); DT_FFT_Cmd_Usage(); return (false); } } case 'R': // Service Reliability Level { cmd->ReliabilityLevel = DT_ParseQoS(opts->optarg); if (0 == cmd->ReliabilityLevel) { DT_Mdep_printf ("Invalid FFT Test Parameter: %c\n", c); DT_FFT_Cmd_Usage(); return (false); } break; } case 'n': { cmd->port = atoi(opts->optarg); break; } case '?': default: { DT_Mdep_printf ("Invalid FFT Test Parameter: %c\n", c); DT_FFT_Cmd_Usage(); return (false); } } } if (cmd->device_name[0] == '\0') { if (!DT_Mdep_GetDefaultDeviceName(cmd->device_name)) { DT_Mdep_printf("can't get default device name\n"); DT_FFT_Cmd_Usage(); return (false); } } if (cmd->fft_type == NONE) { DT_Mdep_printf ("must define the function feature with -f to test\n"); DT_FFT_Cmd_Usage(); return (false); } if (cmd->server_name[0] == '\0' && (cmd->fft_type == CONNMGT_CLIENT || cmd->fft_type == DATAXFER_CLIENT || cmd->fft_type == UNSUPP || cmd->fft_type == STRESS_CLIENT)) { DT_Mdep_printf("must define the server name with -s option\n"); DT_FFT_Cmd_Usage(); return (false); } if (cmd->server_name[0] == '\0' && cmd->fft_type == NS) { DT_Mdep_printf("\ Must specify host name or host IP address with -s option to be tested\n"); DT_FFT_Cmd_Usage(); return (false); } //now parse the test cases if (opts->optind == my_argc) //default: test all cases { for (i = 0; i < cmd->size; i++) { cmd->cases_flag[i] = true; } return true; } //test specified cases i = opts->optind; while (i < my_argc) { if (strlen(my_argv[i]) < 5 || strncmp(my_argv[i], "case", 4) != 0) { DT_Mdep_printf("test cases format is not correct: %s\n", my_argv[i]); DT_FFT_Cmd_Usage(); return (false); } len = strspn(my_argv[i] + 4, "0123456789"); if (len == 0 || len != strlen(my_argv[i] + 4)) { DT_Mdep_printf("must specify case number: %s\n", my_argv[i]); DT_FFT_Cmd_Usage(); return (false); } caseNum = atoi(my_argv[i] + 4); if (caseNum < 0 || caseNum >= cmd->size) { DT_Mdep_printf ("test case number must be within range : 0 -- %d\n", cmd->size - 1); DT_FFT_Cmd_Usage(); return (false); } cmd->cases_flag[caseNum] = true; i++; } return (true); } //-------------------------------------------------------------- void DT_FFT_Cmd_Usage(void) { char usage[] = { "dapltest -T F [-D ] -f [-i ] \n" "[-t ] [-v ] [-s ] [case0] [case1] [...]\n" "USAGE: [-D ]\n" "USAGE: [-n ]\n" "USAGE: -f \n" "USAGE: hwconn\n" "USAGE: endpoint\n" "USAGE: pz\n" "USAGE: mem\n" "USAGE: connmgt\n" "USAGE: queryinfo\n" #if 0 // not yet implemented "USAGE: connmgt_client (not yet implemented)\n" "USAGE: cqmgt (not yet implemented)\n" "USAGE: ns (not yet implemented)\n" "USAGE: errhand (not yet implemented)\n" "USAGE: unsupp (not yet implemented)\n" "USAGE: stress (not yet implemented)\n" "USAGE: stress_client (not yet implemented)\n" #endif "USAGE: -i : itreration time for stress test\n" "USAGE: -t : number of threads for stress test\n" "USAGE: -v : number of vis for stress test\n" "USAGE: -s \n" "USAGE: server host name or ip address\n" "USAGE: [-R ]\n" "USAGE: (BE == QOS_BEST_EFFORT - Default )\n" "USAGE: (HT == QOS_HIGH_THROUGHPUT))\n" "USAGE: (LL == QOS_LOW_LATENCY)\n" "USAGE: (EC == QOS_ECONOMY)\n" "USAGE: (PM == QOS_PREMIUM)\n" "NOTE: iter_num is just for stress_client test, default 100000\n" "NOTE: Server_name must be specified for connmgt_client, \n" " NS and unsupp function feature.\n" "NOTE: if test cases are not specified, test all cases in that function\n" " feature. else just test the specified cases\n" }; DT_Mdep_printf("USAGE: -------FFT TEST------------\n"); DT_Mdep_printf("%s\n", usage); } dapl-2.1.5/test/dapltest/cmd/dapl_getopt.c000066400000000000000000000101561255317474200204640ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define GETOPT_MAGIC 0x04030201 #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /** * Initialize the getopt fields in preparation for parsing * a command line. */ void DT_mygetopt_init(mygetopt_t * opts) { opts->magic = GETOPT_MAGIC; opts->place = EMSG; opts->opterr = 1; opts->optind = 1; opts->optopt = 0; opts->optarg = 0; } /** * Parse command line arguments. * * Return either the option discovered, or * (int) -1 when there are no more options * (int) '?' when an illegal option is found * (int) ':' when a required option argument is missing. */ int DT_mygetopt_r(int argc, char *const *argv, const char *ostr, mygetopt_t * opts) { char *p; char *oli; /* option letter list index */ if (GETOPT_MAGIC != opts->magic) { DT_Mdep_printf("%s: getopt warning: " "option argument is not properly initialized.\n", argc > 0 ? argv[0] : "unknown command"); DT_mygetopt_init(opts); } if (!*(opts->place)) { /* update scanning pointer */ if ((opts->optind) >= argc || *((opts->place) = argv[(opts->optind)]) != '-') { (opts->place) = EMSG; return (EOF); } if ((opts->place)[0] != '-') { /* Invalid 1st argument */ return (BADCH); } if ((opts->place)[1] && *++(opts->place) == '-') { /* found "--" which is an invalid option */ ++(opts->optind); (opts->place) = EMSG; return (BADCH); } } /* option letter okay? */ opts->optopt = (int)*(opts->place)++; oli = strchr(ostr, (opts->optopt)); if (opts->optopt == (int)':' || !oli) { /* * if the user didn't specify '-' as an option, assume it means EOF. */ if ((opts->optopt) == (int)'-') { /* return (EOF); */ return (BADCH); } if (!*(opts->place)) { ++(opts->optind); } if ((opts->opterr) && *ostr != ':') { p = strchr(*argv, '/'); if (!p) { p = *argv; } else { ++p; } if (opts->optopt != '?') { /* Anything but '?' needs error */ DT_Mdep_printf("%s: Illegal option -- %c\n", p, (opts->optopt)); } } return (BADCH); } if (*++oli != ':') { /* don't need argument */ (opts->optarg) = NULL; if (!*(opts->place)) { ++(opts->optind); } } else { /* need an argument */ if (*(opts->place)) { /* no white space */ (opts->optarg) = (opts->place); } else { if (argc <= ++(opts->optind)) { /* no arg */ (opts->place) = EMSG; if (*ostr == ':') { return (BADARG); } p = strchr(*argv, '/'); if (!p) { p = *argv; } else { ++p; } if ((opts->opterr)) { DT_Mdep_printf ("%s: option requires an argument -- %c\n", p, (opts->optopt)); } return (BADCH); } else { /* white space */ (opts->optarg) = argv[(opts->optind)]; } } (opts->place) = EMSG; ++(opts->optind); } return (opts->optopt); /* dump back option letter */ } dapl-2.1.5/test/dapltest/cmd/dapl_limit_cmd.c000066400000000000000000000153461255317474200211310ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* --------------------------------------------------- */ void DT_Limit_Cmd_Init(Limit_Cmd_t * cmd) { memset((void *)cmd, 0, sizeof(Limit_Cmd_t)); cmd->ReliabilityLevel = DAT_QOS_BEST_EFFORT; cmd->width = 1; cmd->maximum = 1000; cmd->port = SERVER_PORT_NUMBER; } /* --------------------------------------------------- */ bool DT_Limit_Cmd_Parse(Limit_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; int i; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "dm:w:D:R:n:", opts); if (c == EOF) { break; } switch (c) { case 'D': /* device name */ { strcpy(cmd->device_name, opts->optarg); break; } case 'R': /* Service Reliability Level */ { cmd->ReliabilityLevel = DT_ParseQoS(opts->optarg); break; } case 'd': /* print debug messages */ { DT_dapltest_debug++; cmd->debug = true; break; } case 'm': /* maximum for exhaustion testing */ { unsigned int len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -m option\n"); DT_Limit_Cmd_Usage(); return (false); } cmd->maximum = atol(opts->optarg); break; } case 'w': /* width (number of {ia,evd,ep,...} sets) */ { unsigned int len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -w option\n"); DT_Limit_Cmd_Usage(); return (false); } cmd->width = atol(opts->optarg); break; } case 'n': { cmd->port = atoi(opts->optarg); break; } case '?': default: { DT_Mdep_printf ("Invalid Limit Test Parameter: %c\n", c); DT_Limit_Cmd_Usage(); return (false); } } } if (cmd->device_name[0] == '\0') { if (!DT_Mdep_GetDefaultDeviceName(cmd->device_name)) { DT_Mdep_printf("can't get default device name\n"); DT_Limit_Cmd_Usage(); return (false); } } /* * by default: test all limit tests * otherwise: parse the remaining limit test arguments */ if (opts->optind == my_argc) { for (i = 0; i < LIM_NUM_TESTS; i++) { cmd->Test_List[i] = 1; } } else { for (i = opts->optind; i < my_argc; i++) { if (strcmp(my_argv[i], "limit_ia") == 0) { cmd->Test_List[LIM_IA] = 1; continue; } if (strcmp(my_argv[i], "limit_pz") == 0) { cmd->Test_List[LIM_PZ] = 1; continue; } #ifndef __KDAPLTEST__ if (strcmp(my_argv[i], "limit_cno") == 0) { cmd->Test_List[LIM_CNO] = 1; continue; } #endif if (strcmp(my_argv[i], "limit_evd") == 0) { cmd->Test_List[LIM_EVD] = 1; continue; } if (strcmp(my_argv[i], "limit_ep") == 0) { cmd->Test_List[LIM_EP] = 1; continue; } if (strcmp(my_argv[i], "limit_rsp") == 0) { cmd->Test_List[LIM_RSP] = 1; continue; } if (strcmp(my_argv[i], "limit_psp") == 0) { cmd->Test_List[LIM_PSP] = 1; continue; } if (strcmp(my_argv[i], "limit_lmr") == 0) { cmd->Test_List[LIM_LMR] = 1; continue; } if (strcmp(my_argv[i], "limit_rpost") == 0) { cmd->Test_List[LIM_RPOST] = 1; continue; } if (strcmp(my_argv[i], "limit_size_lmr") == 0) { cmd->Test_List[LIM_SIZE_LMR] = 1; continue; } DT_Mdep_printf("Cannot find this limit test: %s\n", my_argv[i]); DT_Limit_Cmd_Usage(); return (false); } /* end foreach remaining argv */ } return (true); } /* --------------------------------------------------- */ void DT_Limit_Cmd_Usage(void) { DT_Mdep_printf("USAGE: ---- LIMIT TEST ----\n"); DT_Mdep_printf("USAGE: dapltest -T L\n"); DT_Mdep_printf("USAGE: [-D ]\n"); DT_Mdep_printf("USAGE: [-n ]\n"); DT_Mdep_printf("USAGE: [-d] : debug (zero)\n"); DT_Mdep_printf("USAGE: [-w ]\n"); DT_Mdep_printf("USAGE: [-m ]\n"); DT_Mdep_printf("USAGE: (1000 - Default)\n"); DT_Mdep_printf("USAGE: [-R ]\n"); DT_Mdep_printf("USAGE: (BE == QOS_BEST_EFFORT - Default)\n"); DT_Mdep_printf("USAGE: (HT == QOS_HIGH_THROUGHPUT)\n"); DT_Mdep_printf("USAGE: (LL == QOS_LOW_LATENCY)\n"); DT_Mdep_printf("USAGE: (EC == QOS_ECONOMY)\n"); DT_Mdep_printf("USAGE: (PM == QOS_PREMIUM)\n"); DT_Mdep_printf("USAGE: [limit_ia [limit_pz] [limit_evd] ... ]\n"); DT_Mdep_printf("NOTE: If test is not specified, do all the limit tests\n"); DT_Mdep_printf("NOTE: Else, just do the specified tests\n"); DT_Mdep_printf("NOTE: Each test is separated by space, the test can be:\n"); DT_Mdep_printf("NOTE: [limit_ia] test max num of open IAs\n"); DT_Mdep_printf("NOTE: [limit_pz] test max num of PZs\n"); #ifndef __KDAPLTEST__ DT_Mdep_printf("NOTE: [limit_cno] test max num of CNOs\n"); #endif DT_Mdep_printf("NOTE: [limit_evd] test max num of EVDs\n"); DT_Mdep_printf("NOTE: [limit_rsp] test max num of RSPs\n"); DT_Mdep_printf("NOTE: [limit_psp] test max num of PSPs\n"); DT_Mdep_printf("NOTE: [limit_ep] test max num of EPs\n"); DT_Mdep_printf("NOTE: [limit_lmr] test max num of LMRs\n"); DT_Mdep_printf("NOTE: [limit_rpost] test max num of recvs posted\n"); DT_Mdep_printf("NOTE: [limit_size_lmr] test max size of LMR\n"); } dapl-2.1.5/test/dapltest/cmd/dapl_main.c000066400000000000000000000102521255317474200201030ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* Main Entry Point */ int main(int argc, char *argv[]) { return (dapltest(argc, argv)); } /* * dapltest main program */ int dapltest(int argc, char *argv[]) { Params_t *params_ptr; DAT_RETURN rc = DAT_SUCCESS; /* check memory leaking */ /* * DT_Mdep_LockInit(&Alloc_Count_Lock); alloc_count = 0; */ #if defined(_WIN32) || defined(_WIN64) { /* Cannot be done from DT_Mdep_Init as dapl_init makes some socket * calls....So need to do this before calling dapl_init */ WSADATA wsaData; int i; i = WSAStartup(MAKEWORD(2, 2), &wsaData); if (i != 0) { printf("%s WSAStartup(2.2) failed? (0x%x)\n", argv[0], i); exit(1); } } #endif #ifdef GPROF { extern void dapl_init(void); dapl_init(); } #endif DT_dapltest_debug = 0; params_ptr = (Params_t *) DT_Mdep_Malloc(sizeof(Params_t)); if (!params_ptr) { DT_Mdep_printf("Cannot allocate memory for Params structure\n"); return (1); } DT_Tdep_Init(); /* init (kdapl/udapl)test-dependent code */ DT_Endian_Init(); /* init endian of local machine */ DT_Mdep_Init(); /* init OS, libraries, etc. */ params_ptr->local_is_little_endian = DT_local_is_little_endian; /* * parse command line arguments */ if (!DT_Params_Parse(argc, argv, params_ptr)) { DT_Mdep_printf("Command line syntax error\n"); return 1; } params_ptr->cpu_mhz = DT_Mdep_GetCpuMhz(); /* call the test-dependent code for invoking the actual test */ rc = DT_Tdep_Execute_Test(params_ptr); /* cleanup */ DT_Mdep_End(); DT_Mdep_Free(params_ptr); DT_Tdep_End(); #ifdef GPROF { extern void dapl_fini(void); dapl_fini(); } #endif /* * check memory leaking DT_Mdep_printf("App allocated Memory left: %d\n", * alloc_count); DT_Mdep_LockDestroy(&Alloc_Count_Lock); */ return (rc); } void Dapltest_Main_Usage(void) { DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf("USAGE: dapltest -T [-D IA_name] [-n port_number] [test-specific args]\n"); DT_Mdep_printf("USAGE: where \n"); DT_Mdep_printf("USAGE: S = Run as a server\n"); DT_Mdep_printf("USAGE: T = Transaction Test\n"); DT_Mdep_printf("USAGE: Q = Quit Test\n"); DT_Mdep_printf("USAGE: P = Performance Test\n"); DT_Mdep_printf("USAGE: L = Limit Test\n"); DT_Mdep_printf("USAGE: F = FFT Test\n"); DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf("USAGE: -D Interface_Adapter {default ibnic0v2}\n"); DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf("USAGE: -n server_port_number {default 42768}\n"); DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf ("NOTE:\tRun as server taking defaults (dapltest -T S [-D ibnic0v2] [-p 42768])\n"); DT_Mdep_printf("NOTE: dapltest\n"); DT_Mdep_printf("NOTE:\n"); DT_Mdep_printf ("NOTE:\tdapltest arguments may be supplied in a script file\n"); DT_Mdep_printf("NOTE:\tdapltest -f \n"); DT_Mdep_printf("USAGE:\n"); } dapl-2.1.5/test/dapltest/cmd/dapl_netaddr.c000066400000000000000000000064621255317474200206100ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" DAT_IA_ADDRESS_PTR DT_NetAddrAlloc(Per_Test_Data_t * pt_ptr) { DAT_IA_ADDRESS_PTR netaddr; netaddr = (DAT_IA_ADDRESS_PTR) DT_Mdep_Malloc(sizeof(DAT_SOCK_ADDR)); if (!netaddr) { DT_Mdep_printf("dapltest: No Memory to create netaddr!\n"); } return netaddr; } void DT_NetAddrFree(Per_Test_Data_t * pt_ptr, DAT_IA_ADDRESS_PTR netaddr) { DT_Mdep_Free(netaddr); } bool DT_NetAddrLookupHostAddress(DAT_IA_ADDRESS_PTR to_netaddr, DAT_NAME_PTR hostname) { struct addrinfo *target; int rval; rval = getaddrinfo(hostname, NULL, NULL, &target); if (rval != 0) { char *whatzit = "unknown error return"; switch (rval) { case EAI_FAMILY: { whatzit = "unsupported address family"; break; } case EAI_SOCKTYPE: { whatzit = "unsupported socket type"; break; } case EAI_BADFLAGS: { whatzit = "invalid flags"; break; } case EAI_NONAME: { whatzit = "unknown node name"; break; } case EAI_SERVICE: { whatzit = "service unavailable"; break; } #if !defined(WIN32) && defined(__USE_GNU) case EAI_ADDRFAMILY: { whatzit = "node has no address in this family"; break; } case EAI_NODATA: { whatzit = "node has no addresses defined"; break; } #endif case EAI_MEMORY: { whatzit = "out of memory"; break; } case EAI_FAIL: { whatzit = "permanent name server failure"; break; } case EAI_AGAIN: { whatzit = "temporary name server failure"; break; } #if !defined(WIN32) case EAI_SYSTEM: { whatzit = "system error"; break; } #endif } DT_Mdep_printf("getaddrinfo (%s) failed (%s)\n", hostname, whatzit); return DAT_FALSE; } /* Pull out IP address and print it as a sanity check */ DT_Mdep_printf("Server Name: %s \n", hostname); DT_Mdep_printf("Server Net Address: %s\n", inet_ntoa(((struct sockaddr_in *)target->ai_addr)-> sin_addr)); *to_netaddr = *((DAT_IA_ADDRESS_PTR) target->ai_addr); freeaddrinfo(target); return (DAT_TRUE); } dapl-2.1.5/test/dapltest/cmd/dapl_params.c000066400000000000000000000170771255317474200204560ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define MAX_ARGC 500 #define MAX_ARG_LEN 100 /* Parse command line arguments */ bool DT_Params_Parse(int argc, char *argv[], Params_t * params_ptr) { Server_Cmd_t *Server_Cmd; Transaction_Cmd_t *Transaction_Cmd; Quit_Cmd_t *Quit_Cmd; Limit_Cmd_t *Limit_Cmd; Performance_Cmd_t *Performance_Cmd; FFT_Cmd_t *FFT_Cmd; char *filename; FILE *fd; mygetopt_t opts; int c; char *cp; char *sp; char line[256]; char *my_argv[MAX_ARGC]; int my_argc; int i; DT_mygetopt_init(&opts); opts.opterr = 0; /* turn off automatical error handler */ fd = 0; my_argc = 0; for (i = 0; i < MAX_ARGC; i++) { my_argv[i] = NULL; } /* dapltest with no arguments means run as a server with default values */ if (argc == 1) { params_ptr->test_type = SERVER_TEST; params_ptr->ReliabilityLevel = DAT_QOS_BEST_EFFORT; Server_Cmd = ¶ms_ptr->u.Server_Cmd; DT_Server_Cmd_Init(Server_Cmd); if (!DT_Mdep_GetDefaultDeviceName(Server_Cmd->dapl_name)) { DT_Mdep_printf("can't get default device name\n"); return false; } return true; } /* check for a script file */ if (strncmp(argv[1], "-f", 2) == 0) { if (argc == 2) { /* dapltest -fdata */ filename = argv[1] + 2; } else { if (argc == 3 && strcmp(argv[1], "-f") == 0) { /* dapltest -f data */ filename = argv[2]; } else { DT_Mdep_printf ("-f allows no additional options\n"); goto main_usage; } } if (!filename || strlen(filename) == 0) { DT_Mdep_printf ("Missing with -f option\n"); goto main_usage; } /* read the script file and create a fake argc, argv */ fd = fopen(filename, "r"); if (fd == 0) { DT_Mdep_printf("Cannot open script file: %s\n", filename); goto main_usage; } my_argc = 1; my_argv[0] = DT_Mdep_Malloc(MAX_ARG_LEN); if (!my_argv[0]) { DT_Mdep_printf("No Memory\n"); goto error_return; } strcpy(my_argv[0], argv[0]); while (fgets(&line[0], 256, fd)) { sp = &line[0]; for (;;) { cp = strtok(sp, " \t\n"); sp = 0; /* so can continue to parse this string */ if (!cp) { /* no more token found */ break; } if (*cp == '#') { /* Comment; go to next line. */ break; } my_argv[my_argc] = DT_Mdep_Malloc(MAX_ARG_LEN); if (!my_argv[my_argc]) { DT_Mdep_printf("No Memory\n"); goto error_return; } strcpy(my_argv[my_argc], cp); my_argc++; } } } else { my_argc = argc; for (i = 0; i < argc; i++) { my_argv[i] = argv[i]; } } #if 0 for (i = 0; i < my_argc; i++) { DT_Mdep_printf("ARG %s\n", my_argv[i]); } exit(1); #endif /* get test type - which must be the first arg */ c = DT_mygetopt_r(my_argc, my_argv, "T:", &opts); if (c != 'T') { DT_Mdep_printf("Must Specify Test (-T) option first\n"); goto main_usage; } if ((opts.optarg == 0) || strlen(opts.optarg) == 0 || *opts.optarg == '-') { DT_Mdep_printf("Must specify test type\n"); goto main_usage; } switch (*opts.optarg) { case 'S': /* Server Test */ { params_ptr->test_type = SERVER_TEST; Server_Cmd = ¶ms_ptr->u.Server_Cmd; DT_Server_Cmd_Init(Server_Cmd); if (!DT_Server_Cmd_Parse(Server_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = Server_Cmd->ReliabilityLevel; params_ptr->debug = Server_Cmd->debug; params_ptr->server_port = Server_Cmd->port; break; } case 'T': /* Transaction Test */ { params_ptr->test_type = TRANSACTION_TEST; Transaction_Cmd = ¶ms_ptr->u.Transaction_Cmd; DT_Transaction_Cmd_Init(Transaction_Cmd); if (!DT_Transaction_Cmd_Parse(Transaction_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = Transaction_Cmd->ReliabilityLevel; params_ptr->debug = Transaction_Cmd->debug; params_ptr->server_port = Transaction_Cmd->port; DT_NetAddrLookupHostAddress(¶ms_ptr->server_netaddr, Transaction_Cmd-> server_name); break; } case 'Q': /* Quit server Test */ { params_ptr->test_type = QUIT_TEST; Quit_Cmd = ¶ms_ptr->u.Quit_Cmd; DT_Quit_Cmd_Init(Quit_Cmd); if (!DT_Quit_Cmd_Parse(Quit_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = Quit_Cmd->ReliabilityLevel; params_ptr->debug = Quit_Cmd->debug; params_ptr->server_port = Quit_Cmd->port; DT_NetAddrLookupHostAddress(¶ms_ptr->server_netaddr, Quit_Cmd->server_name); break; } case 'L': /* Limit Test */ { params_ptr->test_type = LIMIT_TEST; Limit_Cmd = ¶ms_ptr->u.Limit_Cmd; DT_Limit_Cmd_Init(Limit_Cmd); if (!DT_Limit_Cmd_Parse (Limit_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = Limit_Cmd->ReliabilityLevel; params_ptr->debug = Limit_Cmd->debug; params_ptr->server_port = Limit_Cmd->port; break; } case 'P': /* Performance Test */ { params_ptr->test_type = PERFORMANCE_TEST; Performance_Cmd = ¶ms_ptr->u.Performance_Cmd; if (!DT_Performance_Cmd_Init(Performance_Cmd)) { goto error_return; } if (!DT_Performance_Cmd_Parse(Performance_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = Performance_Cmd->qos; params_ptr->debug = Performance_Cmd->debug; params_ptr->server_port = Performance_Cmd->port; DT_NetAddrLookupHostAddress(¶ms_ptr->server_netaddr, Performance_Cmd-> server_name); break; } case 'F': { params_ptr->test_type = FFT_TEST; FFT_Cmd = ¶ms_ptr->u.FFT_Cmd; DT_FFT_Cmd_Init(FFT_Cmd); if (!DT_FFT_Cmd_Parse(FFT_Cmd, my_argc, my_argv, &opts)) { goto error_return; } params_ptr->ReliabilityLevel = FFT_Cmd->ReliabilityLevel; DT_NetAddrLookupHostAddress(¶ms_ptr->server_netaddr, FFT_Cmd->server_name); params_ptr->debug = false; params_ptr->server_port = FFT_Cmd->port; break; } default: { DT_Mdep_printf("Invalid Test Type\n"); goto main_usage; } } if (fd) { for (i = 0; i < my_argc; i++) { DT_Mdep_Free(my_argv[i]); } fclose(fd); } return true; main_usage: Dapltest_Main_Usage(); error_return: if (fd) { for (i = 0; i < my_argc; i++) { DT_Mdep_Free(my_argv[i]); } fclose(fd); } return false; } dapl-2.1.5/test/dapltest/cmd/dapl_performance_cmd.c000066400000000000000000000201051255317474200223010ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" static void DT_Performance_Cmd_Usage(void) { DT_Mdep_printf("USAGE: ---- PERFORMANCE TEST ----\n"); DT_Mdep_printf("USAGE: dapltest -T P\n"); DT_Mdep_printf("USAGE: -s \n"); DT_Mdep_printf("USAGE: -n \n"); DT_Mdep_printf("USAGE: [-m b|p]\n"); DT_Mdep_printf("USAGE: [-D ]\n"); DT_Mdep_printf("USAGE: [-d] : debug (zero)\n"); DT_Mdep_printf("USAGE: [-i ] : (1, 000)\n"); DT_Mdep_printf("USAGE: [-p ]\n"); DT_Mdep_printf("USAGE: [-R ]\n"); DT_Mdep_printf("USAGE: (BE == QOS_BEST_EFFORT - Default)\n"); DT_Mdep_printf("USAGE: (HT == QOS_HIGH_THROUGHPUT)\n"); DT_Mdep_printf("USAGE: (LL == QOS_LOW_LATENCY)\n"); DT_Mdep_printf("USAGE: (EC == QOS_ECONOMY)\n"); DT_Mdep_printf("USAGE: (PM == QOS_PREMIUM)\n"); DT_Mdep_printf("USAGE: \n"); DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf("USAGE: Each OP consists of:\n"); DT_Mdep_printf("USAGE: : \"RR\" (RDMA READ)\n"); DT_Mdep_printf("USAGE: : \"RW\" (RDMA WRITE)\n"); DT_Mdep_printf("USAGE: [seg_size [num_segs] ] : (4096, 1)\n"); } static bool DT_Performance_Cmd_Parse_Op(Performance_Cmd_t * cmd, int index, int my_argc, char **my_argv) { int i; /* * Op Format: [seg_size] [num_segs] */ if (index == my_argc) { DT_Mdep_printf("Operation Missing Transfer Type\n"); return (false); } for (i = 0; index < my_argc; i++, index++) { switch (i) { case 0: { if (0 == strncmp(my_argv[index], "RR", strlen("RR"))) { cmd->op.transfer_type = RDMA_READ; } else if (0 == strncmp(my_argv[index], "RW", strlen("RW"))) { cmd->op.transfer_type = RDMA_WRITE; } else { DT_Mdep_printf ("OP type must be \n"); return (false); } break; } case 1: { cmd->op.seg_size = atoi(my_argv[index]); break; } case 2: { cmd->op.num_segs = atoi(my_argv[index]); break; } default: { DT_Mdep_printf("Too many OP args\n"); return (false); } } } return (true); } static bool DT_Performance_Cmd_Validate(Performance_Cmd_t * cmd) { if ('\0' == cmd->server_name[0]) { DT_Mdep_printf ("Must specify server_name in command line or scriptfile\n"); return (false); } if ('\0' == cmd->dapl_name[0]) { DT_Mdep_printf ("Must specify device_name in command line or scriptfile\n"); return (false); } if (0 == cmd->pipeline_len) { DT_Mdep_printf("Pipeline size must not be 0\n"); return (false); } if (cmd->debug) { DT_Performance_Cmd_Print(cmd); } return true; } bool DT_Performance_Cmd_Parse(Performance_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; unsigned int len; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "D:dm:i:p:R:s:n:", opts); if (EOF == c) { break; } switch (c) { case 'D': /* device name */ { strncpy(cmd->dapl_name, opts->optarg, NAME_SZ); break; } case 'd': /* print debug messages */ { DT_dapltest_debug++; cmd->debug = true; break; } case 'm': /* mode */ { if (!strncmp(opts->optarg, "b", strlen("b"))) { cmd->mode = BLOCKING_MODE; } else if (!strncmp (opts->optarg, "p", strlen("p"))) { cmd->mode = POLLING_MODE; } else { DT_Mdep_printf ("Syntax Error -m option\n"); DT_Performance_Cmd_Usage(); return (false); } break; } case 'i': /* num iterations */ { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -i option\n"); DT_Performance_Cmd_Usage(); return (false); } cmd->num_iterations = atol(opts->optarg); break; } case 'p': /* pipline size */ { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -p option\n"); DT_Performance_Cmd_Usage(); return (false); } cmd->pipeline_len = atol(opts->optarg); break; } case 'R': /* Service Reliability Level */ { cmd->qos = DT_ParseQoS(opts->optarg); break; } case 's': /* server name */ { if ((opts->optarg == 0) || strlen(opts->optarg) == 0 || *opts->optarg == '-') { DT_Mdep_printf ("must specify server name\n"); DT_Performance_Cmd_Usage(); return (false); } strncpy(cmd->server_name, opts->optarg, NAME_SZ); break; } case 'n': { cmd->port = atoi(opts->optarg); break; } default: { DT_Mdep_printf ("Invalid Performance Test Parameter: %c\n", c); DT_Performance_Cmd_Usage(); return (false); } } } /* * now parse the op */ if (!DT_Performance_Cmd_Parse_Op(cmd, opts->optind, my_argc, my_argv)) { DT_Performance_Cmd_Usage(); return (false); } if (!DT_Performance_Cmd_Validate(cmd)) { DT_Performance_Cmd_Usage(); return (false); } return (true); } bool DT_Performance_Cmd_Init(Performance_Cmd_t * cmd) { memset(cmd, 0, sizeof(Performance_Cmd_t)); cmd->dapltest_version = DAPLTEST_VERSION; cmd->client_is_little_endian = DT_local_is_little_endian; cmd->qos = DAT_QOS_BEST_EFFORT; cmd->debug = false; cmd->num_iterations = 1000; cmd->pipeline_len = ~0; cmd->port = SERVER_PORT_NUMBER; cmd->op.transfer_type = RDMA_WRITE; cmd->op.seg_size = 4096; cmd->op.num_segs = 1; if (!DT_Mdep_GetDefaultDeviceName(cmd->dapl_name)) { DT_Mdep_printf("can't get default device name\n"); return (false); } return (true); } void DT_Performance_Cmd_Print(Performance_Cmd_t * cmd) { DT_Mdep_printf("-------------------------------------\n"); DT_Mdep_printf("PerfCmd.server_name : %s\n", cmd->server_name); DT_Mdep_printf("PerfCmd.server_port_number : %d\n", cmd->port); DT_Mdep_printf("PerfCmd.dapl_name : %s\n", cmd->dapl_name); DT_Mdep_printf("PerfCmd.mode : %s\n", (cmd->mode == BLOCKING_MODE) ? "BLOCKING" : "POLLING"); DT_Mdep_printf("PerfCmd.num_iterations : %d\n", cmd->num_iterations); DT_Mdep_printf("PerfCmd.pipeline_len : %d\n", cmd->pipeline_len); DT_Mdep_printf("PerfCmd.op.transfer_type : %s\n", cmd->op.transfer_type == RDMA_READ ? "RDMA_READ" : cmd->op.transfer_type == RDMA_WRITE ? "RDMA_WRITE" : "SEND_RECV"); DT_Mdep_printf("PerfCmd.op.num_segs : %d\n", cmd->op.num_segs); DT_Mdep_printf("PerfCmd.op.seg_size : %d\n", cmd->op.seg_size); } dapl-2.1.5/test/dapltest/cmd/dapl_qos_util.c000066400000000000000000000034411255317474200210200ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* * Parse a QOS argument into a DAT_QOS. * * Returns no errors: defaults to best effort. */ DAT_QOS DT_ParseQoS(char *arg) { if (0 == strcmp(arg, "HT")) { return (DAT_QOS_HIGH_THROUGHPUT); } if (0 == strcmp(arg, "LL")) { return (DAT_QOS_LOW_LATENCY); } if (0 == strcmp(arg, "EC")) { return (DAT_QOS_ECONOMY); } if (0 == strcmp(arg, "PM")) { return (DAT_QOS_PREMIUM); } /* * Default to "BE" so no point in checking further */ return (DAT_QOS_BEST_EFFORT); } dapl-2.1.5/test/dapltest/cmd/dapl_quit_cmd.c000066400000000000000000000101731255317474200207660ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /*--------------------------------------------------------- */ void DT_Quit_Cmd_Init(Quit_Cmd_t * cmd) { memset((void *)cmd, 0, sizeof(Quit_Cmd_t)); cmd->ReliabilityLevel = DAT_QOS_BEST_EFFORT; cmd->port = SERVER_PORT_NUMBER; } /*--------------------------------------------------------- */ bool DT_Quit_Cmd_Parse(Quit_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "ds:D:R:n", opts); if (c == EOF) { break; } switch (c) { case 'D': { strcpy(cmd->device_name, opts->optarg); break; } case 's': { strcpy(cmd->server_name, opts->optarg); break; } case 'd': /* print debug messages */ { DT_dapltest_debug++; cmd->debug = true; break; } case 'R': /* Service Reliability Level */ { cmd->ReliabilityLevel = DT_ParseQoS(opts->optarg); break; } case 'n': { cmd->port = atoi(opts->optarg); break; } case '?': default: { DT_Mdep_printf("Invalid Quit option: %c\n", opts->optopt); DT_Quit_Cmd_Usage(); return (false); } } } if (cmd->device_name[0] == '\0') { if (!DT_Mdep_GetDefaultDeviceName(cmd->device_name)) { DT_Mdep_printf("can't get default device name\n"); DT_Quit_Cmd_Usage(); return (false); } } if (!DT_Quit_Cmd_Validate(cmd)) { DT_Quit_Cmd_Usage(); return (false); } return (true); } /*------------------------------------------------------------------------------ */ bool DT_Quit_Cmd_Validate(Quit_Cmd_t * cmd) { if (cmd->server_name[0] == '\0') { DT_Mdep_printf ("Must specify server_name in command line or scriptfile\n"); return (false); } return (true); } /*--------------------------------------------------------- */ void DT_Quit_Cmd_Usage(void) { DT_Mdep_printf("USAGE: ---- QUIT TEST ----\n"); DT_Mdep_printf("USAGE: dapltest -T Q\n"); DT_Mdep_printf("USAGE: -s \n"); DT_Mdep_printf("USAGE: -n \n"); DT_Mdep_printf("USAGE: [-D ]\n"); DT_Mdep_printf("USAGE: [-d] : debug (zero)\n"); DT_Mdep_printf("USAGE: [-R ]\n"); DT_Mdep_printf ("USAGE: (BE == QOS_BEST_EFFORT - Default)\n"); DT_Mdep_printf("USAGE: (HT == QOS_HIGH_THROUGHPUT)\n"); DT_Mdep_printf("USAGE: (LL == QOS_LOW_LATENCY)\n"); DT_Mdep_printf("USAGE: (EC == QOS_ECONOMY)\n"); DT_Mdep_printf("USAGE: (PM == QOS_PREMIUM)\n"); } /*--------------------------------------------------------- */ void DT_Quit_Cmd_Print(Quit_Cmd_t * cmd) { DT_Mdep_printf("Quit_Cmd.server_name: %s\n", cmd->server_name); DT_Mdep_printf("Quit_Cmd.device_name: %s\n", cmd->device_name); DT_Mdep_printf("Quit_Cmd.port: %s\n", cmd->port); } dapl-2.1.5/test/dapltest/cmd/dapl_server_cmd.c000066400000000000000000000073231255317474200213150ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Server_Cmd_Init(Server_Cmd_t * Server_Cmd) { DT_dapltest_debug = 0; Server_Cmd->debug = false; Server_Cmd->port = SERVER_PORT_NUMBER; Server_Cmd->dapl_name[0] = '\0'; Server_Cmd->ReliabilityLevel = DAT_QOS_BEST_EFFORT; } bool DT_Server_Cmd_Parse(Server_Cmd_t * Server_Cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "dD:R:n:", opts); if (c == EOF) { break; } switch (c) { case 'D': { strcpy(Server_Cmd->dapl_name, opts->optarg); break; } case 'd': { DT_dapltest_debug++; Server_Cmd->debug = true; break; } case 'R': /* Service Reliability Level */ { Server_Cmd->ReliabilityLevel = DT_ParseQoS(opts->optarg); if (0 == Server_Cmd->ReliabilityLevel) { return (false); } break; } case 'n': { Server_Cmd->port = atoi(opts->optarg); break; } case '?': default: { DT_Mdep_printf("Invalid Server option: %c\n", opts->optopt); DT_Server_Cmd_Usage(); return (false); } } } if (Server_Cmd->dapl_name == '\0') { if (!DT_Mdep_GetDefaultDeviceName(Server_Cmd->dapl_name)) { DT_Mdep_printf("can't get default device name\n"); DT_Server_Cmd_Usage(); return (false); } } return (true); } void DT_Server_Cmd_Usage(void) { DT_Mdep_printf("USAGE: ---- SERVER MODE ----\n"); DT_Mdep_printf("USAGE: dapltest -T S\n"); DT_Mdep_printf("USAGE: [-D ]\n"); DT_Mdep_printf("USAGE: [-d] : debug (zero)\n"); DT_Mdep_printf("USAGE: [-R ]\n"); DT_Mdep_printf("USAGE: [-n ]\n"); DT_Mdep_printf("USAGE: (BE == QOS_BEST_EFFORT - Default)\n"); DT_Mdep_printf("USAGE: (HT == QOS_HIGH_THROUGHPUT)\n"); DT_Mdep_printf("USAGE: (LL == QOS_LOW_LATENCY)\n"); DT_Mdep_printf("USAGE: (EC == QOS_ECONOMY)\n"); DT_Mdep_printf("USAGE: (PM == QOS_PREMIUM)\n"); DT_Mdep_printf("USAGE: Run as server using default parameters\n"); DT_Mdep_printf("USAGE: dapltest\n"); DT_Mdep_printf("USAGE:\n"); } void DT_Server_Cmd_Print(Server_Cmd_t * Server_Cmd) { DT_Mdep_printf("Server_Cmd.debug: %d\n", Server_Cmd->debug); DT_Mdep_printf("Server_Cmd.dapl_name: %s\n", Server_Cmd->dapl_name); DT_Mdep_printf("Server_Cmd.port: %d\n", Server_Cmd->port); } dapl-2.1.5/test/dapltest/cmd/dapl_transaction_cmd.c000066400000000000000000000320151255317474200223300ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" static bool DT_Transaction_Cmd_Parse_Op(Transaction_Cmd_t * cmd, char *arg) { char *c_ptr; int op; if (cmd->num_ops >= MAX_OPS) { DT_Mdep_printf("Client: Too Many Ops - Max %d\n", MAX_OPS); goto error_return; } op = cmd->num_ops; cmd->num_ops++; /* set some defaults */ cmd->op[op].seg_size = 4096; cmd->op[op].num_segs = 1; cmd->op[op].reap_send_on_recv = false; /* * packet format: [seg_size] [num_segs] */ c_ptr = strtok(arg, " \t"); if (!c_ptr) { DT_Mdep_printf("OP first arg must \n"); goto error_return; } /* first token is : */ if (strcmp(c_ptr, "server") == 0) { cmd->op[op].server_initiated = true; } else { if (strcmp(c_ptr, "client") == 0) { cmd->op[op].server_initiated = false; } else { DT_Mdep_printf("OP first arg must \n"); goto error_return; } } c_ptr = strtok(0, " \t"); if (!c_ptr) { DT_Mdep_printf("OP Second arg must be \n"); goto error_return; } /* second token is : */ if (strcmp(c_ptr, "RR") == 0) { cmd->op[op].transfer_type = RDMA_READ; } else { if (strcmp(c_ptr, "RW") == 0) { cmd->op[op].transfer_type = RDMA_WRITE; } else { if (strcmp(c_ptr, "SR") == 0) { cmd->op[op].transfer_type = SEND_RECV; } else { DT_Mdep_printf ("OP Second arg must be \n"); goto error_return; } } } /* * there may or may not be additional parameters... [seg_size] [num_segs] * [-f] */ c_ptr = strtok(0, " \t"); if (c_ptr && strspn(c_ptr, "0123456789") != 0) { cmd->op[op].seg_size = atoi(c_ptr); c_ptr = strtok(0, " \t"); } if (c_ptr && strspn(c_ptr, "0123456789") != 0) { cmd->op[op].num_segs = atoi(c_ptr); c_ptr = strtok(0, " \t"); } if (c_ptr && strcmp(c_ptr, "-f") == 0) { cmd->op[op].reap_send_on_recv = true; if (cmd->op[op].transfer_type != SEND_RECV) { DT_Mdep_printf("OP: -f only valid on SEND_RECV\n"); goto error_return; } c_ptr = strtok(0, " \t"); } if (c_ptr) { DT_Mdep_printf("OP too many args \n"); goto error_return; } return true; error_return: return false; } static bool DT_Transaction_Cmd_Validate(Transaction_Cmd_t * cmd) { unsigned int i; bool has_server_send; bool has_client_send; unsigned int reap_count; has_server_send = false; has_client_send = false; reap_count = 0; if (cmd->server_name[0] == '\0') { DT_Mdep_printf ("Must specify server_name in command line or scriptfile\n"); return (false); } for (i = 0; i < cmd->num_ops; i++) { switch (cmd->op[i].transfer_type) { case SEND_RECV: { if (cmd->op[i].server_initiated) { has_server_send = true; } else { has_client_send = true; } if (cmd->op[i].reap_send_on_recv) { if (!cmd->op[i].server_initiated) { /* client */ reap_count++; } else { /* server */ if (reap_count > 0) { reap_count--; } else { DT_Mdep_printf ("OP: Unbalanced -f options\n"); return false; } } } break; } case RDMA_READ: { break; } case RDMA_WRITE: { break; } } } if (!has_server_send || !has_client_send) { DT_Mdep_printf("Error: Transaction test requires \n"); DT_Mdep_printf ("Error: At least one server SR and one client SR Operation\n"); return false; } if (reap_count != 0) { DT_Mdep_printf("OP: Unbalanced -f options\n"); return false; } if (cmd->debug) { DT_Transaction_Cmd_Print(cmd); } return true; } static void DT_Transaction_Cmd_Usage(void) { DT_Mdep_printf("USAGE: ---- TRANSACTION TEST ----\n"); DT_Mdep_printf("USAGE: dapltest -T T\n"); DT_Mdep_printf("USAGE: -s \n"); DT_Mdep_printf("USAGE: [-D ]\n"); DT_Mdep_printf("USAGE: [-n ]\n"); DT_Mdep_printf("USAGE: [-d] : debug (zero)\n"); DT_Mdep_printf("USAGE: [-i ] : (1, 000)\n"); DT_Mdep_printf("USAGE: [-t ] : (1)\n"); DT_Mdep_printf("USAGE: [-w ] : (1)\n"); DT_Mdep_printf("USAGE: [-V ] : Validate data: (false)\n"); DT_Mdep_printf("USAGE: [-P ] : DTO Completion Polling: (false)\n"); DT_Mdep_printf("USAGE: [-r ] : Use RSPs: (false)\n"); DT_Mdep_printf("USAGE: [-R ]\n"); DT_Mdep_printf("USAGE: (BE == QOS_BEST_EFFORT - Default)\n"); DT_Mdep_printf("USAGE: (HT == QOS_HIGH_THROUGHPUT)\n"); DT_Mdep_printf("USAGE: (LL == QOS_LOW_LATENCY)\n"); DT_Mdep_printf("USAGE: (EC == QOS_ECONOMY)\n"); DT_Mdep_printf("USAGE: (PM == QOS_PREMIUM)\n"); DT_Mdep_printf("USAGE: : \"server\"/\"client\"\n"); DT_Mdep_printf("USAGE: : \"SR\" (SEND/RECV)\n"); DT_Mdep_printf("USAGE: : \"RR\" (RDMA READ)\n"); DT_Mdep_printf("USAGE: : \"RW\" (RDMA WRITE)\n"); DT_Mdep_printf("USAGE: [seg_size [num_segs] ] : (4096, 1)\n"); DT_Mdep_printf("USAGE: [-f] : Reap sends on recv\n"); DT_Mdep_printf("USAGE:\n"); DT_Mdep_printf("NOTE: -f is only allowed on \"SR\" OPs\n"); DT_Mdep_printf("NOTE: -f must appear in pairs (one client, one server)\n"); DT_Mdep_printf("NOTE: At least one server SR and one client SR OP are required\n"); DT_Mdep_printf("NOTE: and use of -V results in the use of three extra OPs\n"); } void DT_Transaction_Cmd_Init(Transaction_Cmd_t * cmd) { memset((void *)cmd, 0, sizeof(Transaction_Cmd_t)); cmd->dapltest_version = DAPLTEST_VERSION; cmd->client_is_little_endian = DT_local_is_little_endian; cmd->num_iterations = 1000; cmd->num_threads = 1; cmd->eps_per_thread = 1; cmd->debug = false; cmd->validate = false; cmd->port = SERVER_PORT_NUMBER; cmd->ReliabilityLevel = DAT_QOS_BEST_EFFORT; } bool DT_Transaction_Cmd_Parse(Transaction_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts) { int c; unsigned int len; int i; char op[100]; for (;;) { c = DT_mygetopt_r(my_argc, my_argv, "rQVPdw:s:D:i:t:v:R:n:", opts); if (c == EOF) { break; } switch (c) { case 's': /* server name */ { if ((opts->optarg == 0) || strlen(opts->optarg) == 0 || *opts->optarg == '-') { DT_Mdep_printf ("must specify server name\n"); DT_Transaction_Cmd_Usage(); return (false); } strcpy(cmd->server_name, opts->optarg); break; } case 'D': /* device name */ { strcpy(cmd->dapl_name, opts->optarg); break; } case 'i': /* num iterations */ { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -i option\n"); DT_Transaction_Cmd_Usage(); return (false); } cmd->num_iterations = atol(opts->optarg); break; } case 't': /* num threads */ { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -t option\n"); DT_Transaction_Cmd_Usage(); return (false); } cmd->num_threads = atol(opts->optarg); break; } case 'w': /* num EPs per thread */ { len = strspn(opts->optarg, "0123456789"); if (len == 0 || len != strlen(opts->optarg)) { DT_Mdep_printf ("Syntax Error -w option\n"); DT_Transaction_Cmd_Usage(); return (false); } cmd->eps_per_thread = atol(opts->optarg); break; } case 'd': /* print debug messages */ { DT_dapltest_debug++; cmd->debug = true; break; } case 'r': /* use RSP instead of PSP */ { cmd->use_rsp = true; break; } case 'V': /* validate data being sent/received */ { cmd->validate = true; break; } case 'P': /* use completion polling */ { cmd->poll = true; break; } case 'R': /* Service Reliability Level */ { cmd->ReliabilityLevel = DT_ParseQoS(opts->optarg); break; } case 'n': { cmd->port = atoi(opts->optarg); break; } case '?': default: { DT_Mdep_printf ("Invalid Transaction Test Parameter: %c\n", c); DT_Transaction_Cmd_Usage(); return (false); } } } if (cmd->dapl_name[0] == '\0') { if (!DT_Mdep_GetDefaultDeviceName(cmd->dapl_name)) { DT_Mdep_printf("can't get default device name\n"); DT_Transaction_Cmd_Usage(); return (false); } } /* * now parse the transaction ops this is ugly, but it's easier to gather * each transaction into a single string */ for (i = opts->optind; i < my_argc; i++) { strcpy(&op[0], my_argv[i]); while (i < my_argc - 1) { i++; if ((strncmp(my_argv[i], "client", 6) == 0) || strncmp(my_argv[i], "server", 6) == 0) { i--; break; } strcat(op, " "); strcat(op, my_argv[i]); } if (!DT_Transaction_Cmd_Parse_Op(cmd, op)) { DT_Transaction_Cmd_Usage(); return (false); } } /* * If we're going to validate the data, we append 3 OPs that * serve as barriers so that both the client and server can * validate their entire set of recv transactions without * interference. * * The first op appended serves to notify the client that the * server is at the rendezvous and will transfer nothing else, * so the client can validate all recv buffers. The second op * notifies the server that the client is quiescent, so the * server can safely validate its recv buffers. The final op * tells the client that the server is done, and both can * proceed with the next iteration. */ if (cmd->validate) { DT_Mdep_printf ("NOTE: Adding OP \"server SR\" - for validation\n"); memcpy(op, "server SR", strlen("server SR") + 1); DT_Transaction_Cmd_Parse_Op(cmd, op); DT_Mdep_printf ("NOTE: Adding OP \"client SR\" - for validation\n"); memcpy(op, "client SR", strlen("client SR") + 1); DT_Transaction_Cmd_Parse_Op(cmd, op); DT_Mdep_printf ("NOTE: Adding OP \"server SR\" - for validation\n"); memcpy(op, "server SR", strlen("server SR") + 1); DT_Transaction_Cmd_Parse_Op(cmd, op); } if (!DT_Transaction_Cmd_Validate(cmd)) { DT_Transaction_Cmd_Usage(); return (false); } return (true); } void DT_Transaction_Cmd_Print(Transaction_Cmd_t * cmd) { unsigned int i; DT_Mdep_printf("-------------------------------------\n"); DT_Mdep_printf("TransCmd.server_name : %s\n", cmd->server_name); DT_Mdep_printf("TransCmd.server_port_number : %d\n", cmd->port); DT_Mdep_printf("TransCmd.num_iterations : %d\n", cmd->num_iterations); DT_Mdep_printf("TransCmd.num_threads : %d\n", cmd->num_threads); DT_Mdep_printf("TransCmd.eps_per_thread : %d\n", cmd->eps_per_thread); DT_Mdep_printf("TransCmd.validate : %d\n", cmd->validate); DT_Mdep_printf("TransCmd.dapl_name : %s\n", cmd->dapl_name); DT_Mdep_printf("TransCmd.num_ops : %d\n", cmd->num_ops); for (i = 0; i < cmd->num_ops; i++) { DT_Mdep_printf("TransCmd.op[%d].transfer_type : %s %s\n", i, cmd->op[i].transfer_type == 0 ? "RDMA_READ" : cmd->op[i].transfer_type == 1 ? "RDMA_WRITE" : "SEND_RECV", cmd->op[i]. server_initiated ? " (server)" : " (client)"); DT_Mdep_printf("TransCmd.op[%d].seg_size : %d\n", i, cmd->op[i].seg_size); DT_Mdep_printf("TransCmd.op[%d].num_segs : %d\n", i, cmd->op[i].num_segs); DT_Mdep_printf("TransCmd.op[%d].reap_send_on_recv : %d\n", i, cmd->op[i].reap_send_on_recv); } } dapl-2.1.5/test/dapltest/common/000077500000000000000000000000001255317474200165405ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/common/dapl_endian.c000066400000000000000000000054711255317474200211510ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Endian_Init(void) { int endian; endian = 1; DT_local_is_little_endian = *((unsigned char *)(&endian)) == 1; } /* * Big/Little Endian conversion functions */ #define c1a32 ((DAT_UINT32)0x00FF00FF) #define c1b32 ((DAT_UINT32)0xFF00FF00) #define c2a32 ((DAT_UINT32)0x0000FFFF) #define c2b32 ((DAT_UINT32)0xFFFF0000) #define c164 ((DAT_UINT64)0x00FF00FF) #define c1a64 (c164 | (c164 << 32)) #define c1b64 (c1a64 << 8) #define c264 ((DAT_UINT64)0x0000FFFF) #define c2a64 (c264 | (c264 << 32)) #define c2b64 (c2a64 << 16) #define c3a64 ((DAT_UINT64)0xFFFFFFFF) #define c3b64 (c3a64 << 32) DAT_UINT32 DT_Endian32(DAT_UINT32 val) { if (DT_local_is_little_endian) { return val; } val = ((val & c1a32) << 8) | ((val & c1b32) >> 8); val = ((val & c2a32) << 16) | ((val & c2b32) >> 16); return (val); } DAT_UINT64 DT_Endian64(DAT_UINT64 val) { if (DT_local_is_little_endian) { return val; } val = ((val & c1a64) << 8) | ((val & c1b64) >> 8); val = ((val & c2a64) << 16) | ((val & c2b64) >> 16); val = ((val & c3a64) << 32) | ((val & c3b64) >> 32); return (val); } DAT_UINT32 DT_EndianMemHandle(DAT_UINT32 val) { val = ((val & c1a32) << 8) | ((val & c1b32) >> 8); val = ((val & c2a32) << 16) | ((val & c2b32) >> 16); return (val); } DAT_UINT64 DT_EndianMemAddress(DAT_UINT64 val) { DAT_UINT64 val64; val64 = val; val64 = ((val64 & c1a64) << 8) | ((val64 & c1b64) >> 8); val64 = ((val64 & c2a64) << 16) | ((val64 & c2b64) >> 16); val64 = ((val64 & c3a64) << 32) | ((val64 & c3b64) >> 32); return val64; } dapl-2.1.5/test/dapltest/common/dapl_global.c000066400000000000000000000025731255317474200211530ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" bool DT_local_is_little_endian; DAT_COUNT DT_dapltest_debug = 0; dapl-2.1.5/test/dapltest/common/dapl_performance_cmd_util.c000066400000000000000000000037771255317474200241030ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Performance_Cmd_Endian(Performance_Cmd_t * cmd) { cmd->dapltest_version = DT_Endian32(cmd->dapltest_version); cmd->qos = DT_Endian32(cmd->qos); cmd->num_iterations = DT_Endian32(cmd->num_iterations); cmd->debug = DT_Endian32(cmd->debug); cmd->op.transfer_type = DT_Endian32(cmd->op.transfer_type); cmd->op.seg_size = DT_Endian32(cmd->op.seg_size); cmd->op.num_segs = DT_Endian32(cmd->op.num_segs); } /* * * Map Performance_Mode_Type values to readable strings * */ const char *DT_PerformanceModeToString(Performance_Mode_Type mode) { if (BLOCKING_MODE == mode) { return "blocking"; } else if (POLLING_MODE == mode) { return "polling"; } else { return "error: unkown mode"; } } dapl-2.1.5/test/dapltest/common/dapl_quit_cmd_util.c000066400000000000000000000027071255317474200225540ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /*--------------------------------------------------------- */ void DT_Quit_Cmd_Endian(Quit_Cmd_t * cmd, bool to_wire) { /* do nothing */ } dapl-2.1.5/test/dapltest/common/dapl_transaction_cmd_util.c000066400000000000000000000044751255317474200241230ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Transaction_Cmd_Endian(Transaction_Cmd_t * cmd, bool to_wire) { unsigned int i; cmd->dapltest_version = DT_Endian32(cmd->dapltest_version); cmd->num_iterations = DT_Endian32(cmd->num_iterations); cmd->num_threads = DT_Endian32(cmd->num_threads); cmd->eps_per_thread = DT_Endian32(cmd->eps_per_thread); cmd->use_rsp = DT_Endian32(cmd->use_rsp); cmd->debug = DT_Endian32(cmd->debug); cmd->validate = DT_Endian32(cmd->validate); cmd->ReliabilityLevel = DT_Endian32(cmd->ReliabilityLevel); if (!to_wire) { cmd->num_ops = DT_Endian32(cmd->num_ops); } for (i = 0; i < cmd->num_ops; i++) { cmd->op[i].server_initiated = DT_Endian32(cmd->op[i].server_initiated); cmd->op[i].transfer_type = DT_Endian32(cmd->op[i].transfer_type); cmd->op[i].num_segs = DT_Endian32(cmd->op[i].num_segs); cmd->op[i].seg_size = DT_Endian32(cmd->op[i].seg_size); cmd->op[i].reap_send_on_recv = DT_Endian32(cmd->op[i].reap_send_on_recv); } if (to_wire) { cmd->num_ops = DT_Endian32(cmd->num_ops); } } dapl-2.1.5/test/dapltest/include/000077500000000000000000000000001255317474200166735ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/include/dapl_bpool.h000066400000000000000000000043661255317474200211700ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_BPOOL_H__ #define __DAPL_BPOOL_H__ #include "dapl_proto.h" typedef struct Bpool_tag Bpool; /* * struct Bpool */ struct Bpool_tag { unsigned char *alloc_ptr; DAT_UINT32 alloc_size; DAT_PZ_HANDLE pz_handle; DAT_COUNT seg_size; DAT_COUNT num_segs; /* num segments */ unsigned char *buffer_start; /* Start of buffer area */ DAT_VLEN buffer_size; /* Size of data buffer (rounded) */ DAT_VADDR reg_addr; /* start of registered area */ DAT_VLEN reg_size; /* size of registered area */ DAT_EP_HANDLE ep_handle; /* EP area is registered to */ DAT_LMR_HANDLE lmr_handle; /* local access */ DAT_LMR_CONTEXT lmr_context; DAT_LMR_TRIPLET*tripl_start; /* local IOV */ DAT_BOOLEAN enable_rdma_write; /* remote access */ DAT_BOOLEAN enable_rdma_read; DAT_RMR_HANDLE rmr_handle; DAT_RMR_CONTEXT rmr_context; DAT_EVD_HANDLE rmr_evd_handle; }; #endif dapl-2.1.5/test/dapltest/include/dapl_client_info.h000066400000000000000000000031231255317474200223340ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_CLIENT_INFO_H__ #define __DAPL_CLIENT_INFO_H__ #include "dapl_proto.h" #pragma pack (2) typedef struct { DAT_UINT32 dapltest_version; DAT_UINT32 is_little_endian; DAT_UINT32 test_type; DAT_UINT32 total_threads; } Client_Info_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_common.h000066400000000000000000000032531255317474200213370ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_COMMON_H__ #define __DAPL_COMMON_H__ #include "dapl_proto.h" #define SERVER_PORT_NUMBER ((DAT_CONN_QUAL)62000) typedef enum { RDMA_READ, RDMA_WRITE, SEND_RECV } DT_Transfer_Type; #pragma pack(1) typedef struct { DAT_RMR_CONTEXT rmr_context; DAT_CONTEXT mem_address; } RemoteMemoryInfo; #pragma pack() #endif /* __DAPL_COMMON_H__ */ dapl-2.1.5/test/dapltest/include/dapl_execute.h000066400000000000000000000027041255317474200215110ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_EXECUTE_H_ #define _DAPL_EXECUTE_H_ #include "dapl_proto.h" #include "dapl_params.h" DAT_RETURN DT_Execute_Test ( Params_t *params_ptr ) ; #endif dapl-2.1.5/test/dapltest/include/dapl_fft_cmd.h000066400000000000000000000037061255317474200214540ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_FFT_CMD_H__ #define __DAPL_FFT_CMD_H__ #include "dapl_proto.h" #define MAXCASES 100 typedef enum { NONE, HWCONN, CQMGT, ENDPOINT, PTAGMGT, MEMMGT, CONNMGT, CONNMGT_CLIENT, DATAXFER, DATAXFER_CLIENT, QUERYINFO, NS, ERRHAND, UNSUPP, STRESS, STRESS_CLIENT, } FFT_Type_e; typedef struct { FFT_Type_e fft_type; char device_name[256]; //-D char server_name[256]; bool cases_flag[MAXCASES]; int size; int num_iter; //-i int num_threads; //-t int num_vis; //-v DAT_QOS ReliabilityLevel; //-R DAT_CONN_QUAL port; /* -n */ } FFT_Cmd_t; #endif dapl-2.1.5/test/dapltest/include/dapl_fft_util.h000066400000000000000000000053321255317474200216630ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef DAPL_FFT_UTIL_H #define DAPL_FFT_UTIL_H #include "dapl_proto.h" #include "dapl_test_data.h" #define DT_assert_dat(test_num, x) if(x) ; \ else { \ DT_assert_fail(test_num, #x, __FILE__, __BASE_FILE__, __LINE__); \ DT_Tdep_PT_Printf(test_num,"Error = %d, %s\n", rc, DT_RetToString(rc)); \ res = 0; \ goto cleanup; \ } #define DT_assert(test_num, x) if(x) ; \ else { \ DT_assert_fail(test_num, #x, __FILE__, __BASE_FILE__, __LINE__); \ res = 0; \ goto cleanup; \ } #define DT_assert_clean(test_num, x) if(x) ; \ else { \ DT_assert_fail(test_num, #x, __FILE__, __BASE_FILE__, __LINE__); \ DT_Tdep_PT_Printf(test_num,"Error = %d, %s\n", rc, DT_RetToString(rc)); \ return 0; \ } typedef struct { DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_PSP_HANDLE psp_handle; DAT_EP_HANDLE ep_handle; DAT_EVD_HANDLE cr_evd, conn_evd, send_evd, recv_evd; DAT_EVENT event; DAT_COUNT count; DAT_CR_HANDLE cr_handle; Bpool *bpool; DAT_CR_ARRIVAL_EVENT_DATA cr_stat; DAT_EVENT_NUMBER event_num; DAT_IA_ADDRESS_PTR remote_netaddr; Per_Test_Data_t *pt_ptr; bool connected; } FFT_Connection_t; typedef enum { QUERY_CNO, QUERY_CR, QUERY_EP, QUERY_EVD, QUERY_IA, QUERY_LMR, QUERY_RMR, QUERY_PSP, QUERY_RSP, QUERY_PZ, } FFT_query_enum; typedef struct { int (*fun) (Params_t *params_ptr, FFT_Cmd_t* cmd); } FFT_Testfunc_t; #endif dapl-2.1.5/test/dapltest/include/dapl_getopt.h000066400000000000000000000033131255317474200213460ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_GETOPT_H__ #define __DAPL_GETOPT_H__ typedef struct { int magic; char *place; int opterr; int optind; int optopt; char *optarg; } mygetopt_t; /* function prototypes */ void DT_mygetopt_init (mygetopt_t * opts); int DT_mygetopt_r (int argc, char *const * argv, const char *ostr, mygetopt_t * opts); #endif dapl-2.1.5/test/dapltest/include/dapl_global.h000066400000000000000000000027251255317474200213120ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_GLOBAL_H__ #define __DAPL_GLOBAL_H__ #include "dapl_proto.h" extern DAT_COUNT DT_dapltest_debug; extern bool DT_local_is_little_endian; #endif dapl-2.1.5/test/dapltest/include/dapl_limit_cmd.h000066400000000000000000000040101255317474200220000ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_LIMIT_CMD_H__ #define __DAPL_LIMIT_CMD_H__ #include "dapl_proto.h" typedef enum { LIM_IA, LIM_PZ, #ifndef __KDAPLTEST__ LIM_CNO, #endif LIM_EVD, LIM_EP, LIM_RSP, LIM_PSP, LIM_LMR, LIM_RPOST, LIM_SIZE_LMR, /* add further tests here */ LIM_NUM_TESTS /* for array size & limit checks */ } Limit_Index; //------------------------------------- #pragma pack (2) typedef struct { char device_name[256]; /* -D */ DAT_QOS ReliabilityLevel; /* -R */ DAT_UINT32 width; /* -w */ DAT_UINT32 debug; /* -d */ DAT_UINT32 maximum; /* -m */ DAT_UINT32 Test_List[ LIM_NUM_TESTS ]; DAT_CONN_QUAL port; /* -n */ } Limit_Cmd_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_mdep.h000066400000000000000000000026631255317474200210000ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_MDEP_H__ #define __DAPL_MDEP_H__ #ifdef __KERNEL__ #include "dapl_mdep_kernel.h" #else #include "dapl_mdep_user.h" #endif #endif dapl-2.1.5/test/dapltest/include/dapl_memlist.h000066400000000000000000000033131255317474200215160ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_MEMLIST_H__ #define __DAPL_MEMLIST_H__ #include "dapl_proto.h" typedef enum { BPOOL, BUFF, PERTESTDATA, NIC, NETADDRESS, TRANSACTIONTEST, THREAD, EPCONTEXT } mem_type_e; struct Mem_list_entry { char filename[50]; mem_type_e MemType; void *mem_ptr; struct Mem_list_entry *next; }; typedef struct Mem_list_entry MemListEntry_t; #endif dapl-2.1.5/test/dapltest/include/dapl_params.h000066400000000000000000000043241255317474200213320ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_PARAMS_H__ #define __DAPL_PARAMS_H__ #include "dapl_proto.h" #include "dapl_server_cmd.h" #include "dapl_transaction_cmd.h" #include "dapl_performance_cmd.h" #include "dapl_limit_cmd.h" #include "dapl_quit_cmd.h" #include "dapl_fft_cmd.h" typedef enum { SERVER_TEST, TRANSACTION_TEST, PERFORMANCE_TEST, LIMIT_TEST, QUIT_TEST, FFT_TEST } test_type_e; typedef struct { test_type_e test_type; union { Server_Cmd_t Server_Cmd; Transaction_Cmd_t Transaction_Cmd; Performance_Cmd_t Performance_Cmd; Limit_Cmd_t Limit_Cmd; Quit_Cmd_t Quit_Cmd; FFT_Cmd_t FFT_Cmd; } u; /* Needed here due to structure of command processing */ DAT_QOS ReliabilityLevel; DAT_SOCK_ADDR server_netaddr; void * phead; bool local_is_little_endian; bool debug; double cpu_mhz; int server_port; } Params_t; #endif dapl-2.1.5/test/dapltest/include/dapl_performance_cmd.h000066400000000000000000000042701255317474200231730ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_PERFORMANCE_CMD_H__ #define __DAPL_PERFORMANCE_CMD_H__ #include "dapl_proto.h" #define NAME_SZ 256 typedef enum { BLOCKING_MODE, POLLING_MODE } Performance_Mode_Type; #pragma pack (2) typedef struct { DAT_UINT32 transfer_type; DAT_UINT32 seg_size; DAT_UINT32 num_segs; } Performance_Cmd_Op_t; typedef struct { DAT_UINT32 dapltest_version; DAT_UINT32 client_is_little_endian; char server_name[NAME_SZ]; /* -s */ char dapl_name[NAME_SZ]; /* -D */ DAT_QOS qos; DAT_UINT32 debug; /* -d */ Performance_Mode_Type mode; /* -m */ DAT_UINT32 num_iterations; /* -i */ DAT_UINT32 pipeline_len; /* -p */ Performance_Cmd_Op_t op; DAT_UINT32 use_rsp; /* -r */ DAT_CONN_QUAL port; /* -n */ } Performance_Cmd_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_performance_stats.h000066400000000000000000000043121255317474200235630ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_STATS_H__ #define __DAPL_STATS_H__ #include "dapl_proto.h" #define DT_min(a, b) ((a < b) ? (a) : (b)) #define DT_max(a, b) ((a > b) ? (a) : (b)) #define DT_whole(num) ((unsigned int)(num)) #define DT_hundredths(num) ((unsigned int)(((num) - (unsigned int)(num)) * 100)) typedef struct { unsigned int num; DT_Mdep_TimeStamp total_ts; DT_Mdep_TimeStamp max_ts; DT_Mdep_TimeStamp min_ts; } Performance_Stats_Data_t; typedef struct { unsigned int num_ops; int64_t bytes; unsigned int post_ctxt_switch_num; unsigned int reap_ctxt_switch_num; double cpu_utilization; DT_Mdep_TimeStamp time_ts; Performance_Stats_Data_t posts_sans_ctxt; Performance_Stats_Data_t posts_with_ctxt; Performance_Stats_Data_t reaps_sans_ctxt; Performance_Stats_Data_t reaps_with_ctxt; Performance_Stats_Data_t latency; } Performance_Stats_t; #endif dapl-2.1.5/test/dapltest/include/dapl_performance_test.h000066400000000000000000000060741255317474200234130ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_PERFORMANCE_TEST_H__ #define __DAPL_PERFORMANCE_TEST_H__ #include "dapl_proto.h" #include "dapl_tdep.h" #include "dapl_common.h" #include "dapl_test_data.h" #include "dapl_performance_cmd.h" #define DT_PERF_SYNC_SEND_BUFFER_ID 0 #define DT_PERF_SYNC_RECV_BUFFER_ID 1 #define DT_PERF_SYNC_BUFF_SIZE sizeof (RemoteMemoryInfo) #define DT_PERF_DFLT_EVD_LENGTH 8 typedef struct { DT_Transfer_Type transfer_type; DAT_UINT32 num_segs; DAT_UINT32 seg_size; Bpool *bp; /* RDMA info */ DAT_RMR_CONTEXT Rdma_Context; DAT_VADDR Rdma_Address; } Performance_Test_Op_t; typedef struct { DAT_EP_HANDLE ep_handle; DAT_EP_ATTR ep_attr; DAT_CONN_QUAL port; DAT_COUNT pipeline_len; Bpool *bp; Performance_Test_Op_t op; } Performance_Ep_Context_t; typedef struct { Per_Test_Data_t *pt_ptr; Performance_Cmd_t *cmd; DAT_IA_ADDRESS_PTR remote_ia_addr; DAT_BOOLEAN is_remote_little_endian; DAT_CONN_QUAL base_port; DAT_IA_ATTR ia_attr; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_CNO_HANDLE cno_handle; DAT_COUNT reqt_evd_length; DAT_EVD_HANDLE reqt_evd_hdl; /* request+rmr */ DAT_COUNT recv_evd_length; DAT_EVD_HANDLE recv_evd_hdl; /* receive */ DAT_COUNT conn_evd_length; DAT_EVD_HANDLE conn_evd_hdl; /* connect */ DAT_COUNT creq_evd_length; DAT_EVD_HANDLE creq_evd_hdl; /* "" request */ Performance_Ep_Context_t ep_context; } Performance_Test_t; #endif dapl-2.1.5/test/dapltest/include/dapl_proto.h000066400000000000000000000562211255317474200212150ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_PROTO_H__ #define __DAPL_PROTO_H__ #ifdef __KERNEL__ #include #else #include #include #include #include #include #endif #include "dapl_mdep.h" #include "dapl_tdep_print.h" #include "dapl_bpool.h" #include "dapl_client_info.h" #include "dapl_common.h" #include "dapl_client_info.h" #include "dapl_execute.h" #include "dapl_getopt.h" #include "dapl_global.h" #include "dapl_fft_cmd.h" #include "dapl_fft_util.h" #include "dapl_limit_cmd.h" #include "dapl_memlist.h" #include "dapl_params.h" #include "dapl_performance_stats.h" #include "dapl_performance_test.h" #include "dapl_quit_cmd.h" #include "dapl_server_info.h" #include "dapl_tdep.h" #include "dapl_test_data.h" #include "dapl_transaction_cmd.h" #include "dapl_transaction_test.h" #include "dapl_transaction_stats.h" #include "dapl_version.h" #define DAT_ERROR(Type,SubType) ((DAT_RETURN)(DAT_CLASS_ERROR | Type | SubType)) /* * Prototypes */ /* dapl_bpool.c */ Bpool * DT_BpoolAlloc (Per_Test_Data_t * pt_ptr, DT_Tdep_Print_Head* phead, DAT_IA_HANDLE ia_handle, DAT_PZ_HANDLE pz_handle, DAT_EP_HANDLE ep_handle, DAT_EVD_HANDLE rmr_evd_handle, DAT_COUNT seg_size, DAT_COUNT num_segs, DAT_COUNT alignment, DAT_BOOLEAN enable_rdma_write, DAT_BOOLEAN enable_rdma_read); bool DT_Bpool_Destroy (Per_Test_Data_t * pt_ptr, DT_Tdep_Print_Head *phead, Bpool * bpool_ptr); unsigned char *DT_Bpool_GetBuffer (Bpool * bpool_ptr, int index); DAT_COUNT DT_Bpool_GetBuffSize (Bpool * bpool_ptr, int index); DAT_LMR_TRIPLET *DT_Bpool_GetIOV (Bpool * bpool_ptr, int index); DAT_LMR_CONTEXT DT_Bpool_GetLMR (Bpool * bpool_ptr, int index); DAT_RMR_CONTEXT DT_Bpool_GetRMR (Bpool * bpool_ptr, int index); void DT_Bpool_print (DT_Tdep_Print_Head* phead, Bpool *bpool_ptr); /* dapl_cnxn.c */ int get_ep_connection_state (DT_Tdep_Print_Head* phead, DAT_EP_HANDLE ep_handle); /* dapl_client.c */ DAT_RETURN DT_cs_Client (Params_t * params_ptr, char *dapl_name, char *server_name, DAT_UINT32 total_threads); /* dapl_client_info.c */ void DT_Client_Info_Endian (Client_Info_t * client_info); void DT_Client_Info_Print (DT_Tdep_Print_Head *phead, Client_Info_t * client_info); /* dapl_transaction_stats.c */ void DT_init_transaction_stats (Transaction_Stats_t * transaction_stats, unsigned int nums); void DT_transaction_stats_set_ready (DT_Tdep_Print_Head* phead, Transaction_Stats_t* transaction_stats); void DT_transaction_stats2_set_ready (DT_Tdep_Print_Head* phead, Transaction_Stats_t* transaction_stats); bool DT_transaction_stats_wait_for_all (DT_Tdep_Print_Head* phead, Transaction_Stats_t* transaction_stats); bool DT_transaction_stats2_wait_for_all (DT_Tdep_Print_Head* phead, Transaction_Stats_t* transaction_stats); void DT_update_transaction_stats (Transaction_Stats_t * transaction_stats, unsigned int num_ops, unsigned int time_ms, unsigned int bytes_send, unsigned int bytes_recv, unsigned int bytes_rdma_read, unsigned int bytes_rdma_write); void DT_print_transaction_stats (DT_Tdep_Print_Head* phead, Transaction_Stats_t* transaction_stats, unsigned int num_threads, unsigned int num_EPs); /* dapl_endian.c */ void DT_Endian_Init (void); DAT_UINT32 DT_Endian32 (DAT_UINT32 val); DAT_UINT64 DT_Endian64 (DAT_UINT64 val); DAT_UINT32 DT_EndianMemHandle (DAT_UINT32 val); DAT_UINT64 DT_EndianMemAddress (DAT_UINT64 val); /* dapl_getopt.c */ void DT_mygetopt_init (mygetopt_t * opts); int DT_mygetopt_r (int argc, char *const * argv, const char *ostr, mygetopt_t * opts); /* dapl_main.c */ int main (int argc, char *argv[]); int dapltest (int argc, char *argv[]); void Dapltest_Main_Usage (void); /* dapl_mdep.c */ void DT_Mdep_Init (void); void DT_Mdep_End (void); bool DT_Mdep_GetDefaultDeviceName (char *dapl_name); void DT_Mdep_Sleep (int msec); void DT_Mdep_Schedule (void); bool DT_Mdep_GetCpuStat (DT_CpuStat *sys_stat); unsigned long DT_Mdep_GetTime (void); double DT_Mdep_GetCpuMhz (void); unsigned long DT_Mdep_GetContextSwitchNum (void); void *DT_Mdep_Malloc (size_t l_); void DT_Mdep_Free (void *a_); bool DT_Mdep_LockInit (DT_Mdep_LockType * lock_ptr); void DT_Mdep_LockDestroy (DT_Mdep_LockType * lock_ptr); void DT_Mdep_Lock (DT_Mdep_LockType * lock_ptr); void DT_Mdep_Unlock (DT_Mdep_LockType * lock_ptr); void DT_Mdep_Thread_Init_Attributes (Thread * thread_ptr); void DT_Mdep_Thread_Destroy_Attributes (Thread * thread_ptr); bool DT_Mdep_Thread_Start (Thread * thread_ptr); void DT_Mdep_Thread_Detach (DT_Mdep_ThreadHandleType thread_id); DT_Mdep_ThreadHandleType DT_Mdep_Thread_SELF ( void ); void DT_Mdep_Thread_EXIT ( void * thread_handle ); int DT_Mdep_wait_object_init ( IN DT_WAIT_OBJECT *wait_obj); int DT_Mdep_wait_object_wait ( IN DT_WAIT_OBJECT *wait_obj, IN int timeout_val); int DT_Mdep_wait_object_wakeup ( IN DT_WAIT_OBJECT *wait_obj); int DT_Mdep_wait_object_destroy ( IN DT_WAIT_OBJECT *wait_obj); DT_Mdep_Thread_Start_Routine_Return_Type DT_Mdep_Thread_Start_Routine (void *thread_handle); /* dapl_memlist.c */ void DT_MemListInit (Per_Test_Data_t * pt_ptr); void *DT_MemListAlloc (Per_Test_Data_t * pt_ptr, char *file, mem_type_e t, int size); void DT_MemListFree (Per_Test_Data_t * pt_ptr, void *ptr); void DT_PrintMemList (Per_Test_Data_t * pt_ptr); /* dapl_netaddr.c */ bool DT_NetAddrLookupHostAddress (DAT_IA_ADDRESS_PTR to_netaddr, char *hostname); DAT_IA_ADDRESS_PTR DT_NetAddrAlloc (Per_Test_Data_t * pt_ptr); void DT_NetAddrFree (Per_Test_Data_t * pt_ptr, DAT_IA_ADDRESS_PTR netaddr); /* dapl_params.c */ bool DT_Params_Parse (int argc, char *argv[], Params_t * params_ptr); /* dapl_performance_cmd.c */ const char * DT_PerformanceModeToString (Performance_Mode_Type mode); bool DT_Performance_Cmd_Init (Performance_Cmd_t * cmd); bool DT_Performance_Cmd_Parse (Performance_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts); void DT_Performance_Cmd_Print (Performance_Cmd_t * cmd); void DT_Performance_Cmd_PT_Print (DT_Tdep_Print_Head* phead, Performance_Cmd_t * cmd); void DT_Performance_Cmd_Endian (Performance_Cmd_t * cmd); /* dapl_performance_client.c */ DAT_RETURN DT_Performance_Test_Client ( Params_t *params_ptr, Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_IA_ADDRESS_PTR remote); bool DT_Performance_Test_Client_Connect ( DT_Tdep_Print_Head *phead, Performance_Test_t * test_ptr); bool DT_Performance_Test_Client_Exchange ( Params_t *params_ptr, DT_Tdep_Print_Head *phead, Performance_Test_t *test_ptr ); /* dapl_performance_server.c */ void DT_Performance_Test_Server (void * pt_ptr); bool DT_Performance_Test_Server_Connect ( DT_Tdep_Print_Head *phead, Performance_Test_t * test_ptr); bool DT_Performance_Test_Server_Exchange ( DT_Tdep_Print_Head *phead, Performance_Test_t *test_ptr); /* dapl_performance_util.c */ bool DT_Performance_Test_Create (Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_IA_ADDRESS_PTR remote_ia_addr, DAT_BOOLEAN is_server, DAT_BOOLEAN is_remote_little_endian, Performance_Test_t **perf_test); void DT_Performance_Test_Destroy (Per_Test_Data_t * pt_ptr, Performance_Test_t *test_ptr, DAT_BOOLEAN is_server); bool DT_performance_post_rdma_op (Performance_Ep_Context_t *ep_context, DAT_EVD_HANDLE reqt_evd_hdl, Performance_Stats_t *stats); unsigned int DT_performance_reap (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, Performance_Mode_Type mode, Performance_Stats_t *stats); unsigned int DT_performance_wait (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, Performance_Stats_t *stats); unsigned int DT_performance_poll (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, Performance_Stats_t *stats); /* dapl_performance_stats.c */ void DT_performance_stats_init (Performance_Stats_t * stats); void DT_performance_stats_record_post (Performance_Stats_t *stats, unsigned long ctxt_switch_num, DT_Mdep_TimeStamp ts); void DT_performance_stats_record_reap (Performance_Stats_t *stats, unsigned long ctxt_switch_num, DT_Mdep_TimeStamp ts); void DT_performance_stats_record_latency (Performance_Stats_t *stats, DT_Mdep_TimeStamp ts); void DT_performance_stats_data_combine (Performance_Stats_Data_t * dest, Performance_Stats_Data_t * src_a, Performance_Stats_Data_t * src_b); void DT_performance_stats_combine (Performance_Stats_t * dest, Performance_Stats_t * src_a, Performance_Stats_t * src_b); double DT_performance_stats_data_print (DT_Tdep_Print_Head* phead, Performance_Stats_Data_t* data, double cpu_mhz); void DT_performance_stats_print (Params_t * params_ptr, DT_Tdep_Print_Head* phead, Performance_Stats_t * stats, Performance_Cmd_t * cmd, Performance_Test_t * test); /* dapl_server.c */ void DT_cs_Server (Params_t * params_ptr); /* dapl_server_cmd.c */ void DT_Server_Cmd_Init (Server_Cmd_t * Server_Cmd); bool DT_Server_Cmd_Parse (Server_Cmd_t * Server_Cmd, int my_argc, char **my_argv, mygetopt_t * opts); void DT_Server_Cmd_Print (Server_Cmd_t * Server_Cmd); void DT_Server_Cmd_PT_Print (DT_Tdep_Print_Head* phead, Server_Cmd_t * Server_Cmd); void DT_Server_Cmd_Usage (void); /* dapl_server_info.c */ void DT_Server_Info_Endian (Server_Info_t * server_info); void DT_Server_Info_Print (DT_Tdep_Print_Head* phead, Server_Info_t * server_info); /* dapl_test_data.c */ Per_Test_Data_t *DT_Alloc_Per_Test_Data (DT_Tdep_Print_Head* phead); void DT_Free_Per_Test_Data (Per_Test_Data_t * pt_ptr); /* dapl_test_util.c */ DAT_BOOLEAN DT_query (Per_Test_Data_t *pt_ptr, DAT_IA_HANDLE ia_handle, DAT_EP_HANDLE ep_handle); DAT_BOOLEAN DT_post_recv_buffer (DT_Tdep_Print_Head* phead, DAT_EP_HANDLE ep_handle, Bpool * bp, int index, int size); DAT_BOOLEAN DT_post_send_buffer (DT_Tdep_Print_Head* phead, DAT_EP_HANDLE ep_handle, Bpool * bp, int index, int size); bool DT_conn_event_wait (DT_Tdep_Print_Head* phead, DAT_EP_HANDLE ep_handle, DAT_EVD_HANDLE evd_handle, DAT_EVENT_NUMBER *event_number); bool DT_disco_event_wait ( DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, DAT_EP_HANDLE *ep_handle ); bool DT_cr_event_wait (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, DAT_CR_ARRIVAL_EVENT_DATA *cr_stat_p); bool DT_dto_event_reap (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, bool poll, DAT_DTO_COMPLETION_EVENT_DATA *dtop); bool DT_dto_event_wait (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, DAT_DTO_COMPLETION_EVENT_DATA *dtop); bool DT_dto_event_poll (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, DAT_DTO_COMPLETION_EVENT_DATA *dtop); bool DT_rmr_event_wait (DT_Tdep_Print_Head* phead, DAT_EVD_HANDLE evd_handle, DAT_RMR_BIND_COMPLETION_EVENT_DATA *rmr_ptr); bool DT_dto_check ( DT_Tdep_Print_Head* phead, DAT_DTO_COMPLETION_EVENT_DATA *dto_p, DAT_EP_HANDLE ep_expected, DAT_COUNT len_expected, DAT_DTO_COOKIE cookie_expected, char *message); bool DT_rmr_check ( DT_Tdep_Print_Head* phead, DAT_RMR_BIND_COMPLETION_EVENT_DATA*rmr_p, DAT_RMR_HANDLE rmr_expected, DAT_PVOID cookie_expected, char *message); bool DT_cr_check (DT_Tdep_Print_Head* phead, DAT_CR_ARRIVAL_EVENT_DATA *cr_stat_p, DAT_PSP_HANDLE psp_handle_expected, DAT_CONN_QUAL port_expected, DAT_CR_HANDLE *cr_handlep, char *message); /* dapl_thread.c */ void DT_Thread_Init (Per_Test_Data_t * pt_ptr); void DT_Thread_End (Per_Test_Data_t * pt_ptr); Thread *DT_Thread_Create (Per_Test_Data_t * pt_ptr, void (*fn) (void *), void *param, unsigned int stacksize); void DT_Thread_Destroy (Thread * thread_ptr, Per_Test_Data_t * pt_ptr); bool DT_Thread_Start (Thread * thread_ptr); /* dapl_quit_cmd.c */ void DT_Quit_Cmd_Init (Quit_Cmd_t * cmd); bool DT_Quit_Cmd_Parse (Quit_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts); bool DT_Quit_Cmd_Validate (Quit_Cmd_t * cmd); void DT_Quit_Cmd_Endian (Quit_Cmd_t * cmd, bool to_wire); void DT_Quit_Cmd_Print (Quit_Cmd_t * cmd); void DT_Quit_Cmd_PT_Print (DT_Tdep_Print_Head *phead, Quit_Cmd_t * cmd); void DT_Quit_Cmd_Usage (void); /* dapl_transaction_cmd.c */ void DT_Transaction_Cmd_Init (Transaction_Cmd_t * cmd); bool DT_Transaction_Cmd_Parse (Transaction_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts); void DT_Transaction_Cmd_Print (Transaction_Cmd_t * cmd); void DT_Transaction_Cmd_PT_Print (DT_Tdep_Print_Head* phead, Transaction_Cmd_t * cmd); void DT_Transaction_Cmd_Endian (Transaction_Cmd_t * cmd, bool to_wire); /* dapl_transaction_test.c */ DAT_RETURN DT_Transaction_Test_Client (Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE ia_handle, DAT_IA_ADDRESS_PTR remote); void DT_Transaction_Test_Server (void *params); bool DT_Transaction_Create_Test (Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_BOOLEAN is_server, unsigned int port_num, DAT_BOOLEAN remote_is_little_endian, DAT_IA_ADDRESS_PTR remote_ia_addr); void DT_Transaction_Main (void *param); bool DT_Transaction_Run (DT_Tdep_Print_Head* phead, Transaction_Test_t * test_ptr); void DT_Transaction_Validation_Fill (DT_Tdep_Print_Head* phead, Transaction_Test_t * test_ptr, unsigned int iteration); bool DT_Transaction_Validation_Check (DT_Tdep_Print_Head* phead, Transaction_Test_t * test_ptr, int iteration); void DT_Print_Transaction_Test (DT_Tdep_Print_Head* phead, Transaction_Test_t* test_ptr); void DT_Print_Transaction_Stats (DT_Tdep_Print_Head* phead, Transaction_Test_t* test_ptr); /* dapl_transaction_util.c */ bool DT_handle_post_recv_buf (DT_Tdep_Print_Head* phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx); bool DT_handle_send_op (DT_Tdep_Print_Head* phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx, bool poll); bool DT_handle_recv_op (DT_Tdep_Print_Head* phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx, bool poll, bool repost_recv); bool DT_handle_rdma_op (DT_Tdep_Print_Head* phead, Ep_Context_t * ep_context, unsigned int num_eps, DT_Transfer_Type opcode, int op_indx, bool poll); bool DT_check_params (Per_Test_Data_t *pt_ptr, char *module); void DT_Test_Error (void); /* dapl_util.c */ const char *DT_RetToString (DAT_RETURN ret_value); const char *DT_TransferTypeToString (DT_Transfer_Type type); const char *DT_AsyncErr2Str (DAT_EVENT_NUMBER error_code); const char *DT_EventToSTr (DAT_EVENT_NUMBER event_code); const char *DT_State2Str (DAT_EP_STATE state_code); DAT_QOS DT_ParseQoS (char *arg); unsigned char *DT_AlignPtr (void * val, DAT_COUNT align); DAT_COUNT DT_RoundSize (DAT_COUNT val, DAT_COUNT align); /* dapl_limit_cmd.c */ void DT_Limit_Cmd_Init ( Limit_Cmd_t * cmd); bool DT_Limit_Cmd_Parse ( Limit_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts); void DT_Limit_Cmd_Usage (void); /* dapl_limit.c */ DAT_RETURN DT_cs_Limit (Params_t *params, Limit_Cmd_t * cmd); /* dapl_fft_cmd.c */ void DT_FFT_Cmd_Init ( FFT_Cmd_t * cmd); bool DT_FFT_Cmd_Parse ( FFT_Cmd_t * cmd, int my_argc, char **my_argv, mygetopt_t * opts); void DT_FFT_Cmd_Usage (void); /* dapl_fft_test.c */ DAT_RETURN DT_cs_FFT (Params_t *params, FFT_Cmd_t * cmd); /* dapl_fft_hwconn.c */ void DT_hwconn_test (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case2 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case3 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case4 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case5 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case6 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_hwconn_case7 (Params_t *params_ptr, FFT_Cmd_t *cmd); /* dapl_fft_endpoint.c */ void DT_endpoint_test (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_endpoint_generic (Params_t *params_ptr, FFT_Cmd_t *cmd, bool destroy_pz_early); int DT_endpoint_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_endpoint_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_endpoint_case2 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_endpoint_case3 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_endpoint_case4 (Params_t *params_ptr, FFT_Cmd_t *cmd); /* dapl_fft_pz.c */ void DT_pz_test (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case2 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case3 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case4 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case5 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_pz_case6 (Params_t *params_ptr, FFT_Cmd_t *cmd); /* dapl_fft_util.c */ void DT_assert_fail (DT_Tdep_Print_Head* phead, char *exp, char *file, char *baseFile, int line); int DT_ia_open (DAT_NAME_PTR dev_name, DAT_IA_HANDLE *ia_handle); int DT_ep_create (Params_t *params_ptr, DAT_IA_HANDLE ia_handle, DAT_PZ_HANDLE pz_handle, DAT_EVD_HANDLE *cr_evd, DAT_EVD_HANDLE *conn_evd, DAT_EVD_HANDLE *send_evd, DAT_EVD_HANDLE *recv_evd, DAT_EP_HANDLE *ep_handle); void DT_fft_init_conn_struct (FFT_Connection_t *conn); void DT_fft_init_client (Params_t *params_ptr, FFT_Cmd_t *cmd, FFT_Connection_t *conn); int DT_fft_destroy_conn_struct (Params_t *params_ptr, FFT_Connection_t *conn); void DT_fft_init_server (Params_t *params_ptr, FFT_Cmd_t *cmd, FFT_Connection_t *conn); void DT_fft_listen (Params_t *params_ptr, FFT_Connection_t *conn); int DT_fft_connect (Params_t *params_ptr, FFT_Connection_t *conn); /* dapl_fft_connmgt.c */ int DT_connmgt_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_connmgt_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); void DT_connmgt_test (Params_t *params_ptr, FFT_Cmd_t *cmd); /* dapl_fft_mem.c */ int DT_mem_generic (Params_t *params_ptr, FFT_Cmd_t *cmd, int flag); int DT_mem_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_mem_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_mem_case2 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_mem_case3 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_mem_case4 (Params_t *params_ptr, FFT_Cmd_t *cmd); void DT_mem_test (Params_t *params_ptr, FFT_Cmd_t *cmd); /* dapl_fft_queryinfo.c */ int DT_queryinfo_basic (Params_t *params_ptr, FFT_Cmd_t *cmd, FFT_query_enum object_to_query, DAT_RETURN result_wanted); int DT_queryinfo_case0 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case1 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case2 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case3 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case4 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case5 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case6 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case7 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case8 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case9 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case10 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case11 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case12 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case13 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case14 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case15 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case16 (Params_t *params_ptr, FFT_Cmd_t *cmd); int DT_queryinfo_case17 (Params_t *params_ptr, FFT_Cmd_t *cmd); void DT_queryinfo_test (Params_t *params_ptr, FFT_Cmd_t *cmd); #endif /* __DAPL_PROTO_H__ */ dapl-2.1.5/test/dapltest/include/dapl_quit_cmd.h000066400000000000000000000031641255317474200216550ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_QUIT_CMD_H__ #define __DAPL_QUIT_CMD_H__ #pragma pack (2) typedef struct { char server_name[256]; /* -s */ char device_name[256]; /* -D */ DAT_UINT32 debug; /* -d */ DAT_QOS ReliabilityLevel; /* -R */ DAT_CONN_QUAL port; /* -n */ } Quit_Cmd_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_server_cmd.h000066400000000000000000000031321255317474200221740ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_SERVER_CMD_H__ #define __DAPL_SERVER_CMD_H__ #pragma pack (2) typedef struct { bool debug; /* -d */ char dapl_name[256]; /* -D device name */ DAT_QOS ReliabilityLevel; /* -R */ DAT_CONN_QUAL port; /* -n */ } Server_Cmd_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_server_info.h000066400000000000000000000033751255317474200223750ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_SERVER_INFO_H__ #define __DAPL_SERVER_INFO_H__ #include "dapl_proto.h" #pragma pack (2) struct started_server { char devicename[256]; struct started_server *next; }; typedef struct started_server Started_server_t; extern Started_server_t *DT_started_server_list; typedef struct { DAT_UINT32 dapltest_version; DAT_UINT32 is_little_endian; DAT_UINT32 first_port_number; } Server_Info_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_tdep.h000066400000000000000000000046301255317474200210030ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_TDEP_H_ #define _DAPL_TDEP_H_ #include "dapl_proto.h" #ifdef __KDAPL__ typedef DAT_HANDLE DAT_CNO_HANDLE; #endif /* function prototypes */ void DT_Tdep_Init ( void ) ; void DT_Tdep_End ( void ) ; DAT_RETURN DT_Tdep_Execute_Test ( Params_t *params_ptr ) ; DAT_RETURN DT_Tdep_lmr_create (DAT_IA_HANDLE ia_handle, DAT_MEM_TYPE mem_type, DAT_REGION_DESCRIPTION region, DAT_VLEN len, DAT_PZ_HANDLE pz_handle, DAT_MEM_PRIV_FLAGS priv_flag, DAT_LMR_HANDLE *lmr_handle_ptr, DAT_LMR_CONTEXT *lmr_context_ptr, DAT_RMR_CONTEXT *rmr_context_ptr, DAT_VLEN *reg_size_ptr, DAT_VADDR *reg_addr_ptr); DAT_RETURN DT_Tdep_evd_create (DAT_IA_HANDLE ia_handle, DAT_COUNT evd_min_qlen, DAT_CNO_HANDLE cno_handle, DAT_EVD_FLAGS evd_flags, DAT_EVD_HANDLE *evd_handle_ptr); DAT_RETURN DT_Tdep_evd_free (DAT_EVD_HANDLE evd_handle); DAT_RETURN DT_Tdep_evd_wait (DAT_EVD_HANDLE evd_handle, DAT_TIMEOUT timeout, DAT_EVENT *event); DAT_RETURN DT_Tdep_evd_dequeue (DAT_EVD_HANDLE evd_handle, DAT_EVENT *event); #endif dapl-2.1.5/test/dapltest/include/dapl_tdep_print.h000066400000000000000000000042011255317474200222110ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef _DAPL_TDEP_PRINT_H_ #define _DAPL_TDEP_PRINT_H_ #define DT_Tdep_PT_Debug(N, _X_) \ do { \ if (DT_dapltest_debug >= (N)) \ { \ DT_Tdep_PT_Printf _X_; \ } \ } while (0) #ifdef __KERNEL__ typedef struct Tdep_Print_Entry_Tag { struct Tdep_Print_Entry_Tag *next; char buffer[PRINT_MAX]; } Tdep_Print_Entry; typedef struct DT_Tdep_Print_Head_Tag { int instance; struct DT_Tdep_Print_Head_Tag *next; Tdep_Print_Entry *head; Tdep_Print_Entry *tail; DT_Mdep_LockType lock; DT_WAIT_OBJECT wait_object; } DT_Tdep_Print_Head; void DT_Tdep_PT_Printf (DT_Tdep_Print_Head *phead, const char * fmt, ...); #else typedef void * DT_Tdep_Print_Head; void DT_Tdep_PT_Printf (DT_Tdep_Print_Head *phead, const char * fmt, ...); #endif #endif dapl-2.1.5/test/dapltest/include/dapl_test_data.h000066400000000000000000000070121255317474200220140ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_TEST_DATA_H__ #define __DAPL_TEST_DATA_H__ #include "dapl_proto.h" #include "dapl_bpool.h" #include "dapl_client_info.h" #include "dapl_transaction_stats.h" #include "dapl_memlist.h" #include "dapl_params.h" #include "dapl_server_info.h" /* This lock allows the client side to run * in a shell script loop without breaking * connections. Remove it and due to timing * problems on the server side occasionally * the server will reject connections. */ extern DT_Mdep_LockType g_PerfTestLock; /* * check memory leaking extern int alloc_count ; extern * DT_Mdep_LockType Alloc_Count_Lock; */ typedef struct { int NextPortNumber; int num_clients; DT_Mdep_LockType num_clients_lock; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_EVD_HANDLE recv_evd_hdl; DAT_EVD_HANDLE reqt_evd_hdl; DAT_EVD_HANDLE conn_evd_hdl; DAT_EVD_HANDLE creq_evd_hdl; DAT_EVD_HANDLE async_evd_hdl; DAT_EVD_HANDLE rmr_evd_hdl; DAT_EP_HANDLE ep_handle; DAT_PSP_HANDLE psp_handle; Bpool *bpool; } Per_Server_Data_t; typedef struct { DT_Mdep_LockType MemListLock; MemListEntry_t *MemListHead; DT_Mdep_LockType Thread_counter_lock; int Thread_counter; Thread *thread; bool local_is_server; Server_Info_t Server_Info; Client_Info_t Client_Info; Params_t Params; DAT_IA_ATTR ia_attr; DAT_PROVIDER_ATTR provider_attr; DAT_EP_ATTR ep_attr; Per_Server_Data_t *ps_ptr; Transaction_Stats_t Client_Stats; /* synchronize the server with the server's spawned test thread. * That test thread uses a PSP that only one test at a time can * use. If we don't synchronize access between the teardown and * creation of that PSP then the client will fail to connect * randomly, a symptom that the server is not coordinated with * its test threads. Remove this at your own peril, or if you * really want your test client to experience rejection on a * random but regular basis. */ DT_WAIT_OBJECT synch_wait_object; int Countdown_Counter; } Per_Test_Data_t; #endif dapl-2.1.5/test/dapltest/include/dapl_transaction_cmd.h000066400000000000000000000045701255317474200232220ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_TRANSACTION_CMD_H__ #define __DAPL_TRANSACTION_CMD_H__ #include "dapl_proto.h" #define MAX_OPS 100 #define NAME_SZ 256 #pragma pack (2) typedef struct { DAT_UINT32 server_initiated; DAT_UINT32 transfer_type; DAT_UINT32 num_segs; DAT_UINT32 seg_size; DAT_UINT32 reap_send_on_recv; } Transaction_Cmd_Op_t; typedef struct { DAT_UINT32 dapltest_version; DAT_UINT32 client_is_little_endian; char server_name[NAME_SZ]; /* -s */ DAT_UINT32 num_iterations; /* -i */ DAT_UINT32 num_threads; /* -t */ DAT_UINT32 eps_per_thread; /* -w */ DAT_UINT32 use_cno; /* NOT USED - remove and bump version*/ DAT_UINT32 use_rsp; /* -r */ DAT_UINT32 debug; /* -d */ DAT_UINT32 validate; /* -V */ DAT_UINT32 poll; /* -P */ DAT_CONN_QUAL port; /* -n */ char dapl_name[NAME_SZ]; /* -D */ DAT_QOS ReliabilityLevel; DAT_UINT32 num_ops; Transaction_Cmd_Op_t op[MAX_OPS]; } Transaction_Cmd_t; #pragma pack () #endif dapl-2.1.5/test/dapltest/include/dapl_transaction_stats.h000066400000000000000000000034361255317474200236150ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_TRANSACTION_STATS_H__ #define __DAPL_TRANSACTION_STATS_H__ #include "dapl_proto.h" #define whole(num) ((unsigned int)(num)) #define hundredths(num) ((unsigned int)(((num) - (unsigned int)(num)) * 100)) typedef struct { DT_Mdep_LockType lock; unsigned int wait_count; unsigned int num_ops; unsigned int time_ms; unsigned int bytes_send; unsigned int bytes_recv; unsigned int bytes_rdma_read; unsigned int bytes_rdma_write; } Transaction_Stats_t; #endif dapl-2.1.5/test/dapltest/include/dapl_transaction_test.h000066400000000000000000000066521255317474200234410ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_TRANSACTION_TEST_H__ #define __DAPL_TRANSACTION_TEST_H__ #include "dapl_proto.h" #include "dapl_common.h" #include "dapl_test_data.h" #include "dapl_transaction_cmd.h" typedef struct { DAT_BOOLEAN server_initiated; DT_Transfer_Type transfer_type; DAT_UINT32 num_segs; DAT_UINT32 seg_size; DAT_BOOLEAN reap_send_on_recv; Bpool *bp; /* RDMA info */ DAT_RMR_CONTEXT Rdma_Context; DAT_VADDR Rdma_Address; } Transaction_Test_Op_t; typedef struct { DAT_EP_HANDLE ep_handle; DAT_EP_ATTR ep_attr; DAT_CONN_QUAL ia_port; Bpool *bp; Transaction_Test_Op_t op[ MAX_OPS ]; DAT_RSP_HANDLE rsp_handle; DAT_PSP_HANDLE psp_handle; DAT_EVD_HANDLE recv_evd_hdl; /* receive */ DAT_EVD_HANDLE reqt_evd_hdl; /* request+rmr */ DAT_EVD_HANDLE conn_evd_hdl; /* connect */ DAT_EVD_HANDLE creq_evd_hdl; /* "" request */ } Ep_Context_t; typedef struct { unsigned int stat_bytes_send; unsigned int stat_bytes_recv; unsigned int stat_bytes_rdma_read; unsigned int stat_bytes_rdma_write; unsigned int start_time; unsigned int end_time; } Transaction_Test_Stats_t; typedef struct { /* This group set up by DT_Transaction_Create_Test() */ DAT_BOOLEAN is_server; DAT_BOOLEAN remote_is_little_endian; Per_Test_Data_t *pt_ptr; DAT_IA_HANDLE ia_handle; Transaction_Cmd_t *cmd; DAT_IA_ADDRESS_PTR remote_ia_addr; DAT_CONN_QUAL base_port; DAT_TIMEOUT time_out; DAT_COUNT evd_length; Thread *thread; /* This group set up by each thread in DT_Transaction_Main() */ DAT_PZ_HANDLE pz_handle; Ep_Context_t *ep_context; /* Statistics set by DT_Transaction_Run() */ Transaction_Test_Stats_t stats; } Transaction_Test_t; #endif dapl-2.1.5/test/dapltest/include/dapl_version.h000066400000000000000000000027571255317474200215440ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_VERSION_H #define __DAPL_VERSION_H /* * Dapltest version number * * This should be bumped everytime the "cross-the-wire" behavior changes. */ #define DAPLTEST_VERSION 0x00000006 #endif dapl-2.1.5/test/dapltest/mdep/000077500000000000000000000000001255317474200161755ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/mdep/linux/000077500000000000000000000000001255317474200173345ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/mdep/linux/dapl_mdep_user.c000066400000000000000000000265761255317474200225030ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_mdep.h" #include "dapl_proto.h" #include /* needed for pthread_atfork() */ #include #include /* needed for getenv() */ #include /* needed for thread setup */ #include #include #include #include #include #include #include #include /* for printf */ #include #include #include /* for getaddrinfo */ /* * Include files for setting up a network name */ #include #include #include #include static FILE *Stat_Fp = NULL; # define DT_STAT_FILE "/proc/stat" #include "dapl_test_data.h" /* for alloc_count */ /* * Machine dependant initialization */ void DT_Mdep_Init(void) { Stat_Fp = fopen(DT_STAT_FILE, "r"); if (NULL == Stat_Fp) { perror("fopen of " DT_STAT_FILE " failed"); exit(1); } } /* * Machine dependant deinitialization */ void DT_Mdep_End(void) { if (0 != fclose(Stat_Fp)) { perror("fclose of " DT_STAT_FILE " failed"); exit(1); } } /* * Generate name of IB device */ bool DT_Mdep_GetDefaultDeviceName(char *dapl_name) { strcpy(dapl_name, DT_MdepDeviceName); return true; } /* * Sleep specified number of milliseconds */ void DT_Mdep_Sleep(int msec) { struct timespec t; t.tv_sec = msec / 1000; /* Whole seconds */ t.tv_nsec = (msec % 1000) * 1000 * 1000; nanosleep(&t, 0); } void DT_Mdep_Schedule(void) { /* nothing here */ } /* * Get system statistics including uptime and idle time */ bool DT_Mdep_GetCpuStat(DT_CpuStat * cpu_stat) { #define DT_CPU_STAT_STR "cpu" #define DT_CPU_STAT_BUFFER_SIZE 1024 #define DT_CPU_STAT_DELIMITER " " static char buffer[DT_CPU_STAT_BUFFER_SIZE]; cpu_stat->user = 0; cpu_stat->system = 0; cpu_stat->idle = 0; if (0 != fflush(Stat_Fp)) { perror("fflush of " DT_STAT_FILE " failed"); exit(1); } for (;;) { if (NULL == fgets(buffer, DT_CPU_STAT_BUFFER_SIZE, Stat_Fp)) { printf(DT_CPU_STAT_STR " not found\n"); exit(1); } if (!strncmp(buffer, DT_CPU_STAT_STR, strlen(DT_CPU_STAT_STR))) { break; } } (void)strtok(buffer, DT_CPU_STAT_DELIMITER); cpu_stat->user = strtoul(strtok(NULL, DT_CPU_STAT_DELIMITER), NULL, 0); cpu_stat->user += strtoul(strtok(NULL, DT_CPU_STAT_DELIMITER), NULL, 0); cpu_stat->system = strtoul(strtok(NULL, DT_CPU_STAT_DELIMITER), NULL, 0); cpu_stat->idle = strtoul(strtok(NULL, DT_CPU_STAT_DELIMITER), NULL, 0); rewind(Stat_Fp); return true; } /* * Get current time in milliseconds (relative to some fixed point) */ unsigned long DT_Mdep_GetTime(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } #ifdef RDTSC_TIMERS double DT_Mdep_GetCpuMhz(void) { #define DT_TSC_BUFFER_SIZE 128 #if defined (__PPC__) || defined (__PPC64__) #define DT_TSC_RATE "timebase" #define DT_TSC_BASE 1000000.0 #else #define DT_TSC_RATE "cpu MHz" #define DT_TSC_BASE 1.0 #endif #define DT_TSC_DELIMITER ":" FILE *fp; char buffer[DT_TSC_BUFFER_SIZE]; char *mhz_str; fp = fopen("/proc/cpuinfo", "r"); if (NULL == fp) { perror("fopen of /proc/cpuinfo failed"); exit(1); } for (;;) { if (NULL == fgets(buffer, DT_TSC_BUFFER_SIZE, fp)) { printf("cpu MHZ not found\n"); exit(1); } if (!strncmp(buffer, DT_TSC_RATE, strlen(DT_TSC_RATE))) { (void)strtok(buffer, DT_TSC_DELIMITER); mhz_str = strtok(NULL, DT_TSC_DELIMITER); break; } } if (0 != fclose(fp)) { perror("fclose of /proc/cpuinfo failed"); exit(1); } return strtod(mhz_str, NULL) / DT_TSC_BASE; } #else /* !RDTSC_TIMERS */ double DT_Mdep_GetCpuMhz(void) { return 1; } #endif unsigned long DT_Mdep_GetContextSwitchNum(void) { #define DT_CTXT_STR "ctxt" #define DT_CTXT_BUFFER_SIZE 1024 #define DT_CTXT_DELIMITER " " static char buffer[DT_CTXT_BUFFER_SIZE]; char *ctxt_str; if (0 != fflush(Stat_Fp)) { perror("fflush of " DT_STAT_FILE " failed"); exit(1); } for (;;) { if (NULL == fgets(buffer, DT_CTXT_BUFFER_SIZE, Stat_Fp)) { printf(DT_CTXT_STR " not found\n"); exit(1); } if (!strncmp(buffer, DT_CTXT_STR, strlen(DT_CTXT_STR))) { (void)strtok(buffer, DT_CTXT_DELIMITER); ctxt_str = strtok(NULL, DT_CTXT_DELIMITER); break; } } rewind(Stat_Fp); return strtoul(ctxt_str, NULL, 0); } /* * Memory allocate and free routines for control blocks (objects) - regular * memory, always zeroed. */ void *DT_Mdep_Malloc(size_t l_) { void *rval; /* * check memory leaking DT_Mdep_Lock(&Alloc_Count_Lock); alloc_count++; * DT_Mdep_Unlock(&Alloc_Count_Lock); */ rval = malloc(l_); if (rval) { memset(rval, 0, l_); } return (rval); } void DT_Mdep_Free(void *a_) { /* * check memory leaking DT_Mdep_Lock(&Alloc_Count_Lock); alloc_count--; * DT_Mdep_Unlock(&Alloc_Count_Lock); */ free(a_); } /* * Lock support * * Lock object constructor */ bool DT_Mdep_LockInit(DT_Mdep_LockType * lock_ptr) { return pthread_mutex_init(lock_ptr, 0) ? false : true; } /* * Lock object destructor */ void DT_Mdep_LockDestroy(DT_Mdep_LockType * lock_ptr) { pthread_mutex_destroy(lock_ptr); } /* * Lock */ void DT_Mdep_Lock(DT_Mdep_LockType * lock_ptr) { pthread_mutex_lock(lock_ptr); } /* * unlock */ void DT_Mdep_Unlock(DT_Mdep_LockType * lock_ptr) { pthread_mutex_unlock(lock_ptr); } /* * Init Thread Attributes */ void DT_Mdep_Thread_Init_Attributes(Thread * thread_ptr) { pthread_attr_init(&thread_ptr->attr); pthread_attr_setstacksize(&thread_ptr->attr, thread_ptr->stacksize); /* Create thread in detached state to free resources on termination; * this precludes doing a pthread_join, but we don't do it */ pthread_attr_setdetachstate(&thread_ptr->attr, PTHREAD_CREATE_DETACHED); } /* * Destroy Thread Attributes */ void DT_Mdep_Thread_Destroy_Attributes(Thread * thread_ptr) { pthread_attr_destroy(&thread_ptr->attr); } /* * Start the thread */ bool DT_Mdep_Thread_Start(Thread * thread_ptr) { return pthread_create(&thread_ptr->thread_handle, &thread_ptr->attr, DT_Mdep_Thread_Start_Routine, thread_ptr) == 0; } /* * Thread execution entry point function */ DT_Mdep_Thread_Start_Routine_Return_Type DT_Mdep_Thread_Start_Routine(void *thread_handle) { Thread *thread_ptr; thread_ptr = (Thread *) thread_handle; thread_ptr->function(thread_ptr->param); return 0; } /* * Thread detach routine. Allows the pthreads * interface to clean up resources properly at * thread's end. */ void DT_Mdep_Thread_Detach(DT_Mdep_ThreadHandleType thread_id) { /* AMM */ pthread_detach(thread_id); } /* * Allows a thread to get its own ID so it * can pass it to routines wanting to act * upon themselves. */ DT_Mdep_ThreadHandleType DT_Mdep_Thread_SELF(void) { /* AMM */ return (pthread_self()); } /* * Allow a thread to exit and cleanup resources. */ void DT_Mdep_Thread_EXIT(void *thread_handle) { /* AMM */ pthread_exit(thread_handle); } /* * DT_Mdep_wait_object_init * * Initialize a wait object * * Input: * wait_obj * * Returns: * 0 if successful * -1 if unsuccessful */ int DT_Mdep_wait_object_init(IN DT_WAIT_OBJECT * wait_obj) { wait_obj->signaled = DAT_FALSE; if (0 != pthread_cond_init(&wait_obj->cv, NULL)) { return (-1); } /* Always returns 0. */ pthread_mutex_init(&wait_obj->lock, NULL); return 0; } /* Wait on the supplied wait object, up to the specified time_out. * A timeout of DAT_TIMEOUT_INFINITE will wait indefinitely. * Timeout should be specified in micro seconds. * * Functional returns: * 0 -- another thread invoked dapl_os_wait object_wakeup * -1 -- someone else is already waiting in this wait * object. * only one waiter is allowed at a time. * -1 -- another thread invoked dapl_os_wait_object_destroy * -1 -- the specified time limit was reached. */ int DT_Mdep_wait_object_wait(IN DT_WAIT_OBJECT * wait_obj, IN int timeout_val) { int dat_status; int pthread_status; struct timespec future; dat_status = 0; pthread_status = 0; if (timeout_val != DAT_TIMEOUT_INFINITE) { struct timeval now; struct timezone tz; unsigned int microsecs; gettimeofday(&now, &tz); microsecs = now.tv_usec + (timeout_val % 1000000); if (microsecs > 1000000) { now.tv_sec = now.tv_sec + timeout_val / 1000000 + 1; now.tv_usec = microsecs - 1000000; } else { now.tv_sec = now.tv_sec + timeout_val / 1000000; now.tv_usec = microsecs; } /* Convert timeval to timespec */ future.tv_sec = now.tv_sec; future.tv_nsec = now.tv_usec * 1000; pthread_mutex_lock(&wait_obj->lock); while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) { pthread_status = pthread_cond_timedwait(&wait_obj->cv, &wait_obj->lock, &future); /* * No need to reset &future if we go around the loop; * It's an absolute time. */ } /* Reset the signaled status if we were woken up. */ if (pthread_status == 0) { wait_obj->signaled = false; } pthread_mutex_unlock(&wait_obj->lock); } else { pthread_mutex_lock(&wait_obj->lock); while (wait_obj->signaled == DAT_FALSE && pthread_status == 0) { pthread_status = pthread_cond_wait(&wait_obj->cv, &wait_obj->lock); } /* Reset the signaled status if we were woken up. */ if (pthread_status == 0) { wait_obj->signaled = false; } pthread_mutex_unlock(&wait_obj->lock); } if (ETIMEDOUT == pthread_status) { return (-1); } else if (0 != pthread_status) { return (-1); } return 0; } /* * DT_Mdep_wait_object_wakeup * * Wakeup a thread waiting on a wait object * * Input: * wait_obj * * Returns: * 0 if successful * -1 if not successful */ int DT_Mdep_wait_object_wakeup(DT_WAIT_OBJECT * wait_obj) { pthread_mutex_lock(&wait_obj->lock); wait_obj->signaled = true; pthread_mutex_unlock(&wait_obj->lock); if (0 != pthread_cond_signal(&wait_obj->cv)) { return (-1); } return 0; } /* * DT_Mdep_wait_object_destroy * * Destroy a wait object * * Input: * wait_obj * * Returns: * 0 if successful * -1 if not successful */ int DT_Mdep_wait_object_destroy(IN DT_WAIT_OBJECT * wait_obj) { if (0 != pthread_cond_destroy(&wait_obj->cv)) { return (-1); } if (0 != pthread_mutex_destroy(&wait_obj->lock)) { return (-1); } return 0; } dapl-2.1.5/test/dapltest/mdep/linux/dapl_mdep_user.h000077500000000000000000000115401255317474200224740ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #ifndef __DAPL_MDEP_USER_H__ #define __DAPL_MDEP_USER_H__ /* include files */ #include #include #include #include #include #include #include #include #include #include /* inet_ntoa */ #include #include #include /* Default Device Name */ #define DT_MdepDeviceName "ofa-v2-ib0" /* Boolean */ typedef int bool; #define true (1) #define false (0) #ifndef __BASE_FILE__ #define __BASE_FILE__ __FILE__ #endif #ifndef _INLINE_ #define _INLINE_ __inline__ #endif /* * Locks */ typedef pthread_mutex_t DT_Mdep_LockType; /* Wait object used for inter thread communication */ typedef struct { bool signaled; pthread_cond_t cv; pthread_mutex_t lock; } DT_WAIT_OBJECT; /* * Thread types */ typedef pthread_t DT_Mdep_ThreadHandleType; typedef void (*DT_Mdep_ThreadFunction) (void *param); typedef void * DT_Mdep_Thread_Start_Routine_Return_Type; #define DT_MDEP_DEFAULT_STACK_SIZE 65536 typedef struct { void (*function) (void *); void *param; DT_Mdep_ThreadHandleType thread_handle; unsigned int stacksize; pthread_attr_t attr; /* Thread attributes */ } Thread; /* * System information * */ typedef struct { unsigned long int system; unsigned long int user; unsigned long int idle; } DT_CpuStat; /* * Timing */ #ifdef RDTSC_TIMERS typedef unsigned long long int DT_Mdep_TimeStamp; static _INLINE_ DT_Mdep_TimeStamp DT_Mdep_GetTimeStamp ( void ) { #if defined(__GNUC__) && defined(__i386__) DT_Mdep_TimeStamp x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x; #else #ifdef __ia64__ unsigned long ret; __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret)); return ret; #else #if defined(__PPC__) || defined(__PPC64__) unsigned int tbl, tbu0, tbu1; do { __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); } while (tbu0 != tbu1); return (((unsigned long long)tbu0) << 32) | tbl; #else #if defined(__x86_64__) unsigned int __a,__d; asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); return ((unsigned long)__a) | (((unsigned long)__d)<<32); #else #error "Linux CPU architecture - unimplemented" #endif #endif #endif #endif } #else /* !RDTSC_TIMERS */ /* * Get timestamp, microseconds, (relative to some fixed point) */ typedef double DT_Mdep_TimeStamp; static _INLINE_ DT_Mdep_TimeStamp DT_Mdep_GetTimeStamp ( void ) { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec * 1000000 + tv.tv_usec); } #endif /* * Define long format types to be used in *printf format strings. We * use the C string constant concatenation ability to define 64 bit * formats, which unfortunatly are non standard in the C compiler * world. E.g. %llx for gcc, %I64x for Windows */ #if defined(__x86_64__) || defined(__ia64__) #define F64d "%ld" #define F64u "%lu" #define F64x "%lx" #define F64X "%lX" #else #define F64d "%lld" #define F64u "%llu" #define F64x "%llx" #define F64X "%llX" #endif /* * Define notion of a LONG LONG 0 */ #define LZERO 0ULL /* Mdep function defines */ #define DT_Mdep_Debug(N, _X_) \ do { \ if (DT_dapltest_debug >= (N)) \ { \ DT_Mdep_printf _X_; \ } \ } while (0) #define DT_Mdep_printf printf #define DT_Mdep_flush() fflush(NULL) /* * Release processor to reschedule */ #define DT_Mdep_yield pthread_yield #endif dapl-2.1.5/test/dapltest/scripts/000077500000000000000000000000001255317474200167375ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/scripts/cl.sh000077500000000000000000000165761255317474200177130ustar00rootroot00000000000000#!/bin/sh # # Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # Copyright (c) 2014 Intel Corporation. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. The license is also # available from the Open Source Initiative, see # http://www.opensource.org/licenses/cpl.php. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. The license is also available from # the Open Source Initiative, see # http://www.opensource.org/licenses/bsd-license.php. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. The # license is also available from the Open Source Initiative, see # http://www.opensource.org/licenses/gpl-license.php. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # # Sample DAPLtest client Usage: cl.sh hostname [testname] [device] # # default device = ofa-v2-ib0 # DT=dapltest D=ofa-v2-ib0 L=1 X= T= E= # need some help? if [ "$1" == "-h" ] ; then T= else S=$1 if [ ! "$2" == "" ] ; then T=$2 if [ ! "$3" == "" ] ; then D=$3 fi fi fi if [ ! "$X" == "" ] ; then DAT_OS_DBG_TYPE=$X DAT_DBG_TYPE=$X DAT_DBG_LEVEL=$X DAPL_DBG_LEVEL=$X DAPL_DBG_TYPE=$X else DAT_DBG_TYPE=0x1 DAT_DBG_LEVEL=1 fi echo "" echo "uDAPL client test $DT $T $D -> $S" echo "" # Endpoint and Thread stress if [ "$T" == "epa" ] ; then T=10 E=10 LT=10 LE=50 for ((T=$T ; $T <= $LT ; $((T++)) )) ; do for ((E=$E ; $E <= $LE ; $((E++)) )) ; do echo $T $E: Multi: Threads[$T] Endpoints[$E] Send/Recv test - 4096 iterations, 3 8K segs $DT -T T -s $S -D $D -i 4096 -t $T -w $E client SR 8192 3 server SR 8192 3 if [ $? -ne 0 ] ; then echo failed $X exit 1 fi done done echo THREADS $LT and ENDPOINTS $LE loops completed. exit fi if [ "$T" == "conn" ] ; then # Connectivity test - client sends one buffer with one 4KB segments, one time. # add '-d' for debug output. $DT -T T -s $S -D $D -i 1 -t 1 -w 1 client SR 4096 server SR 4096 exit fi if [ "$T" == "trans" ] ; then echo Transaction test - 8192 iterations, 1 thread, SR 4KB buffers $DT -T T -s $S -D $D -i 8192 -t 1 -w 1 client SR 4096 server SR 4096 exit fi if [ "$T" == "transm" ] ; then echo Multiple RW, RR, SR transactions, 4096 iterations $DT -T T -P -t 1 -w 1 -i 4096 -s $S -D $D client RW 4096 1 server RW 2048 4 server RR 1024 1 client RR 2048 1 client SR 1024 3 -f server SR 256 3 -f exit fi if [ "$T" == "transmx" ] ; then echo Multiple RW, RR, SR transactions, 8192 iterations $DT -T T -P -t 1 -w 1 -i 8192 -s $S -D $D \ client RW 32768 4 server RW 32768 4 \ server RR 32768 1 client RR 32768 1 \ client SR 16384 4 -f server SR 16384 4 -f exit fi if [ "$T" == "transt" ] ; then echo Multi-threaded[4] Transaction test - 4096 iterations, 1 thread, SR 4KB buffers $DT -T T -s $S -D $D -i 4096 -t 4 -w 1 client SR 8192 3 server SR 8192 3 exit fi if [ "$T" == "transme" ] ; then echo Multiple endpoints[4] transactions [RW, RR, SR], 4096 iterations $DT -T T -P -t 1 -w 4 -i 4096 -s $S -D $D client RW 4096 1 server RW 2048 4 server RR 1024 1 client RR 2048 1 client SR 1024 3 -f server SR 256 3 -f exit fi if [ "$T" == "transmet" ] ; then echo Multiple: threads[2] endpoints[4] transactions[RW, RR, SR], 4096 iterations $DT -T T -P -t 2 -w 4 -i 4096 -s $S -D $D client RW 4096 1 server RW 2048 4 server RR 1024 1 client RR 2048 1 client SR 1024 3 -f server SR 256 3 -f exit fi if [ "$T" == "transmete" ] ; then echo Multiple: threads[4] endpoints[4] transactions[RW, RR, SR], 8192 iterations $DT -T T -P -t 4 -w 4 -i 8192 -s $S -D $D client RW 4096 1 server RW 2048 4 server RR 1024 1 client RR 2048 1 client SR 1024 3 -f server SR 256 3 -f exit fi if [ "$T" == "threads" ] ; then echo Multi Threaded[6] Send/Recv test - 4096 iterations, 3 8K segs $DT -T T -s $S -D $D -i 4096 -t 6 -w 1 client SR 8192 3 server SR 8192 3 exit fi if [ "$T" == "threadsm" ] ; then echo Multi: Threads[4] endpoints[4] Send/Recv test - 4096 iterations, 3 8K segs $DT -T T -s $S -D $D -i 4096 -t 4 -w 4 client SR 8192 3 server SR 8192 3 exit fi if [ "$T" == "perf" ] ; then #echo Performance test $DT -T P -s $S -D $D -i 2048 -m b RW 4096 2 exit fi if [ "$T" == "rdma-read" ] ; then $DT -T P -s $S -D $D -i 4096 RR 32768 1 exit fi if [ "$T" == "rdma-write" ] ; then $DT -T P -s $S -D $D -i 4096 RW 32768 4 exit fi if [ "$T" == "bw" ] ; then echo bandwidth 65K msgs $DT -T P -s $S -D $D -i 4096 -p 16 -m b RW 65536 2 exit fi if [ "$T" == "latb" ] ; then echo latency test - block for completion events $DT -T P -s $S -D $D -i 8192 -p 1 -m b RW 4 1 exit fi if [ "$T" == "latp" ] ; then echo latency test - poll completion events $DT -T P -s $S -D $D -i 100000 -p 1 -m p RW 4 1 exit fi if [ "$T" == "lim" ] ; then echo Resource limit tests $DT -T L -D $D -w 8 -m 100 limit_ia $DT -T L -D $D -w 8 -m 100 limit_pz $DT -T L -D $D -w 8 -m 100 limit_evd $DT -T L -D $D -w 8 -m 100 limit_ep $DT -T L -D $D -w 8 -m 100 limit_psp $DT -T L -D $D -w 8 -m 100 limit_lmr $DT -T L -D $D -w 8 -m 15 limit_rpost exit fi if [ "$T" == "regression" ] ; then echo $T testing in $L Loops # rdma-write, read, perf TST="trans perf threads threadsm transm transt transme transmet transmete rdma-write rdma-read bw latb latp " for ((n=1 ; $n <= $L ; $((n++)) )) ; do for X in $TST ; do $0 $1 $X $D if [ $? -ne 0 ] ; then echo failed $X exit 1 fi done echo $n $T loops completed. done $DT -T Q -s $S -D $D exit 0 fi if [ "$T" == "stop" ] ; then $DT -T Q -s $S -D $D exit fi echo " usage: cl.sh hostname [testname [-D]]" echo " where testname" echo " stop - request DAPLtest server to exit." echo " conn - simple connection with limited dater transfer" echo " trans - single transaction test" echo " transm - transaction test: multiple transactions [RW SND, RDMA]" echo " transt - transaction test: multi-threaded, single transaction" echo " transme - transaction test: multi-endpoints per thread " echo " transmet - transaction test: multi: threads and endpoints per thread" echo " transmete - transaction test: multi threads == endpoints" echo " perf - Performance test" echo " threads - multi-threaded single transaction test." echo " threadsm - multi: threads and endpoints, single transaction test." echo " rdma-write - RDMA write" echo " rdma-read - RDMA read" echo " bw - bandwidth" echo " latb - latency tests, blocking for events" echo " latp - latency tests, polling for events" echo " lim - limit tests." echo " regression - loop over a collection of all tests." exit 0 dapl-2.1.5/test/dapltest/scripts/regress.sh000077500000000000000000000072771255317474200207650ustar00rootroot00000000000000#!/bin/sh # # Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. The license is also # available from the Open Source Initiative, see # http://www.opensource.org/licenses/cpl.php. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. The license is also available from # the Open Source Initiative, see # http://www.opensource.org/licenses/bsd-license.php. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. The # license is also available from the Open Source Initiative, see # http://www.opensource.org/licenses/gpl-license.php. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # # Sample regression client invocation # me=`basename $0` case $# in 0) host=dat-linux3 device=ofa-v2-ib0;; 1) host=$1 device=ofa-v2-ib0;; 2) host=$1 device=$2 ;; *) echo Usage: $me '[hostname [device] ]' 1>&2 ; exit 1;; esac #==================================================================== #client1 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 1 -w 1 \ client SR 256 \ server SR 256 #==================================================================== #client2 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 1 -w 1 \ client SR 256 \ server RW 4096 \ server SR 256 #==================================================================== #client3 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 1 -w 1 \ client SR 256 \ server RR 4096 \ server SR 256 #==================================================================== #client4 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 1 -w 1 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 4096 \ server SR 256 #==================================================================== #client5 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 1 -w 8 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 4096 \ server SR 256 #==================================================================== #client6 #==================================================================== dapltest -T T -s ${host} -D ${device} -i 10000 -t 4 -w 8 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 256 \ server RW 4096 \ server SR 256 \ client SR 4096 \ server SR 256 #==================================================================== # Quit the server #==================================================================== dapltest -T Q -s ${host} -D ${device} dapl-2.1.5/test/dapltest/scripts/srv.sh000077500000000000000000000027701255317474200201160ustar00rootroot00000000000000#!/bin/sh # # Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. # Copyright (c) 2014 Intel Corporation. All rights reserved. # # This Software is licensed under one of the following licenses: # # 1) under the terms of the "Common Public License 1.0" a copy of which is # in the file LICENSE.txt in the root directory. The license is also # available from the Open Source Initiative, see # http://www.opensource.org/licenses/cpl.php. # # 2) under the terms of the "The BSD License" a copy of which is in the file # LICENSE2.txt in the root directory. The license is also available from # the Open Source Initiative, see # http://www.opensource.org/licenses/bsd-license.php. # # 3) under the terms of the "GNU General Public License (GPL) Version 2" a # copy of which is in the file LICENSE3.txt in the root directory. The # license is also available from the Open Source Initiative, see # http://www.opensource.org/licenses/gpl-license.php. # # Licensee has the right to choose one of the above licenses. # # Redistributions of source code must retain the above copyright # notice and one of the license notices. # # Redistributions in binary form must reproduce both the above copyright # notice, one of the license notices in the documentation # and/or other materials provided with the distribution. # # Sample DAPLtest server Usage: srv.sh [device] # # default device = ofa-v2-ib0 # DT=dapltest D=ofa-v2-ib0 if [ ! "$1" == "" ] ; then D=$1 fi $DT -T S -D $D exit $? dapl-2.1.5/test/dapltest/test/000077500000000000000000000000001255317474200162275ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/test/dapl_bpool.c000066400000000000000000000256241255317474200205170ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* flag to prevent usage of Memory Windows as they are not supported in mthca */ static DAT_BOOLEAN enable_memory_windows = DAT_FALSE; /*****************************************************************************/ /* * Allocate buffer pool (data buffers) * * Caller wants to allocate buffers of bytes, * with each buffer aligned as requested. The caller is free to * use the buffers separately, or as one contiguous segment, so * we allocate IOV entries enough to support either usage. */ Bpool *DT_BpoolAlloc(Per_Test_Data_t * pt_ptr, DT_Tdep_Print_Head * phead, DAT_IA_HANDLE ia_handle, DAT_PZ_HANDLE pz_handle, DAT_EP_HANDLE ep_handle, DAT_EVD_HANDLE rmr_evd_handle, DAT_COUNT seg_size, DAT_COUNT num_segs, DAT_COUNT alignment, DAT_BOOLEAN enable_rdma_write, DAT_BOOLEAN enable_rdma_read) { char *module = "DT_BpoolAlloc"; unsigned char *alloc_ptr = 0; Bpool *bpool_ptr = 0; DAT_COUNT alloc_size; DAT_REGION_DESCRIPTION region; DAT_RETURN ret; /* We'll hand out aligned buffers, compensate here */ seg_size = DT_RoundSize(seg_size, alignment); alloc_size = seg_size * num_segs + alignment; alloc_ptr = (unsigned char *)DT_MemListAlloc(pt_ptr, "bpool", BUFF, alloc_size); if (!alloc_ptr) { DT_Tdep_PT_Printf(phead, "No Memory to create bpool buffer!\n"); goto err; } bpool_ptr = (Bpool *) DT_MemListAlloc(pt_ptr, "bpool", BPOOL, sizeof(Bpool) + num_segs * sizeof(DAT_LMR_TRIPLET)); if (!bpool_ptr) { DT_Tdep_PT_Printf(phead, "No Memory to create Bpool!\n"); goto err; } bpool_ptr->alloc_ptr = alloc_ptr; bpool_ptr->alloc_size = alloc_size; bpool_ptr->pz_handle = pz_handle; bpool_ptr->num_segs = num_segs; bpool_ptr->ep_handle = ep_handle; bpool_ptr->buffer_size = seg_size * num_segs; bpool_ptr->buffer_start = DT_AlignPtr(alloc_ptr, alignment); bpool_ptr->tripl_start = (DAT_LMR_TRIPLET *) (bpool_ptr + 1); bpool_ptr->seg_size = seg_size; bpool_ptr->enable_rdma_write = enable_rdma_write; bpool_ptr->enable_rdma_read = enable_rdma_read; bpool_ptr->rmr_evd_handle = rmr_evd_handle; DT_Tdep_PT_Debug(3, (phead, "lmr_create [%p, " F64x "]\n", bpool_ptr->buffer_start, bpool_ptr->buffer_size)); memset(®ion, 0, sizeof(region)); region.for_va = bpool_ptr->buffer_start; ret = DT_Tdep_lmr_create(ia_handle, DAT_MEM_TYPE_VIRTUAL, region, bpool_ptr->buffer_size, pz_handle, DAT_MEM_PRIV_ALL_FLAG, &bpool_ptr->lmr_handle, &bpool_ptr->lmr_context, &bpool_ptr->rmr_context, &bpool_ptr->reg_size, &bpool_ptr->reg_addr); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_create failed %s\n", module, DT_RetToString(ret)); goto err; } /* verify that the outputs are reasonable */ if (((uintptr_t) bpool_ptr->reg_addr > (uintptr_t) bpool_ptr->buffer_start) || (bpool_ptr->reg_size < bpool_ptr->buffer_size + ((uintptr_t) bpool_ptr->buffer_start - (uintptr_t) bpool_ptr->reg_addr))) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_create bogus" "in: 0x%p, " F64x " out 0x" F64x ", " F64x "\n", module, bpool_ptr->buffer_start, bpool_ptr->buffer_size, bpool_ptr->reg_addr, bpool_ptr->reg_size); goto err; } DT_Tdep_PT_Debug(3, (phead, "lmr_create OK [0x" F64x ", " F64x ", lctx=%x]\n", bpool_ptr->reg_addr, bpool_ptr->reg_size, bpool_ptr->lmr_context)); /* Enable RDMA if requested */ if (enable_memory_windows && (enable_rdma_write || enable_rdma_read)) { DAT_LMR_TRIPLET iov; DAT_RMR_COOKIE cookie; DAT_MEM_PRIV_FLAGS mflags; DAT_RMR_BIND_COMPLETION_EVENT_DATA rmr_stat; /* create the RMR */ ret = dat_rmr_create(pz_handle, &bpool_ptr->rmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rmr_create failed %s\n", module, DT_RetToString(ret)); goto err; } /* bind the RMR */ iov.virtual_address = bpool_ptr->reg_addr; iov.segment_length = bpool_ptr->reg_size; iov.lmr_context = bpool_ptr->lmr_context; cookie.as_64 = (DAT_UINT64) 0UL; cookie.as_ptr = (DAT_PVOID) (uintptr_t) bpool_ptr->reg_addr; mflags = (enable_rdma_write && enable_rdma_read ? DAT_MEM_PRIV_ALL_FLAG : (enable_rdma_write ? DAT_MEM_PRIV_WRITE_FLAG : (enable_rdma_read ? DAT_MEM_PRIV_READ_FLAG : 0))); DT_Tdep_PT_Debug(3, (phead, "rmr_bind [" F64x ", " F64x "]\n", bpool_ptr->reg_addr, bpool_ptr->reg_size)); ret = dat_rmr_bind(bpool_ptr->rmr_handle, bpool_ptr->lmr_handle, &iov, mflags, DAT_VA_TYPE_VA, bpool_ptr->ep_handle, cookie, DAT_COMPLETION_DEFAULT_FLAG, &bpool_ptr->rmr_context); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rmr_bind failed %s\n", module, DT_RetToString(ret)); goto err; } DT_Tdep_PT_Debug(3, (phead, "rmr_bind-wait\n")); /* await the bind result */ if (!DT_rmr_event_wait(phead, bpool_ptr->rmr_evd_handle, &rmr_stat) || !DT_rmr_check(phead, &rmr_stat, bpool_ptr->rmr_handle, (DAT_PVOID) (uintptr_t) bpool_ptr->reg_addr, "Bpool")) { goto err; } DT_Tdep_PT_Debug(3, (phead, "rmr_bound [OK Rctx=%x]\n", bpool_ptr->rmr_context)); } /* * Finally! Return the newly created Bpool. */ return (bpool_ptr); /* ********************************* * Whoops - clean up and return NULL */ err: if (bpool_ptr) { if (bpool_ptr->rmr_handle) { ret = dat_rmr_free(bpool_ptr->rmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rmr_free failed %s\n", module, DT_RetToString(ret)); } } if (bpool_ptr->lmr_handle) { ret = dat_lmr_free(bpool_ptr->lmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_free failed %s\n", module, DT_RetToString(ret)); } } DT_MemListFree(pt_ptr, bpool_ptr); } if (alloc_ptr) { DT_MemListFree(pt_ptr, alloc_ptr); } return (0); } /*****************************************************************************/ bool DT_Bpool_Destroy(Per_Test_Data_t * pt_ptr, DT_Tdep_Print_Head * phead, Bpool * bpool_ptr) { char *module = "DT_Bpool_Destroy"; bool rval = true; if (bpool_ptr) { if (bpool_ptr->alloc_ptr) { if (bpool_ptr->rmr_handle) { DAT_LMR_TRIPLET iov; DAT_RMR_COOKIE cookie; DAT_RETURN ret; iov.virtual_address = bpool_ptr->reg_addr; iov.segment_length = 0; /* un-bind */ iov.lmr_context = bpool_ptr->lmr_context; cookie.as_64 = (DAT_UINT64) 0UL; cookie.as_ptr = (DAT_PVOID) (uintptr_t) bpool_ptr->reg_addr; /* * Do not attempt to unbind here. The remote node * is going through the same logic and may disconnect * before an unbind completes. Any bind/unbind * operation requires a CONNECTED QP to complete, * a disconnect will cause problems. Unbind is * a simple optimization to allow rebinding of * an RMR, doing an rmr_free will pull the plug * and cleanup properly. */ ret = dat_rmr_free(bpool_ptr->rmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rmr_free failed %s\n", module, DT_RetToString(ret)); rval = false; } } if (bpool_ptr->lmr_handle) { DAT_RETURN ret = dat_lmr_free(bpool_ptr->lmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_free failed %s\n", module, DT_RetToString(ret)); rval = false; } } DT_MemListFree(pt_ptr, bpool_ptr->alloc_ptr); } DT_MemListFree(pt_ptr, bpool_ptr); } return (rval); } /*****************************************************************************/ unsigned char *DT_Bpool_GetBuffer(Bpool * bpool_ptr, int index) { return (bpool_ptr->buffer_start + index * bpool_ptr->seg_size); } /*****************************************************************************/ DAT_COUNT DT_Bpool_GetBuffSize(Bpool * bpool_ptr, int index) { return (bpool_ptr->seg_size); } /*****************************************************************************/ DAT_LMR_TRIPLET *DT_Bpool_GetIOV(Bpool * bpool_ptr, int index) { return (bpool_ptr->tripl_start + index); } /*****************************************************************************/ DAT_LMR_CONTEXT DT_Bpool_GetLMR(Bpool * bpool_ptr, int index) { return (bpool_ptr->lmr_context); } /*****************************************************************************/ DAT_RMR_CONTEXT DT_Bpool_GetRMR(Bpool * bpool_ptr, int index) { return (bpool_ptr->rmr_context); } /*****************************************************************************/ void DT_Bpool_print(DT_Tdep_Print_Head * phead, Bpool * bpool_ptr) { DT_Tdep_PT_Printf(phead, "BPOOL %p\n", bpool_ptr); DT_Tdep_PT_Printf(phead, "BPOOL alloc_ptr %p\n", bpool_ptr->alloc_ptr); DT_Tdep_PT_Printf(phead, "BPOOL alloc_size %x\n", (int)bpool_ptr->alloc_size); DT_Tdep_PT_Printf(phead, "BPOOL pz_handle %p\n", bpool_ptr->pz_handle); DT_Tdep_PT_Printf(phead, "BPOOL num_segs %x\n", (int)bpool_ptr->num_segs); DT_Tdep_PT_Printf(phead, "BPOOL seg_size %x\n", (int)bpool_ptr->seg_size); DT_Tdep_PT_Printf(phead, "BPOOL tripl_start %p\n", bpool_ptr->tripl_start); DT_Tdep_PT_Printf(phead, "BPOOL buffer_start %p\n", bpool_ptr->buffer_start); DT_Tdep_PT_Printf(phead, "BPOOL buffer_size %x\n", (int)bpool_ptr->buffer_size); DT_Tdep_PT_Printf(phead, "BPOOL rdma_write %x\n", (int)bpool_ptr->enable_rdma_write); DT_Tdep_PT_Printf(phead, "BPOOL rdmaread %x\n", (int)bpool_ptr->enable_rdma_read); } dapl-2.1.5/test/dapltest/test/dapl_client.c000066400000000000000000000405271255317474200206610ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #if defined(DFLT_QLEN) #undef DFLT_QLEN #endif #define DFLT_QLEN 8 /* default event queue length */ #define MAX_CONN_RETRY 8 /* * Client control routine Connect to the server, send the command across. * Then start the client-side of the test - creating threads as needed */ DAT_RETURN DT_cs_Client(Params_t * params_ptr, char *dapl_name, char *server_name, DAT_UINT32 total_threads) { Per_Test_Data_t *pt_ptr = NULL; DAT_IA_HANDLE ia_handle = DAT_HANDLE_NULL; DAT_PZ_HANDLE pz_handle = DAT_HANDLE_NULL; DAT_EVD_HANDLE recv_evd_hdl = DAT_HANDLE_NULL; DAT_EVD_HANDLE reqt_evd_hdl = DAT_HANDLE_NULL; DAT_EVD_HANDLE conn_evd_hdl = DAT_HANDLE_NULL; DAT_EVD_HANDLE async_evd_hdl = DAT_HANDLE_NULL; DAT_EP_HANDLE ep_handle = DAT_HANDLE_NULL; Server_Info_t *sinfo = NULL; Transaction_Cmd_t *Transaction_Cmd = NULL; Quit_Cmd_t *Quit_Cmd = NULL; Performance_Cmd_t *Performance_Cmd = NULL; Bpool *bpool = NULL; DAT_IA_ADDRESS_PTR server_netaddr = NULL; char *module = "DT_cs_Client"; unsigned int did_connect = 0; unsigned int retry_cnt = 0; DAT_DTO_COOKIE dto_cookie; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_EVENT_NUMBER event_num; unsigned char *buffp; DAT_RETURN ret, rc; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; dto_cookie.as_64 = LZERO; DT_Tdep_PT_Printf(phead, "%s: Starting Test ... \n", module); DT_Mdep_Schedule(); /* Set up the Per_Test_Data */ pt_ptr = DT_Alloc_Per_Test_Data(phead); if (!pt_ptr) { DT_Tdep_PT_Printf(phead, "%s: no memory for Per_Test_Data\n", module); return DAT_INSUFFICIENT_RESOURCES; } DT_MemListInit(pt_ptr); /* init MemlistLock and memListHead */ DT_Thread_Init(pt_ptr); /* init ThreadLock and threadcount */ pt_ptr->local_is_server = false; pt_ptr->Client_Info.dapltest_version = DAPLTEST_VERSION; pt_ptr->Client_Info.is_little_endian = DT_local_is_little_endian; pt_ptr->Client_Info.test_type = params_ptr->test_type; pt_ptr->Client_Info.total_threads = total_threads; memcpy((void *)(uintptr_t) & pt_ptr->Params, (const void *)params_ptr, sizeof(Params_t)); /* Allocate and fill in the Server's address */ server_netaddr = ¶ms_ptr->server_netaddr; /* Open the IA */ ret = dat_ia_open(dapl_name, DFLT_QLEN, &async_evd_hdl, &ia_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: Could not open %s (%s)\n", module, dapl_name, DT_RetToString(ret)); ia_handle = DAT_HANDLE_NULL; goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: IA %s opened\n", module, dapl_name)); /* Create a PZ */ ret = dat_pz_create(ia_handle, &pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_create error: %s\n", module, DT_RetToString(ret)); pz_handle = DAT_HANDLE_NULL; goto client_exit; } /* Create 3 events - recv, request, connect */ ret = DT_Tdep_evd_create(ia_handle, DFLT_QLEN, NULL, DAT_EVD_DTO_FLAG, &recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (recv) failed %s\n", module, DT_RetToString(ret)); recv_evd_hdl = DAT_HANDLE_NULL; goto client_exit; } ret = DT_Tdep_evd_create(ia_handle, DFLT_QLEN, NULL, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (send) failed %s\n", module, DT_RetToString(ret)); reqt_evd_hdl = DAT_HANDLE_NULL; goto client_exit; } ret = DT_Tdep_evd_create(ia_handle, DFLT_QLEN, NULL, DAT_EVD_CONNECTION_FLAG, &conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (conn) failed %s\n", module, DT_RetToString(ret)); conn_evd_hdl = DAT_HANDLE_NULL; goto client_exit; } /* Create an EP */ ret = dat_ep_create(ia_handle, /* IA */ pz_handle, /* PZ */ recv_evd_hdl, /* recv */ reqt_evd_hdl, /* request */ conn_evd_hdl, /* connect */ (DAT_EP_ATTR *) NULL, &ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_create error: %s\n", module, DT_RetToString(ret)); ep_handle = DAT_HANDLE_NULL; goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: EP created\n", module)); /* * Gather whatever info we want about defaults, * and check that we can handle the requested parameters. */ if (!DT_query(pt_ptr, ia_handle, ep_handle) || !DT_check_params(pt_ptr, module)) { ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } bpool = DT_BpoolAlloc(pt_ptr, phead, ia_handle, pz_handle, ep_handle, DAT_HANDLE_NULL, /* no RMR */ DT_RoundSize(sizeof(Transaction_Cmd_t), 8192), 3, /* num_buffers */ DAT_OPTIMAL_ALIGNMENT, false, false); if (bpool == 0) { DT_Tdep_PT_Printf(phead, "%s: no memory for command buffer pool.\n", module); ret = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); goto client_exit; } DT_Tdep_PT_Debug(3, (phead, "RecvSrvInfo 0 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(bpool, 0))); DT_Tdep_PT_Debug(3, (phead, "SndCliInfo 1 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(bpool, 1))); DT_Tdep_PT_Debug(3, (phead, "SndCommand 2 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(bpool, 2))); /* Post recv buffer for Server_Info (1st buffer in pool) */ DT_Tdep_PT_Debug(1, (phead, "%s: Posting 1 recv buffer\n", module)); retry_repost: if (!DT_post_recv_buffer(phead, ep_handle, bpool, 0, DT_Bpool_GetBuffSize(bpool, 0))) { DT_Tdep_PT_Printf(phead, "%s: cannot post Server_Info recv buffer.\n", module); ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Connect Endpoint\n", module)); retry: ret = dat_ep_connect(ep_handle, server_netaddr, params_ptr->server_port, DAT_TIMEOUT_INFINITE, 0, (DAT_PVOID) 0, /* no private data */ params_ptr->ReliabilityLevel, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: Cannot connect Endpoint %s\n", module, DT_RetToString(ret)); goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Await connection ...\n", module)); if (!DT_conn_event_wait(phead, ep_handle, conn_evd_hdl, &event_num)) { if (event_num == DAT_CONNECTION_EVENT_PEER_REJECTED) { DAT_EVENT event; DAT_COUNT drained = 0; DT_Mdep_Sleep(1000); DT_Tdep_PT_Printf(phead, "%s: retrying connection...\n", module); retry_cnt++; /* * See if any buffers were flushed as a result of * the REJECT; clean them up and repost if so */ dat_ep_reset(ep_handle); do { rc = DT_Tdep_evd_dequeue(recv_evd_hdl, &event); drained++; } while (DAT_GET_TYPE(rc) != DAT_QUEUE_EMPTY); if (drained > 1 && retry_cnt < MAX_CONN_RETRY) { DT_Tdep_PT_Printf(phead, "Reposting!!! %d\n", drained); goto retry_repost; } else if (retry_cnt < MAX_CONN_RETRY) { goto retry; } } ret = DAT_INSUFFICIENT_RESOURCES; DT_Tdep_PT_Printf(phead, "%s: bad connection event\n", module); goto client_exit; } did_connect++; if (DT_dapltest_debug) { DT_Tdep_PT_Debug(1, (phead, "%s: Connected!\n", module)); get_ep_connection_state(phead, ep_handle); } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(1000); #endif /* Send Client_Info (using 2nd buffer in the pool) */ DT_Tdep_PT_Debug(1, (phead, "%s: Sending Client_Info\n", module)); buffp = DT_Bpool_GetBuffer(bpool, 1); memcpy((void *)buffp, (const void *)&pt_ptr->Client_Info, sizeof(Client_Info_t)); DT_Client_Info_Endian((Client_Info_t *) buffp); if (!DT_post_send_buffer(phead, ep_handle, bpool, 1, DT_Bpool_GetBuffSize(bpool, 1))) { DT_Tdep_PT_Printf(phead, "%s: cannot send Client_Info\n", module); ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } /* reap the send and verify it */ dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(bpool, 1); DT_Tdep_PT_Debug(1, (phead, "%s: Sent Client_Info - awaiting completion\n", module)); if (!DT_dto_event_wait(phead, reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ep_handle, DT_Bpool_GetBuffSize(bpool, 1), dto_cookie, "Client_Info_Send")) { ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } /* Set up the Command (using 3rd buffer in pool) */ DT_Tdep_PT_Debug(1, (phead, "%s: Sending Command\n", module)); buffp = DT_Bpool_GetBuffer(bpool, 2); switch (pt_ptr->Client_Info.test_type) { case TRANSACTION_TEST: { Transaction_Cmd = &pt_ptr->Params.u.Transaction_Cmd; memcpy((void *)buffp, (const void *)Transaction_Cmd, sizeof(Transaction_Cmd_t)); DT_Transaction_Cmd_Endian((Transaction_Cmd_t *) buffp, true); break; } case QUIT_TEST: { Quit_Cmd = &pt_ptr->Params.u.Quit_Cmd; memcpy((void *)buffp, (const void *)Quit_Cmd, sizeof(Quit_Cmd_t)); DT_Quit_Cmd_Endian((Quit_Cmd_t *) buffp, true); break; } case PERFORMANCE_TEST: { Performance_Cmd = &pt_ptr->Params.u.Performance_Cmd; memcpy((void *)buffp, (const void *)Performance_Cmd, sizeof(Performance_Cmd_t)); DT_Performance_Cmd_Endian((Performance_Cmd_t *) buffp); break; } default: { DT_Tdep_PT_Printf(phead, "Unknown Test Type\n"); ret = DAT_INVALID_PARAMETER; goto client_exit; } } /* Send the Command buffer */ if (!DT_post_send_buffer(phead, ep_handle, bpool, 2, DT_Bpool_GetBuffSize(bpool, 2))) { DT_Tdep_PT_Printf(phead, "%s: cannot send Command\n", module); ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(bpool, 2); DT_Tdep_PT_Debug(1, (phead, "%s: Sent Command - awaiting completion\n", module)); if (!DT_dto_event_wait(phead, reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ep_handle, DT_Bpool_GetBuffSize(bpool, 2), dto_cookie, "Client_Cmd_Send")) { ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } /************************************************************************/ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(bpool, 0); DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for Server_Info\n", module)); if (!DT_dto_event_wait(phead, recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ep_handle, DT_Bpool_GetBuffSize(bpool, 0), dto_cookie, "Server_Info_Recv")) { ret = DAT_INSUFFICIENT_RESOURCES; goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Server_Info Received\n", module)); sinfo = (Server_Info_t *) DT_Bpool_GetBuffer(bpool, 0); DT_Server_Info_Endian(sinfo); memcpy((void *)(uintptr_t) & pt_ptr->Server_Info, (const void *)sinfo, sizeof(Server_Info_t)); /* Perform obligatory version check */ if (pt_ptr->Server_Info.dapltest_version != DAPLTEST_VERSION) { DT_Tdep_PT_Printf(phead, "%s: DAPLTEST VERSION MISMATCH: Server %d, Client %d\n", module, pt_ptr->Server_Info.dapltest_version, DAPLTEST_VERSION); ret = DAT_MODEL_NOT_SUPPORTED; goto client_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Version OK!\n", module)); /* Dump out what we know, if requested */ if (DT_dapltest_debug) { DT_Server_Info_Print(phead, &pt_ptr->Server_Info); DT_Client_Info_Print(phead, &pt_ptr->Client_Info); } /* Onward to running the actual test requested */ switch (pt_ptr->Client_Info.test_type) { case TRANSACTION_TEST: { if (Transaction_Cmd->debug) { DT_Transaction_Cmd_PT_Print(phead, Transaction_Cmd); } ret = DT_Transaction_Test_Client(pt_ptr, ia_handle, server_netaddr); break; } case QUIT_TEST: { DT_Quit_Cmd_PT_Print(phead, Quit_Cmd); ret = DAT_SUCCESS; break; } case PERFORMANCE_TEST: { if (Performance_Cmd->debug) { DT_Performance_Cmd_PT_Print(phead, Performance_Cmd); } ret = DT_Performance_Test_Client(params_ptr, pt_ptr, ia_handle, server_netaddr); break; } } /********************************************************************* * Done - clean up and go home * ret == function DAT_RETURN return code */ client_exit: DT_Tdep_PT_Debug(1, (phead, "%s: Cleaning Up ...\n", module)); /* Disconnect the EP */ if (ep_handle) { /* * graceful attempt might fail because we got here due to * some error above, so we may as well try harder. */ rc = dat_ep_disconnect(ep_handle, DAT_CLOSE_ABRUPT_FLAG); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_disconnect (abrupt) error: %s\n", module, DT_RetToString(rc)); } else if (did_connect && !DT_disco_event_wait(phead, conn_evd_hdl, NULL)) { DT_Tdep_PT_Printf(phead, "%s: bad disconnect event\n", module); } } /* Free the bpool (if any) */ DT_Bpool_Destroy(pt_ptr, phead, bpool); /* Free the EP */ if (ep_handle) { DAT_EVENT event; /* * Drain off outstanding DTOs that may have been * generated by racing disconnects */ do { rc = DT_Tdep_evd_dequeue(recv_evd_hdl, &event); } while (rc == DAT_SUCCESS); rc = dat_ep_free(ep_handle); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free error: %s\n", module, DT_RetToString(rc)); /* keep going */ } } /* Free the 3 EVDs */ if (conn_evd_hdl) { rc = DT_Tdep_evd_free(conn_evd_hdl); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (conn) error: %s\n", module, DT_RetToString(rc)); /* keep going */ } } if (reqt_evd_hdl) { rc = DT_Tdep_evd_free(reqt_evd_hdl); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (reqt) error: %s\n", module, DT_RetToString(rc)); /* keep going */ } } if (recv_evd_hdl) { rc = DT_Tdep_evd_free(recv_evd_hdl); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (recv) error: %s\n", module, DT_RetToString(rc)); /* keep going */ } } /* Free the PZ */ if (pz_handle) { rc = dat_pz_free(pz_handle); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_free error: %s\n", module, DT_RetToString(rc)); /* keep going */ } } /* Close the IA */ if (ia_handle) { /* dat_ia_close cleans up async evd handle, too */ rc = dat_ia_close(ia_handle, DAT_CLOSE_GRACEFUL_FLAG); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (graceful) error: %s\n", module, DT_RetToString(rc)); rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (abrupt) error: %s\n", module, DT_RetToString(rc)); } /* keep going */ } else { DT_Tdep_PT_Debug(1, (phead, "%s: IA %s closed\n", module, dapl_name)); } } /* Free the Per_Test_Data */ DT_Mdep_LockDestroy(&pt_ptr->Thread_counter_lock); DT_PrintMemList(pt_ptr); /* check if we return all space allocated */ DT_Mdep_LockDestroy(&pt_ptr->MemListLock); DT_Free_Per_Test_Data(pt_ptr); DT_Tdep_PT_Printf(phead, "%s: ========== End of Work -- Client Exiting\n", module); return ret; } dapl-2.1.5/test/dapltest/test/dapl_client_info.c000066400000000000000000000041761255317474200216740ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Client_Info_Endian(Client_Info_t * client_info) { client_info->dapltest_version = DT_Endian32(client_info->dapltest_version); client_info->is_little_endian = DT_Endian32(client_info->is_little_endian); client_info->test_type = DT_Endian32(client_info->test_type); client_info->total_threads = DT_Endian32(client_info->total_threads); } void DT_Client_Info_Print(DT_Tdep_Print_Head * phead, Client_Info_t * client_info) { DT_Tdep_PT_Printf(phead, "-------------------------------------\n"); DT_Tdep_PT_Printf(phead, "Client_Info.dapltest_version : %d\n", client_info->dapltest_version); DT_Tdep_PT_Printf(phead, "Client_Info.is_little_endian : %d\n", client_info->is_little_endian); DT_Tdep_PT_Printf(phead, "Client_Info.test_type : %d\n", client_info->test_type); } dapl-2.1.5/test/dapltest/test/dapl_cnxn.c000066400000000000000000000043251255317474200203450ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /****************************************************************************/ int get_ep_connection_state(DT_Tdep_Print_Head * phead, DAT_EP_HANDLE ep_handle) { DAT_EP_STATE ep_state; DAT_BOOLEAN in_dto_idle; DAT_BOOLEAN out_dto_idle; DAT_RETURN ret; char *recv_status = "Idle"; char *req_status = "Idle"; ret = dat_ep_get_status(ep_handle, &ep_state, &in_dto_idle, &out_dto_idle); if (ret != 0) { DT_Tdep_PT_Printf(phead, "DAT_ERROR: Can't get Connection State %s\n", DT_RetToString(ret)); } else { if (in_dto_idle == 0) { recv_status = "Active"; } if (out_dto_idle == 0) { req_status = "Active"; } DT_Tdep_PT_Printf(phead, "DAT_STATE: %s\n", DT_State2Str(ep_state)); DT_Tdep_PT_Printf(phead, "DAT_STATE: Inbound DTO Status: %s \n", recv_status); DT_Tdep_PT_Printf(phead, "DAT_STATE: Outbound DTO Status: %s\n", req_status); } return 0; } dapl-2.1.5/test/dapltest/test/dapl_execute.c000066400000000000000000000054661255317474200210500ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #include "dapl_transaction_cmd.h" #include "dapl_performance_cmd.h" #include "dapl_quit_cmd.h" #include "dapl_limit_cmd.h" DAT_RETURN DT_Execute_Test(Params_t * params_ptr) { DAT_RETURN rc = DAT_SUCCESS; Transaction_Cmd_t *Transaction_Cmd; Quit_Cmd_t *Quit_Cmd; Limit_Cmd_t *Limit_Cmd; Performance_Cmd_t *Performance_Cmd; FFT_Cmd_t *FFT_Cmd; /* re init global data - for kdapltest, we are now in the kernel */ DT_local_is_little_endian = params_ptr->local_is_little_endian; DT_dapltest_debug = params_ptr->debug; switch (params_ptr->test_type) { case SERVER_TEST: { DT_cs_Server(params_ptr); break; } case TRANSACTION_TEST: { Transaction_Cmd = ¶ms_ptr->u.Transaction_Cmd; rc = DT_cs_Client(params_ptr, Transaction_Cmd->dapl_name, Transaction_Cmd->server_name, Transaction_Cmd->num_threads * Transaction_Cmd->eps_per_thread); break; } case QUIT_TEST: { Quit_Cmd = ¶ms_ptr->u.Quit_Cmd; (void)DT_cs_Client(params_ptr, Quit_Cmd->device_name, Quit_Cmd->server_name, 0); break; } case LIMIT_TEST: { Limit_Cmd = ¶ms_ptr->u.Limit_Cmd; rc = DT_cs_Limit(params_ptr, Limit_Cmd); break; } case PERFORMANCE_TEST: { Performance_Cmd = ¶ms_ptr->u.Performance_Cmd; rc = DT_cs_Client(params_ptr, Performance_Cmd->dapl_name, Performance_Cmd->server_name, 1); break; } case FFT_TEST: { FFT_Cmd = ¶ms_ptr->u.FFT_Cmd; rc = DT_cs_FFT(params_ptr, FFT_Cmd); break; } } return rc; } dapl-2.1.5/test/dapltest/test/dapl_fft_connmgt.c000066400000000000000000000070771255317474200217120ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" int DT_connmgt_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { FFT_Connection_t conn; int res = 1; DAT_RETURN rc = 0; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Ensure time in dat_evd_wait works correctly\n"); DT_fft_init_server(params_ptr, cmd, &conn); DT_assert(phead, NULL != conn.ia_handle); rc = DT_Tdep_evd_wait(conn.cr_evd, 10000, &conn.event); DT_assert_dat(phead, DAT_GET_TYPE(rc) == DAT_TIMEOUT_EXPIRED); cleanup: rc = DT_fft_destroy_conn_struct(params_ptr, &conn); DT_assert_clean(phead, rc == DAT_SUCCESS); return res; } int DT_connmgt_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { FFT_Connection_t conn; int res = 1; DAT_RETURN rc; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Attempt to use timeout of 0 in dat_evd_wait\n"); DT_fft_init_server(params_ptr, cmd, &conn); DT_assert(phead, NULL != conn.ia_handle); rc = DT_Tdep_evd_wait(conn.cr_evd, 0, &conn.event); DT_assert_dat(phead, DAT_GET_TYPE(rc) == DAT_TIMEOUT_EXPIRED); cleanup: rc = DT_fft_destroy_conn_struct(params_ptr, &conn); DT_assert_clean(phead, rc == DAT_SUCCESS); return res; } void DT_connmgt_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_connmgt_case0}, {DT_connmgt_case1}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); DT_Tdep_PT_Printf(phead, "\ Function feature: Connect Management (Server side) case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: use other test tool\n"); } else if (res == -2) { DT_Tdep_PT_Printf(phead, "Result: not support or next stage to develop\n"); } DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); } } } } dapl-2.1.5/test/dapltest/test/dapl_fft_endpoint.c000066400000000000000000000164541255317474200220640ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define CQENTRYCOUNT 100 #define BUFFSIZE 1024 #define DEFAULT_QUEUE_LEN 10 int DT_endpoint_generic(Params_t * params_ptr, FFT_Cmd_t * cmd, bool destroy_pz_early) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_EP_HANDLE ep_handle; DAT_EVD_HANDLE evd_handle; DAT_EVD_HANDLE conn_evd_handle; DAT_EVD_HANDLE send_evd_handle; DAT_EVD_HANDLE recv_evd_handle; DAT_RETURN rc, wanted; int res; DT_Tdep_Print_Head *phead; res = 1; ia_handle = NULL; pz_handle = NULL; ep_handle = NULL; evd_handle = NULL; conn_evd_handle = NULL; send_evd_handle = NULL; recv_evd_handle = NULL; dev_name = cmd->device_name; evd_handle = DAT_HANDLE_NULL; phead = params_ptr->phead; rc = dat_ia_open((const DAT_NAME_PTR)dev_name, DEFAULT_QUEUE_LEN, &evd_handle, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); if (destroy_pz_early) { if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } } rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, NULL, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &send_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, NULL, DAT_EVD_DTO_FLAG, &recv_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, NULL, DAT_EVD_CONNECTION_FLAG, &conn_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_ep_create(ia_handle, pz_handle, recv_evd_handle, send_evd_handle, conn_evd_handle, NULL, &ep_handle); if (destroy_pz_early) { wanted = DAT_INVALID_HANDLE; } else { wanted = DAT_SUCCESS; } DT_assert_dat(phead, DAT_GET_TYPE(rc) == wanted); cleanup: if (ep_handle) { rc = dat_ep_free(ep_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (send_evd_handle) { rc = DT_Tdep_evd_free(send_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (recv_evd_handle) { rc = DT_Tdep_evd_free(recv_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn_evd_handle) { rc = DT_Tdep_evd_free(conn_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (!destroy_pz_early && pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return res; } int DT_endpoint_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Test if we can normally create endpoint and destory it.\n"); DT_Tdep_PT_Printf(phead, "\ The endpoint is not associated with a CQ\n"); return DT_endpoint_generic(params_ptr, cmd, false); /* destroy pz early */ } int DT_endpoint_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: try to create endpoint with pz already destroyed\n"); return DT_endpoint_generic(params_ptr, cmd, true); /* destroy pz early */ } int DT_endpoint_case2(Params_t * params_ptr, FFT_Cmd_t * cmd) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_EP_HANDLE ep_handle; DAT_EVD_HANDLE send_evd, conn_evd, recv_evd, cr_evd; DAT_PZ_HANDLE pz_handle; DAT_EVENT event; Bpool *bpool; int res; DAT_RETURN rc; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: try to destroy ep with descriptor still in working queue\n"); res = 1; bpool = 0; pz_handle = 0; ia_handle = 0; ep_handle = 0; send_evd = 0; conn_evd = 0; recv_evd = 0; cr_evd = 0; dev_name = cmd->device_name; rc = DT_ia_open(dev_name, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_ep_create(params_ptr, ia_handle, pz_handle, &cr_evd, &conn_evd, &send_evd, &recv_evd, &ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); bpool = DT_BpoolAlloc(0, phead, ia_handle, pz_handle, NULL, NULL, 4096, 1, DAT_OPTIMAL_ALIGNMENT, false, false); DT_assert(phead, bpool != 0); DT_assert(phead, DT_post_recv_buffer(phead, ep_handle, bpool, 0, 4096) == true); if (ep_handle) { rc = dat_ep_free(ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } /* * Remove all DTOs. The disconnect above may have * flushed all posted operations, so this is just a * clean up. */ do { rc = DT_Tdep_evd_dequeue(recv_evd, &event); } while (rc == DAT_SUCCESS); cleanup: if (bpool) { rc = DT_Bpool_Destroy(0, phead, bpool); DT_assert_clean(phead, rc != false); } if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return res; } /*-------------------------------------------------------------*/ void DT_endpoint_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_endpoint_case0}, {DT_endpoint_case1}, {DT_endpoint_case2}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); DT_Tdep_PT_Printf(phead, "\ Function feature: EndPoint management case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: use other test tool\n"); } else if (res == -2) { DT_Tdep_PT_Printf(phead, "Result: not support or next stage to develop\n"); } DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); } } return; } dapl-2.1.5/test/dapltest/test/dapl_fft_hwconn.c000066400000000000000000000145341255317474200215350ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /*--------------------------------------------------------*/ int DT_hwconn_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { char *dev_name; DAT_IA_HANDLE nic_handle; DAT_EVD_HANDLE evd_handle; DAT_RETURN rc; int res = 1; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Test if we can normally Open NIC and then close it\n"); dev_name = cmd->device_name; nic_handle = 0; evd_handle = DAT_HANDLE_NULL; rc = dat_ia_open((const DAT_NAME_PTR)dev_name, 10, &evd_handle, &nic_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_ia_close(nic_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_dat(phead, rc == DAT_SUCCESS); cleanup: return res; } /*--------------------------------------------------------*/ int DT_hwconn_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { DAT_IA_HANDLE nic_handle; DAT_RETURN rc; DAT_EVD_HANDLE evd_handle; char dev_name[100]; int i; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: try to open NIC with incorrect device name\n"); DT_Tdep_PT_Printf(phead, " (just num, one letter, multiple letter, num_letter\n"); DT_Tdep_PT_Printf(phead, "letter_num). You alse can do this test manually\n"); DT_Tdep_PT_Printf(phead, "dapltest -T F -D -f hwconn \n"); for (i = 0; i < 5; i++) { if (i == 0) { sprintf(dev_name, "%s", "40"); /* just number */ } else if (i == 1) { sprintf(dev_name, "%s", "x"); /* just letter */ } else if (i == 2) { sprintf(dev_name, "%s", "xsdf"); /* multiple letter */ } else if (i == 3) { sprintf(dev_name, "%s", "x34"); /* letter_number */ } else if (i == 4) { sprintf(dev_name, "%s", "34df"); /* number_letter */ } evd_handle = DAT_HANDLE_NULL; rc = dat_ia_open((const DAT_NAME_PTR)dev_name, 10, &evd_handle, &nic_handle); if (DAT_GET_TYPE(rc) != DAT_PROVIDER_NOT_FOUND) { const char *major_msg, *minor_msg; DT_Tdep_PT_Printf(phead, " \ fff not get expected result when open NIC with device name: %s\n", dev_name); dat_strerror(rc, &major_msg, &minor_msg); DT_Tdep_PT_Printf(phead, "ERROR: %s (%s)\n", major_msg, minor_msg); if (rc == DAT_SUCCESS) { rc = dat_ia_close(nic_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return 0; } } return 1; } /*--------------------------------------------------------*/ int DT_hwconn_case2(Params_t * params_ptr, FFT_Cmd_t * cmd) { DAT_IA_HANDLE nic_handle; DAT_RETURN rc; int res = 1; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Try to close nic with Nic handle is null (NIC not open)\n"); nic_handle = 0; rc = dat_ia_close(nic_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_dat(phead, DAT_GET_TYPE(rc) == DAT_INVALID_HANDLE); cleanup: return res; } /*--------------------------------------------------------*/ int DT_hwconn_case3(Params_t * params_ptr, FFT_Cmd_t * cmd) { FFT_Connection_t conn; DAT_RETURN rc; int res; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Test if we can close NIC when the created \n"); DT_Tdep_PT_Printf(phead, "endpoint has not been destroyed.\n"); DT_Tdep_PT_Printf(phead, "The problem for this case is that once the hca is closed, \n"); DT_Tdep_PT_Printf(phead, "there is no way to destroy the endpoint's resources\n"); DT_Tdep_PT_Printf(phead, "thus the test leaks a small amount of memory\n"); res = 1; DT_fft_init_client(params_ptr, cmd, &conn); /* try to close nic when vi have not destroyed */ if (conn.ia_handle) { rc = dat_ia_close(conn.ia_handle, DAT_CLOSE_ABRUPT_FLAG); if (rc != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Warning: dat_ia_close fails %s, reboot for cleanup\n", DT_RetToString(rc)); return 0; } } else { res = 0; } /* if nic is closed, it is impossible to destory vi and ptag */ //DT_fft_destroy_conn_struct(&conn); return res; } /*-------------------------------------------------------------*/ void DT_hwconn_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_hwconn_case0}, {DT_hwconn_case1}, {DT_hwconn_case2}, {DT_hwconn_case3}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); DT_Tdep_PT_Printf(phead, "\ Function feature: Hardware connection case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: use other test tool\n"); } else if (res == -2) { DT_Tdep_PT_Printf(phead, "Result: next stage to develop\n"); } DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); } } return; } dapl-2.1.5/test/dapltest/test/dapl_fft_mem.c000066400000000000000000000142251255317474200210140ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define CQENTRYCOUNT 100 #define BUFFSIZE 1024 /*--------------------------------------------------------*/ int DT_mem_generic(Params_t * params_ptr, FFT_Cmd_t * cmd, int flag) { DAT_RETURN rc, expect; FFT_Connection_t conn; DAT_REGION_DESCRIPTION region; DAT_VLEN reg_size; DAT_LMR_HANDLE lmr_handle; DAT_LMR_CONTEXT lmr_context; DAT_VADDR reg_addr; unsigned char *alloc_ptr; int res; DAT_VLEN buffer_size; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; rc = 0; expect = 0; res = 1; lmr_handle = 0; lmr_context = 0; reg_addr = 0; alloc_ptr = 0; ia_handle = 0; pz_handle = 0; DT_fft_init_client(params_ptr, cmd, &conn); DT_assert(phead, NULL != conn.ia_handle); if (flag == 2) { buffer_size = 0; alloc_ptr = 0; } else { buffer_size = BUFFSIZE * sizeof(unsigned char); alloc_ptr = (unsigned char *)DT_Mdep_Malloc((size_t) buffer_size); DT_assert(phead, alloc_ptr); } memset(®ion, 0, sizeof(region)); region.for_va = alloc_ptr; ia_handle = conn.ia_handle; if (flag != 3) { pz_handle = conn.pz_handle; } if (flag != 4) { DT_Tdep_PT_Printf(phead, "Registering memory\n"); rc = DT_Tdep_lmr_create(ia_handle, DAT_MEM_TYPE_VIRTUAL, region, buffer_size, conn.pz_handle, DAT_MEM_PRIV_ALL_FLAG, &lmr_handle, &lmr_context, NULL, /* FIXME */ ®_size, ®_addr); if (flag == 2) { expect = DAT_LENGTH_ERROR; } else { expect = DAT_SUCCESS; } DT_assert_dat(phead, DAT_GET_TYPE(rc) == expect); } if (flag == 1) { if (lmr_handle) { rc = dat_lmr_free(lmr_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } lmr_handle = 0; rc = DT_Tdep_lmr_create(conn.ia_handle, DAT_MEM_TYPE_VIRTUAL, region, buffer_size, conn.pz_handle, DAT_MEM_PRIV_ALL_FLAG, &lmr_handle, &lmr_context, NULL, /* FIXME */ ®_size, ®_addr); DT_assert_dat(phead, rc == DAT_SUCCESS); } cleanup: if (lmr_handle) { rc = dat_lmr_free(lmr_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (alloc_ptr) { DT_Mdep_Free(alloc_ptr); } rc = DT_fft_destroy_conn_struct(params_ptr, &conn); DT_assert_clean(phead, rc == DAT_SUCCESS); return res; } int DT_mem_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Test if we can register typical size of memory\n"); DT_Tdep_PT_Printf(phead, "\ then deregister it.\n"); return DT_mem_generic(params_ptr, cmd, 0); } /*--------------------------------------------------------*/ int DT_mem_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Test if we can register typical size of memory\n"); DT_Tdep_PT_Printf(phead, "\ deregister, then register it again.\n"); return DT_mem_generic(params_ptr, cmd, 1); } /*--------------------------------------------------------*/ int DT_mem_case2(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Try to register memory with memory size 0\n"); return DT_mem_generic(params_ptr, cmd, 2); } /*--------------------------------------------------------*/ int DT_mem_case3(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Try to register memory with null pz\n"); return DT_mem_generic(params_ptr, cmd, 3); } /*--------------------------------------------------------*/ int DT_mem_case4(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Try to deregister memory with null lmr_handle\n"); return DT_mem_generic(params_ptr, cmd, 4); } /*-------------------------------------------------------------*/ void DT_mem_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_mem_case0}, {DT_mem_case1}, {DT_mem_case2}, {DT_mem_case3}, {DT_mem_case4}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); DT_Tdep_PT_Printf(phead, "\ Function feature: Memory register/deregister case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: use other test tool\n"); } else if (res == -2) { DT_Tdep_PT_Printf(phead, "Result: not support or next stage to develop\n"); } DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); } } return; } dapl-2.1.5/test/dapltest/test/dapl_fft_pz.c000066400000000000000000000146441255317474200206740ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define CQENTRYCOUNT 100 #define BUFFSIZE 1024 /*--------------------------------------------------------*/ int DT_pz_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_EVD_HANDLE evd_handle; DAT_RETURN rc; int res; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: Test if we can normally create pz and destroy it.\n"); res = 1; ia_handle = 0; pz_handle = 0; evd_handle = DAT_HANDLE_NULL; dev_name = cmd->device_name; rc = DT_ia_open(dev_name, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); cleanup: if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_dat(phead, rc == DAT_SUCCESS); } return res; } /*--------------------------------------------------------*/ int DT_pz_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; DAT_EP_HANDLE ep_handle; DAT_EVD_HANDLE conn_evd, send_evd, recv_evd, cr_evd; DAT_RETURN rc; int res; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: try to destroy pz with vi still associated with it\n"); res = 1; ia_handle = 0; pz_handle = 0; ep_handle = 0; conn_evd = 0; send_evd = 0; recv_evd = 0; cr_evd = 0; dev_name = cmd->device_name; rc = DT_ia_open(dev_name, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_ep_create(params_ptr, ia_handle, pz_handle, &cr_evd, &conn_evd, &send_evd, &recv_evd, &ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_dat(phead, DAT_GET_TYPE(rc) == DAT_INVALID_STATE); } cleanup: /* corrrect order */ if (ep_handle) { rc = dat_ep_free(ep_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn_evd) { rc = DT_Tdep_evd_free(conn_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (send_evd) { rc = DT_Tdep_evd_free(send_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (recv_evd) { rc = DT_Tdep_evd_free(recv_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return res; } /*--------------------------------------------------------*/ int DT_pz_case2(Params_t * params_ptr, FFT_Cmd_t * cmd) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_PZ_HANDLE pz_handle; Bpool *bpool; DAT_RETURN rc; int res; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "\ Description: try to destroy pz with registered memory still\n"); DT_Tdep_PT_Printf(phead, "\ associated with it\n"); res = 1; ia_handle = 0; pz_handle = 0; bpool = 0; dev_name = cmd->device_name; rc = DT_ia_open(dev_name, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* allocate and register bpool */ bpool = DT_BpoolAlloc(0, phead, ia_handle, pz_handle, NULL, NULL, BUFFSIZE, 1, DAT_OPTIMAL_ALIGNMENT, false, false); DT_assert(phead, bpool != 0); if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_dat(phead, DAT_GET_TYPE(rc) == DAT_INVALID_STATE); } cleanup: /* deregister and free bpool */ if (DT_Bpool_Destroy(0, phead, bpool) == false) { DT_Tdep_PT_Printf(phead, "Warning: Destroy bpool fails, reboot for cleanup\n"); return 0; } if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return res; } /*-------------------------------------------------------------*/ void DT_pz_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_pz_case0}, {DT_pz_case1}, {DT_pz_case2}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); DT_Tdep_PT_Printf(phead, "\ Function feature: Protection Zone management case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: use other test tool\n"); } else if (res == -2) { DT_Tdep_PT_Printf(phead, "Result: not support or next stage to develop\n"); } DT_Tdep_PT_Printf(phead, "\ *********************************************************************\n"); } } return; } dapl-2.1.5/test/dapltest/test/dapl_fft_queryinfo.c000066400000000000000000000432531255317474200222620ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define CQENTRYCOUNT 100 #define BUFFSIZE 1024 #define DEFAULT_QUEUE_LEN 10 #if defined(WIN32) static DAT_OS_WAIT_PROXY_AGENT NULLPROXY = { (DAT_PVOID) NULL, (DAT_AGENT_FUNC) NULL }; #endif int DT_queryinfo_basic(Params_t * params_ptr, FFT_Cmd_t * cmd, FFT_query_enum object_to_query, DAT_RETURN result_wanted) { char *dev_name; DAT_IA_HANDLE ia_handle; DAT_IA_ATTR ia_attributes; DAT_PROVIDER_ATTR provider_attributes; DAT_EVD_HANDLE evd_handle; DAT_EVD_HANDLE conn_evd_handle; DAT_EVD_HANDLE cr_evd_handle; DAT_EVD_HANDLE send_evd_handle; DAT_EVD_HANDLE recv_evd_handle; DAT_EP_HANDLE ep_handle; DAT_EP_PARAM ep_param; DAT_CNO_HANDLE cno_handle; #ifndef __KDAPLTEST__ DAT_CNO_PARAM cno_param; #endif DAT_EVD_PARAM evd_param; DAT_PSP_HANDLE psp_handle; DAT_PSP_PARAM psp_param; DAT_RSP_HANDLE rsp_handle; DAT_RSP_PARAM rsp_param; DAT_PZ_HANDLE pz_handle; DAT_PZ_PARAM pz_param; DAT_LMR_HANDLE lmr_handle; DAT_LMR_PARAM lmr_param; DAT_LMR_CONTEXT lmr_context; DAT_RMR_HANDLE rmr_handle; DAT_RMR_PARAM rmr_param; DAT_REGION_DESCRIPTION region; DAT_VLEN reg_size; DAT_VADDR reg_addr; DAT_VLEN buffer_size; unsigned char *alloc_ptr; DT_Tdep_Print_Head *phead; DAT_RETURN rc; int res = 1; buffer_size = BUFFSIZE * sizeof(unsigned char); phead = params_ptr->phead; reg_addr = 0; alloc_ptr = 0; ia_handle = NULL; pz_handle = NULL; ep_handle = NULL; lmr_handle = NULL; rmr_handle = NULL; pz_handle = NULL; psp_handle = NULL; rsp_handle = NULL; cno_handle = NULL; evd_handle = DAT_HANDLE_NULL; conn_evd_handle = DAT_HANDLE_NULL; cr_evd_handle = DAT_HANDLE_NULL; recv_evd_handle = DAT_HANDLE_NULL; send_evd_handle = DAT_HANDLE_NULL; dev_name = cmd->device_name; /* All functions require an ia_handle to be created */ rc = dat_ia_open((const DAT_NAME_PTR)dev_name, DEFAULT_QUEUE_LEN, &evd_handle, &ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* These functions require a pz_handle to be created */ if ((object_to_query == QUERY_EVD) || (object_to_query == QUERY_RMR) || (object_to_query == QUERY_LMR) || (object_to_query == QUERY_EP) || (object_to_query == QUERY_RSP) || (object_to_query == QUERY_PZ)) { rc = dat_pz_create(ia_handle, &pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } /* These functions require a ep_handle to be created */ if ((object_to_query == QUERY_EP) || (object_to_query == QUERY_RSP)) { rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, cno_handle, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &send_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, cno_handle, DAT_EVD_DTO_FLAG, &recv_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, cno_handle, DAT_EVD_CONNECTION_FLAG, &conn_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_ep_create(ia_handle, pz_handle, recv_evd_handle, send_evd_handle, conn_evd_handle, NULL, &ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } /* These functions require a CR EVD to be created. */ if ((object_to_query == QUERY_PSP) || (object_to_query == QUERY_RSP)) { rc = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, cno_handle, DAT_EVD_CR_FLAG, &cr_evd_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); } /* Test dat_ia_query function */ if (object_to_query == QUERY_IA) { if (result_wanted == DAT_SUCCESS) { rc = dat_ia_query(ia_handle, &evd_handle, DAT_IA_ALL, &ia_attributes, DAT_PROVIDER_FIELD_ALL, &provider_attributes); } else if (result_wanted == DAT_INVALID_PARAMETER) { /* * The only way to get an invalid parameter is to * NULL out ia_attr and for the DAT_IA_ATTR_MASK to * have values */ rc = dat_ia_query(ia_handle, &evd_handle, DAT_IA_ALL, NULL, DAT_PROVIDER_FIELD_ALL, &provider_attributes); } else if (result_wanted == DAT_INVALID_HANDLE) { rc = dat_ia_query(evd_handle, &evd_handle, DAT_IA_ALL, &ia_attributes, DAT_PROVIDER_FIELD_ALL, &provider_attributes); } } /* Test dat_cno_query function */ else if (object_to_query == QUERY_CNO) { #ifndef __KDAPLTEST__ #if defined(WIN32) rc = dat_cno_create(ia_handle, NULLPROXY, &cno_handle); #else rc = dat_cno_create(ia_handle, DAT_OS_WAIT_PROXY_AGENT_NULL, &cno_handle); #endif DT_assert_dat(phead, rc == DAT_SUCCESS); if (result_wanted == DAT_SUCCESS) { rc = dat_cno_query(cno_handle, DAT_CNO_FIELD_ALL, &cno_param); } else if (result_wanted == DAT_INVALID_PARAMETER) { rc = dat_cno_query(cno_handle, DAT_CNO_FIELD_ALL, NULL); } else if (result_wanted == DAT_INVALID_HANDLE) { rc = dat_cno_query(ia_handle, DAT_CNO_FIELD_ALL, &cno_param); } #endif } /* Test dat_evd_query function */ else if (object_to_query == QUERY_EVD) { if (result_wanted == DAT_SUCCESS) { rc = dat_evd_query(evd_handle, DAT_EVD_FIELD_ALL, &evd_param); } else if (result_wanted == DAT_INVALID_PARAMETER) { rc = dat_evd_query(evd_handle, DAT_EVD_FIELD_ALL, NULL); } else if (result_wanted == DAT_INVALID_HANDLE) { rc = dat_evd_query(ia_handle, DAT_EVD_FIELD_ALL, &evd_param); } } /* Test dat_psp_query function */ else if (object_to_query == QUERY_PSP) { rc = dat_psp_create(ia_handle, params_ptr->server_port, cr_evd_handle, DAT_PSP_PROVIDER_FLAG, &psp_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); if (result_wanted == DAT_SUCCESS) { rc = dat_psp_query(psp_handle, DAT_PSP_FIELD_ALL, &psp_param); } else if (result_wanted == DAT_INVALID_PARAMETER) { rc = dat_psp_query(psp_handle, DAT_PSP_FIELD_ALL, NULL); } else if (result_wanted == DAT_INVALID_HANDLE) { rc = dat_psp_query(evd_handle, DAT_PSP_FIELD_ALL, &psp_param); } } /* Test dat_rsp_query function */ else if (object_to_query == QUERY_RSP) { rc = dat_rsp_create(ia_handle, params_ptr->server_port, ep_handle, cr_evd_handle, &rsp_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_rsp_query(rsp_handle, DAT_RSP_FIELD_ALL, &rsp_param); } /* Test dat_cr_query function */ else if (object_to_query == QUERY_CR) { /* This query is tested in the conmgt test */ res = -1; } /* Test dat_ep_query function */ else if (object_to_query == QUERY_EP) { rc = dat_ep_query(ep_handle, DAT_EP_FIELD_ALL, &ep_param); } /* Test dat_pz_query function */ else if (object_to_query == QUERY_PZ) { rc = dat_pz_query(pz_handle, DAT_PZ_FIELD_ALL, &pz_param); } /* Test dat_lmr_query function */ else if (object_to_query == QUERY_LMR) { alloc_ptr = (unsigned char *)DT_Mdep_Malloc((size_t) buffer_size); DT_assert(phead, alloc_ptr); memset(®ion, 0, sizeof(region)); region.for_va = alloc_ptr; rc = DT_Tdep_lmr_create(ia_handle, DAT_MEM_TYPE_VIRTUAL, region, buffer_size, pz_handle, DAT_MEM_PRIV_ALL_FLAG, &lmr_handle, &lmr_context, NULL, /* FIXME */ ®_size, ®_addr); DT_assert_dat(phead, rc == DAT_SUCCESS); rc = dat_lmr_query(lmr_handle, DAT_LMR_FIELD_ALL, &lmr_param); } /* Test dat_rmr_query function */ else if (object_to_query == QUERY_RMR) { rc = dat_rmr_create(pz_handle, &rmr_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* We don't bind the RMR to anything, so don't ask for the * LMR_TRIPLET flag */ rc = dat_rmr_query(rmr_handle, DAT_RMR_FIELD_ALL - DAT_RMR_FIELD_LMR_TRIPLET, &rmr_param); } DT_assert_dat(phead, DAT_GET_TYPE(rc) == result_wanted); cleanup: if (rsp_handle) { rc = dat_rsp_free(rsp_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ep_handle) { rc = dat_ep_free(ep_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (send_evd_handle) { rc = DT_Tdep_evd_free(send_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (recv_evd_handle) { rc = DT_Tdep_evd_free(recv_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn_evd_handle) { rc = DT_Tdep_evd_free(conn_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (lmr_handle) { rc = dat_lmr_free(lmr_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (rmr_handle) { rc = dat_rmr_free(rmr_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } #ifndef __KDAPLTEST__ if (cno_handle) { rc = dat_cno_free(cno_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } #endif if (psp_handle) { rc = dat_psp_free(psp_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (cr_evd_handle) { rc = DT_Tdep_evd_free(cr_evd_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (pz_handle) { rc = dat_pz_free(pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (ia_handle) { rc = dat_ia_close(ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return res; } int DT_queryinfo_case0(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify IA Querying information is successful using\nDAT_IA_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_IA, DAT_SUCCESS); } int DT_queryinfo_case1(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify CNO Querying information is successful using\nDAT_CNO_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_CNO, DAT_SUCCESS); } int DT_queryinfo_case2(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify EVD Querying information is successful using\nDAT_EVD_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_EVD, DAT_SUCCESS); } int DT_queryinfo_case3(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify PSP Querying information is successful using\nDAT_PSP_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_PSP, DAT_SUCCESS); } int DT_queryinfo_case4(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify RSP Querying information is successful using\nDAT_RSP_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_RSP, DAT_SUCCESS); } int DT_queryinfo_case5(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify CR Querying information is successful using\nDAT_CR_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_CR, DAT_SUCCESS); } int DT_queryinfo_case6(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify EP Querying information is successful using\nDAT_EP_QUERY.\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_EP, DAT_SUCCESS); } int DT_queryinfo_case7(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify PZ Querying information is successful using\n"); DT_Tdep_PT_Printf(phead, "DAT_PZ_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_PZ, DAT_SUCCESS); } int DT_queryinfo_case8(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify LMR Querying information is successful using\n"); DT_Tdep_PT_Printf(phead, "DAT_LMR_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_LMR, DAT_SUCCESS); } int DT_queryinfo_case9(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify RMR Querying information is successful using\n"); DT_Tdep_PT_Printf(phead, "DAT_RMR_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_RMR, DAT_SUCCESS); } int DT_queryinfo_case10(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify IA Querying fails with DAT_INVALID_PARAMETER when\n"); DT_Tdep_PT_Printf(phead, "passing a bad parameter to DAT_IA_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_IA, DAT_INVALID_PARAMETER); } int DT_queryinfo_case11(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify IA Querying fails with DAT_INVALID_HANDLE when\n"); DT_Tdep_PT_Printf(phead, "passing an invalid handle to DAT_IA_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_IA, DAT_INVALID_HANDLE); } int DT_queryinfo_case12(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify CNO Querying fails with DAT_INVALID_PARAMETER when\n"); DT_Tdep_PT_Printf(phead, "passing a bad parameter to DAT_CNO_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_CNO, DAT_INVALID_PARAMETER); } int DT_queryinfo_case13(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify CNO Querying fails with DAT_INVALID_HANDLE when\n"); DT_Tdep_PT_Printf(phead, "passing an invalid handle to DAT_CNO_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_CNO, DAT_INVALID_HANDLE); } int DT_queryinfo_case14(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify EVD Querying fails with DAT_INVALID_PARAMETER when\n"); DT_Tdep_PT_Printf(phead, "passing a bad parameter to DAT_EVD_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_EVD, DAT_INVALID_PARAMETER); } int DT_queryinfo_case15(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify EVD Querying fails with DAT_INVALID_HANDLE when\n"); DT_Tdep_PT_Printf(phead, "passing an invalid handle to DAT_EVD_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_EVD, DAT_INVALID_HANDLE); } int DT_queryinfo_case16(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify PSP Querying fails with DAT_INVALID_PARAMETER when\n"); DT_Tdep_PT_Printf(phead, "passing a bad parameter to DAT_PSP_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_PSP, DAT_INVALID_PARAMETER); } int DT_queryinfo_case17(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; phead = params_ptr->phead; DT_Tdep_PT_Printf(phead, "Description: Verify PSP Querying fails with DAT_INVALID_HANDLE when\n"); DT_Tdep_PT_Printf(phead, "passing an invalid handle to DAT_PSP_QUERY\n"); return DT_queryinfo_basic(params_ptr, cmd, QUERY_PSP, DAT_INVALID_HANDLE); } /*-------------------------------------------------------------*/ void DT_queryinfo_test(Params_t * params_ptr, FFT_Cmd_t * cmd) { int i; int res; DT_Tdep_Print_Head *phead; FFT_Testfunc_t cases_func[] = { {DT_queryinfo_case0}, {DT_queryinfo_case1}, {DT_queryinfo_case2}, {DT_queryinfo_case3}, {DT_queryinfo_case4}, {DT_queryinfo_case5}, {DT_queryinfo_case6}, {DT_queryinfo_case7}, {DT_queryinfo_case8}, {DT_queryinfo_case9}, {DT_queryinfo_case10}, {DT_queryinfo_case11}, #ifndef __KDAPLTEST__ {DT_queryinfo_case12}, {DT_queryinfo_case13}, #endif {DT_queryinfo_case14}, {DT_queryinfo_case15}, {DT_queryinfo_case16}, {DT_queryinfo_case17}, }; phead = params_ptr->phead; for (i = 0; i < cmd->size; i++) { if (cmd->cases_flag[i]) { DT_Tdep_PT_Printf(phead, "*********************************************************************\n"); DT_Tdep_PT_Printf(phead, "Function feature: Queryinfo case: %d\n", i); res = cases_func[i].fun(params_ptr, cmd); if (res == 1) { DT_Tdep_PT_Printf(phead, "Result: PASS\n"); } else if (res == 0) { DT_Tdep_PT_Printf(phead, "Result: FAIL\n"); } else if (res == -1) { DT_Tdep_PT_Printf(phead, "Result: UNSUPP\n"); } DT_Tdep_PT_Printf(phead, "*********************************************************************\n"); } } return; } dapl-2.1.5/test/dapltest/test/dapl_fft_test.c000066400000000000000000000043501255317474200212130ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" DAT_RETURN DT_cs_FFT(Params_t * params_ptr, FFT_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; DAT_RETURN rc = DAT_SUCCESS; phead = params_ptr->phead; switch (cmd->fft_type) { case HWCONN: { DT_hwconn_test(params_ptr, cmd); break; } case ENDPOINT: { DT_endpoint_test(params_ptr, cmd); break; } case PTAGMGT: { DT_pz_test(params_ptr, cmd); break; } case MEMMGT: { DT_mem_test(params_ptr, cmd); break; } case CONNMGT: { DT_connmgt_test(params_ptr, cmd); break; } case QUERYINFO: { DT_queryinfo_test(params_ptr, cmd); break; } #if 0 // not yet implemented case CONNMGT_CLIENT: case NS: case ERRHAND: case UNSUPP: case STRESS: case STRESS_CLIENT: case CQMGT: { DT_Tdep_PT_Printf(phead, "Not Yet Implemented\n"); break; } #endif default: { DT_Tdep_PT_Printf(phead, "don't know this test\n"); rc = DAT_INVALID_PARAMETER; break; } } return rc; } dapl-2.1.5/test/dapltest/test/dapl_fft_util.c000066400000000000000000000242611255317474200212140ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define DEFAULT_QUEUE_LEN 10 /* function that is called when an assertion fails, printing out the line * that failed vi DT_Tdep_PT_Printf */ void DT_assert_fail(DT_Tdep_Print_Head * phead, char *exp, char *file, char *baseFile, int line) { if (!strcmp(file, baseFile)) { DT_Tdep_PT_Printf(phead, "%s failed in file %s, line %d\n", exp, file, line); } else { DT_Tdep_PT_Printf(phead, "%s failed in file %s (included from %s), line %d\n", exp, file, baseFile, line); } } /* helper function to open an IA */ int DT_ia_open(DAT_NAME_PTR dev_name, DAT_IA_HANDLE * ia_handle) { DAT_EVD_HANDLE evd_handle; evd_handle = DAT_HANDLE_NULL; return dat_ia_open(dev_name, DEFAULT_QUEUE_LEN, &evd_handle, ia_handle); } /* helper function to create an endpoint and its associated EVDs */ int DT_ep_create(Params_t * params_ptr, DAT_IA_HANDLE ia_handle, DAT_PZ_HANDLE pz_handle, DAT_EVD_HANDLE * cr_evd, DAT_EVD_HANDLE * conn_evd, DAT_EVD_HANDLE * send_evd, DAT_EVD_HANDLE * recv_evd, DAT_EP_HANDLE * ep_handle) { DAT_RETURN status; DT_Tdep_Print_Head *phead; *conn_evd = 0; *send_evd = 0; *recv_evd = 0; *cr_evd = 0; phead = params_ptr->phead; status = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, cr_evd); if (status != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "dat_evd_create failed %s\n", DT_RetToString(status)); return status; } status = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, conn_evd); if (status != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "dat_evd_create failed %s\n", DT_RetToString(status)); return status; } status = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, send_evd); if (status != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "dat_evd_create failed %s\n", DT_RetToString(status)); return status; } status = DT_Tdep_evd_create(ia_handle, DEFAULT_QUEUE_LEN, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG, recv_evd); if (status != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "dat_evd_create failed %s\n", DT_RetToString(status)); return status; } status = dat_ep_create(ia_handle, pz_handle, *recv_evd, *send_evd, *conn_evd, NULL, ep_handle); if (status != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "dat_ep_create failed %s\n", DT_RetToString(status)); } return status; } /* function that initializes the connection struct */ void DT_fft_init_conn_struct(FFT_Connection_t * conn) { conn->ia_handle = 0; conn->pz_handle = 0; conn->psp_handle = 0; conn->ep_handle = 0; conn->cr_evd = 0; conn->send_evd = 0; conn->conn_evd = 0; conn->recv_evd = 0; conn->cr_handle = 0; conn->remote_netaddr = 0; conn->bpool = 0; conn->pt_ptr = 0; conn->connected = false; } /* helper function that simplifies many dat calls for the initiialization of a * dat "client" */ void DT_fft_init_client(Params_t * params_ptr, FFT_Cmd_t * cmd, FFT_Connection_t * conn) { int res; DAT_RETURN rc = 0; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; /* initialize the struct's members */ DT_fft_init_conn_struct(conn); /* open the IA */ rc = DT_ia_open(cmd->device_name, &conn->ia_handle); if (rc != DAT_SUCCESS) { /* make sure the handle has an invalid value */ conn->ia_handle = NULL; } DT_assert_dat(phead, rc == DAT_SUCCESS); /* create a PZ */ rc = dat_pz_create(conn->ia_handle, &conn->pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* create an EP and its EVDs */ rc = DT_ep_create(params_ptr, conn->ia_handle, conn->pz_handle, &conn->cr_evd, &conn->conn_evd, &conn->send_evd, &conn->recv_evd, &conn->ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* if a server name is given, allocate memory for a net address and set it * up appropriately */ if (cmd->server_name && strlen(cmd->server_name)) { conn->remote_netaddr = ¶ms_ptr->server_netaddr; } cleanup: return; } /* helper function to break down a client or server created with one of the * init helper functions */ int DT_fft_destroy_conn_struct(Params_t * params_ptr, FFT_Connection_t * conn) { DAT_RETURN rc = DAT_SUCCESS; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; if (conn->ep_handle) { if (conn->connected) { rc = dat_ep_disconnect(conn->ep_handle, DAT_CLOSE_DEFAULT); DT_assert_clean(phead, rc == DAT_SUCCESS); if (!DT_disco_event_wait(phead, conn->cr_evd, NULL)) { DT_Tdep_PT_Printf(phead, "DT_fft_destroy_conn_struct: bad disconnect event\n"); } } rc = dat_ep_free(conn->ep_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->bpool) { DT_Bpool_Destroy(0, phead, conn->bpool); } if (conn->psp_handle) { rc = dat_psp_free(conn->psp_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->cr_evd) { rc = DT_Tdep_evd_free(conn->cr_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->conn_evd) { rc = DT_Tdep_evd_free(conn->conn_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->send_evd) { rc = DT_Tdep_evd_free(conn->send_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->recv_evd) { rc = DT_Tdep_evd_free(conn->recv_evd); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->pt_ptr) { DT_Free_Per_Test_Data(conn->pt_ptr); } if (conn->pz_handle) { rc = dat_pz_free(conn->pz_handle); DT_assert_clean(phead, rc == DAT_SUCCESS); } if (conn->ia_handle) { rc = dat_ia_close(conn->ia_handle, DAT_CLOSE_ABRUPT_FLAG); DT_assert_clean(phead, rc == DAT_SUCCESS); } return rc; } /* helper function to init a dat "server" */ void DT_fft_init_server(Params_t * params_ptr, FFT_Cmd_t * cmd, FFT_Connection_t * conn) { int res; DAT_RETURN rc = 0; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; /* init the connection struct's members */ DT_fft_init_conn_struct(conn); /* open the IA */ rc = DT_ia_open(cmd->device_name, &conn->ia_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* create a PZ */ rc = dat_pz_create(conn->ia_handle, &conn->pz_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* create an EP and its EVDs */ rc = DT_ep_create(params_ptr, conn->ia_handle, conn->pz_handle, &conn->cr_evd, &conn->conn_evd, &conn->send_evd, &conn->recv_evd, &conn->ep_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* create a PSP */ rc = dat_psp_create(conn->ia_handle, params_ptr->server_port, conn->cr_evd, DAT_PSP_CONSUMER_FLAG, &conn->psp_handle); DT_assert_dat(phead, rc == DAT_SUCCESS); /* allocate memory for buffers */ conn->bpool = DT_BpoolAlloc(0, phead, conn->ia_handle, conn->pz_handle, NULL, NULL, 8192, 2, DAT_OPTIMAL_ALIGNMENT, false, false); DT_assert(phead, conn->bpool); cleanup: return; } /* helper function that allows a server to listen for a connection */ void DT_fft_listen(Params_t * params_ptr, FFT_Connection_t * conn) { int res; DAT_RETURN rc = 0; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; /* wait on a CR event via the CR EVD */ DT_assert_dat(phead, DT_cr_event_wait(phead, conn->cr_evd, &conn->cr_stat) && DT_cr_check(phead, &conn->cr_stat, conn->psp_handle, params_ptr->server_port, &conn->cr_handle, "DT_fft_listen")); /* accept the connection */ rc = dat_cr_accept(conn->cr_handle, conn->ep_handle, 0, (DAT_PVOID) 0); DT_assert_dat(phead, rc == DAT_SUCCESS); /* wait on a conn event via the conn EVD */ DT_assert(phead, DT_conn_event_wait(phead, conn->ep_handle, conn->conn_evd, &conn->event_num) == true); conn->connected = true; cleanup: return; } /* helper function that allows a client to connect to a server */ int DT_fft_connect(Params_t * params_ptr, FFT_Connection_t * conn) { int wait_count; int res; DAT_RETURN rc = 0; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; /* try 10 times to connect */ for (wait_count = 0; wait_count < 10; wait_count++) { DT_Tdep_PT_Printf(phead, "Connection to server, attempt #%d\n", wait_count + 1); /* attempt to connect, timeout = 10 secs */ rc = dat_ep_connect(conn->ep_handle, conn->remote_netaddr, params_ptr->server_port, 10 * 1000000, 0, (DAT_PVOID) 0, DAT_QOS_BEST_EFFORT, DAT_CONNECT_DEFAULT_FLAG); DT_assert_dat(phead, rc == DAT_SUCCESS); /* wait on conn event */ DT_assert(phead, DT_conn_event_wait(phead, conn->ep_handle, conn->conn_evd, &conn->event_num) == true); /* make sure we weren't rejected by the peer */ if (conn->event_num == DAT_CONNECTION_EVENT_PEER_REJECTED) { DT_Mdep_Sleep(1000); DT_Tdep_PT_Printf(phead, "Connection rejected by peer; retrying\n"); } } cleanup: if (conn->event_num == DAT_CONNECTION_EVENT_ESTABLISHED) { conn->connected = true; } /* returns true if connected, false otherwise */ return (conn->connected); } dapl-2.1.5/test/dapltest/test/dapl_limit.c000066400000000000000000001156771255317474200205320ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* * Increase the size of an array of handles */ static bool more_handles(DT_Tdep_Print_Head * phead, DAT_HANDLE ** old_ptrptr, /* pointer to current pointer */ unsigned int *old_count, /* number pointed to */ unsigned int size) { /* size of one datum */ unsigned int count = *old_count; DAT_HANDLE *old_handles = *old_ptrptr; DAT_HANDLE *handle_tmp = DT_Mdep_Malloc(count * 2 * size); if (!handle_tmp) { DT_Tdep_PT_Printf(phead, "Out of memory for more DAT_HANDLEs\n"); return (false); } memcpy(handle_tmp, old_handles, count * size); DT_Mdep_Free(old_handles); *old_ptrptr = handle_tmp; *old_count = count * 2; return (true); } /* * Limit test workhorse. * * This test creates the sequence of DAT objects needed to move * data back and forth, attempting to find the limits supported * for the DAT object indicated by 'depth'. For example, if * depth == LIM_LMR, the test will create a set of {IA,PZ,CNO,EVD,EP} * before trying to exhaust LMR creation using the {IA,PZ,CNO,EVD,EP} set. * * The 'cmd->width' parameter can be used to control how may of these * parallel DAT object sets we create before stopping to beat upon * the constructor for the object indicated by 'depth', providing for * increased (or at least different) stress on the DAPL. */ static bool limit_test(DT_Tdep_Print_Head * phead, Limit_Cmd_t * cmd, Limit_Index depth) { DAT_EVD_HANDLE conn_handle; typedef struct obj_set { DAT_IA_HANDLE ia_handle; DAT_EVD_HANDLE ia_async_handle; DAT_PZ_HANDLE pz_handle; DAT_CNO_HANDLE cno_handle; DAT_EVD_HANDLE evd_handle; DAT_EP_HANDLE ep_handle; DAT_LMR_HANDLE lmr_handle; char *lmr_buffer; DAT_LMR_CONTEXT lmr_context; DAT_RMR_HANDLE rmr_handle; DAT_RMR_CONTEXT rmr_context; } Obj_Set; Obj_Set *hdl_sets = (Obj_Set *) NULL; bool retval = false; char *module = "LimitTest"; #if defined (WIN32) /* * The Windows compiler will not deal with complex definitions * in macros, so create a variable here. */ #if defined (DAT_OS_WAIT_PROXY_AGENT_NULL) #undef DAT_OS_WAIT_PROXY_AGENT_NULL #endif DAT_OS_WAIT_PROXY_AGENT DAT_OS_WAIT_PROXY_AGENT_NULL = { NULL, NULL }; #endif DAT_RETURN ret; #ifdef DFLT_QLEN #undef DFLT_QLEN #endif # define DFLT_QLEN 10 /* a small CM event queue */ # define DFLT_DTO_QLEN 1024 /* a larger DTO event queue */ # define START_COUNT 1024 /* initial # handles */ # define DFLT_BUFFSZ 4096 /* default size for buffer */ # define CONN_QUAL0 0xAffab1e /* Allocate 'width' Obj_Sets */ if (depth && !(hdl_sets = DT_Mdep_Malloc(sizeof(Obj_Set) * cmd->width))) { DT_Tdep_PT_Printf(phead, "%s: No memory for handle array!\n", module); goto clean_up_now; } /* ----------- * IA handling */ if (depth > LIM_IA) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w; DT_Tdep_PT_Debug(1, (phead, "%s: dat_ia_open X %d\n", module, cmd->width)); for (w = 0; w < cmd->width; w++) { /* Specify that we want to get back an async EVD. */ hdl_sets[w].ia_async_handle = DAT_HANDLE_NULL; ret = dat_ia_open(cmd->device_name, DFLT_QLEN, &hdl_sets[w].ia_async_handle, &hdl_sets[w].ia_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_open (%s) #%d fails: %s\n", module, cmd->device_name, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].ia_async_handle = DAT_HANDLE_NULL; hdl_sets[w].ia_handle = DAT_HANDLE_NULL; goto clean_up_now; } } } else if (depth == LIM_IA) { /* * See how many IAs we can create */ typedef struct _ia { DAT_IA_HANDLE ia_handle; DAT_EVD_HANDLE ia_async_handle; } OneOpen; unsigned int count = START_COUNT; OneOpen *hdlptr = (OneOpen *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* IA Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_ia_open\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: IAs opened: %d\n", module, w); retval = true; break; } /* Specify that we want to get back an async EVD. */ hdlptr[w].ia_async_handle = DAT_HANDLE_NULL; ret = dat_ia_open(cmd->device_name, DFLT_QLEN, &hdlptr[w].ia_async_handle, &hdlptr[w].ia_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_open (%s) #%d fails: %s\n", module, cmd->device_name, w + 1, DT_RetToString(ret)); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: IAs opened: %d\n", module, w); retval = true; /* IA Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_ia_close(hdlptr[tmp].ia_handle, DAT_CLOSE_GRACEFUL_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (graceful) fails: %s\n", module, DT_RetToString(ret)); retval = false; ret = dat_ia_close(hdlptr[tmp].ia_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (abrupt) fails: %s\n", module, DT_RetToString (ret)); } } } DT_Mdep_Free(hdlptr); } } /* End IA handling */ /* ----------- * PZ handling */ if (depth > LIM_PZ) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w; DT_Tdep_PT_Debug(1, (phead, "%s: dat_pz_create X %d\n", module, cmd->width)); for (w = 0; w < cmd->width; w++) { ret = dat_pz_create(hdl_sets[w].ia_handle, &hdl_sets[w].pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].pz_handle = DAT_HANDLE_NULL; goto clean_up_now; } } } else if (depth == LIM_PZ) { /* * See how many PZs we can create */ unsigned int count = START_COUNT; DAT_PZ_HANDLE *hdlptr = (DAT_PZ_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* PZ Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_pz_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: PZs created: %d\n", module, w); retval = true; break; } ret = dat_pz_create(hdl_sets[w % cmd->width]. ia_handle, &hdlptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: PZs created: %d\n", module, w); retval = true; /* PZ Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_pz_free(hdlptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End PZ handling */ #ifndef __KDAPLTEST__ /* ----------- * CNO handling */ if (depth > LIM_CNO) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w; DT_Tdep_PT_Debug(1, (phead, "%s: dat_cno_create X %d\n", module, cmd->width)); for (w = 0; w < cmd->width; w++) { ret = dat_cno_create(hdl_sets[w].ia_handle, DAT_OS_WAIT_PROXY_AGENT_NULL, &hdl_sets[w].cno_handle); if (DAT_GET_TYPE(ret) == DAT_NOT_IMPLEMENTED) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_create unimplemented\n", module); hdl_sets[w].cno_handle = DAT_HANDLE_NULL; /* ignore this error */ break; } else if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].cno_handle = DAT_HANDLE_NULL; goto clean_up_now; } } } else if (depth == LIM_CNO) { /* * See how many CNOs we can create */ unsigned int count = START_COUNT; DAT_CNO_HANDLE *hdlptr = (DAT_CNO_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* CNO Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_cno_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: CNOs created: %d\n", module, w); retval = true; break; } ret = dat_cno_create(hdl_sets[w % cmd->width]. ia_handle, DAT_OS_WAIT_PROXY_AGENT_NULL, &hdlptr[w]); if (DAT_GET_TYPE(ret) == DAT_NOT_IMPLEMENTED) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_create unimplemented\n", module); retval = true; break; } else if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: CNOs created: %d\n", module, w); retval = true; /* CNO Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_cno_free(hdlptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End CNO handling */ #endif /* __KDAPLTEST__ */ /* ----------- * EVD handling */ if (depth > LIM_EVD) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w = 0; DAT_EVD_FLAGS flags = (DAT_EVD_DTO_FLAG /* | DAT_EVD_SOFTWARE_FLAG */ | DAT_EVD_CR_FLAG | DAT_EVD_RMR_BIND_FLAG); /* not ASYNC */ DT_Tdep_PT_Debug(1, (phead, "%s: dat_evd_create X %d\n", module, cmd->width)); /* * First create a connection EVD to be used for EP creation */ ret = DT_Tdep_evd_create(hdl_sets[0].ia_handle, DFLT_QLEN, NULL, DAT_EVD_CONNECTION_FLAG, &conn_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: conn dat_evd_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ conn_handle = DAT_HANDLE_NULL; goto clean_up_now; } for (w = 0; w < cmd->width; w++) { ret = DT_Tdep_evd_create(hdl_sets[w].ia_handle, DFLT_DTO_QLEN, hdl_sets[w].cno_handle, flags, &hdl_sets[w].evd_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].evd_handle = DAT_HANDLE_NULL; goto clean_up_now; } } } else if (depth == LIM_EVD) { /* * See how many EVDs we can create */ unsigned int count = START_COUNT; DAT_EVD_HANDLE *hdlptr = (DAT_EVD_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); DAT_EVD_FLAGS flags = (DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG | DAT_EVD_CR_FLAG); /* EVD Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_evd_create\n", module)); /* * First create a connection EVD to be used for EP creation */ ret = DT_Tdep_evd_create(hdl_sets[0].ia_handle, DFLT_QLEN, NULL, DAT_EVD_CONNECTION_FLAG, &conn_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: conn dat_evd_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ conn_handle = DAT_HANDLE_NULL; } for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: EVDs created: %d\n", module, w); retval = true; break; } ret = DT_Tdep_evd_create(hdl_sets[w % cmd->width]. ia_handle, DFLT_QLEN, hdl_sets[w % cmd->width]. cno_handle, flags, &hdlptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: EVDs created: %d\n", module, w); retval = true; /* EVD Cleanup loop */ if (conn_handle != DAT_HANDLE_NULL) { ret = DT_Tdep_evd_free(conn_handle); conn_handle = DAT_HANDLE_NULL; } for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = DT_Tdep_evd_free(hdlptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End EVD handling */ /* ----------- * EP handling */ if (depth > LIM_EP) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w; DT_Tdep_PT_Debug(1, (phead, "%s: dat_ep_create X %d\n", module, cmd->width)); for (w = 0; w < cmd->width; w++) { ret = dat_ep_create(hdl_sets[w].ia_handle, hdl_sets[w].pz_handle, hdl_sets[w].evd_handle, /* recv */ hdl_sets[w].evd_handle, /* request */ conn_handle, /* connect */ (DAT_EP_ATTR *) NULL, &hdl_sets[w].ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].ep_handle = DAT_HANDLE_NULL; goto clean_up_now; } } } else if (depth == LIM_EP) { /* * See how many EPs we can create */ unsigned int count = START_COUNT; DAT_EP_HANDLE *hdlptr = (DAT_EP_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* EP Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_ep_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: EPs created: %d\n", module, w); retval = true; break; } ret = dat_ep_create(hdl_sets[w % cmd->width].ia_handle, hdl_sets[w % cmd->width].pz_handle, hdl_sets[w % cmd->width].evd_handle, hdl_sets[w % cmd->width].evd_handle, conn_handle, /* connect */ (DAT_EP_ATTR *) NULL, &hdlptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: EPs created: %d\n", module, w); retval = true; /* EP Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_ep_free(hdlptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End EP handling */ /* ----------- * RSP handling * * if (depth > LIM_RSP) { * Since RSPs are not part of the Obj_Set, * there's nothing to do. * } else ... */ if (depth == LIM_RSP) { /* * See how many RSPs we can create */ unsigned int count = START_COUNT; DAT_RSP_HANDLE *hdlptr = (DAT_RSP_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); DAT_EP_HANDLE *epptr = (DAT_EP_HANDLE *) DT_Mdep_Malloc(count * sizeof(*epptr)); /* RSP Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_rsp_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count) { unsigned int count1 = count; unsigned int count2 = count; if (!more_handles (phead, (DAT_HANDLE **) & hdlptr, &count1, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: RSPs created: %d\n", module, w); retval = true; break; } if (!more_handles (phead, (DAT_HANDLE **) & epptr, &count2, sizeof(*epptr))) { DT_Tdep_PT_Printf(phead, "%s: RSPs created: %d\n", module, w); retval = true; break; } if (count1 != count2) { DT_Tdep_PT_Printf(phead, "%s: Mismatch in allocation of handle arrays at point %d\n", module, w); retval = true; break; } count = count1; } /* * Each RSP needs a unique EP, so create one first */ ret = dat_ep_create(hdl_sets[w % cmd->width]. ia_handle, hdl_sets[w % cmd->width]. pz_handle, hdl_sets[w % cmd->width]. evd_handle, hdl_sets[w % cmd->width]. evd_handle, conn_handle, (DAT_EP_ATTR *) NULL, &epptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_create #%d fails: %s testing RSPs\n", module, w + 1, DT_RetToString(ret)); retval = true; break; } ret = dat_rsp_create(hdl_sets[w % cmd->width]. ia_handle, CONN_QUAL0 + w, epptr[w], hdl_sets[w % cmd->width]. evd_handle, &hdlptr[w]); if (DAT_GET_TYPE(ret) == DAT_NOT_IMPLEMENTED) { DT_Tdep_PT_Printf(phead, "%s: dat_rsp_create unimplemented\n", module); /* ignore this error */ retval = true; break; } else if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rsp_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* Cleanup the EP; no-one else will. */ ret = dat_ep_free(epptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free (internal cleanup @ #%d) fails: %s\n", module, w + 1, DT_RetToString (ret)); } retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: RSPs created: %d\n", module, w); retval = true; /* RSP Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_rsp_free(hdlptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_rsp_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } /* Free EPs */ ret = dat_ep_free(epptr[tmp]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free fails: %s for RSPs\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End RSP handling */ /* ----------- * PSP handling * * if (depth > LIM_PSP) { * Since PSPs are not part of the Obj_Set, * there's nothing to do. * } else ... */ if (depth == LIM_PSP) { /* * See how many PSPs we can create */ unsigned int count = START_COUNT; DAT_PSP_HANDLE *hdlptr = (DAT_PSP_HANDLE *) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* PSP Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_psp_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: PSPs created: %d\n", module, w); retval = true; break; } ret = dat_psp_create(hdl_sets[w % cmd->width]. ia_handle, CONN_QUAL0 + w, hdl_sets[w % cmd->width]. evd_handle, DAT_PSP_CONSUMER_FLAG, &hdlptr[w]); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_psp_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); retval = true; hdlptr[w] = DAT_HANDLE_NULL; break; } } DT_Tdep_PT_Printf(phead, "%s: PSPs created: %d\n", module, w); retval = true; /* PSP Cleanup loop */ for (tmp = 0; tmp < w; tmp++) { DT_Mdep_Schedule(); ret = dat_psp_free(hdlptr[tmp]); if (DAT_GET_TYPE(ret) == DAT_NOT_IMPLEMENTED) { DT_Tdep_PT_Printf(phead, "%s: dat_psp_free unimplemented\n" "\tNB: Expect EVD+IA cleanup errors!\n", module); break; } else if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_psp_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } DT_Mdep_Free(hdlptr); } } /* End PSP handling */ /* ----------- * LMR handling */ if (depth > LIM_LMR) { /* * The abuse is not for us this time, just prep Obj_Set. */ unsigned int w; DT_Tdep_PT_Debug(1, (phead, "%s: dat_lmr_create X %d\n", module, cmd->width)); for (w = 0; w < cmd->width; w++) { DAT_REGION_DESCRIPTION region; DAT_VLEN reg_size; DAT_VADDR reg_addr; hdl_sets[w].lmr_buffer = DT_Mdep_Malloc(DFLT_BUFFSZ); if (!hdl_sets[w].lmr_buffer) { DT_Tdep_PT_Printf(phead, "%s: no memory for LMR buffers\n", module); goto clean_up_now; } memset(®ion, 0, sizeof(region)); region.for_va = hdl_sets[w].lmr_buffer; ret = DT_Tdep_lmr_create(hdl_sets[w].ia_handle, DAT_MEM_TYPE_VIRTUAL, region, DFLT_BUFFSZ, hdl_sets[w].pz_handle, DAT_MEM_PRIV_ALL_FLAG, &hdl_sets[w].lmr_handle, &hdl_sets[w].lmr_context, NULL, /* FIXME */ ®_size, ®_addr); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_create #%d fails: %s\n", module, w + 1, DT_RetToString(ret)); /* handle contents undefined on failure */ hdl_sets[w].lmr_handle = DAT_HANDLE_NULL; goto clean_up_now; } if ((uintptr_t) reg_addr > (uintptr_t) hdl_sets[w].lmr_buffer || (reg_size < DFLT_BUFFSZ + ((uintptr_t) reg_addr - (uintptr_t) hdl_sets[w]. lmr_buffer))) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_create bogus outputs " "in: 0x%p, %x out 0x%llx, %llx\n", module, hdl_sets[w].lmr_buffer, DFLT_BUFFSZ, reg_addr, reg_size); goto clean_up_now; } } } else if (depth == LIM_LMR) { /* * See how many LMRs we can create */ unsigned int count = START_COUNT; Bpool **hdlptr = (Bpool **) DT_Mdep_Malloc(count * sizeof(*hdlptr)); /* LMR Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int tmp; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting dat_lmr_create\n", module)); for (w = 0; w < cmd->maximum; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: no memory for LMR handles\n", module); DT_Tdep_PT_Printf(phead, "%s: LMRs created: %d\n", module, w); retval = true; break; } /* * Let BpoolAlloc do the hard work; this means that * we're testing unique memory registrations rather * than repeatedly binding the same buffer set. */ hdlptr[w] = DT_BpoolAlloc((Per_Test_Data_t *) 0, phead, hdl_sets[w % cmd->width]. ia_handle, hdl_sets[w % cmd->width]. pz_handle, hdl_sets[w % cmd->width]. ep_handle, hdl_sets[w % cmd->width]. evd_handle, DFLT_BUFFSZ, 1, DAT_OPTIMAL_ALIGNMENT, false, false); if (!hdlptr[w]) { DT_Tdep_PT_Printf(phead, "%s: LMRs created: %d\n", module, w); retval = true; break; } } DT_Tdep_PT_Printf(phead, "%s: LMRs created: %d\n", module, w); retval = true; /* LMR Cleanup loop */ for (tmp = 0; tmp <= w; tmp++) { DT_Mdep_Schedule(); if (hdlptr[tmp]) { /* ignore rval - DT_Bpool_Destroy will complain */ (void) DT_Bpool_Destroy((Per_Test_Data_t *) 0, phead, hdlptr[tmp]); } } DT_Mdep_Free(hdlptr); } } /* End LMR handling */ /* ----------- * Posted receive buffer handling */ if (depth == LIM_RPOST) { /* * See how many receive buffers we can post (to each EP). * We are posting the same buffer 'cnt' times, deliberately, * but that should be OK. */ unsigned int count = START_COUNT; DAT_LMR_TRIPLET *hdlptr = (DAT_LMR_TRIPLET *) DT_Mdep_Malloc(count * cmd->width * sizeof(*hdlptr)); /* Recv-Post Exhaustion test loop */ if (hdlptr) { unsigned int w = 0; unsigned int i = 0; unsigned int done = 0; DT_Tdep_PT_Debug(1, (phead, "%s: Exhausting posting of recv buffers\n", module)); for (w = 0; w < cmd->maximum && !done; w++) { DT_Mdep_Schedule(); if (w == count && !more_handles(phead, (DAT_HANDLE **) & hdlptr, &count, cmd->width * sizeof(*hdlptr))) { DT_Tdep_PT_Printf(phead, "%s: no memory for IOVs \n", module); DT_Tdep_PT_Printf(phead, "%s: recv buffers posted per EP: %d\n" "\t\t (total posted: %d)\n", module, w, w * cmd->width); done = retval = true; break; } for (i = 0; i < cmd->width; i++) { DAT_LMR_TRIPLET *iovp = &hdlptr[w * cmd->width + i]; DAT_DTO_COOKIE cookie; iovp->virtual_address = (DAT_VADDR) (uintptr_t) hdl_sets[i].lmr_buffer; iovp->segment_length = DFLT_BUFFSZ; iovp->lmr_context = hdl_sets[i].lmr_context; cookie.as_64 = (DAT_UINT64) 0UL; cookie.as_ptr = (DAT_PVOID) hdl_sets[i].lmr_buffer; DT_Tdep_PT_Printf(phead, "%s: dat_ep_post_recv #%d\n", module, w * cmd->width + i + 1); ret = dat_ep_post_recv(hdl_sets[i]. ep_handle, 1, iovp, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_post_recv fails: %s\n", module, DT_RetToString (ret)); DT_Tdep_PT_Printf(phead, "%s: recv buffers posted per EP: %d\n" "\t\t (total posted: %d)\n", module, w, w * cmd->width + i); done = retval = true; break; } } /* end for each EP wide */ } /* end forever (!done) loop */ retval = true; DT_Tdep_PT_Printf(phead, "%s: recv buffers posted per EP: %d\n" "\t\t (total posted: %d)\n", module, w, w * cmd->width); /* Rpost Cleanup loop */ for (i = 0; i < cmd->width; i++) { DAT_EVENT event; /* * Disconnecting an unconnected EP should complete * outstanding recv DTOs in error, and otherwise * be a no-op. */ ret = dat_ep_reset(hdl_sets[i].ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_disconnect (abrupt) fails: %s\n", module, DT_RetToString(ret)); retval = false; } else { /* * Remove all DTOs. The disconnect above should have * flushed all posted operations, so this is just a * clean up. */ do { ret = DT_Tdep_evd_dequeue(hdl_sets [i]. evd_handle, &event); } while (ret == DAT_SUCCESS); } } DT_Mdep_Free(hdlptr); } } /* end depth == LIM_RPOST */ /* ----------- * Test maximum size of LMR allowed */ if (depth == LIM_SIZE_LMR) { DAT_COUNT last_size = 0; DAT_COUNT test_size = DFLT_BUFFSZ; Bpool *test_bpool; for (;;) { DT_Mdep_Schedule(); test_bpool = DT_BpoolAlloc((Per_Test_Data_t *) 0, phead, hdl_sets[0].ia_handle, hdl_sets[0].pz_handle, hdl_sets[0].ep_handle, hdl_sets[0].evd_handle, test_size, 1, DAT_OPTIMAL_ALIGNMENT, false, false); if (!test_bpool) { DT_Tdep_PT_Printf(phead, "%s: Largest LMR was 0x%x bytes\n" "\t (failed attempting 0x%x bytes)\n", module, last_size, test_size); retval = true; break; } else if (!DT_Bpool_Destroy ((Per_Test_Data_t *) 0, phead, test_bpool)) { DT_Tdep_PT_Printf(phead, "%s: Largest LMR was 0x%x bytes\n", module, test_size); retval = true; break; } last_size = test_size; test_size <<= 1; if (test_size < last_size) { /* could conceivably wrap on 32-bit architectures */ DT_Tdep_PT_Printf(phead, "%s: LMR of 0x%x bytes OK - %s\n", module, last_size, "stopping now."); retval = true; break; } } /* end forever loop */ } /* end depth == LIM_SIZE_LMR */ DT_Tdep_PT_Debug(1, (phead, "%s: Limit Testing Completed - %s\n", module, retval ? "Successfully" : "with errors")); /* ---------------------------------------------------------- * Clean up and go home */ clean_up_now: DT_Tdep_PT_Debug(1, (phead, "%s: Cleaning up ...\n", module)); if (depth > LIM_LMR) { unsigned int w; for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].lmr_handle) { ret = dat_lmr_free(hdl_sets[w].lmr_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_lmr_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } if ((void *)hdl_sets[w].lmr_buffer) { DT_Mdep_Free((void *)hdl_sets[w].lmr_buffer); } } } /* end LIM_LMR cleanup */ /* * if (depth == LIM_PSP) { * Since PSPs are not part of the Obj_Set, * there's no cleanup to do. * } * * if (depth == LIM_RSP) { * Since RSPs are not part of the Obj_Set, * there'no cleanup nothing to do. * } */ if (depth > LIM_EP) { unsigned int w; for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].ep_handle) { ret = dat_ep_free(hdl_sets[w].ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } } } /* end LIM_EP cleanup */ if (depth > LIM_EVD) { unsigned int w; if (conn_handle != DAT_HANDLE_NULL) { ret = DT_Tdep_evd_free(conn_handle); conn_handle = DAT_HANDLE_NULL; } for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].evd_handle) { ret = DT_Tdep_evd_free(hdl_sets[w].evd_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } } } /* end LIM_EVD cleanup */ #ifndef __KDAPLTEST__ if (depth > LIM_CNO) { unsigned int w; for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].cno_handle) { ret = dat_cno_free(hdl_sets[w].cno_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_cno_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } } } /* end LIM_CNO cleanup */ #endif if (depth > LIM_PZ) { unsigned int w; for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].pz_handle) { ret = dat_pz_free(hdl_sets[w].pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_free fails: %s\n", module, DT_RetToString(ret)); retval = false; } } } } /* end LIM_PZ cleanup */ if (depth > LIM_IA) { unsigned int w; for (w = 0; w < cmd->width; w++) { if (hdl_sets[w].ia_handle) { /* dat_ia_close cleans up async evd handle, too */ ret = dat_ia_close(hdl_sets[w].ia_handle, DAT_CLOSE_GRACEFUL_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (graceful) error: %s\n", module, DT_RetToString(ret)); /* * Since we take some pains to clean up properly, * this really is an error. But if we get here, * we may as well try the largest hammer we have. */ retval = false; ret = dat_ia_close(hdl_sets[w].ia_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (abrupt) error: %s\n", module, DT_RetToString (ret)); } } } } } /* end LIM_IA cleanup */ if (depth && hdl_sets) { DT_Mdep_Free(hdl_sets); } DT_Tdep_PT_Debug(1, (phead, "%s: testing and cleanup complete.\n", module)); return (retval); } /********************************************************************* * Framework to run through all of the limit tests */ DAT_RETURN DT_cs_Limit(Params_t * params, Limit_Cmd_t * cmd) { DT_Tdep_Print_Head *phead; char *star = "**********************************************************************"; phead = params->phead; if (cmd->Test_List[LIM_IA]) { char list[] = { "Limitation Test limit_ia\n" "Description: Test max num of opens for the same physical IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_IA)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_PZ]) { char list[] = { "Limitation Test limit_pz\n" "Description: Test max num of PZs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_PZ)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } #ifndef __KDAPLTEST__ if (cmd->Test_List[LIM_CNO]) { char list[] = { "Limitation Test limit_cno\n" "Description: Test max num of CNOs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_CNO)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } #endif if (cmd->Test_List[LIM_EVD]) { char list[] = { "Limitation Test limit_evd\n" "Description: Test max num of EVDs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_EVD)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_EP]) { char list[] = { "Limitation Test limit_ep\n" "Description: Test max num of EPs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_EP)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_RSP]) { char list[] = { "Limitation Test limit_rsp\n" "Description: Test max num of RSPs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_RSP)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_PSP]) { char list[] = { "Limitation Test limit_psp\n" "Description: Test max num of PSPs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_PSP)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_LMR]) { char list[] = { "Limitation Test limit_lmr\n" "Description: Test max num of LMRs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_LMR)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_RPOST]) { char list[] = { "Limitation Test limit_rpost\n" "Description: Test max num of receive buffers posted to an EP" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_RPOST)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } if (cmd->Test_List[LIM_SIZE_LMR]) { char list[] = { "Limitation Test limit_size_lmr\n" "Description: Test max size of LMRs that are supported by an IA" } ; DT_Tdep_PT_Printf(phead, "%s\n", star); DT_Tdep_PT_Printf(phead, "%s\n", list); if (!limit_test(phead, cmd, LIM_SIZE_LMR)) { goto error; } DT_Tdep_PT_Printf(phead, "%s\n", star); } /* More tests TBS ... */ return DAT_SUCCESS; error: DT_Tdep_PT_Printf(phead, "error occurs, can not continue with limit test\n"); DT_Tdep_PT_Printf(phead, "%s\n", star); return DAT_INSUFFICIENT_RESOURCES; } dapl-2.1.5/test/dapltest/test/dapl_memlist.c000066400000000000000000000064641255317474200210570ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_MemListInit(Per_Test_Data_t * pt_ptr) { DT_Mdep_LockInit(&pt_ptr->MemListLock); pt_ptr->MemListHead = 0; } void *DT_MemListAlloc(Per_Test_Data_t * pt_ptr, char *file, mem_type_e t, int size) { void *buffptr; MemListEntry_t *entry_ptr; buffptr = 0; entry_ptr = 0; buffptr = DT_Mdep_Malloc(size); if (buffptr == 0) { return 0; } if (pt_ptr == 0) { /* not use mem_list */ return buffptr; } entry_ptr = (MemListEntry_t *) DT_Mdep_Malloc(sizeof(MemListEntry_t)); if (entry_ptr == 0) { DT_Mdep_Free(buffptr); return 0; } strcpy(entry_ptr->filename, file); entry_ptr->MemType = t; entry_ptr->mem_ptr = buffptr; DT_Mdep_Lock(&pt_ptr->MemListLock); entry_ptr->next = pt_ptr->MemListHead; pt_ptr->MemListHead = entry_ptr; DT_Mdep_Unlock(&pt_ptr->MemListLock); return buffptr; } void DT_MemListFree(Per_Test_Data_t * pt_ptr, void *ptr) { MemListEntry_t *pre, *cur; if (pt_ptr == 0) { /* not use mem_list */ DT_Mdep_Free(ptr); return; } DT_Mdep_Lock(&pt_ptr->MemListLock); pre = 0; cur = pt_ptr->MemListHead; while (cur) { if (cur->mem_ptr == ptr) { if (!pre) { /* first entry */ pt_ptr->MemListHead = cur->next; cur->next = 0; } else { pre->next = cur->next; cur->next = 0; } DT_Mdep_Free(ptr); DT_Mdep_Free(cur); goto unlock_and_return; } pre = cur; cur = cur->next; } unlock_and_return: DT_Mdep_Unlock(&pt_ptr->MemListLock); } void DT_PrintMemList(Per_Test_Data_t * pt_ptr) { char *type[10] = { "BPOOL", "BUFF", "PERTESTDATA", "NIC", "NETADDRESS", "TRANSACTIONTEST", "THREAD", "EPCONTEXT" }; DT_Tdep_Print_Head *phead; MemListEntry_t *cur; phead = pt_ptr->Params.phead; DT_Mdep_Lock(&pt_ptr->MemListLock); cur = pt_ptr->MemListHead; if (cur != 0) { DT_Tdep_PT_Printf(phead, "the allocated memory that have not been returned are:\n"); } while (cur) { DT_Tdep_PT_Printf(phead, "file: dapl_%s, \tMemType:%s\n", cur->filename, type[cur->MemType]); cur = cur->next; } DT_Mdep_Unlock(&pt_ptr->MemListLock); } dapl-2.1.5/test/dapltest/test/dapl_performance_client.c000066400000000000000000000315251255317474200232400ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define MAX_CONN_RETRY 8 /****************************************************************************/ DAT_RETURN DT_Performance_Test_Client(Params_t * params_ptr, Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_IA_ADDRESS_PTR remote_ia_addr) { Performance_Test_t *test_ptr = NULL; int connected = 1; DT_Tdep_Print_Head *phead; DAT_RETURN rc; phead = pt_ptr->Params.phead; DT_Tdep_PT_Debug(1, (phead, "Client: Starting performance test\n")); if (!DT_Performance_Test_Create(pt_ptr, ia_handle, remote_ia_addr, false, pt_ptr->Server_Info.is_little_endian, &test_ptr)) { DT_Tdep_PT_Debug(1, (phead, "Client: Resource Creation Failed\n")); connected = 0; } else if (!DT_Performance_Test_Client_Connect(phead, test_ptr)) { DT_Tdep_PT_Debug(1, (phead, "Client: Connection Failed\n")); connected = 0; } if (connected) { if (!DT_Performance_Test_Client_Exchange (params_ptr, phead, test_ptr)) { DT_Tdep_PT_Debug(1, (phead, "Client: Test Failed\n")); } } /* If we never connected, then the test will hang here * because in the destroy of the test it waits for a * disconnect event which will never arrive, simply * because there was never a connection. */ DT_Performance_Test_Destroy(pt_ptr, test_ptr, false); #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif DT_Tdep_PT_Debug(1, (phead, "Client: Finished performance test\n")); return (connected ? DAT_SUCCESS : DAT_INSUFFICIENT_RESOURCES); } /****************************************************************************/ bool DT_Performance_Test_Client_Connect(DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr) { DAT_RETURN ret; DAT_EVENT_NUMBER event_num; unsigned int retry_cnt = 0; /* * Client - connect */ DT_Tdep_PT_Debug(1, (phead, "Client[" F64x "]: Connect on port 0x" F64x "\n", test_ptr->base_port, test_ptr->ep_context.port)); retry: ret = dat_ep_connect(test_ptr->ep_context.ep_handle, test_ptr->remote_ia_addr, test_ptr->ep_context.port, DAT_TIMEOUT_INFINITE, 0, (DAT_PVOID) 0, /* no private data */ test_ptr->cmd->qos, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_connect error: %s\n", test_ptr->base_port, DT_RetToString(ret)); return false; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(phead, test_ptr->ep_context.ep_handle, test_ptr->conn_evd_hdl, &event_num)) { if (event_num == DAT_CONNECTION_EVENT_PEER_REJECTED) { DT_Mdep_Sleep(1000); DT_Tdep_PT_Printf(phead, "Test[" F64x "]: retrying connection...\n", test_ptr->base_port); retry_cnt++; if (retry_cnt < MAX_CONN_RETRY) { goto retry; } } /* error message printed by DT_cr_event_wait */ return false; } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif DT_Tdep_PT_Debug(1, (phead, "Client[" F64x "]: Got Connection\n", test_ptr->base_port)); return true; } /****************************************************************************/ static bool DT_Performance_Test_Client_Phase1(DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr, Performance_Stats_t * stats) { DT_Mdep_TimeStamp pre_ts; DT_Mdep_TimeStamp post_ts; DT_CpuStat pre_cpu_stat; DT_CpuStat post_cpu_stat; unsigned int post_cnt; unsigned int reap_cnt; /* * measure bandwidth, OPS, and CPU utilization */ if (!DT_Mdep_GetCpuStat(&pre_cpu_stat)) { return false; } pre_ts = DT_Mdep_GetTimeStamp(); /* * Fill the pipe */ for (post_cnt = 0; post_cnt < (unsigned int)test_ptr->ep_context.pipeline_len; post_cnt++) { if (!DT_performance_post_rdma_op (&test_ptr->ep_context, test_ptr->reqt_evd_hdl, stats)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Post %i failed\n", test_ptr->base_port, post_cnt)); return false; } } /* * Reap completions and repost */ for (reap_cnt = 0; reap_cnt < test_ptr->cmd->num_iterations;) { unsigned int cur_reap_cnt; unsigned int cur_post_cnt; unsigned int cur_post_i; cur_reap_cnt = DT_performance_reap(phead, test_ptr->reqt_evd_hdl, test_ptr->cmd->mode, stats); if (0 == cur_reap_cnt) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Poll %i failed\n", test_ptr->base_port, reap_cnt)); return false; } /* repost */ cur_post_cnt = DT_min(test_ptr->cmd->num_iterations - post_cnt, cur_reap_cnt); for (cur_post_i = 0; cur_post_i < cur_post_cnt; cur_post_i++) { if (!DT_performance_post_rdma_op(&test_ptr->ep_context, test_ptr->reqt_evd_hdl, stats)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Post %i failed\n", test_ptr->base_port, post_cnt)); return false; } } reap_cnt += cur_reap_cnt; post_cnt += cur_post_cnt; } /* end time and update stats */ post_ts = DT_Mdep_GetTimeStamp(); stats->time_ts = post_ts - pre_ts; stats->num_ops = test_ptr->cmd->num_iterations; if (!DT_Mdep_GetCpuStat(&post_cpu_stat)) { return false; } /* calculate CPU utilization */ { unsigned long int system; unsigned long int user; unsigned long int idle; unsigned long int total; system = post_cpu_stat.system - pre_cpu_stat.system; user = post_cpu_stat.user - pre_cpu_stat.user; idle = post_cpu_stat.idle - pre_cpu_stat.idle; total = system + user + idle; if (0 == total) { stats->cpu_utilization = 0.0; } else { stats->cpu_utilization = (double)1.0 - ((double)idle / (double)total); stats->cpu_utilization *= 100.0; } } return true; } /****************************************************************************/ static bool DT_Performance_Test_Client_Phase2(DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr, Performance_Stats_t * stats) { DAT_LMR_TRIPLET *iov; DAT_RMR_TRIPLET rmr_triplet; DAT_DTO_COOKIE cookie; DAT_EVENT event; DAT_RETURN ret; Performance_Ep_Context_t *ep_context; Performance_Test_Op_t *op; DT_Mdep_TimeStamp pre_ts; DT_Mdep_TimeStamp post_ts; unsigned long int bytes; unsigned int i; /* * measure latency */ ep_context = &test_ptr->ep_context; op = &ep_context->op; iov = DT_Bpool_GetIOV(op->bp, 0); bytes = op->seg_size * op->num_segs; /* Prep the inputs */ for (i = 0; i < op->num_segs; i++) { iov[i].virtual_address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(op->bp, i); iov[i].segment_length = op->seg_size; iov[i].lmr_context = DT_Bpool_GetLMR(op->bp, i); } rmr_triplet.virtual_address = op->Rdma_Address; rmr_triplet.segment_length = op->seg_size * op->num_segs; rmr_triplet.rmr_context = op->Rdma_Context; cookie.as_ptr = NULL; for (i = 0; i < test_ptr->cmd->num_iterations; i++) { if (RDMA_WRITE == op->transfer_type) { pre_ts = DT_Mdep_GetTimeStamp(); ret = dat_ep_post_rdma_write(ep_context->ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); } else { pre_ts = DT_Mdep_GetTimeStamp(); ret = dat_ep_post_rdma_read(ep_context->ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); } if (DAT_SUCCESS != ret) { return false; } for (;;) { DT_Mdep_Schedule(); ret = DT_Tdep_evd_dequeue(test_ptr->reqt_evd_hdl, &event); post_ts = DT_Mdep_GetTimeStamp(); if (DAT_GET_TYPE(ret) == DAT_QUEUE_EMPTY) { continue; } else if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_dequeue failed: %s\n", DT_RetToString(ret)); return false; } else if (event.event_number == DAT_DTO_COMPLETION_EVENT) { DT_performance_stats_record_latency(stats, post_ts - pre_ts); break; } else { /* error */ DT_Tdep_PT_Printf(phead, "Warning: dapl_performance_wait swallowing %s event\n", DT_EventToSTr(event. event_number)); return false; } } } return true; } /****************************************************************************/ bool DT_Performance_Test_Client_Exchange(Params_t * params_ptr, DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_DTO_COOKIE dto_cookie; Performance_Stats_t stats; RemoteMemoryInfo *rmi; test_ptr->ep_context.op.bp = DT_BpoolAlloc(test_ptr->pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr->ep_context.ep_handle, test_ptr->reqt_evd_hdl, test_ptr->ep_context.op.seg_size, test_ptr->ep_context.op.num_segs, DAT_OPTIMAL_ALIGNMENT, false, false); if (!test_ptr->ep_context.op.bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for buffers (RDMA/RD)\n", test_ptr->base_port); return false; } /* * Recv the other side's info */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Waiting for Sync Msg\n", test_ptr->base_port)); dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_RECV_BUFFER_ID); if (!DT_dto_event_wait(phead, test_ptr->recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context.ep_handle, DT_PERF_SYNC_BUFF_SIZE, dto_cookie, "Received Sync_Msg")) { return false; } /* * Extract what we need */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Sync Msg Received\n", test_ptr->base_port)); rmi = (RemoteMemoryInfo *) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_RECV_BUFFER_ID); /* * If the client and server are of different endiannesses, * we must correct the endianness of the handle and address * we pass to the other side. The other side cannot (and * better not) interpret these values. */ if (DT_local_is_little_endian && !test_ptr->is_remote_little_endian) { rmi->rmr_context = DT_EndianMemHandle(rmi->rmr_context); rmi->mem_address.as_64 = DT_EndianMemAddress(rmi->mem_address.as_64); } test_ptr->ep_context.op.Rdma_Context = rmi->rmr_context; test_ptr->ep_context.op.Rdma_Address = rmi->mem_address.as_64; DT_Tdep_PT_Debug(3, (phead, "Got RemoteMemInfo [ va=" F64x ", ctx=%x ]\n", test_ptr->ep_context.op.Rdma_Address, test_ptr->ep_context.op.Rdma_Context)); /* * Get to work ... */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Begin...\n", test_ptr->base_port)); DT_performance_stats_init(&stats); if (!DT_Performance_Test_Client_Phase1(phead, test_ptr, &stats)) { return false; } if (!DT_Performance_Test_Client_Phase2(phead, test_ptr, &stats)) { return false; } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Sending Sync Msg\n", test_ptr->base_port)); if (!DT_post_send_buffer(phead, test_ptr->ep_context.ep_handle, test_ptr->ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID, DT_PERF_SYNC_BUFF_SIZE)) { /* error message printed by DT_post_send_buffer */ return false; } dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID); if (!DT_dto_event_wait(phead, test_ptr->reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context.ep_handle, DT_PERF_SYNC_BUFF_SIZE, dto_cookie, "Client_Sync_Send")) { return false; } DT_performance_stats_print(params_ptr, phead, &stats, test_ptr->cmd, test_ptr); return true; } dapl-2.1.5/test/dapltest/test/dapl_performance_server.c000066400000000000000000000260361255317474200232710ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /****************************************************************************/ void DT_Performance_Test_Server(void *var) { Per_Test_Data_t *pt_ptr = var; Performance_Test_t *test_ptr = NULL; DT_Tdep_Print_Head *phead; int success = 1; phead = pt_ptr->Params.phead; DT_Tdep_PT_Debug(1, (phead, "Server: Starting performance test\n")); if (!DT_Performance_Test_Create(pt_ptr, pt_ptr->ps_ptr->ia_handle, (DAT_IA_ADDRESS_PTR) 0, true, pt_ptr->Client_Info.is_little_endian, &test_ptr)) { DT_Tdep_PT_Printf(phead, "Server: Resource Creation Failed\n"); success = 0; } if (1 == success) { if (!DT_Performance_Test_Server_Connect(phead, test_ptr)) { success = 0; DT_Tdep_PT_Printf(phead, "Server: Connection Failed\n"); } } if (1 == success) { if (!DT_Performance_Test_Server_Exchange(phead, test_ptr)) { success = 0; DT_Tdep_PT_Printf(phead, "Server: Test Failed\n"); } } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif DT_Performance_Test_Destroy(pt_ptr, test_ptr, true); DT_Tdep_PT_Printf(phead, "Server: Finished performance test. Detaching.\n"); DT_Mdep_Thread_Detach(DT_Mdep_Thread_SELF()); /* AMM */ DT_Thread_Destroy(pt_ptr->thread, pt_ptr); /* destroy Master thread */ DT_Mdep_Lock(&pt_ptr->ps_ptr->num_clients_lock); pt_ptr->ps_ptr->num_clients--; DT_Mdep_Unlock(&pt_ptr->ps_ptr->num_clients_lock); DT_PrintMemList(pt_ptr); /* check if we return all space allocated */ DT_Mdep_LockDestroy(&pt_ptr->Thread_counter_lock); DT_Mdep_LockDestroy(&pt_ptr->MemListLock); DT_Free_Per_Test_Data(pt_ptr); DT_Mdep_Unlock(&g_PerfTestLock); DT_Tdep_PT_Printf(phead, "Server: Finished performance test. Exiting.\n"); DT_Mdep_Thread_EXIT(NULL); } /****************************************************************************/ bool DT_Performance_Test_Server_Connect(DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr) { DAT_RETURN ret; bool status; DAT_RSP_HANDLE rsp_handle; DAT_PSP_HANDLE psp_handle; DAT_CR_ARRIVAL_EVENT_DATA cr_stat; DAT_CR_HANDLE cr_handle; DAT_EVENT_NUMBER event_num; rsp_handle = DAT_HANDLE_NULL; psp_handle = DAT_HANDLE_NULL; #if 0 /* FIXME */ if (test_ptr->cmd->use_rsp) { /* * Server - create a single-use RSP and * await a connection for this EP */ ret = dat_rsp_create(test_ptr->ia_handle, test_ptr->ep_context.port, test_ptr->ep_context.ep_handle, test_ptr->creq_evd_hdl, &rsp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_rsp_create error: %s\n", test_ptr->base_port, DT_RetToString(ret)); status = false; goto psp_free; } DT_Tdep_PT_Debug(1, (phead, "Server[" F64x "]: Listen on RSP port 0x" F64x "\n", test_ptr->base_port, test_ptr->ep_context.port)); /* wait for the connection request */ if (!DT_cr_event_wait(test_ptr->conn_evd_hdl, &cr_stat) || !DT_cr_check(&cr_stat, DAT_HANDLE_NULL, test_ptr->ep_context.port, &cr_handle, "Server")) { status = false; goto psp_free; } /* what, me query? just try to accept the connection */ ret = dat_cr_accept(cr_handle, test_ptr->ep_context.ep_handle, 0, (DAT_PVOID) 0 /* no private data */ ); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_accept error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* cr_handle consumed on failure */ status = false; goto psp_free; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(test_ptr->ep_context.ep_handle, test_ptr->conn_evd_hdl, &event_num)) { /* error message printed by DT_conn_event_wait */ status = false; goto psp_free; } } else #endif /* FIXME */ { /* * Server - use a short-lived PSP instead of an RSP */ status = true; ret = dat_psp_create(test_ptr->ia_handle, test_ptr->ep_context.port, test_ptr->creq_evd_hdl, DAT_PSP_CONSUMER_FLAG, &psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_psp_create error: %s\n", test_ptr->base_port, DT_RetToString(ret)); status = false; psp_handle = DAT_HANDLE_NULL; return (status); } } /* * Here's where we tell the main server process that * this thread is ready to wait for a connection request * from the remote end. */ DT_Mdep_wait_object_wakeup(&test_ptr->pt_ptr->synch_wait_object); DT_Tdep_PT_Debug(1, (phead, "Server[" F64x "]: Listen on PSP port 0x" F64x "\n", test_ptr->base_port, test_ptr->ep_context.port)); /* wait for a connection request */ if (!DT_cr_event_wait(phead, test_ptr->creq_evd_hdl, &cr_stat) || !DT_cr_check(phead, &cr_stat, psp_handle, test_ptr->ep_context.port, &cr_handle, "Server")) { status = false; goto psp_free; } /* what, me query? just try to accept the connection */ ret = dat_cr_accept(cr_handle, test_ptr->ep_context.ep_handle, 0, (DAT_PVOID) 0 /* no private data */ ); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_accept error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* cr_handle consumed on failure */ status = false; goto psp_free; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(phead, test_ptr->ep_context.ep_handle, test_ptr->conn_evd_hdl, &event_num)) { /* error message printed by DT_cr_event_wait */ status = false; goto psp_free; } DT_Tdep_PT_Debug(1, (phead, "Server[" F64x "]: Accept on port 0x" F64x "\n", test_ptr->base_port, test_ptr->ep_context.port)); psp_free: if (DAT_HANDLE_NULL != psp_handle) { /* throw away single-use PSP */ ret = dat_psp_free(psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_psp_free error: %s\n", test_ptr->base_port, DT_RetToString(ret)); status = false; } } if (DAT_HANDLE_NULL != rsp_handle) { /* throw away single-use PSP */ ret = dat_rsp_free(rsp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_rsp_free error: %s\n", test_ptr->base_port, DT_RetToString(ret)); status = false; } } /* end short-lived PSP */ #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif return status; } /****************************************************************************/ bool DT_Performance_Test_Server_Exchange(DT_Tdep_Print_Head * phead, Performance_Test_t * test_ptr) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; RemoteMemoryInfo *rmi; DAT_DTO_COOKIE dto_cookie; test_ptr->ep_context.op.bp = DT_BpoolAlloc(test_ptr->pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr->ep_context.ep_handle, test_ptr->reqt_evd_hdl, test_ptr->ep_context.op.seg_size, test_ptr->ep_context.op.num_segs, DAT_OPTIMAL_ALIGNMENT, true, true); if (!test_ptr->ep_context.op.bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for buffers (RDMA/RD)\n", test_ptr->base_port); return false; } test_ptr->ep_context.op.Rdma_Context = DT_Bpool_GetRMR(test_ptr->ep_context.op.bp, 0); test_ptr->ep_context.op.Rdma_Address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(test_ptr->ep_context.op.bp, 0); /* * Prep send buffer with memory information */ rmi = (RemoteMemoryInfo *) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID); rmi->rmr_context = test_ptr->ep_context.op.Rdma_Context; rmi->mem_address.as_64 = test_ptr->ep_context.op.Rdma_Address; if (rmi->mem_address.as_ptr) { DT_Tdep_PT_Debug(3, (phead, "RemoteMemInfo va=" F64x ", ctx=%x\n", rmi->mem_address.as_64, rmi->rmr_context)); } /* * If the client and server are of different endiannesses, * we must correct the endianness of the handle and address * we pass to the other side. The other side cannot (and * better not) interpret these values. */ if (DT_local_is_little_endian && !test_ptr->is_remote_little_endian) { rmi->rmr_context = DT_EndianMemHandle(rmi->rmr_context); rmi->mem_address.as_64 = DT_EndianMemAddress(rmi->mem_address.as_64); } /* * Send our memory info */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Sending Sync Msg\n", test_ptr->base_port)); /* post the send buffer */ if (!DT_post_send_buffer(phead, test_ptr->ep_context.ep_handle, test_ptr->ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID, DT_PERF_SYNC_BUFF_SIZE)) { /* error message printed by DT_post_send_buffer */ return false; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID); if (!DT_dto_event_wait(phead, test_ptr->reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context.ep_handle, DT_PERF_SYNC_BUFF_SIZE, dto_cookie, "Send Sync_Msg")) { return false; } /* * Recv the other side's info */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Waiting for Sync Msg\n", test_ptr->base_port)); dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context.bp, DT_PERF_SYNC_RECV_BUFFER_ID); if (!DT_dto_event_wait(phead, test_ptr->recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context.ep_handle, DT_PERF_SYNC_BUFF_SIZE, dto_cookie, "Received Sync_Msg")) { return false; } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Received Sync Msg\n", test_ptr->base_port)); return true; } dapl-2.1.5/test/dapltest/test/dapl_performance_stats.c000066400000000000000000000264301255317474200231170ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_performance_stats_init(Performance_Stats_t * stats) { stats->num_ops = 0; stats->bytes = 0; stats->post_ctxt_switch_num = 0; stats->reap_ctxt_switch_num = 0; stats->cpu_utilization = 0.0; stats->time_ts = 0; stats->posts_sans_ctxt.num = 0; stats->posts_sans_ctxt.total_ts = 0; stats->posts_sans_ctxt.max_ts = 0; stats->posts_sans_ctxt.min_ts = ~0; stats->posts_with_ctxt.num = 0; stats->posts_with_ctxt.total_ts = 0; stats->posts_with_ctxt.max_ts = 0; stats->posts_with_ctxt.min_ts = ~0; stats->reaps_sans_ctxt.num = 0; stats->reaps_sans_ctxt.total_ts = 0; stats->reaps_sans_ctxt.max_ts = 0; stats->reaps_sans_ctxt.min_ts = ~0; stats->reaps_with_ctxt.num = 0; stats->reaps_with_ctxt.total_ts = 0; stats->reaps_with_ctxt.max_ts = 0; stats->reaps_with_ctxt.min_ts = ~0; stats->latency.num = 0; stats->latency.total_ts = 0; stats->latency.max_ts = 0; stats->latency.min_ts = ~0; } void DT_performance_stats_record_post(Performance_Stats_t * stats, unsigned long ctxt_switch_num, DT_Mdep_TimeStamp ts) { if (ctxt_switch_num) { stats->posts_with_ctxt.num++; stats->posts_with_ctxt.total_ts += ts; stats->posts_with_ctxt.max_ts = DT_max(stats->posts_with_ctxt.max_ts, ts); stats->posts_with_ctxt.min_ts = DT_min(stats->posts_with_ctxt.min_ts, ts); stats->post_ctxt_switch_num += ctxt_switch_num; } else { stats->posts_sans_ctxt.num++; stats->posts_sans_ctxt.total_ts += ts; stats->posts_sans_ctxt.max_ts = DT_max(stats->posts_sans_ctxt.max_ts, ts); stats->posts_sans_ctxt.min_ts = DT_min(stats->posts_sans_ctxt.min_ts, ts); } } void DT_performance_stats_record_reap(Performance_Stats_t * stats, unsigned long ctxt_switch_num, DT_Mdep_TimeStamp ts) { if (ctxt_switch_num) { stats->reaps_with_ctxt.num++; stats->reaps_with_ctxt.total_ts += ts; stats->reaps_with_ctxt.max_ts = DT_max(stats->reaps_with_ctxt.max_ts, ts); stats->reaps_with_ctxt.min_ts = DT_min(stats->reaps_with_ctxt.min_ts, ts); stats->reap_ctxt_switch_num += ctxt_switch_num; } else { stats->reaps_sans_ctxt.num++; stats->reaps_sans_ctxt.total_ts += ts; stats->reaps_sans_ctxt.max_ts = DT_max(stats->reaps_sans_ctxt.max_ts, ts); stats->reaps_sans_ctxt.min_ts = DT_min(stats->reaps_sans_ctxt.min_ts, ts); } } void DT_performance_stats_record_latency(Performance_Stats_t * stats, DT_Mdep_TimeStamp ts) { stats->latency.num++; stats->latency.total_ts += ts; stats->latency.max_ts = DT_max(stats->latency.max_ts, ts); stats->latency.min_ts = DT_min(stats->latency.min_ts, ts); } void DT_performance_stats_data_combine(Performance_Stats_Data_t * dest, Performance_Stats_Data_t * src_a, Performance_Stats_Data_t * src_b) { dest->num = src_a->num + src_b->num; dest->total_ts = src_a->total_ts + src_b->total_ts; dest->max_ts = DT_max(src_a->max_ts, src_b->max_ts); dest->min_ts = DT_min(src_a->min_ts, src_b->min_ts); } void DT_performance_stats_combine(Performance_Stats_t * dest, Performance_Stats_t * src_a, Performance_Stats_t * src_b) { dest->num_ops = src_a->num_ops + src_b->num_ops; dest->bytes = src_a->bytes + src_b->bytes; dest->post_ctxt_switch_num = src_a->post_ctxt_switch_num + src_b->post_ctxt_switch_num; dest->reap_ctxt_switch_num = src_b->reap_ctxt_switch_num + src_b->reap_ctxt_switch_num; dest->cpu_utilization = DT_max(src_a->cpu_utilization, src_b->cpu_utilization); dest->time_ts = DT_max(src_a->time_ts, src_b->time_ts); DT_performance_stats_data_combine(&dest->posts_sans_ctxt, &src_a->posts_sans_ctxt, &src_b->posts_sans_ctxt); DT_performance_stats_data_combine(&dest->posts_with_ctxt, &src_a->posts_with_ctxt, &src_b->posts_with_ctxt); DT_performance_stats_data_combine(&dest->reaps_sans_ctxt, &src_a->reaps_sans_ctxt, &src_b->reaps_sans_ctxt); DT_performance_stats_data_combine(&dest->reaps_with_ctxt, &src_a->reaps_with_ctxt, &src_b->reaps_with_ctxt); DT_performance_stats_data_combine(&dest->latency, &src_a->latency, &src_b->latency); } double DT_performance_stats_data_print(DT_Tdep_Print_Head * phead, Performance_Stats_Data_t * data, double cpu_mhz) { double average; average = (int64_t) data->total_ts / (data->num * cpu_mhz); DT_Tdep_PT_Printf(phead, " Arithmetic mean : %d.%d us\n" " maximum : %d.%d us\n" " minimum : %d.%d us\n", DT_whole(average), DT_hundredths(average), DT_whole((int64_t) data->max_ts / cpu_mhz), DT_hundredths((int64_t) data->max_ts / cpu_mhz), DT_whole((int64_t) data->min_ts / cpu_mhz), DT_hundredths((int64_t) data->min_ts / cpu_mhz)); return average; } void DT_performance_stats_print(Params_t * params_ptr, DT_Tdep_Print_Head * phead, Performance_Stats_t * stats, Performance_Cmd_t * cmd, Performance_Test_t * test) { double cpu_mhz; double time_s; double mbytes; double ops_per_sec; double bandwidth; double latency; double time_per_post; double time_per_reap; cpu_mhz = params_ptr->cpu_mhz; latency = 0; #if defined(WIN32) /* * The Microsoft compiler is unable to do a 64 bit conversion when * working with double. time_ts is a 64 bit value, so we * potentially lose precision, so limit it to the Windows * platform. Trying to do the operation below without casting * a 64 bit value to an unsigned int results in the error when * using Visual C 6.0: * * Compiler Error C2520: conversion from unsigned __int64 to * double not implemented, use signed __int64. * * Note that signed __int64 doesn't work either! */ time_s = (double)((unsigned int)stats->time_ts / (1000000.0 * cpu_mhz)); #else time_s = (double)(stats->time_ts / (1000000.0 * cpu_mhz)); #endif mbytes = (double)(1.0 * stats->bytes) / 1024 / 1024; if (0.0 == time_s) { DT_Tdep_PT_Printf(phead, "Error determining time\n"); return; } else if (0 == stats->num_ops) { DT_Tdep_PT_Printf(phead, "Error determining number of operations\n"); return; } else if (0.0 == cpu_mhz) { DT_Tdep_PT_Printf(phead, "Error determining CPU speed\n"); return; } ops_per_sec = stats->num_ops / time_s; bandwidth = mbytes / time_s; DT_Tdep_PT_Printf(phead, "------------------------- Statistics -------------------------\n"); DT_Tdep_PT_Printf(phead, " Mode : %s\n" " Operation Type : %s\n" " Number of Operations : %u\n" " Segment Size : %u\n" " Number of Segments : %u \n" " Pipeline Length : %u\n\n", DT_PerformanceModeToString(cmd->mode), DT_TransferTypeToString(cmd->op.transfer_type), cmd->num_iterations, cmd->op.seg_size, cmd->op.num_segs, test->ep_context.pipeline_len); DT_Tdep_PT_Printf(phead, " Total Time : %d.%d sec\n" " Total Data Exchanged : %d.%d MB\n" " CPU Utilization : %d.%d\n" " Operation Throughput : %d.%d ops/sec\n" " Bandwidth : %d.%d MB/sec\n", DT_whole(time_s), DT_hundredths(time_s), DT_whole(mbytes), DT_hundredths(mbytes), DT_whole(stats->cpu_utilization), DT_hundredths(stats->cpu_utilization), DT_whole(ops_per_sec), DT_hundredths(ops_per_sec), DT_whole(bandwidth), DT_hundredths(bandwidth)); DT_Tdep_PT_Printf(phead, "\nLatency\n"); if (stats->latency.num) { latency = DT_performance_stats_data_print(phead, &stats->latency, cpu_mhz); } DT_Tdep_PT_Printf(phead, "\n" "Time Per Post\n" " %u posts without context switches\n", stats->posts_sans_ctxt.num); if (stats->posts_sans_ctxt.num) { DT_performance_stats_data_print(phead, &stats->posts_sans_ctxt, cpu_mhz); } DT_Tdep_PT_Printf(phead, "\n" " %u posts with context switches\n", stats->posts_with_ctxt.num); if (stats->posts_with_ctxt.num) { DT_Tdep_PT_Printf(phead, " %u number of context switches\n", stats->post_ctxt_switch_num); DT_performance_stats_data_print(phead, &stats->posts_with_ctxt, cpu_mhz); } DT_Tdep_PT_Printf(phead, "\n" "Time Per Reap\n" " %u reaps without context switches\n", stats->reaps_sans_ctxt.num); if (stats->reaps_sans_ctxt.num) { DT_performance_stats_data_print(phead, &stats->reaps_sans_ctxt, cpu_mhz); } DT_Tdep_PT_Printf(phead, "\n" " %u reaps with context switches\n", stats->reaps_with_ctxt.num); if (stats->reaps_with_ctxt.num) { DT_Tdep_PT_Printf(phead, "\n" " %u number of context switches\n", stats->reap_ctxt_switch_num); DT_performance_stats_data_print(phead, &stats->reaps_with_ctxt, cpu_mhz); } time_per_post = (int64_t) (stats->posts_sans_ctxt.total_ts + stats->posts_with_ctxt.total_ts) / (cpu_mhz * (stats-> posts_sans_ctxt. num + stats-> posts_with_ctxt. num)); time_per_reap = (int64_t) (stats->reaps_sans_ctxt.total_ts + stats->reaps_with_ctxt.total_ts) / (cpu_mhz * (stats-> reaps_sans_ctxt. num + stats-> reaps_with_ctxt. num)); DT_Tdep_PT_Printf(phead, "\nNOTE: 1 MB = 1024 KB = 1048576 B \n"); DT_Tdep_PT_Printf(phead, "---------------------------------------------------------------------\n"); DT_Tdep_PT_Printf(phead, "raw: %s, %u, %u, %u, %u, %d.%d, %d.%d, %d.%d, %d.%d, %d.%d, %d.%d \n", DT_TransferTypeToString(cmd->op.transfer_type), cmd->num_iterations, cmd->op.seg_size, cmd->op.num_segs, test->ep_context.pipeline_len, DT_whole(stats->cpu_utilization), DT_hundredths(stats->cpu_utilization), DT_whole(ops_per_sec), DT_hundredths(ops_per_sec), DT_whole(bandwidth), DT_hundredths(bandwidth), DT_whole(latency), DT_hundredths(latency), DT_whole(time_per_post), DT_hundredths(time_per_post), DT_whole(time_per_reap), DT_hundredths(time_per_reap)); DT_Tdep_PT_Printf(phead, "---------------------------------------------------------------------\n"); } dapl-2.1.5/test/dapltest/test/dapl_performance_util.c000066400000000000000000000442301255317474200227340ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define DT_Mdep_GetContextSwitchNum() 0 /* FIXME */ /****************************************************************************/ bool DT_Performance_Test_Create(Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_IA_ADDRESS_PTR remote_ia_addr, DAT_BOOLEAN is_server, DAT_BOOLEAN is_remote_little_endian, Performance_Test_t ** perf_test) { Performance_Test_t *test_ptr; DAT_COUNT pipeline_len; DAT_RETURN ret; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; test_ptr = DT_MemListAlloc(pt_ptr, "transaction_test_t", TRANSACTIONTEST, sizeof(Performance_Test_t)); if (NULL == test_ptr) { return false; } *perf_test = test_ptr; test_ptr->pt_ptr = pt_ptr; test_ptr->remote_ia_addr = remote_ia_addr; test_ptr->is_remote_little_endian = is_remote_little_endian; test_ptr->base_port = (DAT_CONN_QUAL) pt_ptr->Server_Info.first_port_number; test_ptr->ia_handle = ia_handle; test_ptr->cmd = &pt_ptr->Params.u.Performance_Cmd; ret = dat_ia_query(test_ptr->ia_handle, NULL, DAT_IA_ALL, &test_ptr->ia_attr, 0, NULL); if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ia_query error: %s\n", test_ptr->base_port, DT_RetToString(ret)); return false; } pipeline_len = DT_min(DT_min(test_ptr->cmd->num_iterations, test_ptr->cmd->pipeline_len), DT_min(test_ptr->ia_attr.max_dto_per_ep, test_ptr->ia_attr.max_evd_qlen)); if (RDMA_READ == test_ptr->cmd->op.transfer_type) { pipeline_len = DT_min(pipeline_len, test_ptr->ia_attr.max_rdma_read_per_ep); } test_ptr->reqt_evd_length = pipeline_len; test_ptr->recv_evd_length = DT_PERF_DFLT_EVD_LENGTH; test_ptr->conn_evd_length = DT_PERF_DFLT_EVD_LENGTH; test_ptr->creq_evd_length = DT_PERF_DFLT_EVD_LENGTH; /* create a protection zone */ ret = dat_pz_create(test_ptr->ia_handle, &test_ptr->pz_handle); if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_pz_create error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->pz_handle = DAT_HANDLE_NULL; return false; } /* create 4 EVDs - recv, request+RMR, conn-request, connect */ ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->recv_evd_length, test_ptr->cno_handle, DAT_EVD_DTO_FLAG, &test_ptr->recv_evd_hdl); /* recv */ if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (recv) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->recv_evd_hdl = DAT_HANDLE_NULL; return false; } ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->reqt_evd_length, test_ptr->cno_handle, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &test_ptr->reqt_evd_hdl); /* request + rmr bind */ if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (request) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->reqt_evd_hdl = DAT_HANDLE_NULL; return false; } if (is_server) { /* Client-side doesn't need CR events */ ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->creq_evd_length, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &test_ptr->creq_evd_hdl); /* cr */ if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (cr) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->creq_evd_hdl = DAT_HANDLE_NULL; return false; } } ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->conn_evd_length, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &test_ptr->conn_evd_hdl); /* conn */ if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (conn) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->conn_evd_hdl = DAT_HANDLE_NULL; return false; } /* * Set up the EP context: * create the EP * allocate buffers for remote memory info and sync message * post the receive buffers * connect * set up buffers and remote memory info * send across our info * recv the other side's info and extract what we need */ test_ptr->ep_context.ep_attr = test_ptr->pt_ptr->ep_attr; test_ptr->ep_context.ep_attr.max_request_dtos = pipeline_len; /* Create EP */ ret = dat_ep_create(test_ptr->ia_handle, /* IA */ test_ptr->pz_handle, /* PZ */ test_ptr->recv_evd_hdl, /* recv */ test_ptr->reqt_evd_hdl, /* request */ test_ptr->conn_evd_hdl, /* connect */ &test_ptr->ep_context.ep_attr, /* EP attrs */ &test_ptr->ep_context.ep_handle); if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_create error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->ep_context.ep_handle = DAT_HANDLE_NULL; return false; } /* * Allocate a buffer pool so we can exchange the * remote memory info and initialize. */ test_ptr->ep_context.bp = DT_BpoolAlloc(test_ptr->pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr->ep_context.ep_handle, DAT_HANDLE_NULL, /* rmr */ DT_PERF_SYNC_BUFF_SIZE, 2, /* 2 RMIs */ DAT_OPTIMAL_ALIGNMENT, false, false); if (!test_ptr->ep_context.bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for remote memory buffers\n", test_ptr->base_port); return false; } DT_Tdep_PT_Debug(3, (phead, "0: SYNC_SEND %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context.bp, DT_PERF_SYNC_SEND_BUFFER_ID))); DT_Tdep_PT_Debug(3, (phead, "1: SYNC_RECV %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context. bp, DT_PERF_SYNC_RECV_BUFFER_ID))); /* * Post recv and sync buffers */ if (!DT_post_recv_buffer(phead, test_ptr->ep_context.ep_handle, test_ptr->ep_context.bp, DT_PERF_SYNC_RECV_BUFFER_ID, DT_PERF_SYNC_BUFF_SIZE)) { /* error message printed by DT_post_recv_buffer */ return false; } /* * Fill in the test_ptr with relevant command info */ test_ptr->ep_context.op.transfer_type = test_ptr->cmd->op.transfer_type; test_ptr->ep_context.op.num_segs = test_ptr->cmd->op.num_segs; test_ptr->ep_context.op.seg_size = test_ptr->cmd->op.seg_size; /* * Exchange remote memory info: If we're going to participate * in an RDMA, we need to allocate memory buffers and advertise * them to the other side. */ test_ptr->ep_context.op.Rdma_Context = (DAT_RMR_CONTEXT) 0; test_ptr->ep_context.op.Rdma_Address = 0; test_ptr->ep_context.port = test_ptr->base_port; test_ptr->ep_context.pipeline_len = pipeline_len; return true; } /****************************************************************************/ void DT_Performance_Test_Destroy(Per_Test_Data_t * pt_ptr, Performance_Test_t * test_ptr, DAT_BOOLEAN is_server) { DAT_RETURN ret; DAT_EP_HANDLE ep_handle; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; ep_handle = DAT_HANDLE_NULL; /* Free the per-op buffers */ if (test_ptr->ep_context.op.bp) { if (!DT_Bpool_Destroy(test_ptr->pt_ptr, phead, test_ptr->ep_context.op.bp)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: Warning: Bpool destroy fails\n", test_ptr->base_port); /* carry on trying, regardless */ } } /* Free the remote memory info exchange buffers */ if (test_ptr->ep_context.bp) { if (!DT_Bpool_Destroy(test_ptr->pt_ptr, phead, test_ptr->ep_context.bp)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: Warning: Bpool destroy fails\n", test_ptr->base_port); /* carry on trying, regardless */ } } /* * Disconnect -- we may have left recv buffers posted, if we * bailed out mid-setup, or ran to completion * normally, so we use abrupt closure. */ if (test_ptr->ep_context.ep_handle) { ret = dat_ep_disconnect(test_ptr->ep_context.ep_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: Warning: dat_ep_disconnect error %s\n", test_ptr->base_port, DT_RetToString(ret)); /* carry on trying, regardless */ } else if (!DT_disco_event_wait(phead, test_ptr->conn_evd_hdl, &ep_handle)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: bad disconnect event\n", test_ptr->base_port); } } if (DAT_HANDLE_NULL != ep_handle) { /* Destroy the EP */ ret = dat_ep_free(ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_free error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* carry on trying, regardless */ } } /* clean up the EVDs */ if (test_ptr->conn_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (conn) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } if (is_server) { if (test_ptr->creq_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->creq_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (creq) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } } if (test_ptr->reqt_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (reqt) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } if (test_ptr->recv_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (recv) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } /* clean up the PZ */ if (test_ptr->pz_handle) { ret = dat_pz_free(test_ptr->pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_pz_free error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } DT_MemListFree(test_ptr->pt_ptr, test_ptr); DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: cleanup is done\n", test_ptr->base_port)); } /****************************************************************************/ bool DT_performance_post_rdma_op(Performance_Ep_Context_t * ep_context, DAT_EVD_HANDLE reqt_evd_hdl, Performance_Stats_t * stats) { unsigned int j; unsigned long int bytes; unsigned long pre_ctxt_num; unsigned long post_ctxt_num; DT_Mdep_TimeStamp pre_ts; DT_Mdep_TimeStamp post_ts; DAT_DTO_COOKIE cookie; DAT_RETURN ret; Performance_Test_Op_t *op = &ep_context->op; DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(op->bp, 0); DAT_RMR_TRIPLET rmr_triplet; bytes = op->seg_size * op->num_segs; /* Prep the inputs */ for (j = 0; j < op->num_segs; j++) { iov[j].virtual_address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(op->bp, j); iov[j].segment_length = op->seg_size; iov[j].lmr_context = DT_Bpool_GetLMR(op->bp, j); } rmr_triplet.virtual_address = op->Rdma_Address; rmr_triplet.segment_length = op->seg_size * op->num_segs; rmr_triplet.rmr_context = op->Rdma_Context; cookie.as_ptr = NULL; if (RDMA_WRITE == op->transfer_type) { pre_ctxt_num = DT_Mdep_GetContextSwitchNum(); pre_ts = DT_Mdep_GetTimeStamp(); ret = dat_ep_post_rdma_write(ep_context->ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); post_ts = DT_Mdep_GetTimeStamp(); post_ctxt_num = DT_Mdep_GetContextSwitchNum(); stats->bytes += bytes; } else { pre_ctxt_num = DT_Mdep_GetContextSwitchNum(); pre_ts = DT_Mdep_GetTimeStamp(); ret = dat_ep_post_rdma_read(ep_context->ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); post_ts = DT_Mdep_GetTimeStamp(); post_ctxt_num = DT_Mdep_GetContextSwitchNum(); stats->bytes += bytes; } if (DAT_SUCCESS != ret) { return false; } DT_performance_stats_record_post(stats, post_ctxt_num - pre_ctxt_num, post_ts - pre_ts); return true; } /****************************************************************************/ unsigned int DT_performance_reap(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, Performance_Mode_Type mode, Performance_Stats_t * stats) { if (BLOCKING_MODE == mode) { return DT_performance_wait(phead, evd_handle, stats); } else { return DT_performance_poll(phead, evd_handle, stats); } } /****************************************************************************/ unsigned int DT_performance_wait(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, Performance_Stats_t * stats) { DAT_COUNT i; DAT_COUNT queue_size; DAT_RETURN ret; DAT_EVENT event; unsigned long pre_ctxt_num; unsigned long post_ctxt_num; DT_Mdep_TimeStamp pre_ts; DT_Mdep_TimeStamp post_ts; queue_size = 0; pre_ctxt_num = DT_Mdep_GetContextSwitchNum(); pre_ts = DT_Mdep_GetTimeStamp(); ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); post_ts = DT_Mdep_GetTimeStamp(); post_ctxt_num = DT_Mdep_GetContextSwitchNum(); if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_dequeue failed: %s\n", DT_RetToString(ret)); return 0; } else if (event.event_number == DAT_DTO_COMPLETION_EVENT) { DT_performance_stats_record_reap(stats, post_ctxt_num - pre_ctxt_num, post_ts - pre_ts); } else { /* This should not happen. There has been an error if it does. */ DT_Tdep_PT_Printf(phead, "Warning: dapl_performance_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); return 0; } for (i = 0; i < queue_size; i++) { pre_ctxt_num = DT_Mdep_GetContextSwitchNum(); pre_ts = DT_Mdep_GetTimeStamp(); ret = DT_Tdep_evd_dequeue(evd_handle, &event); post_ts = DT_Mdep_GetTimeStamp(); post_ctxt_num = DT_Mdep_GetContextSwitchNum(); if (DAT_GET_TYPE(ret) == DAT_QUEUE_EMPTY) { continue; } else if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_dequeue failed: %s\n", DT_RetToString(ret)); return 0; } else if (event.event_number == DAT_DTO_COMPLETION_EVENT) { DT_performance_stats_record_reap(stats, post_ctxt_num - pre_ctxt_num, post_ts - pre_ts); } else { /* This should not happen. There has been an error if it does. */ DT_Tdep_PT_Printf(phead, "Warning: dapl_performance_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); return 0; } } return ++queue_size; } /****************************************************************************/ unsigned int DT_performance_poll(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, Performance_Stats_t * stats) { DAT_RETURN ret; DAT_EVENT event; unsigned long pre_ctxt_num; unsigned long post_ctxt_num; DT_Mdep_TimeStamp pre_ts; DT_Mdep_TimeStamp post_ts; for (;;) { pre_ctxt_num = DT_Mdep_GetContextSwitchNum(); pre_ts = DT_Mdep_GetTimeStamp(); ret = DT_Tdep_evd_dequeue(evd_handle, &event); post_ts = DT_Mdep_GetTimeStamp(); post_ctxt_num = DT_Mdep_GetContextSwitchNum(); if (DAT_GET_TYPE(ret) == DAT_QUEUE_EMPTY) { continue; } else if (DAT_SUCCESS != ret) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_dequeue failed: %s\n", DT_RetToString(ret)); return 0; } else if (event.event_number == DAT_DTO_COMPLETION_EVENT) { DT_performance_stats_record_reap(stats, post_ctxt_num - pre_ctxt_num, post_ts - pre_ts); return 1; } else { /* This should not happen. There has been an error if it does. */ DT_Tdep_PT_Printf(phead, "Warning: dapl_performance_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); return 0; } } /*never reached */ return 0; } void DT_Performance_Cmd_PT_Print(DT_Tdep_Print_Head * phead, Performance_Cmd_t * cmd) { DT_Tdep_PT_Printf(phead, "-------------------------------------\n"); DT_Tdep_PT_Printf(phead, "PerfCmd.server_name : %s\n", cmd->server_name); DT_Tdep_PT_Printf(phead, "PerfCmd.dapl_name : %s\n", cmd->dapl_name); DT_Tdep_PT_Printf(phead, "PerfCmd.mode : %s\n", (cmd->mode == BLOCKING_MODE) ? "BLOCKING" : "POLLING"); DT_Tdep_PT_Printf(phead, "PerfCmd.num_iterations : %d\n", cmd->num_iterations); DT_Tdep_PT_Printf(phead, "PerfCmd.pipeline_len : %d\n", cmd->pipeline_len); DT_Tdep_PT_Printf(phead, "PerfCmd.op.transfer_type : %s\n", cmd->op.transfer_type == RDMA_READ ? "RDMA_READ" : cmd->op.transfer_type == RDMA_WRITE ? "RDMA_WRITE" : "SEND_RECV"); DT_Tdep_PT_Printf(phead, "PerfCmd.op.num_segs : %d\n", cmd->op.num_segs); DT_Tdep_PT_Printf(phead, "PerfCmd.op.seg_size : %d\n", cmd->op.seg_size); } dapl-2.1.5/test/dapltest/test/dapl_quit_util.c000066400000000000000000000032711255317474200214150ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Quit_Cmd_PT_Print(DT_Tdep_Print_Head * phead, Quit_Cmd_t * cmd) { /* DT_Mdep_printf ("Quit_Cmd.server_name: %s\n", cmd->server_name); DT_Mdep_printf ("Quit_Cmd.device_name: %s\n", cmd->device_name); */ DT_Tdep_PT_Printf(phead, "Quit_Cmd.server_name: %s\n", cmd->server_name); DT_Tdep_PT_Printf(phead, "Quit_Cmd.device_name: %s\n", cmd->device_name); } dapl-2.1.5/test/dapltest/test/dapl_server.c000066400000000000000000000604371255317474200207130ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #ifdef DFLT_QLEN #undef DFLT_QLEN #endif #define DFLT_QLEN 32 /* default event queue length */ int send_control_data(DT_Tdep_Print_Head * phead, unsigned char *buffp, Per_Server_Data_t * ps_ptr, Per_Test_Data_t * pt_ptr); void DT_cs_Server(Params_t * params_ptr) { Server_Cmd_t *Server_Cmd = ¶ms_ptr->u.Server_Cmd; Client_Info_t *Client_Info = NULL; Transaction_Cmd_t *Transaction_Cmd = NULL; Quit_Cmd_t *Quit_Cmd = NULL; Performance_Cmd_t *Performance_Cmd = NULL; Per_Server_Data_t *ps_ptr = NULL; Per_Test_Data_t *pt_ptr = NULL; Started_server_t *temp_list = NULL; Started_server_t *pre_list = NULL; unsigned char *buffp = NULL; char *module = "DT_cs_Server"; DAT_DTO_COOKIE dto_cookie; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_RETURN ret; DT_Tdep_Print_Head *phead; phead = params_ptr->phead; /* Check if device from command line already in use */ temp_list = DT_started_server_list; while (temp_list) { if (strcmp(temp_list->devicename, Server_Cmd->dapl_name) == 0) { DT_Tdep_PT_Printf(phead, "NOTICE: server already started for this NIC: %s\n", Server_Cmd->dapl_name); return; } temp_list = temp_list->next; } /* Alloc memory for server list */ temp_list = (Started_server_t *) DT_Mdep_Malloc(sizeof(Started_server_t)); if (temp_list == 0) { DT_Tdep_PT_Printf(phead, "no memory for server_list\n"); return; } strcpy(temp_list->devicename, Server_Cmd->dapl_name); temp_list->next = DT_started_server_list; DT_started_server_list = temp_list; if (Server_Cmd->debug) { /* Echo our inputs if debugging */ DT_Server_Cmd_PT_Print(phead, Server_Cmd); } /* Allocate memory for Per_Server_Data */ ps_ptr = (Per_Server_Data_t *) DT_Mdep_Malloc(sizeof(Per_Server_Data_t)); if (ps_ptr == 0) { DT_Tdep_PT_Printf(phead, "no memory for ps_data\n"); goto server_exit; } DT_Mdep_LockInit(&ps_ptr->num_clients_lock); ps_ptr->NextPortNumber = params_ptr->server_port + 1; ps_ptr->num_clients = 0; /* Open the IA */ ret = dat_ia_open(Server_Cmd->dapl_name, DFLT_QLEN, &ps_ptr->async_evd_hdl, &ps_ptr->ia_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: Could not open %s (%s)\n", module, Server_Cmd->dapl_name, DT_RetToString(ret)); ps_ptr->ia_handle = DAT_HANDLE_NULL; goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: IA %s opened\n", module, Server_Cmd->dapl_name)); /* Create a PZ */ ret = dat_pz_create(ps_ptr->ia_handle, &ps_ptr->pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_create error: %s\n", module, DT_RetToString(ret)); ps_ptr->pz_handle = DAT_HANDLE_NULL; goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: PZ created\n", module)); /* Create 4 events - recv, request, connection-request, connect */ ret = DT_Tdep_evd_create(ps_ptr->ia_handle, DFLT_QLEN, NULL, DAT_EVD_DTO_FLAG, &ps_ptr->recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (recv) failed %s\n", module, DT_RetToString(ret)); ps_ptr->recv_evd_hdl = DAT_HANDLE_NULL; goto server_exit; } ret = DT_Tdep_evd_create(ps_ptr->ia_handle, DFLT_QLEN, NULL, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &ps_ptr->reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (send) failed %s\n", module, DT_RetToString(ret)); ps_ptr->reqt_evd_hdl = DAT_HANDLE_NULL; goto server_exit; } ret = DT_Tdep_evd_create(ps_ptr->ia_handle, DFLT_QLEN, NULL, DAT_EVD_CR_FLAG, &ps_ptr->creq_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (cr) failed %s\n", module, DT_RetToString(ret)); ps_ptr->creq_evd_hdl = DAT_HANDLE_NULL; goto server_exit; } ret = DT_Tdep_evd_create(ps_ptr->ia_handle, DFLT_QLEN, NULL, DAT_EVD_CONNECTION_FLAG, &ps_ptr->conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_create (conn) failed %s\n", module, DT_RetToString(ret)); ps_ptr->conn_evd_hdl = DAT_HANDLE_NULL; goto server_exit; } /* Create the EP */ ret = dat_ep_create(ps_ptr->ia_handle, /* IA */ ps_ptr->pz_handle, /* PZ */ ps_ptr->recv_evd_hdl, /* recv */ ps_ptr->reqt_evd_hdl, /* request */ ps_ptr->conn_evd_hdl, /* connect */ (DAT_EP_ATTR *) NULL, &ps_ptr->ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_create error: %s\n", module, DT_RetToString(ret)); ps_ptr->ep_handle = DAT_HANDLE_NULL; goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: EP created\n", module)); /* Create PSP */ ret = dat_psp_create(ps_ptr->ia_handle, params_ptr->server_port, ps_ptr->creq_evd_hdl, DAT_PSP_CONSUMER_FLAG, &ps_ptr->psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_psp_create error: %s\n", module, DT_RetToString(ret)); ps_ptr->psp_handle = DAT_HANDLE_NULL; goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: PSP created\n", module)); /* * Create two buffers, large enough to hold ClientInfo and the largest * command we'll use. */ ps_ptr->bpool = DT_BpoolAlloc(NULL, phead, ps_ptr->ia_handle, ps_ptr->pz_handle, ps_ptr->ep_handle, DAT_HANDLE_NULL, /* no RMR */ DT_RoundSize(sizeof(Transaction_Cmd_t), 8192), 3, /* num_buffers */ DAT_OPTIMAL_ALIGNMENT, false, false); if (ps_ptr->bpool == 0) { DT_Tdep_PT_Printf(phead, "%s: no memory for command buffer pool.\n", module); goto server_exit; } DT_Tdep_PT_Debug(3, (phead, "Recv 0 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(ps_ptr->bpool, 0))); DT_Tdep_PT_Debug(3, (phead, "Recv 1 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(ps_ptr->bpool, 1))); DT_Tdep_PT_Debug(3, (phead, "SrvInfo 2 %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(ps_ptr->bpool, 2))); /* Initialize the performance test lock in case an incoming test * is a performance test, so we can allow only one at a time. * Otherwise, multiple performance tests cause a race condition * between the server creating a new thread trying to allocate a * PSP with the same ID as another thread that is either running * a test on that same ID or hasn't yet destroyed it. Only one * PSP with a particular ID can exist at a time. It's a * de-facto shared resource that must be protected. */ /************************************************************************ * Loop accepting connections and acting on them */ for (; /* EVER */ ;) { DAT_CR_HANDLE cr_handle; DAT_CR_ARRIVAL_EVENT_DATA cr_stat; DAT_EVENT_NUMBER event_num; /* Set up the Per_Test_Data */ pt_ptr = DT_Alloc_Per_Test_Data(phead); if (!pt_ptr) { DT_Tdep_PT_Printf(phead, "%s: no memory for Per_Test_Data\n", module); goto server_exit; } DT_MemListInit(pt_ptr); DT_Thread_Init(pt_ptr); pt_ptr->local_is_server = true; pt_ptr->ps_ptr = ps_ptr; memcpy((void *)(uintptr_t) & pt_ptr->Params, (const void *)params_ptr, sizeof(Params_t)); /* Server_Info, Client_Info, Params set up below */ /* Gather whatever info we want about defaults */ if (!DT_query(pt_ptr, ps_ptr->ia_handle, ps_ptr->ep_handle)) { goto server_exit; } /* Post recv buffers for ClientInfo and Transaction_Cmd_t */ DT_Tdep_PT_Debug(1, (phead, "%s: Posting 2 recvs\n", module)); if (!DT_post_recv_buffer(phead, ps_ptr->ep_handle, ps_ptr->bpool, 0, DT_Bpool_GetBuffSize(ps_ptr->bpool, 0))) { DT_Tdep_PT_Printf(phead, "%s: cannot post ClientInfo recv buffer\n", module); goto server_exit; } if (!DT_post_recv_buffer(phead, ps_ptr->ep_handle, ps_ptr->bpool, 1, DT_Bpool_GetBuffSize(ps_ptr->bpool, 1))) { DT_Tdep_PT_Printf(phead, "%s: cannot post Transaction_Cmd_t recv buffer\n", module); goto server_exit; } /* message to help automated test scripts know when to start the client */ DT_Tdep_PT_Printf(phead, "Dapltest: Service Point Ready - %s\n", Server_Cmd->dapl_name); DT_Mdep_flush(); DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for Connection Request\n", module)); if (!DT_cr_event_wait(phead, ps_ptr->creq_evd_hdl, &cr_stat) || !DT_cr_check(phead, &cr_stat, ps_ptr->psp_handle, params_ptr->server_port, &cr_handle, module)) { DT_Tdep_PT_Printf(phead, "CR Check failed, file %s line %d\n", __FILE__, __LINE__); goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Accepting Connection Request\n", module)); ret = dat_cr_accept(cr_handle, ps_ptr->ep_handle, 0, (DAT_PVOID) 0); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_cr_accept error: %s\n", module, DT_RetToString(ret)); goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Awaiting connection ...\n", module)); if (!DT_conn_event_wait (phead, ps_ptr->ep_handle, ps_ptr->conn_evd_hdl, &event_num)) { DT_Tdep_PT_Printf(phead, "%s: error awaiting conn-established event\n", module); goto server_exit; } if (DT_dapltest_debug) { DT_Tdep_PT_Debug(1, (phead, "%s: Connected!\n", module)); get_ep_connection_state(phead, ps_ptr->ep_handle); } /* Wait for Client_Info */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(ps_ptr->bpool, 0); DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for Client_Info\n", module)); if (!DT_dto_event_wait(phead, ps_ptr->recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ps_ptr->ep_handle, DT_Bpool_GetBuffSize(ps_ptr->bpool, 0), dto_cookie, "Client_Info_Recv")) { goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Got Client_Info\n", module)); /* Extract the Client_Info */ Client_Info = (Client_Info_t *) DT_Bpool_GetBuffer(ps_ptr->bpool, 0); DT_Client_Info_Endian(Client_Info); memcpy((void *)(uintptr_t) & pt_ptr->Client_Info, (const void *)Client_Info, sizeof(Client_Info_t)); /* Wait for client's command info */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(ps_ptr->bpool, 1); DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for Client_Cmd_Info\n", module)); if (!DT_dto_event_wait(phead, ps_ptr->recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ps_ptr->ep_handle, DT_Bpool_GetBuffSize(ps_ptr->bpool, 1), dto_cookie, "Client_Cmd_Recv")) { goto server_exit; } /* Extract the client's command info */ switch (Client_Info->test_type) { case TRANSACTION_TEST: { Transaction_Cmd = (Transaction_Cmd_t *) DT_Bpool_GetBuffer(ps_ptr->bpool, 1); DT_Transaction_Cmd_Endian(Transaction_Cmd, false); memcpy((void *)(uintptr_t) & pt_ptr->Params.u. Transaction_Cmd, (const void *)Transaction_Cmd, sizeof(Transaction_Cmd_t)); break; } case QUIT_TEST: { Quit_Cmd = (Quit_Cmd_t *) DT_Bpool_GetBuffer(ps_ptr-> bpool, 1); DT_Quit_Cmd_Endian(Quit_Cmd, false); memcpy((void *)(uintptr_t) & pt_ptr->Params.u. Quit_Cmd, (const void *)Quit_Cmd, sizeof(Quit_Cmd_t)); break; } case PERFORMANCE_TEST: { Performance_Cmd = (Performance_Cmd_t *) DT_Bpool_GetBuffer(ps_ptr->bpool, 1); DT_Performance_Cmd_Endian(Performance_Cmd); memcpy((void *)(uintptr_t) & pt_ptr->Params.u. Performance_Cmd, (const void *)Performance_Cmd, sizeof(Performance_Cmd_t)); break; } default: { DT_Tdep_PT_Printf(phead, "Unknown TestType received\n"); goto server_exit; break; } } /* Setup Server Info */ DT_Tdep_PT_Debug(1, (phead, "%s: Send Server_Info\n", module)); pt_ptr->Server_Info.dapltest_version = DAPLTEST_VERSION; pt_ptr->Server_Info.is_little_endian = DT_local_is_little_endian; /* reset port, don't eat up port space on long runs */ if (ps_ptr->NextPortNumber >= params_ptr->server_port + 1000) ps_ptr->NextPortNumber = params_ptr->server_port + 1; pt_ptr->Server_Info.first_port_number = ps_ptr->NextPortNumber; ps_ptr->NextPortNumber += pt_ptr->Client_Info.total_threads; /* This had to be done here because the pt_ptr is being fed to * the thread as its context, and if it isn't properly * initialized before the thread spawns then the thread may * incorrectly set up its PSP and the server will be listening * on the WRONG PORT! */ switch (Client_Info->test_type) { case TRANSACTION_TEST: { /* create a thread to handle this pt_ptr; */ ps_ptr->NextPortNumber += (pt_ptr->Params.u.Transaction_Cmd. eps_per_thread - 1) * pt_ptr->Client_Info.total_threads; DT_Tdep_PT_Debug(1, (phead, "%s: Creating Transaction Test Thread\n", module)); pt_ptr->thread = DT_Thread_Create(pt_ptr, DT_Transaction_Test_Server, pt_ptr, DT_MDEP_DEFAULT_STACK_SIZE); if (pt_ptr->thread == 0) { DT_Tdep_PT_Printf(phead, "no memory to create thread\n"); goto server_exit; } break; } case QUIT_TEST: { DT_Tdep_PT_Debug(1, (phead, "Client Requests Server to Quit\n")); (void)send_control_data(phead, buffp, ps_ptr, pt_ptr); goto server_exit; break; } case LIMIT_TEST: { DT_Tdep_PT_Debug(1, (phead, "Limit Test is Client-side Only!\n")); (void)send_control_data(phead, buffp, ps_ptr, pt_ptr); goto server_exit; break; } case PERFORMANCE_TEST: { /* create a thread to handle this pt_ptr; */ DT_Tdep_PT_Debug(1, (phead, "%s: Creating Performance Test Thread\n", module)); pt_ptr->thread = DT_Thread_Create(pt_ptr, DT_Performance_Test_Server, pt_ptr, DT_MDEP_DEFAULT_STACK_SIZE); if (pt_ptr->thread == 0) { DT_Tdep_PT_Printf(phead, "no memory to create thread\n"); goto server_exit; } /* take the performance test lock to serialize */ DT_Mdep_Lock(&g_PerfTestLock); break; } case FFT_TEST: default: { DT_Tdep_PT_Printf(phead, "Unknown TestType received\n"); (void)send_control_data(phead, buffp, ps_ptr, pt_ptr); goto server_exit; break; } } /* Start the new test thread */ DT_Tdep_PT_Debug(1, (phead, "%s: Starting Test Thread\n", module)); if (DT_Thread_Start(pt_ptr->thread) == false) { DT_Tdep_PT_Debug(1, (phead, "failed to start test thread\n")); goto server_exit; } buffp = DT_Bpool_GetBuffer(ps_ptr->bpool, 2); /* 3rd buffer */ memcpy((void *)buffp, (const void *)&pt_ptr->Server_Info, sizeof(Server_Info_t)); DT_Server_Info_Endian((Server_Info_t *) buffp); /* Perform obligatory version check */ if (pt_ptr->Client_Info.dapltest_version != DAPLTEST_VERSION) { DT_Tdep_PT_Printf(phead, "%s: %s: Server %d, Client %d\n", module, "DAPLTEST VERSION MISMATCH", DAPLTEST_VERSION, pt_ptr->Client_Info.dapltest_version); goto server_exit; } DT_Tdep_PT_Debug(1, (phead, "%s: Version OK!\n", module)); DT_Mdep_wait_object_wait(&pt_ptr->synch_wait_object, DAT_TIMEOUT_INFINITE); /* Send the Server_Info */ DT_Tdep_PT_Debug(1, (phead, "%s: Send Server_Info\n", module)); if (!DT_post_send_buffer(phead, ps_ptr->ep_handle, ps_ptr->bpool, 2, DT_Bpool_GetBuffSize(ps_ptr->bpool, 2))) { DT_Tdep_PT_Printf(phead, "%s: cannot send Server_Info\n", module); goto server_exit; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(ps_ptr->bpool, 2); if (!DT_dto_event_wait(phead, ps_ptr->reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ps_ptr->ep_handle, DT_Bpool_GetBuffSize(ps_ptr->bpool, 2), dto_cookie, "Server_Info_Send")) { goto server_exit; } /* Count this new client and get ready for the next */ DT_Mdep_Lock(&ps_ptr->num_clients_lock); ps_ptr->num_clients++; DT_Mdep_Unlock(&ps_ptr->num_clients_lock); /* we passed the pt_ptr to the thread and must now 'forget' it */ pt_ptr = 0; #ifdef CM_BUSTED DT_Tdep_PT_Debug(1, (phead, "%s: Server exiting because provider does not support\n" " multiple connections to the same service point\n", module)); /* Until connections are healthier we run just one test */ break; #else ret = dat_ep_disconnect(ps_ptr->ep_handle, DAT_CLOSE_GRACEFUL_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_disconnect fails: %s\n", module, DT_RetToString(ret)); goto server_exit; } if (!DT_disco_event_wait(phead, ps_ptr->conn_evd_hdl, NULL)) { DT_Tdep_PT_Printf(phead, "%s: bad disconnect event\n", module); goto server_exit; } /* reset the EP to get back into the game */ dat_ep_reset(ps_ptr->ep_handle); DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for another client...\n", module)); #endif } /* end loop accepting connections */ /************************************************************************ * Finished (or had an error) so clean up and go home */ server_exit: /* Wait until all of our clients are gone */ DT_Tdep_PT_Debug(1, (phead, "%s: Waiting for clients to all go away...\n", module)); while (ps_ptr && ps_ptr->num_clients > 0) { DT_Mdep_Sleep(100); } /* Clean up the Per_Test_Data (if any) */ DT_Tdep_PT_Debug(1, (phead, "%s: Cleaning up ...\n", module)); if (pt_ptr) { DT_Mdep_LockDestroy(&pt_ptr->Thread_counter_lock); DT_Mdep_LockDestroy(&pt_ptr->MemListLock); DT_Free_Per_Test_Data(pt_ptr); } /* Clean up the Per_Server_Data */ if (ps_ptr) { /* * disconnect the most recent EP * * we also get here on error, hence abrupt closure to * flush any lingering buffers posted. */ if (ps_ptr->ep_handle) { ret = dat_ep_disconnect(ps_ptr->ep_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_disconnect fails: %s\n", module, DT_RetToString(ret)); /* keep trying */ } else if (!DT_disco_event_wait(phead, ps_ptr->conn_evd_hdl, NULL)) { DT_Tdep_PT_Printf(phead, "%s: bad disconnect event\n", module); } } /* Destroy the Bpool */ if (ps_ptr->bpool) { if (!DT_Bpool_Destroy(NULL, phead, ps_ptr->bpool)) { DT_Tdep_PT_Printf(phead, "%s: error destroying buffer pool\n", module); /* keep trying */ } } /* Free the PSP */ if (ps_ptr->psp_handle) { ret = dat_psp_free(ps_ptr->psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_psp_free error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } /* Free the EP */ if (ps_ptr->ep_handle) { ret = dat_ep_free(ps_ptr->ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_free error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } /* Free the 4 EVDs */ if (ps_ptr->conn_evd_hdl) { ret = DT_Tdep_evd_free(ps_ptr->conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (conn) error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } if (ps_ptr->creq_evd_hdl) { ret = DT_Tdep_evd_free(ps_ptr->creq_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (creq) error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } if (ps_ptr->reqt_evd_hdl) { ret = DT_Tdep_evd_free(ps_ptr->reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (reqt) error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } if (ps_ptr->recv_evd_hdl) { ret = DT_Tdep_evd_free(ps_ptr->recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_evd_free (recv) error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } /* Free the PZ */ if (ps_ptr->pz_handle) { ret = dat_pz_free(ps_ptr->pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_pz_free error: %s\n", module, DT_RetToString(ret)); /* keep trying */ } } /* Close the IA */ if (ps_ptr->ia_handle) { /* dat_ia_close cleans up async evd handle, too */ ret = dat_ia_close(ps_ptr->ia_handle, DAT_CLOSE_GRACEFUL_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (graceful) error: %s\n", module, DT_RetToString(ret)); ret = dat_ia_close(ps_ptr->ia_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_close (abrupt) error: %s\n", module, DT_RetToString(ret)); } /* keep trying */ } else { DT_Tdep_PT_Debug(1, (phead, "%s: IA %s closed\n", module, Server_Cmd->dapl_name)); } } /* Destroy the ps_ptr */ DT_Mdep_LockDestroy(&ps_ptr->num_clients_lock); DT_Mdep_Free(ps_ptr); } /* end if ps_ptr */ /* Clean up the server list */ pre_list = 0; temp_list = DT_started_server_list; while (temp_list) { if (strcmp(temp_list->devicename, Server_Cmd->dapl_name) == 0) { if (pre_list == 0) { /* first one */ DT_started_server_list = temp_list->next; } else { pre_list->next = temp_list->next; } DT_Mdep_Free(temp_list); break; } pre_list = temp_list; temp_list = temp_list->next; } DT_Tdep_PT_Printf(phead, "%s (%s): Exiting.\n", module, Server_Cmd->dapl_name); } int send_control_data(DT_Tdep_Print_Head * phead, unsigned char *buffp, Per_Server_Data_t * ps_ptr, Per_Test_Data_t * pt_ptr) { char *module = "send_control_data"; DAT_DTO_COOKIE dto_cookie; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; buffp = DT_Bpool_GetBuffer(ps_ptr->bpool, 2); /* 3rd buffer */ memcpy((void *)buffp, (const void *)&pt_ptr->Server_Info, sizeof(Server_Info_t)); DT_Server_Info_Endian((Server_Info_t *) buffp); if (!DT_post_send_buffer(phead, ps_ptr->ep_handle, ps_ptr->bpool, 2, DT_Bpool_GetBuffSize(ps_ptr->bpool, 2))) { DT_Tdep_PT_Printf(phead, "%s: cannot send Server_Info\n", module); return 1; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) (uintptr_t) DT_Bpool_GetBuffer(ps_ptr->bpool, 2); if (!DT_dto_event_wait(phead, ps_ptr->reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, ps_ptr->ep_handle, DT_Bpool_GetBuffSize(ps_ptr->bpool, 2), dto_cookie, "Server_Info_Send")) { return 1; } return 0; } void DT_Server_Cmd_PT_Print(DT_Tdep_Print_Head * phead, Server_Cmd_t * Server_Cmd) { DT_Tdep_PT_Printf(phead, "Server_Cmd.debug: %d\n", Server_Cmd->debug); DT_Tdep_PT_Printf(phead, "Server_Cmd.dapl_name: %s\n", Server_Cmd->dapl_name); } dapl-2.1.5/test/dapltest/test/dapl_server_info.c000066400000000000000000000040131255317474200217120ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" Started_server_t *DT_started_server_list = 0; void DT_Server_Info_Endian(Server_Info_t * server_info) { server_info->dapltest_version = DT_Endian32(server_info->dapltest_version); server_info->is_little_endian = DT_Endian32(server_info->is_little_endian); server_info->first_port_number = DT_Endian32(server_info->first_port_number); } void DT_Server_Info_Print(DT_Tdep_Print_Head * phead, Server_Info_t * server_info) { DT_Tdep_PT_Printf(phead, "-------------------------------------\n"); DT_Tdep_PT_Printf(phead, "Server_Info.dapltest_version : %d\n", server_info->dapltest_version); DT_Tdep_PT_Printf(phead, "Server_Info.is_little_endian : %d\n", server_info->is_little_endian); } dapl-2.1.5/test/dapltest/test/dapl_test_data.c000066400000000000000000000034421255317474200213460ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" DT_Mdep_LockType g_PerfTestLock; /* * check memory leaking int alloc_count; DT_Mdep_LockType * Alloc_Count_Lock; */ Per_Test_Data_t *DT_Alloc_Per_Test_Data(DT_Tdep_Print_Head * phead) { Per_Test_Data_t *pt_ptr; pt_ptr = 0; pt_ptr = DT_Mdep_Malloc(sizeof(Per_Test_Data_t)); if (!pt_ptr) { DT_Tdep_PT_Printf(phead, "No Memory to create per_test_data!\n"); } return (pt_ptr); } void DT_Free_Per_Test_Data(Per_Test_Data_t * pt_ptr) { DT_Mdep_Free(pt_ptr); } dapl-2.1.5/test/dapltest/test/dapl_test_util.c000066400000000000000000000456531255317474200214240ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* ----------------------------------------------------------- * Gather info about default attributes */ DAT_BOOLEAN DT_query(Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE ia_handle, DAT_EP_HANDLE ep_handle) { char *module = "DT_query"; DAT_EVD_HANDLE async_evd_hdl; /* not used */ DAT_EP_PARAM ep_params; DAT_RETURN ret; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; /* Query the IA */ ret = dat_ia_query(ia_handle, &async_evd_hdl, DAT_IA_ALL, &pt_ptr->ia_attr, DAT_PROVIDER_FIELD_ALL, &pt_ptr->provider_attr); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ia_query error: %s\n", module, DT_RetToString(ret)); return (false); } /* Query the EP */ ret = dat_ep_query(ep_handle, DAT_EP_FIELD_ALL, &ep_params); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "%s: dat_ep_query error: %s\n", module, DT_RetToString(ret)); return (false); } pt_ptr->ep_attr = ep_params.ep_attr; /* * If debugging, print out some interesting attributes */ if (DT_dapltest_debug) { DAT_SOCK_ADDR6 *ip6_addr; struct sockaddr_in *ip_addr; DT_Tdep_PT_Printf(phead, "***** DAPL Characteristics *****\n"); DT_Tdep_PT_Printf(phead, "Provider: %s Version %d.%d DAPL %d.%d\n", pt_ptr->provider_attr.provider_name, pt_ptr->provider_attr.provider_version_major, pt_ptr->provider_attr.provider_version_minor, pt_ptr->provider_attr.dapl_version_major, pt_ptr->provider_attr.dapl_version_minor); DT_Tdep_PT_Printf(phead, "Adapter: %s by %s Version %d.%d\n", pt_ptr->ia_attr.adapter_name, pt_ptr->ia_attr.vendor_name, pt_ptr->ia_attr.hardware_version_major, pt_ptr->ia_attr.hardware_version_minor); DT_Tdep_PT_Printf(phead, "Supporting:\n"); DT_Tdep_PT_Printf(phead, "\t%d EPs with %d DTOs and %d RDMA/RDs each\n", pt_ptr->ia_attr.max_eps, pt_ptr->ia_attr.max_dto_per_ep, pt_ptr->ia_attr.max_rdma_read_per_ep); DT_Tdep_PT_Printf(phead, "\t%d EVDs of up to %d entries " " (default S/R size is %d/%d)\n", pt_ptr->ia_attr.max_evds, pt_ptr->ia_attr.max_evd_qlen, pt_ptr->ep_attr.max_request_dtos, pt_ptr->ep_attr.max_recv_dtos); DT_Tdep_PT_Printf(phead, "\tIOVs of up to %d elements\n", pt_ptr->ia_attr.max_iov_segments_per_dto); DT_Tdep_PT_Printf(phead, "\t%d LMRs (and %d RMRs) of up to 0x" F64x " bytes\n", pt_ptr->ia_attr.max_lmrs, pt_ptr->ia_attr.max_rmrs, pt_ptr->ia_attr.max_lmr_block_size); DT_Tdep_PT_Printf(phead, "\tMaximum MTU 0x" F64x " bytes, RDMA 0x" F64x " bytes\n", pt_ptr->ia_attr.max_mtu_size, pt_ptr->ia_attr.max_rdma_size); DT_Tdep_PT_Printf(phead, "\tMaximum Private data size %d bytes\n", pt_ptr->provider_attr.max_private_data_size); ip6_addr = (DAT_SOCK_ADDR6 *) pt_ptr->ia_attr.ia_address_ptr; if (ip6_addr->sin6_family == AF_INET6) { DT_Tdep_PT_Printf(phead, "\tLocal IP address %x:%x:%x:%x:%x:%x:%x:%x:\n", ip6_addr->sin6_addr.s6_addr[0], ip6_addr->sin6_addr.s6_addr[1], ip6_addr->sin6_addr.s6_addr[2], ip6_addr->sin6_addr.s6_addr[3], ip6_addr->sin6_addr.s6_addr[4], ip6_addr->sin6_addr.s6_addr[5], ip6_addr->sin6_addr.s6_addr[6], ip6_addr->sin6_addr.s6_addr[7]); DT_Tdep_PT_Printf(phead, "%x:%x:%x:%x:%x:%x:%x:%x\n", ip6_addr->sin6_addr.s6_addr[8], ip6_addr->sin6_addr.s6_addr[9], ip6_addr->sin6_addr.s6_addr[10], ip6_addr->sin6_addr.s6_addr[11], ip6_addr->sin6_addr.s6_addr[12], ip6_addr->sin6_addr.s6_addr[13], ip6_addr->sin6_addr.s6_addr[14], ip6_addr->sin6_addr.s6_addr[15]); } else if (ip6_addr->sin6_family == AF_INET) { ip_addr = (struct sockaddr_in *)pt_ptr->ia_attr. ia_address_ptr; DT_Tdep_PT_Printf(phead, "\tLocal IP address %s\n", inet_ntoa(ip_addr->sin_addr)); } DT_Tdep_PT_Printf(phead, "***** ***** ***** ***** ***** *****\n"); } return (true); } /* ----------------------------------------------------------- * Post a recv buffer */ DAT_BOOLEAN DT_post_recv_buffer(DT_Tdep_Print_Head * phead, DAT_EP_HANDLE ep_handle, Bpool * bp, int index, int size) { unsigned char *buff = DT_Bpool_GetBuffer(bp, index); DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(bp, index); DAT_LMR_CONTEXT lmr_c = DT_Bpool_GetLMR(bp, index); DAT_DTO_COOKIE cookie; DAT_RETURN ret; /* * Prep the inputs */ iov->virtual_address = (DAT_VADDR) (uintptr_t) buff; iov->segment_length = size; iov->lmr_context = lmr_c; cookie.as_64 = (DAT_UINT64) 0UL; cookie.as_ptr = (DAT_PVOID) buff; DT_Tdep_PT_Debug(3, (phead, "Post-Recv #%d [%p, %x]\n", index, buff, size)); /* Post the recv buffer */ ret = dat_ep_post_recv(ep_handle, 1, iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dat_ep_post_recv failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); return false; } return true; } /* ----------------------------------------------------------- * Post a send buffer */ DAT_BOOLEAN DT_post_send_buffer(DT_Tdep_Print_Head * phead, DAT_EP_HANDLE ep_handle, Bpool * bp, int index, int size) { unsigned char *buff = DT_Bpool_GetBuffer(bp, index); DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(bp, index); DAT_LMR_CONTEXT lmr_c = DT_Bpool_GetLMR(bp, index); DAT_DTO_COOKIE cookie; DAT_RETURN ret; /* * Prep the inputs */ iov->virtual_address = (DAT_VADDR) (uintptr_t) buff; iov->segment_length = size; iov->lmr_context = lmr_c; cookie.as_64 = (DAT_UINT64) 0UL; cookie.as_ptr = (DAT_PVOID) buff; DT_Tdep_PT_Debug(3, (phead, "Post-Send #%d [%p, %x]\n", index, buff, size)); /* Post the recv buffer */ ret = dat_ep_post_send(ep_handle, 1, iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dat_ep_post_send failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); return false; } return true; } /* ----------------------------------------------------------- * Wait for a CR event, returning false on error. */ bool DT_cr_event_wait(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, DAT_CR_ARRIVAL_EVENT_DATA * cr_stat_p) { int err_cnt; err_cnt = 0; for (;;) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (CR) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); /* * If we get an error due to the client breaking the * connection early or some transients, just ignore it * and keep going. If we get a bunch of errors, bail * out. */ /* if ( err_cnt++ < 10 ) */ /* { */ /* continue; */ /* } */ break; } if (event.event_number == DAT_CONNECTION_REQUEST_EVENT) { /* * Pass back what we know, if requested. */ if (cr_stat_p) { *cr_stat_p = event.event_data.cr_arrival_event_data; } return (true); } DT_Tdep_PT_Printf(phead, "Warning: cr_event_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Wait for a connection event, returning false on error. */ bool DT_conn_event_wait(DT_Tdep_Print_Head * phead, DAT_EP_HANDLE ep_handle, DAT_EVD_HANDLE evd_handle, DAT_EVENT_NUMBER * event_number) { for (;;) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (CONN) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); break; } *event_number = event.event_number; if (event.event_number == DAT_CONNECTION_EVENT_PEER_REJECTED || event.event_number == DAT_CONNECTION_EVENT_NON_PEER_REJECTED || event.event_number == DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR || event.event_number == DAT_CONNECTION_EVENT_DISCONNECTED || event.event_number == DAT_CONNECTION_EVENT_BROKEN || event.event_number == DAT_CONNECTION_EVENT_UNREACHABLE || event.event_number == DAT_CONNECTION_EVENT_TIMED_OUT) { DT_Tdep_PT_Printf(phead, "Warning: conn_event_wait %s\n", DT_EventToSTr(event.event_number)); break; } if (event.event_number == DAT_CONNECTION_EVENT_ESTABLISHED) { /* * Could return DAT_CONNECTION_EVENT_DATA and verify: * event.event_data.connect_event_data.ep_handle * event.event_data.connect_event_data.private_data_size * event.event_data.connect_event_data.private_data */ return (true); } DT_Tdep_PT_Printf(phead, "Warning: conn_event_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Wait for a disconnection event, returning false on error. */ bool DT_disco_event_wait(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, DAT_EP_HANDLE * ep_handle) { for (;;) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (DISCONN) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); break; } if (event.event_number == DAT_CONNECTION_EVENT_PEER_REJECTED || event.event_number == DAT_CONNECTION_EVENT_NON_PEER_REJECTED || event.event_number == DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR || event.event_number == DAT_CONNECTION_EVENT_BROKEN || event.event_number == DAT_CONNECTION_EVENT_UNREACHABLE || event.event_number == DAT_CONNECTION_EVENT_TIMED_OUT) { DT_Tdep_PT_Printf(phead, "Warning: disconn_event_wait %s\n", DT_EventToSTr(event.event_number)); break; } if (event.event_number == DAT_CONNECTION_EVENT_DISCONNECTED) { if (ep_handle != NULL) { *ep_handle = event.event_data.connect_event_data. ep_handle; } return (true); } DT_Tdep_PT_Printf(phead, "Warning: conn_event_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Reap a DTO event using a wait or polling, returning false on error. */ bool DT_dto_event_reap(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, bool poll, DAT_DTO_COMPLETION_EVENT_DATA * dto_statusp) { if (poll) { return DT_dto_event_poll(phead, evd_handle, dto_statusp); } else { return DT_dto_event_wait(phead, evd_handle, dto_statusp); } } /* ----------------------------------------------------------- * Poll for a DTO event, returning false on error. */ bool DT_dto_event_poll(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, DAT_DTO_COMPLETION_EVENT_DATA * dto_statusp) { for (;;DT_Mdep_yield()) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_dequeue(evd_handle, &event); if (DAT_GET_TYPE(ret) == DAT_QUEUE_EMPTY) { continue; } if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (DTO) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); break; } if (event.event_number == DAT_DTO_COMPLETION_EVENT) { /* * Pass back all the useful bits if requested: * ep_handle, user_cookie.as_ptr * status, transfered_length */ if (dto_statusp) { *dto_statusp = event.event_data.dto_completion_event_data; } return (true); } DT_Tdep_PT_Printf(phead, "Warning: dto_event_poll swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Wait for a DTO event, returning false on error. */ bool DT_dto_event_wait(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, DAT_DTO_COMPLETION_EVENT_DATA * dto_statusp) { for (;;) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (DTO) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); break; } if (event.event_number == DAT_DTO_COMPLETION_EVENT) { /* * Pass back all the useful bits if requested: * ep_handle, user_cookie.as_ptr * status, transfered_length */ if (dto_statusp) { *dto_statusp = event.event_data.dto_completion_event_data; } return (true); } DT_Tdep_PT_Printf(phead, "Warning: dto_event_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Wait for a RMR event, returning false on error. */ bool DT_rmr_event_wait(DT_Tdep_Print_Head * phead, DAT_EVD_HANDLE evd_handle, DAT_RMR_BIND_COMPLETION_EVENT_DATA * rmr_statusp) { for (;;) { DAT_RETURN ret; DAT_EVENT event; ret = DT_Tdep_evd_wait(evd_handle, DAT_TIMEOUT_INFINITE, &event); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dapl_event_wait (RMR) failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); break; } if (event.event_number == DAT_RMR_BIND_COMPLETION_EVENT) { /* * Pass back all the useful bits if requested: * rmr_handle, user_cookie, status */ if (rmr_statusp) { *rmr_statusp = event.event_data.rmr_completion_event_data; } return (true); } DT_Tdep_PT_Printf(phead, "Warning: rmr_event_wait swallowing %s event\n", DT_EventToSTr(event.event_number)); } return (false); } /* ----------------------------------------------------------- * Check a DTO and print some debug info if anything is amiss. */ bool DT_dto_check(DT_Tdep_Print_Head * phead, DAT_DTO_COMPLETION_EVENT_DATA * dto_p, DAT_EP_HANDLE ep_expected, DAT_COUNT len_expected, DAT_DTO_COOKIE cookie_expected, char *message) { if (((ep_expected != NULL) && (dto_p->ep_handle != ep_expected)) || dto_p->transfered_length != len_expected || dto_p->user_cookie.as_64 != cookie_expected.as_64 || dto_p->status != DAT_DTO_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: %s-reaping DTO problem, status = %s\n", message, (dto_p->status == DAT_DTO_SUCCESS ? "OK" : (dto_p->status == DAT_DTO_FAILURE ? "FAILURE" : "LengthError"))); DT_Test_Error(); if ((ep_expected != NULL) && (dto_p->ep_handle != ep_expected)) { DT_Tdep_PT_Printf(phead, "\tEndPoint mismatch (got %p wanted %p)\n", dto_p->ep_handle, ep_expected); } if (dto_p->transfered_length != len_expected) { DT_Tdep_PT_Printf(phead, "\tLength mismatch (xfer 0x" F64x " wanted 0x%x)\n", dto_p->transfered_length, len_expected); } if (dto_p->user_cookie.as_64 != cookie_expected.as_64) { DT_Tdep_PT_Printf(phead, "\tCookie mismatch (got " F64x " wanted " F64x ")\n", dto_p->user_cookie.as_64, cookie_expected.as_64); } return (false); } return (true); } /* ----------------------------------------------------------- * Check an RMR Bind and print some debug info if anything is amiss. */ bool DT_rmr_check(DT_Tdep_Print_Head * phead, DAT_RMR_BIND_COMPLETION_EVENT_DATA * rmr_p, DAT_RMR_HANDLE rmr_expected, DAT_PVOID cookie_expected, char *message) { if (rmr_p->rmr_handle != rmr_expected || rmr_p->user_cookie.as_ptr != cookie_expected || rmr_p->status != DAT_RMR_BIND_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: %s RMR bind problem, status = %s\n", message, (rmr_p->status == DAT_RMR_BIND_SUCCESS ? "OK" : "FAILURE")); DT_Test_Error(); if (rmr_p->rmr_handle != rmr_expected) { DT_Tdep_PT_Printf(phead, "\tRMR handle mismatch (got 0x%p wanted 0x%p)\n", rmr_p->rmr_handle, rmr_expected); } if (rmr_p->user_cookie.as_ptr != cookie_expected) { DT_Tdep_PT_Printf(phead, "\tCookie mismatch (got %p wanted %p)\n", rmr_p->user_cookie.as_ptr, cookie_expected); } return (false); } return (true); } /* ----------------------------------------------------------- * Check a CR and print some debug info if anything is amiss. */ bool DT_cr_check(DT_Tdep_Print_Head * phead, DAT_CR_ARRIVAL_EVENT_DATA * cr_stat_p, DAT_PSP_HANDLE psp_handle_expected, DAT_CONN_QUAL port_expected, DAT_CR_HANDLE * cr_handlep, char *message) { DAT_RETURN ret; if (cr_handlep) { *cr_handlep = (DAT_CR_HANDLE) 0; } if (cr_stat_p->conn_qual != port_expected || (psp_handle_expected && cr_stat_p->sp_handle.psp_handle != psp_handle_expected)) { DT_Tdep_PT_Printf(phead, "Test Error: %s CR data problem\n", message); DT_Test_Error(); if (cr_stat_p->conn_qual != port_expected) { DT_Tdep_PT_Printf(phead, "\tCR conn_qual mismatch " " (got 0x" F64x " wanted 0x" F64x ")\n", cr_stat_p->conn_qual, port_expected); } if (psp_handle_expected && cr_stat_p->sp_handle.psp_handle != psp_handle_expected) { DT_Tdep_PT_Printf(phead, "\tPSP mismatch (got 0x%p wanted 0x%p)\n", cr_stat_p->sp_handle.psp_handle, psp_handle_expected); } if (!cr_stat_p->cr_handle) { DT_Tdep_PT_Printf(phead, "\tGot NULL cr_handle\n"); } else { ret = dat_cr_reject(cr_stat_p->cr_handle, 0, NULL); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "\tdat_cr_reject error: %s\n", DT_RetToString(ret)); } } return (false); } if (cr_handlep) { *cr_handlep = cr_stat_p->cr_handle; } return (true); } dapl-2.1.5/test/dapltest/test/dapl_thread.c000066400000000000000000000075121255317474200206470ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* * Class Thread * * Threads subsystem initialization */ void DT_Thread_Init(Per_Test_Data_t * pt_ptr) { DT_Mdep_LockInit(&pt_ptr->Thread_counter_lock); pt_ptr->Thread_counter = 0; /* * Initialize the synchronization event in the pt_ptr so it's ready * to be signalled when the time comes. The countdown counter * lets me coordinate with all the test threads so that the server * thread doesn't get notified that the test endpoints are ready * until they actually are. Only transaction tests use this * * functionality; if the performance test gets changed to use * multiple threads on the server side then that code semantic * will need to be added for final test endpoint setup * notification or there will continue to be a race condition * between the main server thread and the server test threads. */ DT_Mdep_wait_object_init(&pt_ptr->synch_wait_object); pt_ptr->Countdown_Counter = 0; } /* * Threads subsystem destroying */ void DT_Thread_End(Per_Test_Data_t * pt_ptr) { DT_Mdep_LockDestroy(&pt_ptr->Thread_counter_lock); /* * destroy the wait object created by init. */ DT_Mdep_wait_object_destroy(&pt_ptr->synch_wait_object); } /* * Thread constructor * * NOTE: This routine does NOT create a thread as the name implies. The thread * is created in DT_Thread_Start (which is counter intuitive) */ Thread *DT_Thread_Create(Per_Test_Data_t * pt_ptr, void (*fn) (void *), void *param, unsigned int stacksize) { Thread *thread_ptr; thread_ptr = (Thread *) DT_MemListAlloc(pt_ptr, "thread.c", THREAD, sizeof(Thread)); if (thread_ptr == NULL) { return NULL; } thread_ptr->param = param; thread_ptr->function = fn; thread_ptr->thread_handle = 0; thread_ptr->stacksize = stacksize; DT_Mdep_Lock(&pt_ptr->Thread_counter_lock); pt_ptr->Thread_counter++; DT_Mdep_Unlock(&pt_ptr->Thread_counter_lock); DT_Mdep_Thread_Init_Attributes(thread_ptr); return thread_ptr; } /* * Thread destructor */ void DT_Thread_Destroy(Thread * thread_ptr, Per_Test_Data_t * pt_ptr) { if (thread_ptr) { DT_Mdep_Lock(&pt_ptr->Thread_counter_lock); pt_ptr->Thread_counter--; DT_Mdep_Unlock(&pt_ptr->Thread_counter_lock); DT_Mdep_Thread_Destroy_Attributes(thread_ptr); DT_MemListFree(pt_ptr, thread_ptr); } } /* * Start thread execution NOTE: This routine DOES create a thread in addition * to starting it whereas DT_Thread_Create just sets up some data structures. * (this is counter-intuitive) */ bool DT_Thread_Start(Thread * thread_ptr) { return DT_Mdep_Thread_Start(thread_ptr); } dapl-2.1.5/test/dapltest/test/dapl_transaction_stats.c000066400000000000000000000136601255317474200231440ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_init_transaction_stats(Transaction_Stats_t * transaction_stats, unsigned int num) { DT_Mdep_LockInit(&transaction_stats->lock); transaction_stats->wait_count = num; transaction_stats->num_ops = 0; transaction_stats->time_ms = 0; transaction_stats->bytes_send = 0; transaction_stats->bytes_recv = 0; transaction_stats->bytes_rdma_read = 0; transaction_stats->bytes_rdma_write = 0; } void DT_transaction_stats_set_ready(DT_Tdep_Print_Head * phead, Transaction_Stats_t * transaction_stats) { DT_Mdep_Lock(&transaction_stats->lock); transaction_stats->wait_count--; DT_Tdep_PT_Debug(1, (phead, "Received Sync Message from server (%d left)\n", transaction_stats->wait_count)); DT_Mdep_Unlock(&transaction_stats->lock); } void DT_transaction_stats_reset_wait_count(DT_Tdep_Print_Head * phead, Transaction_Stats_t * transaction_stats, unsigned int num) { DT_Mdep_Lock(&transaction_stats->lock); transaction_stats->wait_count = num; DT_Mdep_Unlock(&transaction_stats->lock); } bool DT_transaction_stats_wait_for_all(DT_Tdep_Print_Head * phead, Transaction_Stats_t * transaction_stats) { unsigned int loop_count; loop_count = 100 * 10; /* 100 * 10ms * 10 = 10 seconds */ while (transaction_stats->wait_count != 0 && loop_count != 0) { DT_Mdep_Sleep(10); loop_count--; } if (loop_count == 0) { DT_Tdep_PT_Printf(phead, "FAIL: %d Server test connections did not report ready.\n", transaction_stats->wait_count); return false; } return true; } /* * */ void DT_update_transaction_stats(Transaction_Stats_t * transaction_stats, unsigned int num_ops, unsigned int time_ms, unsigned int bytes_send, unsigned int bytes_recv, unsigned int bytes_rdma_read, unsigned int bytes_rdma_write) { DT_Mdep_Lock(&transaction_stats->lock); /* look for the longest time... */ if (time_ms > transaction_stats->time_ms) { transaction_stats->time_ms = time_ms; } transaction_stats->num_ops += num_ops; transaction_stats->bytes_send += bytes_send; transaction_stats->bytes_recv += bytes_recv; transaction_stats->bytes_rdma_read += bytes_rdma_read; transaction_stats->bytes_rdma_write += bytes_rdma_write; DT_Mdep_Unlock(&transaction_stats->lock); } /* * */ void DT_print_transaction_stats(DT_Tdep_Print_Head * phead, Transaction_Stats_t * transaction_stats, unsigned int num_threads, unsigned int num_EPs) { double time_s; double mbytes_send; double mbytes_recv; double mbytes_rdma_read; double mbytes_rdma_write; int total_ops; DT_Mdep_Lock(&transaction_stats->lock); time_s = (double)(transaction_stats->time_ms) / 1000; if (time_s == 0.0) { DT_Tdep_PT_Printf(phead, "----- Test completed successfully, but cannot calculate stats as not\n" "----- enough time has lapsed.\n" "----- Try running the test with more iterations.\n"); goto unlock_and_return; } mbytes_send = (double)transaction_stats->bytes_send / 1000 / 1000; mbytes_recv = (double)transaction_stats->bytes_recv / 1000 / 1000; mbytes_rdma_read = (double)transaction_stats->bytes_rdma_read / 1000 / 1000; mbytes_rdma_write = (double)transaction_stats->bytes_rdma_write / 1000 / 1000; total_ops = transaction_stats->num_ops; if (0 == total_ops) { DT_Tdep_PT_Printf(phead, "----- Test completed successfully, but no operations!\n"); goto unlock_and_return; } DT_Tdep_PT_Printf(phead, "----- Stats ---- : %u threads, %u EPs\n", num_threads, num_EPs); DT_Tdep_PT_Printf(phead, "Total WQE : %7d.%02d WQE/Sec\n", whole(total_ops / time_s), hundredths(total_ops / time_s)); DT_Tdep_PT_Printf(phead, "Total Time : %7d.%02d sec\n", whole(time_s), hundredths(time_s)); DT_Tdep_PT_Printf(phead, "Total Send : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_send), hundredths(mbytes_send), whole(mbytes_send / time_s), hundredths(mbytes_send / time_s)); DT_Tdep_PT_Printf(phead, "Total Recv : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_recv), hundredths(mbytes_recv), whole(mbytes_recv / time_s), hundredths(mbytes_recv / time_s)); DT_Tdep_PT_Printf(phead, "Total RDMA Read : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_rdma_read), hundredths(mbytes_rdma_read), whole(mbytes_rdma_read / time_s), hundredths(mbytes_rdma_read / time_s)); DT_Tdep_PT_Printf(phead, "Total RDMA Write : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_rdma_write), hundredths(mbytes_rdma_write), whole(mbytes_rdma_write / time_s), hundredths(mbytes_rdma_write / time_s)); unlock_and_return: DT_Mdep_Unlock(&transaction_stats->lock); } dapl-2.1.5/test/dapltest/test/dapl_transaction_test.c000066400000000000000000001776101255317474200227730ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define RMI_SEND_BUFFER_ID 0 #define RMI_RECV_BUFFER_ID 1 #define SYNC_SEND_BUFFER_ID 2 #define SYNC_RECV_BUFFER_ID 3 #define FINAL_SYNC_SEND_BUFFER_ID 4 #define FINAL_SYNC_RECV_BUFFER_ID 5 /* * The sync buffers are sent to say "Go!" to the other side. * This is a handy place to test whether a zero-sized send into * a zero-sized buffer actually works. If the client side hangs * in 'Wait for Sync Message' when this is zero, it's a DAPL bug. */ #define SYNC_BUFF_SIZE 64 #ifdef DFLT_QLEN #undef DFLT_QLEN #endif #define DFLT_QLEN 8 /* default event queue length */ #define DFLT_TMO 10 /* default timeout (seconds) */ #define MAX_CONN_RETRY 8 /****************************************************************************/ DAT_RETURN DT_Transaction_Test_Client(Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE ia_handle, DAT_IA_ADDRESS_PTR remote_ia_addr) { Transaction_Cmd_t *cmd = &pt_ptr->Params.u.Transaction_Cmd; unsigned int i; DT_Tdep_Print_Head *phead; DAT_RETURN rc = DAT_SUCCESS; phead = pt_ptr->Params.phead; DT_init_transaction_stats(&pt_ptr->Client_Stats, cmd->num_threads * cmd->eps_per_thread); /* Now go set up the client test threads */ for (i = 0; i < cmd->num_threads; i++) { unsigned int port_num = pt_ptr->Server_Info.first_port_number + i * cmd->eps_per_thread; DT_Tdep_PT_Debug(1, (phead, "Client: Starting Client side of test\n")); if (!DT_Transaction_Create_Test (pt_ptr, ia_handle, false, port_num, pt_ptr->Server_Info.is_little_endian, remote_ia_addr)) { DT_Tdep_PT_Printf(phead, "Client: Cannot Create Test!\n"); rc = DAT_INSUFFICIENT_RESOURCES; break; } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif } /* Wait until end of all threads */ while (pt_ptr->Thread_counter > 0) { DT_Mdep_Sleep(100); } DT_print_transaction_stats(phead, &pt_ptr->Client_Stats, cmd->num_threads, cmd->eps_per_thread); return rc; } /****************************************************************************/ void DT_Transaction_Test_Server(void *params) { Per_Test_Data_t *pt_ptr = (Per_Test_Data_t *) params; Transaction_Cmd_t *cmd = &pt_ptr->Params.u.Transaction_Cmd; unsigned int i; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; pt_ptr->Countdown_Counter = cmd->num_threads; for (i = 0; i < cmd->num_threads; i++) { unsigned int port_num = pt_ptr->Server_Info.first_port_number + i * cmd->eps_per_thread; if (!DT_Transaction_Create_Test(pt_ptr, pt_ptr->ps_ptr->ia_handle, true, port_num, pt_ptr->Client_Info. is_little_endian, (DAT_IA_ADDRESS_PTR) 0)) { DT_Tdep_PT_Printf(phead, "Server: Cannot Create Test!\n"); break; } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif } /* Wait until end of all sub-threads */ while (pt_ptr->Thread_counter > 1) { DT_Mdep_Sleep(100); } DT_Thread_Destroy(pt_ptr->thread, pt_ptr); /* destroy Master thread */ DT_Mdep_Lock(&pt_ptr->ps_ptr->num_clients_lock); pt_ptr->ps_ptr->num_clients--; DT_Mdep_Unlock(&pt_ptr->ps_ptr->num_clients_lock); /* NB: Server has no pt_ptr->remote_netaddr */ DT_PrintMemList(pt_ptr); /* check if we return all space allocated */ DT_Mdep_LockDestroy(&pt_ptr->Thread_counter_lock); DT_Mdep_LockDestroy(&pt_ptr->MemListLock); DT_Free_Per_Test_Data(pt_ptr); DT_Tdep_PT_Printf(phead, "Server: Transaction Test Finished for this client\n"); /* * check memory leaking DT_Tdep_PT_Printf(phead, "Server: App allocated Memory Left: * %d\n", alloc_count); */ } /****************************************************************************/ /* * DT_Transaction_Create_Test() * * Initialize what we can in the test structure. Then fork a thread to do the * work. */ bool DT_Transaction_Create_Test(Per_Test_Data_t * pt_ptr, DAT_IA_HANDLE * ia_handle, DAT_BOOLEAN is_server, unsigned int port_num, DAT_BOOLEAN remote_is_little_endian, DAT_IA_ADDRESS_PTR remote_ia_addr) { Transaction_Test_t *test_ptr; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; test_ptr = (Transaction_Test_t *) DT_MemListAlloc(pt_ptr, "transaction_test_t", TRANSACTIONTEST, sizeof (Transaction_Test_t)); if (!test_ptr) { DT_Tdep_PT_Printf(phead, "No Memory to create transaction test structure!\n"); return false; } /* Unused fields zeroed by allocator */ test_ptr->remote_is_little_endian = remote_is_little_endian; test_ptr->is_server = is_server; test_ptr->pt_ptr = pt_ptr; test_ptr->ia_handle = ia_handle; test_ptr->base_port = (DAT_CONN_QUAL) port_num; test_ptr->cmd = &pt_ptr->Params.u.Transaction_Cmd; test_ptr->time_out = DFLT_TMO * 1000; /* DFLT_TMO seconds */ /* FIXME more analysis needs to go into determining the minimum */ /* possible value for DFLT_QLEN. This evd_length value will be */ /* used for all EVDs. There are a number of dependencies imposed */ /* by this design (ex. min(cr_evd_len) != min(recv_evd_len) ). */ /* In the future it may be best to use individual values. */ test_ptr->evd_length = DT_max(DFLT_QLEN, test_ptr->cmd->eps_per_thread * test_ptr->cmd->num_ops); test_ptr->remote_ia_addr = remote_ia_addr; test_ptr->thread = DT_Thread_Create(pt_ptr, DT_Transaction_Main, test_ptr, DT_MDEP_DEFAULT_STACK_SIZE); if (test_ptr->thread == 0) { DT_Tdep_PT_Printf(phead, "No memory!\n"); DT_MemListFree(test_ptr->pt_ptr, test_ptr); return false; } DT_Thread_Start(test_ptr->thread); return true; } /****************************************************************************/ /* * Main Transaction Test Execution Routine * * Both client and server threads start here, with IA already open. * Each test thread establishes a connection with its counterpart. * They swap remote memory information (if necessary), then set up * buffers and local data structures. When ready, the two sides * synchronize, then testing begins. */ void DT_Transaction_Main(void *param) { Transaction_Test_t *test_ptr = (Transaction_Test_t *) param; DAT_RETURN ret; DAT_UINT32 i, j; bool success = false; Per_Test_Data_t *pt_ptr; Thread *thread; DAT_DTO_COOKIE dto_cookie; char *private_data_str; DAT_EVENT_NUMBER event_num; DT_Tdep_Print_Head *phead; pt_ptr = test_ptr->pt_ptr; thread = test_ptr->thread; phead = pt_ptr->Params.phead; #ifdef CM_BUSTED private_data_str = ""; #else private_data_str = "DAPL and RDMA rule! Test 4321."; #endif /* create a protection zone */ ret = dat_pz_create(test_ptr->ia_handle, &test_ptr->pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_pz_create error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->pz_handle = DAT_HANDLE_NULL; goto test_failure; } /* Allocate per-EP data */ test_ptr->ep_context = (Ep_Context_t *) DT_MemListAlloc(pt_ptr, "transaction_test", EPCONTEXT, test_ptr->cmd->eps_per_thread * sizeof(Ep_Context_t)); if (!test_ptr->ep_context) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for EP context\n", test_ptr->base_port); goto test_failure; } /* * Set up the per-EP contexts: * create the EP * allocate buffers for remote memory info exchange * post the receive buffers * connect * set up buffers and remote memory info * send across our info * recv the other side's info and extract what we need */ for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_EP_ATTR ep_attr; DAT_UINT32 buff_size = MAX_OPS * sizeof(RemoteMemoryInfo); /* create 4 EVDs - recv, request+RMR, conn-request, connect */ ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->evd_length, NULL, DAT_EVD_DTO_FLAG, &test_ptr->ep_context[i].recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (recv) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->ep_context[i].recv_evd_hdl = DAT_HANDLE_NULL; goto test_failure; } ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->evd_length, NULL, DAT_EVD_DTO_FLAG | DAT_EVD_RMR_BIND_FLAG, &test_ptr->ep_context[i].reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (request) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->ep_context[i].reqt_evd_hdl = DAT_HANDLE_NULL; goto test_failure; } if (pt_ptr->local_is_server) { /* Client-side doesn't need CR events */ ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->evd_length, NULL, DAT_EVD_CR_FLAG, &test_ptr->ep_context[i]. creq_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (cr) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->ep_context[i].creq_evd_hdl = DAT_HANDLE_NULL; goto test_failure; } } ret = DT_Tdep_evd_create(test_ptr->ia_handle, test_ptr->evd_length, NULL, DAT_EVD_CONNECTION_FLAG, &test_ptr->ep_context[i].conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_create (conn) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); test_ptr->ep_context[i].conn_evd_hdl = DAT_HANDLE_NULL; goto test_failure; } /* * Adjust default EP attributes to fit the requested test. * This is simplistic; in that we don't count ops of each * type and direction, checking EP limits. We just try to * be sure the EP's WQs are large enough. The "+3" is for * the RemoteMemInfo and Start and Final Sync receive buffers. */ ep_attr = pt_ptr->ep_attr; if (ep_attr.max_recv_dtos < test_ptr->cmd->num_ops + 3) { ep_attr.max_recv_dtos = test_ptr->cmd->num_ops + 3; } if (ep_attr.max_request_dtos < test_ptr->cmd->num_ops + 3) { ep_attr.max_request_dtos = test_ptr->cmd->num_ops + 3; } /* Create EP */ ret = dat_ep_create(test_ptr->ia_handle, /* IA */ test_ptr->pz_handle, /* PZ */ test_ptr->ep_context[i].recv_evd_hdl, /* recv */ test_ptr->ep_context[i].reqt_evd_hdl, /* request */ test_ptr->ep_context[i].conn_evd_hdl, /* connect */ &ep_attr, /* EP attrs */ &test_ptr->ep_context[i].ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_create #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); test_ptr->ep_context[i].ep_handle = DAT_HANDLE_NULL; goto test_failure; } /* * Allocate a buffer pool so we can exchange the * remote memory info and initialize. */ test_ptr->ep_context[i].bp = DT_BpoolAlloc(pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr->ep_context[i].ep_handle, DAT_HANDLE_NULL, /* rmr */ buff_size, 6, DAT_OPTIMAL_ALIGNMENT, false, false); if (!test_ptr->ep_context[i].bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for remote memory buffers\n", test_ptr->base_port); goto test_failure; } DT_Tdep_PT_Debug(3, (phead, "0: RMI_SEND %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context [i].bp, 0))); DT_Tdep_PT_Debug(3, (phead, "1: RMI_RECV %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i]. bp, 1))); DT_Tdep_PT_Debug(3, (phead, "2: INITIAL_SYNC_SEND %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i]. bp, 2))); DT_Tdep_PT_Debug(3, (phead, "3: INITIAL_SYNC_RECV %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i]. bp, 3))); DT_Tdep_PT_Debug(3, (phead, "4: FINAL_SYNC_SEND %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i]. bp, 4))); DT_Tdep_PT_Debug(3, (phead, "5: FINAL_SYNC_RECV %p\n", (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i]. bp, 5))); /* * Post recv and sync buffers */ if (!DT_post_recv_buffer(phead, test_ptr->ep_context[i].ep_handle, test_ptr->ep_context[i].bp, RMI_RECV_BUFFER_ID, buff_size)) { /* error message printed by DT_post_recv_buffer */ goto test_failure; } if (!DT_post_recv_buffer(phead, test_ptr->ep_context[i].ep_handle, test_ptr->ep_context[i].bp, SYNC_RECV_BUFFER_ID, SYNC_BUFF_SIZE)) { /* error message printed by DT_post_recv_buffer */ goto test_failure; } /* * Establish the connection */ test_ptr->ep_context[i].ia_port = test_ptr->base_port + i; if (pt_ptr->local_is_server) { if (test_ptr->cmd->use_rsp) { /* * Server - create a single-use RSP and * await a connection for this EP */ ret = dat_rsp_create(test_ptr->ia_handle, test_ptr->ep_context[i]. ia_port, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i]. creq_evd_hdl, &test_ptr->ep_context[i]. rsp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_rsp_create #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); goto test_failure; } } else { ret = dat_psp_create(test_ptr->ia_handle, test_ptr->ep_context[i]. ia_port, test_ptr->ep_context[i]. creq_evd_hdl, DAT_PSP_CONSUMER_FLAG, &test_ptr->ep_context[i]. psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_psp_create #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); goto test_failure; } DT_Tdep_PT_Debug(1, (phead, "Server[" F64x "]: Listen #%d on PSP port 0x" F64x "\n", test_ptr->base_port, i, test_ptr->ep_context[i]. ia_port)); } } } /* Here's where we tell the server process that this thread is * ready to wait for connection requests from the remote end. * Modify the synch wait semantics at your own risk - if these * signals and waits aren't here, there will be chronic * connection rejection timing problems. */ if (pt_ptr->local_is_server) { DT_Mdep_Lock(&pt_ptr->Thread_counter_lock); pt_ptr->Countdown_Counter--; /* Deliberate pre-decrement. Post decrement won't * work here, so don't do it. */ if (pt_ptr->Countdown_Counter <= 0) { DT_Mdep_wait_object_wakeup(&pt_ptr->synch_wait_object); } DT_Mdep_Unlock(&pt_ptr->Thread_counter_lock); } for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_UINT32 buff_size = MAX_OPS * sizeof(RemoteMemoryInfo); RemoteMemoryInfo *RemoteMemInfo; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_CR_ARRIVAL_EVENT_DATA cr_stat; DAT_CR_HANDLE cr_handle; /* * Establish the connection */ if (pt_ptr->local_is_server) { DAT_CR_PARAM cr_param; if (test_ptr->cmd->use_rsp) { /* wait for the connection request */ if (!DT_cr_event_wait(phead, test_ptr->ep_context[i]. creq_evd_hdl, &cr_stat) || !DT_cr_check(phead, &cr_stat, test_ptr->ep_context[i]. rsp_handle, test_ptr->ep_context[i]. ia_port, &cr_handle, "Server")) { goto test_failure; } ret = dat_cr_query(cr_handle, DAT_CR_FIELD_ALL, &cr_param); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_query #%d error:(%x) %s\n", test_ptr->base_port, i, ret, DT_RetToString(ret)); } else { if (strncmp ((char *)cr_param.private_data, private_data_str, strlen(private_data_str)) != 0) { DT_Tdep_PT_Printf(phead, "--Private Data mismatch!\n"); } else { DT_Tdep_PT_Debug(1, (phead, "--Private Data: %d: <%s>\n", cr_param. private_data_size, (char *) cr_param. private_data)); } } /* what, me query? just try to accept the connection */ ret = dat_cr_accept(cr_handle, 0, /* NULL for RSP */ 0, (DAT_PVOID) 0 /* no private data */ ); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_accept #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); /* cr_handle consumed on failure */ goto test_failure; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i]. conn_evd_hdl, &event_num)) { /* error message printed by DT_conn_event_wait */ goto test_failure; } /* throw away single-use PSP */ ret = dat_rsp_free(test_ptr->ep_context[i]. rsp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_rsp_free #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); goto test_failure; } } else { /* * Server - use a short-lived PSP instead of an RSP */ /* wait for a connection request */ if (!DT_cr_event_wait(phead, test_ptr->ep_context[i]. creq_evd_hdl, &cr_stat)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_psp_create #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); goto test_failure; } if (!DT_cr_check(phead, &cr_stat, test_ptr->ep_context[i]. psp_handle, test_ptr->ep_context[i]. ia_port, &cr_handle, "Server")) { goto test_failure; } ret = dat_cr_query(cr_handle, DAT_CR_FIELD_ALL, &cr_param); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_query #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); } else { if (strncmp ((char *)cr_param.private_data, private_data_str, strlen(private_data_str)) != 0) { DT_Tdep_PT_Printf(phead, "--Private Data mismatch!\n"); } else { DT_Tdep_PT_Debug(1, (phead, "--Private Data: %d: <%s>\n", cr_param. private_data_size, (char *) cr_param. private_data)); } } /* what, me query? just try to accept the connection */ ret = dat_cr_accept(cr_handle, test_ptr->ep_context[i]. ep_handle, 0, (DAT_PVOID) 0 /* no private data */ ); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_cr_accept #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); /* cr_handle consumed on failure */ (void)dat_psp_free(test_ptr-> ep_context[i]. psp_handle); goto test_failure; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i]. conn_evd_hdl, &event_num)) { /* error message printed by DT_cr_event_wait */ (void)dat_psp_free(&test_ptr-> ep_context[i]. psp_handle); goto test_failure; } /* throw away single-use PSP */ ret = dat_psp_free(test_ptr->ep_context[i]. psp_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_psp_free #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); goto test_failure; } } /* end short-lived PSP */ DT_Tdep_PT_Debug(1, (phead, "Server[" F64x "]: Accept #%d on port 0x" F64x "\n", test_ptr->base_port, i, test_ptr->ep_context[i].ia_port)); } else { /* * Client - connect */ unsigned int retry_cnt = 0; DAT_UINT32 buff_size = MAX_OPS * sizeof(RemoteMemoryInfo); DT_Tdep_PT_Debug(1, (phead, "Client[" F64x "]: Connect #%d on port 0x" F64x "\n", test_ptr->base_port, i, test_ptr->ep_context[i].ia_port)); #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif retry: ret = dat_ep_connect(test_ptr->ep_context[i].ep_handle, test_ptr->remote_ia_addr, test_ptr->ep_context[i].ia_port, DAT_TIMEOUT_INFINITE, strlen(private_data_str), private_data_str, pt_ptr->Params.ReliabilityLevel, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_connect #%d error: %s (0x%x)\n", test_ptr->base_port, i, DT_RetToString(ret), ret); goto test_failure; } /* wait for DAT_CONNECTION_EVENT_ESTABLISHED */ if (!DT_conn_event_wait(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i]. conn_evd_hdl, &event_num)) { /* error message printed by DT_cr_event_wait */ if (event_num == DAT_CONNECTION_EVENT_PEER_REJECTED) { DT_Mdep_Sleep(1000); /* * See if any buffers were flushed as a result of * the REJECT; clean them up and repost if so */ { DAT_EVENT event; DAT_COUNT drained = 0; dat_ep_reset(test_ptr-> ep_context[i]. ep_handle); do { ret = DT_Tdep_evd_dequeue (test_ptr-> ep_context[i]. recv_evd_hdl, &event); drained++; } while (DAT_GET_TYPE(ret) != DAT_QUEUE_EMPTY); if (drained > 1) { /* * Post recv and sync buffers */ if (!DT_post_recv_buffer (phead, test_ptr-> ep_context[i]. ep_handle, test_ptr-> ep_context[i].bp, RMI_RECV_BUFFER_ID, buff_size)) { /* error message printed by DT_post_recv_buffer */ goto test_failure; } if (!DT_post_recv_buffer (phead, test_ptr-> ep_context[i]. ep_handle, test_ptr-> ep_context[i].bp, SYNC_RECV_BUFFER_ID, SYNC_BUFF_SIZE)) { /* error message printed by DT_post_recv_buffer */ goto test_failure; } } } DT_Tdep_PT_Printf(phead, "Client[" F64x "]: retrying connection...\n", test_ptr->base_port); retry_cnt++; if (retry_cnt < MAX_CONN_RETRY) { goto retry; } } /* error message printed by DT_cr_event_wait */ goto test_failure; } DT_Tdep_PT_Debug(1, (phead, "Client[" F64x "]: Got Connection #%d\n", test_ptr->base_port, i)); } #ifdef CM_BUSTED /***** XXX Chill out a bit to give the kludged CM a chance ... *****/ DT_Mdep_Sleep(5000); #endif /* * Fill in the test_ptr with relevant command info */ for (j = 0; j < test_ptr->cmd->num_ops; j++) { test_ptr->ep_context[i].op[j].server_initiated = test_ptr->cmd->op[j].server_initiated; test_ptr->ep_context[i].op[j].transfer_type = test_ptr->cmd->op[j].transfer_type; test_ptr->ep_context[i].op[j].num_segs = test_ptr->cmd->op[j].num_segs; test_ptr->ep_context[i].op[j].seg_size = test_ptr->cmd->op[j].seg_size; test_ptr->ep_context[i].op[j].reap_send_on_recv = test_ptr->cmd->op[j].reap_send_on_recv; } /* * Exchange remote memory info: If we're going to participate * in an RDMA, we need to allocate memory buffers and advertise * them to the other side. */ for (j = 0; j < test_ptr->cmd->num_ops; j++) { DAT_BOOLEAN us; us = (pt_ptr->local_is_server && test_ptr->ep_context[i].op[j].server_initiated) || (!pt_ptr->local_is_server && !test_ptr->ep_context[i].op[j].server_initiated); test_ptr->ep_context[i].op[j].Rdma_Context = (DAT_RMR_CONTEXT) 0; test_ptr->ep_context[i].op[j].Rdma_Address = 0; switch (test_ptr->ep_context[i].op[j].transfer_type) { case RDMA_READ: { test_ptr->ep_context[i].op[j].bp = DT_BpoolAlloc(pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr-> ep_context[i]. ep_handle, test_ptr-> ep_context[i]. reqt_evd_hdl, test_ptr-> ep_context[i].op[j]. seg_size, test_ptr-> ep_context[i].op[j]. num_segs, DAT_OPTIMAL_ALIGNMENT, false, !us ? true : false); if (!test_ptr->ep_context[i].op[j].bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for buffers (RDMA/RD)\n", test_ptr-> base_port); goto test_failure; } if (!us) { test_ptr->ep_context[i].op[j]. Rdma_Context = DT_Bpool_GetRMR(test_ptr-> ep_context [i].op[j]. bp, 0); test_ptr->ep_context[i].op[j]. Rdma_Address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer (test_ptr->ep_context[i]. op[j].bp, 0); DT_Tdep_PT_Debug(3, (phead, "not-us: RDMA/RD [ va=" F64x ", ctxt=%x ]\n", test_ptr-> ep_context[i]. op[j]. Rdma_Address, test_ptr-> ep_context[i]. op[j]. Rdma_Context)); } break; } case RDMA_WRITE: { test_ptr->ep_context[i].op[j].bp = DT_BpoolAlloc(pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr-> ep_context[i]. ep_handle, test_ptr-> ep_context[i]. reqt_evd_hdl, test_ptr-> ep_context[i].op[j]. seg_size, test_ptr-> ep_context[i].op[j]. num_segs, DAT_OPTIMAL_ALIGNMENT, !us ? true : false, false); if (!test_ptr->ep_context[i].op[j].bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for buffers (RDMA/WR)\n", test_ptr-> base_port); goto test_failure; } if (!us) { test_ptr->ep_context[i].op[j]. Rdma_Context = DT_Bpool_GetRMR(test_ptr-> ep_context [i].op[j]. bp, 0); test_ptr->ep_context[i].op[j]. Rdma_Address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer (test_ptr->ep_context[i]. op[j].bp, 0); DT_Tdep_PT_Debug(3, (phead, "not-us: RDMA/WR [ va=" F64x ", ctxt=%x ]\n", test_ptr-> ep_context[i]. op[j]. Rdma_Address, test_ptr-> ep_context[i]. op[j]. Rdma_Context)); } break; } case SEND_RECV: { test_ptr->ep_context[i].op[j].bp = DT_BpoolAlloc(pt_ptr, phead, test_ptr->ia_handle, test_ptr->pz_handle, test_ptr->ep_context[i].ep_handle, DAT_HANDLE_NULL, /* rmr */ test_ptr-> ep_context [i]. op [j]. seg_size, test_ptr-> ep_context [i]. op [j]. num_segs, DAT_OPTIMAL_ALIGNMENT, false, false); if (!test_ptr->ep_context[i].op[j].bp) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: no memory for buffers (S/R)\n", test_ptr-> base_port); goto test_failure; } DT_Tdep_PT_Debug(3, (phead, "%d: S/R [ va=%p ]\n", j, (DAT_PVOID) DT_Bpool_GetBuffer (test_ptr-> ep_context[i]. op[j].bp, 0))); break; } } } /* end foreach op */ /* * Prep send buffer with memory information */ RemoteMemInfo = (RemoteMemoryInfo *) DT_Bpool_GetBuffer(test_ptr->ep_context[i].bp, RMI_SEND_BUFFER_ID); for (j = 0; j < test_ptr->cmd->num_ops; j++) { RemoteMemInfo[j].rmr_context = test_ptr->ep_context[i].op[j].Rdma_Context; RemoteMemInfo[j].mem_address.as_64 = test_ptr->ep_context[i].op[j].Rdma_Address; if (RemoteMemInfo[j].mem_address.as_64) { DT_Tdep_PT_Debug(3, (phead, "RemoteMemInfo[%d] va=" F64x ", ctx=%x\n", j, RemoteMemInfo[j]. mem_address.as_64, RemoteMemInfo[j]. rmr_context)); } /* * If the client and server are of different endiannesses, * we must correct the endianness of the handle and address * we pass to the other side. The other side cannot (and * better not) interpret these values. */ if (DT_local_is_little_endian != test_ptr->remote_is_little_endian) { RemoteMemInfo[j].rmr_context = DT_EndianMemHandle(RemoteMemInfo[j]. rmr_context); RemoteMemInfo[j].mem_address.as_64 = DT_EndianMemAddress(RemoteMemInfo[j]. mem_address.as_64); } } /* end foreach op */ /* * Send our memory info. The client performs the first send to comply * with the iWARP MPA protocol's "Connection Startup Rules". */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Sending %s Memory Info\n", test_ptr->base_port, test_ptr->is_server ? "Server" : "Client")); if (!test_ptr->is_server) { /* post the send buffer */ if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, RMI_SEND_BUFFER_ID, buff_size)) { /* error message printed by DT_post_send_buffer */ goto test_failure; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i].bp, RMI_SEND_BUFFER_ID); if (!DT_dto_event_wait (phead, test_ptr->ep_context[i].reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context[i].ep_handle, buff_size, dto_cookie, test_ptr-> is_server ? "Client_Mem_Info_Send" : "Server_Mem_Info_Send")) { goto test_failure; } } /* * Recv the other side's info */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Waiting for %s Memory Info\n", test_ptr->base_port, test_ptr->is_server ? "Client" : "Server")); dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr->ep_context[i].bp, RMI_RECV_BUFFER_ID); if (!DT_dto_event_wait (phead, test_ptr->ep_context[i].recv_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context[i].ep_handle, buff_size, dto_cookie, test_ptr-> is_server ? "Client_Mem_Info_Recv" : "Server_Mem_Info_Recv")) { goto test_failure; } if (test_ptr->is_server) { /* post the send buffer */ if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, RMI_SEND_BUFFER_ID, buff_size)) { /* error message printed by DT_post_send_buffer */ goto test_failure; } /* reap the send and verify it */ dto_cookie.as_64 = LZERO; dto_cookie.as_ptr = (DAT_PVOID) DT_Bpool_GetBuffer(test_ptr-> ep_context[i].bp, RMI_SEND_BUFFER_ID); if (!DT_dto_event_wait (phead, test_ptr->ep_context[i].reqt_evd_hdl, &dto_stat) || !DT_dto_check(phead, &dto_stat, test_ptr->ep_context[i].ep_handle, buff_size, dto_cookie, test_ptr-> is_server ? "Client_Mem_Info_Send" : "Server_Mem_Info_Send")) { goto test_failure; } } /* * Extract what we need */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Memory Info received \n", test_ptr->base_port)); RemoteMemInfo = (RemoteMemoryInfo *) DT_Bpool_GetBuffer(test_ptr->ep_context[i].bp, RMI_RECV_BUFFER_ID); for (j = 0; j < test_ptr->cmd->num_ops; j++) { DAT_BOOLEAN us; us = (pt_ptr->local_is_server && test_ptr->ep_context[i].op[j].server_initiated) || (!pt_ptr->local_is_server && !test_ptr->ep_context[i].op[j].server_initiated); if (us && (test_ptr->ep_context[i].op[j].transfer_type == RDMA_READ || test_ptr->ep_context[i].op[j].transfer_type == RDMA_WRITE)) { test_ptr->ep_context[i].op[j].Rdma_Context = RemoteMemInfo[j].rmr_context; test_ptr->ep_context[i].op[j].Rdma_Address = RemoteMemInfo[j].mem_address.as_64; DT_Tdep_PT_Debug(3, (phead, "Got RemoteMemInfo [ va=" F64x ", ctx=%x ]\n", test_ptr->ep_context[i].op[j]. Rdma_Address, test_ptr->ep_context[i].op[j]. Rdma_Context)); } } } /* end foreach EP context */ /* * Dump out the state of the world if we're debugging */ if (test_ptr->cmd->debug) { DT_Print_Transaction_Test(phead, test_ptr); } /* * Finally! Run the test. */ success = DT_Transaction_Run(phead, test_ptr); /* * Now clean up and go home */ test_failure: if (test_ptr->ep_context) { /* Foreach EP */ for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_EP_HANDLE ep_handle; ep_handle = DAT_HANDLE_NULL; /* Free the per-op buffers */ for (j = 0; j < test_ptr->cmd->num_ops; j++) { if (test_ptr->ep_context[i].op[j].bp) { if (!DT_Bpool_Destroy(pt_ptr, phead, test_ptr-> ep_context[i]. op[j].bp)) { DT_Tdep_PT_Printf(phead, "test[" F64x "]: Warning: Bpool destroy fails\n", test_ptr-> base_port); /* carry on trying, regardless */ } } } /* Free the remote memory info exchange buffers */ if (test_ptr->ep_context[i].bp) { if (!DT_Bpool_Destroy(pt_ptr, phead, test_ptr->ep_context[i]. bp)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: Warning: Bpool destroy fails\n", test_ptr->base_port); /* carry on trying, regardless */ } } /* * Disconnect -- we may have left recv buffers posted, if we * bailed out mid-setup, or ran to completion * normally, so we use abrupt closure. */ if (test_ptr->ep_context[i].ep_handle) { ret = dat_ep_disconnect(test_ptr->ep_context[i]. ep_handle, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: Warning: dat_ep_disconnect (%s) " "#%d error %s\n", test_ptr->base_port, success ? "graceful" : "abrupt", i, DT_RetToString(ret)); /* carry on trying, regardless */ } } /* * Wait on each of the outstanding EP handles. Some of them * may be disconnected by the remote side, we are racing * here. */ if (success) { /* Ensure DT_Transaction_Run did not return error otherwise may get stuck waiting for disconnect event */ if (!DT_disco_event_wait(phead, test_ptr-> ep_context[i]. conn_evd_hdl, &ep_handle)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: bad disconnect event\n", test_ptr->base_port); } } ep_handle = test_ptr->ep_context[i].ep_handle; /* * Free the handle returned by the disconnect event. * With multiple EPs, it may not be the EP we just * disconnected as we are racing with the remote side * disconnects. */ if (DAT_HANDLE_NULL != ep_handle) { DAT_EVENT event; /* * Drain off outstanding DTOs that may have been * generated by racing disconnects */ do { ret = DT_Tdep_evd_dequeue(test_ptr-> ep_context[i]. recv_evd_hdl, &event); } while (ret == DAT_SUCCESS); /* Destroy the EP */ ret = dat_ep_free(ep_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_ep_free #%d error: %s\n", test_ptr->base_port, i, DT_RetToString(ret)); /* carry on trying, regardless */ } } /* clean up the EVDs */ if (test_ptr->ep_context[i].conn_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->ep_context[i]. conn_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (conn) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); } } if (pt_ptr->local_is_server) { if (test_ptr->ep_context[i].creq_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr-> ep_context[i]. creq_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (creq) error: %s\n", test_ptr-> base_port, DT_RetToString (ret)); } } } if (test_ptr->ep_context[i].reqt_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->ep_context[i]. reqt_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (reqt) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); } } if (test_ptr->ep_context[i].recv_evd_hdl) { ret = DT_Tdep_evd_free(test_ptr->ep_context[i]. recv_evd_hdl); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_evd_free (recv) error: %s\n", test_ptr->base_port, DT_RetToString(ret)); } } } /* end foreach per-EP context */ DT_MemListFree(pt_ptr, test_ptr->ep_context); } /* clean up the PZ */ if (test_ptr->pz_handle) { ret = dat_pz_free(test_ptr->pz_handle); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: dat_pz_free error: %s\n", test_ptr->base_port, DT_RetToString(ret)); /* fall through, keep trying */ } } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: cleanup is done\n", test_ptr->base_port)); DT_MemListFree(pt_ptr, test_ptr); DT_Thread_Destroy(thread, pt_ptr); DT_Mdep_Thread_Detach(DT_Mdep_Thread_SELF()); /* AMM */ DT_Mdep_Thread_EXIT(NULL); /* AMM */ } /* ----------------------------------------------------------------------- * The actual performance test */ bool DT_Transaction_Run(DT_Tdep_Print_Head * phead, Transaction_Test_t * test_ptr) { unsigned int op; unsigned int iteration; int bytes; bool ours; bool success = false; bool repost_recv; unsigned int i; /* pre-post all receive buffers */ for (op = 0; op < test_ptr->cmd->num_ops; op++) { /* if it is a SEND/RECV, we must post receive buffers */ if (test_ptr->ep_context[0].op[op].transfer_type == SEND_RECV) { ours = (test_ptr->is_server == test_ptr->ep_context[0].op[op]. server_initiated); if (!ours) { if (!DT_handle_post_recv_buf(phead, test_ptr-> ep_context, test_ptr->cmd-> eps_per_thread, op)) { goto bail; } } } } /* initialize data if we are validating it */ if (test_ptr->cmd->validate) { DT_Transaction_Validation_Fill(phead, test_ptr, 0); } /* * Now that we've posted our receive buffers... * synchronize with the other side. */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Synchronize with the other side\n", test_ptr->base_port)); /* * Each server thread sends a sync message to the corresponding * client thread. All clients wait until all server threads * have sent their sync messages. Then all clients send * sync message. * * Since all of the events are directed to the same EVD, * we do not use DT_dto_check(.) to verify the attributes * of the sync message event. DT_dto_check(.) requires the * comsumer to pass the expected EP, but we do not know * what to expect. DAPL does not guarantee the order of * completions across EPs. Therfore we only know that * test_ptr->cmd->eps_per_thread number of completion events * will be generated but not the order in which they will * complete. */ if (test_ptr->is_server) { /* * Server */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Send Sync to Client\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, SYNC_SEND_BUFFER_ID, SYNC_BUFF_SIZE)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server sync send error\n", test_ptr->base_port)); goto bail; } } for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. reqt_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server sync send error\n", test_ptr->base_port)); goto bail; } } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Wait for Sync Message\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. recv_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server sync recv error\n", test_ptr->base_port)); goto bail; } } } else { /* * Client */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Wait for Sync Message\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. recv_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Client sync recv error\n", test_ptr->base_port)); goto bail; } DT_transaction_stats_set_ready(phead, &test_ptr->pt_ptr-> Client_Stats); } /* check if it is time for client to send sync */ if (!DT_transaction_stats_wait_for_all(phead, &test_ptr->pt_ptr-> Client_Stats)) { goto bail; } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Send Sync Msg\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, SYNC_SEND_BUFFER_ID, SYNC_BUFF_SIZE)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Client sync send error\n", test_ptr->base_port)); goto bail; } } for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. reqt_evd_hdl, &dto_stat)) { goto bail; } } } /* * Get to work ... */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Begin...\n", test_ptr->base_port)); test_ptr->stats.start_time = DT_Mdep_GetTime(); for (iteration = 0; iteration < test_ptr->cmd->num_iterations; iteration++) { DT_Tdep_PT_Debug(1, (phead, "iteration: %d\n", iteration)); /* repost unless this is the last iteration */ repost_recv = (iteration + 1 != test_ptr->cmd->num_iterations); /* * If this is the last iteration, then post the Final Sync recv * buffer. This makes the buffer available before both sides * finish their last iteration. */ if (!repost_recv) { /* post the Final Sync recv buf. */ for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { if (!DT_post_recv_buffer(phead, test_ptr->ep_context[i].ep_handle, test_ptr->ep_context[i].bp, FINAL_SYNC_RECV_BUFFER_ID, SYNC_BUFF_SIZE)) { /* error message printed by DT_post_recv_buffer */ goto bail; } } } for (op = 0; op < test_ptr->cmd->num_ops; op++) { ours = (test_ptr->is_server == test_ptr->ep_context[0].op[op]. server_initiated); bytes = (test_ptr->ep_context[0].op[op].seg_size * test_ptr->ep_context[0].op[op].num_segs * test_ptr->cmd->eps_per_thread); switch (test_ptr->ep_context[0].op[op].transfer_type) { case RDMA_READ: { test_ptr->stats.stat_bytes_rdma_read += bytes; if (ours) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: RdmaRead [%d]\n", test_ptr-> base_port, op)); if (!DT_handle_rdma_op (phead, test_ptr->ep_context, test_ptr->cmd-> eps_per_thread, RDMA_READ, op, test_ptr->cmd->poll)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: RdmaRead error[%d]\n", test_ptr-> base_port, op); goto bail; } } break; } case RDMA_WRITE: { test_ptr->stats.stat_bytes_rdma_write += bytes; if (ours) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: RdmaWrite [%d]\n", test_ptr-> base_port, op)); if (!DT_handle_rdma_op (phead, test_ptr->ep_context, test_ptr->cmd-> eps_per_thread, RDMA_WRITE, op, test_ptr->cmd->poll)) { DT_Tdep_PT_Printf(phead, "Test[" F64x "]: RdmaWrite error[%d]\n", test_ptr-> base_port, op); goto bail; } } break; } case SEND_RECV: { if (ours) { test_ptr->stats. stat_bytes_send += bytes; DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: postsend [%d] \n", test_ptr-> base_port, op)); /* send data */ if (!DT_handle_send_op(phead, test_ptr-> ep_context, test_ptr-> cmd-> eps_per_thread, op, test_ptr-> cmd-> poll)) { goto bail; } } else { test_ptr->stats. stat_bytes_recv += bytes; DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: RecvWait and Re-Post [%d] \n", test_ptr-> base_port, op)); if (!DT_handle_recv_op(phead, test_ptr-> ep_context, test_ptr-> cmd-> eps_per_thread, op, test_ptr-> cmd-> poll, repost_recv)) { goto bail; } } /* now before going on, is it time to validate? */ if (test_ptr->cmd->validate) { if (!test_ptr->pt_ptr->local_is_server) { /* CLIENT */ /* the client validates on the third to last op */ if (op == test_ptr->cmd-> num_ops - 3) { if (!DT_Transaction_Validation_Check(phead, test_ptr, iteration)) { goto bail; } DT_Transaction_Validation_Fill (phead, test_ptr, iteration + 1); } } else { /* SERVER */ /* the server validates on the second to last op */ if (op == test_ptr->cmd-> num_ops - 2) { if (!DT_Transaction_Validation_Check(phead, test_ptr, iteration)) { goto bail; } DT_Transaction_Validation_Fill (phead, test_ptr, iteration + 1); } } } /* end validate */ break; } } /* end switch for transfer type */ } /* end loop for each op */ } /* end loop for iteration */ /* * Final sync up to ensure all previous remote operations have * finished. */ if (test_ptr->is_server) { /* * Server */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Send Final Sync to Client\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, FINAL_SYNC_SEND_BUFFER_ID, SYNC_BUFF_SIZE)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server final sync send error\n", test_ptr->base_port)); goto bail; } } for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. reqt_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server final sync send error\n", test_ptr->base_port)); goto bail; } } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Wait for Final Sync Message\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. recv_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Server final sync recv error\n", test_ptr->base_port)); goto bail; } } } else { /* * Client */ DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Wait for Final Sync Message\n", test_ptr->base_port)); DT_transaction_stats_reset_wait_count(phead, &test_ptr->pt_ptr-> Client_Stats, test_ptr->cmd->eps_per_thread); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. recv_evd_hdl, &dto_stat)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Client final sync recv error\n", test_ptr->base_port)); goto bail; } DT_transaction_stats_set_ready(phead, &test_ptr->pt_ptr-> Client_Stats); } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Send Final Sync Msg\n", test_ptr->base_port)); for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { if (!DT_post_send_buffer(phead, test_ptr->ep_context[i]. ep_handle, test_ptr->ep_context[i].bp, FINAL_SYNC_SEND_BUFFER_ID, SYNC_BUFF_SIZE)) { DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: Client sync send error\n", test_ptr->base_port)); goto bail; } } for (i = 0; i < test_ptr->cmd->eps_per_thread; i++) { DAT_DTO_COMPLETION_EVENT_DATA dto_stat; if (!DT_dto_event_wait(phead, test_ptr->ep_context[i]. reqt_evd_hdl, &dto_stat)) { goto bail; } } } /* end time and print stats */ test_ptr->stats.end_time = DT_Mdep_GetTime(); if (!test_ptr->pt_ptr->local_is_server) { DT_update_transaction_stats(&test_ptr->pt_ptr->Client_Stats, test_ptr->cmd->eps_per_thread * test_ptr->cmd->num_ops * test_ptr->cmd->num_iterations, test_ptr->stats.end_time - test_ptr->stats.start_time, test_ptr->stats.stat_bytes_send, test_ptr->stats.stat_bytes_recv, test_ptr->stats. stat_bytes_rdma_read, test_ptr->stats. stat_bytes_rdma_write); } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: End Successfully\n", test_ptr->base_port)); success = true; bail: return (success); } /*------------------------------------------------------------------------------ */ void DT_Transaction_Validation_Fill(DT_Tdep_Print_Head * phead, Transaction_Test_t * test_ptr, unsigned int iteration) { bool ours; unsigned int op; unsigned int i; unsigned int j; unsigned int ind; unsigned char *buff; if (iteration >= test_ptr->cmd->num_iterations) { return; } DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: FILL Buffers Iteration %d\n", test_ptr->base_port, iteration)); /* * fill all but the last three ops, which * were added to create barriers for data validation */ for (ind = 0; ind < test_ptr->cmd->eps_per_thread; ind++) { for (op = 0; op < test_ptr->cmd->num_ops - 3; op++) { ours = (test_ptr->is_server == test_ptr->ep_context[ind].op[op]. server_initiated); switch (test_ptr->ep_context[ind].op[op].transfer_type) { case RDMA_READ: { if (!ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { /* Avoid using all zero bits the 1st time */ buff[j] = (iteration + 1) & 0xFF; } } } break; } case RDMA_WRITE: { if (ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { /* Avoid using all zero bits the 1st time */ buff[j] = (iteration + 1) & 0xFF; } } } break; } case SEND_RECV: { if (ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); /***** DT_Tdep_PT_Printf(phead, "\tFill: wq=%d op=%d seg=%d ptr=[%p, %d]\n", ind, op, i, buff, j); *****/ for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { /* Avoid using all zero bits the 1st time */ buff[j] = (iteration + 1) & 0xFF; } } } break; } } /* end switch transfer_type */ } /* end for each op */ } /* end for each ep per thread */ } /*------------------------------------------------------------------------------ */ bool DT_Transaction_Validation_Check(DT_Tdep_Print_Head * phead, Transaction_Test_t * test_ptr, int iteration) { bool ours; bool success = true; unsigned int op; unsigned int i; unsigned int j; unsigned int ind; unsigned char *buff; unsigned char expect; unsigned char got; DT_Tdep_PT_Debug(1, (phead, "Test[" F64x "]: VALIDATE Buffers Iteration %d\n", test_ptr->base_port, iteration)); /* * fill all but the last three ops, which * were added to create barriers for data validation */ for (ind = 0; ind < test_ptr->cmd->eps_per_thread; ind++) { for (op = 0; op < test_ptr->cmd->num_ops - 3; op++) { ours = (test_ptr->is_server == test_ptr->ep_context[ind].op[op]. server_initiated); switch (test_ptr->ep_context[ind].op[op].transfer_type) { case RDMA_READ: { if (ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { expect = (iteration + 1) & 0xFF; got = buff[j]; if (expect != got) { DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Validation Error :: %d\n", test_ptr-> base_port, op); DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Expected %x Got %x\n", test_ptr-> base_port, expect, got); DT_Tdep_PT_Debug (3, (phead, "\twq=%d op=%d seg=%d byte=%d ptr=%p\n", ind, op, i, j, buff)); success = false; break; } } } } break; } case RDMA_WRITE: { if (!ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { expect = (iteration + 1) & 0xFF; got = buff[j]; if (expect != got) { DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Validation Error :: %d\n", test_ptr-> base_port, op); DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Expected %x Got %x\n", test_ptr-> base_port, expect, got); DT_Tdep_PT_Debug (3, (phead, "\twq=%d op=%d seg=%d byte=%d ptr=%p\n", ind, op, i, j, buff)); success = false; break; } } } } break; } case SEND_RECV: { if (!ours) { for (i = 0; i < test_ptr->ep_context[ind]. op[op].num_segs; i++) { buff = DT_Bpool_GetBuffer (test_ptr-> ep_context[ind]. op[op].bp, i); DT_Tdep_PT_Debug(3, (phead, "\tCheck:wq=%d op=%d seg=%d ptr=[%p, %d]\n", ind, op, i, buff, test_ptr-> ep_context [ind]. op [op]. seg_size)); for (j = 0; j < test_ptr-> ep_context[ind]. op[op].seg_size; j++) { expect = (iteration + 1) & 0xFF; got = buff[j]; if (expect != got) { DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Validation Error :: %d\n", test_ptr-> base_port, op); DT_Tdep_PT_Printf (phead, "Test[" F64x "]: Expected %x Got %x\n", test_ptr-> base_port, expect, got); DT_Tdep_PT_Debug (3, (phead, "\twq=%d op=%d seg=%d byte=%d ptr=%p\n", ind, op, i, j, buff)); success = false; break; } } } } break; } } /* end switch transfer_type */ } /* end for each op */ } /* end for each ep per thread */ return (success); } /*------------------------------------------------------------------------------ */ void DT_Print_Transaction_Test(DT_Tdep_Print_Head * phead, Transaction_Test_t * test_ptr) { DT_Tdep_PT_Printf(phead, "-------------------------------------\n"); DT_Tdep_PT_Printf(phead, "TransTest.is_server : %d\n", test_ptr->is_server); DT_Tdep_PT_Printf(phead, "TransTest.remote_little_endian : %d\n", test_ptr->remote_is_little_endian); DT_Tdep_PT_Printf(phead, "TransTest.base_port : " F64x "\n", test_ptr->base_port); DT_Tdep_PT_Printf(phead, "TransTest.pz_handle : %p\n", test_ptr->pz_handle); /* statistics */ DT_Tdep_PT_Printf(phead, "TransTest.bytes_send : %d\n", test_ptr->stats.stat_bytes_send); DT_Tdep_PT_Printf(phead, "TransTest.bytes_recv : %d\n", test_ptr->stats.stat_bytes_recv); DT_Tdep_PT_Printf(phead, "TransTest.bytes_rdma_read : %d\n", test_ptr->stats.stat_bytes_rdma_read); DT_Tdep_PT_Printf(phead, "TransTest.bytes_rdma_write : %d\n", test_ptr->stats.stat_bytes_rdma_write); } /*------------------------------------------------------------------------------ */ void DT_Print_Transaction_Stats(DT_Tdep_Print_Head * phead, Transaction_Test_t * test_ptr) { double time; double mbytes_send; double mbytes_recv; double mbytes_rdma_read; double mbytes_rdma_write; int total_ops; time = (double)(test_ptr->stats.end_time - test_ptr->stats.start_time) / 1000; mbytes_send = (double)test_ptr->stats.stat_bytes_send / 1024 / 1024; mbytes_recv = (double)test_ptr->stats.stat_bytes_recv / 1024 / 1024; mbytes_rdma_read = (double)test_ptr->stats.stat_bytes_rdma_read / 1024 / 1024; mbytes_rdma_write = (double)test_ptr->stats.stat_bytes_rdma_write / 1024 / 1024; total_ops = test_ptr->cmd->num_ops * test_ptr->cmd->num_iterations; DT_Tdep_PT_Printf(phead, "Test[: " F64x "] ---- Stats ----\n", test_ptr->base_port); DT_Tdep_PT_Printf(phead, "Iterations : %u\n", test_ptr->cmd->num_iterations); DT_Tdep_PT_Printf(phead, "Ops : %7d.%02d Ops/Sec\n", whole(total_ops / time), hundredths(total_ops / time)); DT_Tdep_PT_Printf(phead, "Time : %7d.%02d sec\n", whole(time), hundredths(time)); DT_Tdep_PT_Printf(phead, "Sent : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_send), hundredths(mbytes_send), whole(mbytes_send / time), hundredths(mbytes_send / time)); DT_Tdep_PT_Printf(phead, "Recv : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_recv), hundredths(mbytes_recv), whole(mbytes_recv / time), hundredths(mbytes_recv / time)); DT_Tdep_PT_Printf(phead, "RDMA Read : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_rdma_read), hundredths(mbytes_rdma_read), whole(mbytes_rdma_read / time), hundredths(mbytes_rdma_read / time)); DT_Tdep_PT_Printf(phead, "RDMA Write : %7d.%02d MB - %7d.%02d MB/Sec\n", whole(mbytes_rdma_write), hundredths(mbytes_rdma_write), whole(mbytes_rdma_write / time), hundredths(mbytes_rdma_write / time)); } dapl-2.1.5/test/dapltest/test/dapl_transaction_util.c000066400000000000000000000502051255317474200227570ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" #define DT_LOCAL_COMPLETION_VECTOR_SIZE 32 /* ----------------------------------------------------------- * Post a recv buffer on each of this thread's EPs. */ bool DT_handle_post_recv_buf(DT_Tdep_Print_Head * phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx) { unsigned int i, j; for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op = &ep_context[i].op[op_indx]; DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(op->bp, 0); DAT_DTO_COOKIE cookie; DAT_RETURN ret; /* Prep the inputs */ for (j = 0; j < op->num_segs; j++) { iov[j].virtual_address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(op->bp, j); iov[j].segment_length = op->seg_size; iov[j].lmr_context = DT_Bpool_GetLMR(op->bp, j); } cookie.as_64 = ((((DAT_UINT64) i) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); /* Post the recv */ ret = dat_ep_post_recv(ep_context[i].ep_handle, op->num_segs, iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dat_ep_post_recv failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); return false; } } return true; } /* ----------------------------------------------------------- * Post a send buffer on each of this thread's EPs. */ bool DT_handle_send_op(DT_Tdep_Print_Head * phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx, bool poll) { unsigned int i, j; unsigned char *completion_reaped; unsigned char lcomp[DT_LOCAL_COMPLETION_VECTOR_SIZE]; bool rc = false; if (num_eps <= DT_LOCAL_COMPLETION_VECTOR_SIZE) { completion_reaped = lcomp; bzero((void *)completion_reaped, sizeof(unsigned char) * num_eps); } else { completion_reaped = DT_Mdep_Malloc(num_eps * sizeof(unsigned char)); if (!completion_reaped) { return false; } } for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op = &ep_context[i].op[op_indx]; DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(op->bp, 0); DAT_DTO_COOKIE cookie; DAT_RETURN ret; /* Prep the inputs */ for (j = 0; j < op->num_segs; j++) { iov[j].virtual_address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(op->bp, j); iov[j].segment_length = op->seg_size; iov[j].lmr_context = DT_Bpool_GetLMR(op->bp, j); } cookie.as_64 = ((((DAT_UINT64) i) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); /* Post the send */ ret = dat_ep_post_send(ep_context[i].ep_handle, op->num_segs, iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dat_ep_post_send failed: %s\n", DT_RetToString(ret)); DT_Test_Error(); goto xit; } } for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op = &ep_context[i].op[op_indx]; if (op->reap_send_on_recv && !op->server_initiated) { /* we will reap the send on the recv (Client SR) */ rc = true; goto xit; } } /* reap the send completion */ for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_DTO_COOKIE dto_cookie; unsigned int epnum; if (!DT_dto_event_reap (phead, ep_context[i].reqt_evd_hdl, poll, &dto_stat)) { goto xit; } epnum = dto_stat.user_cookie.as_64 >> 32; if (epnum > num_eps) { DT_Tdep_PT_Printf(phead, "Test Error: Send: Invalid endpoint completion reaped.\n" "\tEndpoint: 0x%p, Cookie: 0x" F64x ", Length: " F64u "\n", dto_stat.ep_handle, dto_stat.user_cookie.as_64, dto_stat.transfered_length); DT_Test_Error(); goto xit; } op = &ep_context[epnum].op[op_indx]; dto_cookie.as_64 = ((((DAT_UINT64) epnum) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); if (!DT_dto_check(phead, &dto_stat, ep_context[epnum].ep_handle, op->num_segs * op->seg_size, dto_cookie, "Send")) { goto xit; } if (completion_reaped[epnum]) { DT_Tdep_PT_Printf(phead, "Test Error: Send: Secondary completion seen for endpoint 0x%p (%d)\n", ep_context[epnum].ep_handle, epnum); DT_Test_Error(); goto xit; } completion_reaped[epnum] = 1; } for (i = 0; i < num_eps; i++) { if (completion_reaped[i] == 0) { DT_Tdep_PT_Printf(phead, "Test Error: Send: No completion seen for endpoint 0x%p (#%d)\n", ep_context[i].ep_handle, i); DT_Test_Error(); goto xit; } } rc = true; xit: if (completion_reaped != lcomp) DT_Mdep_Free(completion_reaped); return rc; } /* ----------------------------------------------------------- * Reap a recv op on each of this thread's EPs, * then if requested reap the corresponding send ops, * and re-post all of the recv buffers. */ bool DT_handle_recv_op(DT_Tdep_Print_Head * phead, Ep_Context_t * ep_context, unsigned int num_eps, int op_indx, bool poll, bool repost_recv) { unsigned int i; unsigned char *recv_completion_reaped; unsigned char *send_completion_reaped; unsigned char rcomp[DT_LOCAL_COMPLETION_VECTOR_SIZE]; unsigned char lcomp[DT_LOCAL_COMPLETION_VECTOR_SIZE]; bool rc = false; if (num_eps <= DT_LOCAL_COMPLETION_VECTOR_SIZE ) { recv_completion_reaped = rcomp; send_completion_reaped = lcomp; bzero((void *)recv_completion_reaped, sizeof(unsigned char) * num_eps); bzero((void *)send_completion_reaped, sizeof(unsigned char) * num_eps); } else { recv_completion_reaped = DT_Mdep_Malloc(num_eps); if (recv_completion_reaped == NULL) { return false; } send_completion_reaped = DT_Mdep_Malloc(num_eps); if (send_completion_reaped == NULL) { DT_Mdep_Free(recv_completion_reaped); return false; } } /* Foreach EP, reap */ for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_DTO_COOKIE dto_cookie; unsigned int epnum; /* First reap the recv DTO event */ if (!DT_dto_event_reap (phead, ep_context[i].recv_evd_hdl, poll, &dto_stat)) { goto xit; } epnum = dto_stat.user_cookie.as_64 >> 32; if (epnum > num_eps) { DT_Tdep_PT_Printf(phead, "Test Error: Receive: Invalid endpoint completion reaped.\n" "\tEndpoint: 0x%p, Cookie: 0x" F64x ", Length: " F64u "\n", dto_stat.ep_handle, dto_stat.user_cookie.as_64, dto_stat.transfered_length); DT_Test_Error(); goto xit; } op = &ep_context[epnum].op[op_indx]; dto_cookie.as_64 = ((((DAT_UINT64) epnum) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); if (!DT_dto_check(phead, &dto_stat, ep_context[epnum].ep_handle, op->num_segs * op->seg_size, dto_cookie, "Recv")) { DT_Tdep_PT_Printf(phead, "Test Error: recv DTO problem\n"); DT_Test_Error(); goto xit; } if (recv_completion_reaped[epnum]) { DT_Tdep_PT_Printf(phead, "Test Error: Receive: Secondary completion seen for endpoint 0x%p (%d)\n", ep_context[epnum].ep_handle, epnum); DT_Test_Error(); goto xit; } recv_completion_reaped[epnum] = 1; /* * Check the current op to see whether we are supposed * to reap the previous send op now. */ if (op->reap_send_on_recv && op->server_initiated) { if (op_indx <= 0) /* shouldn't happen, but let's be certain */ { DT_Tdep_PT_Printf(phead, "Internal Error: reap_send_on_recv" " but current op == #%d\n", op_indx); goto xit; } if (!DT_dto_event_reap (phead, ep_context[i].reqt_evd_hdl, poll, &dto_stat)) { goto xit; } epnum = dto_stat.user_cookie.as_64 >> 32; if (epnum > num_eps) { DT_Tdep_PT_Printf(phead, "Test Error: Send (ror): Invalid endpoint completion reaped.\n" "\tEndpoint: 0x%p, Cookie: 0x" F64x ", Length: " F64u "\n", dto_stat.ep_handle, dto_stat.user_cookie.as_64, dto_stat.transfered_length); DT_Test_Error(); goto xit; } /* * We're reaping the last transaction, a * send completion that we skipped when it was sent. */ op = &ep_context[epnum].op[op_indx - 1]; dto_cookie.as_64 = ((((DAT_UINT64) epnum) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); /* * If we have multiple EPs we can't guarantee the order of * completions, so disable ep_handle check */ if (!DT_dto_check(phead, &dto_stat, num_eps == 1 ? ep_context[i].ep_handle : NULL, op->num_segs * op->seg_size, dto_cookie, "Send-reaped-on-recv")) { DT_Tdep_PT_Printf(phead, "Test Error: send DTO problem\n"); DT_Test_Error(); goto xit; } if (send_completion_reaped[epnum]) { DT_Tdep_PT_Printf(phead, "Test Error: Send (ror): Secondary completion seen for endpoint 0x%p (%d)\n", ep_context[epnum].ep_handle, epnum); DT_Test_Error(); goto xit; } send_completion_reaped[epnum] = 1; } } for (i = 0; i < num_eps; i++) { if (recv_completion_reaped[i] == 0) { DT_Tdep_PT_Printf(phead, "Test Error: Receive: No completion seen for endpoint 0x%p (#%d)\n", ep_context[i].ep_handle, i); DT_Test_Error(); goto xit; } } if (ep_context[0].op[op_indx].reap_send_on_recv && ep_context[0].op[op_indx].server_initiated) { for (i = 0; i < num_eps; i++) { if (send_completion_reaped[i] == 0) { DT_Tdep_PT_Printf(phead, "Test Error: Send (ror): No completion seen for endpoint 0x%p (#%d)\n", ep_context[i].ep_handle, i); DT_Test_Error(); goto xit; } } } if (repost_recv) { /* repost the receive buffer */ if (!DT_handle_post_recv_buf (phead, ep_context, num_eps, op_indx)) { DT_Tdep_PT_Printf(phead, "Test Error: recv re-post problem\n"); DT_Test_Error(); goto xit; } } rc = true; xit: if (send_completion_reaped != lcomp) { DT_Mdep_Free(recv_completion_reaped); DT_Mdep_Free(send_completion_reaped); } return rc; } /* ----------------------------------------------------------- * Initiate an RDMA op (synchronous) on each of this thread's EPs. */ bool DT_handle_rdma_op(DT_Tdep_Print_Head * phead, Ep_Context_t * ep_context, unsigned int num_eps, DT_Transfer_Type opcode, int op_indx, bool poll) { unsigned int i, j; DAT_RETURN ret; unsigned char *completion_reaped; unsigned char lcomp[DT_LOCAL_COMPLETION_VECTOR_SIZE]; bool rc = false; if (num_eps <= DT_LOCAL_COMPLETION_VECTOR_SIZE) { completion_reaped = lcomp; bzero((void *)completion_reaped, sizeof(unsigned char) * num_eps); } else { completion_reaped = DT_Mdep_Malloc(num_eps * sizeof(unsigned char)); if (!completion_reaped) { return false; } } /* Initiate the operation */ for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op = &ep_context[i].op[op_indx]; DAT_LMR_TRIPLET *iov = DT_Bpool_GetIOV(op->bp, 0); DAT_DTO_COOKIE cookie; DAT_RMR_TRIPLET rmr_triplet; /* Prep the inputs */ for (j = 0; j < op->num_segs; j++) { iov[j].virtual_address = (DAT_VADDR) (uintptr_t) DT_Bpool_GetBuffer(op->bp, j); iov[j].segment_length = op->seg_size; iov[j].lmr_context = DT_Bpool_GetLMR(op->bp, j); } cookie.as_64 = ((((DAT_UINT64) i) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); rmr_triplet.virtual_address = (DAT_VADDR) (uintptr_t) op->Rdma_Address; rmr_triplet.segment_length = op->seg_size * op->num_segs; rmr_triplet.rmr_context = op->Rdma_Context; DT_Tdep_PT_Debug(3, (phead, "Call dat_ep_post_rdma_%s [" F64x ", sz=" F64x ", ctxt=%x]\n", (opcode == RDMA_WRITE ? "write" : "read"), rmr_triplet.virtual_address, rmr_triplet.segment_length, rmr_triplet.rmr_context)); /* Post the operation */ if (opcode == RDMA_WRITE) { ret = dat_ep_post_rdma_write(ep_context[i].ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); } else { /* opcode == RDMA_READ */ ret = dat_ep_post_rdma_read(ep_context[i].ep_handle, op->num_segs, iov, cookie, &rmr_triplet, DAT_COMPLETION_DEFAULT_FLAG); } if (ret != DAT_SUCCESS) { DT_Tdep_PT_Printf(phead, "Test Error: dat_ep_post_rdma_%s failed: %s\n", (opcode == RDMA_WRITE ? "write" : "read"), DT_RetToString(ret)); DT_Test_Error(); goto err; } else { DT_Tdep_PT_Debug(3, (phead, "Done dat_ep_post_rdma_%s %s\n", (opcode == RDMA_WRITE ? "write" : "read"), " () Waiting ...")); } } /* Wait for it to happen */ for (i = 0; i < num_eps; i++) { Transaction_Test_Op_t *op; DAT_DTO_COMPLETION_EVENT_DATA dto_stat; DAT_DTO_COOKIE dto_cookie; unsigned int epnum; if (!DT_dto_event_reap (phead, ep_context[i].reqt_evd_hdl, poll, &dto_stat)) { goto err; } epnum = dto_stat.user_cookie.as_64 >> 32; if (epnum > num_eps) { DT_Tdep_PT_Printf(phead, "Test Error: %s: Invalid endpoint completion reaped.\n" "\tEndpoint: 0x%p, Cookie: 0x" F64x ", Length: " F64u "\n", opcode == RDMA_WRITE ? "RDMA/WR" : "RDMA/RD", dto_stat.ep_handle, dto_stat.user_cookie.as_64, dto_stat.transfered_length); DT_Test_Error(); goto err; } op = &ep_context[epnum].op[op_indx]; dto_cookie.as_64 = ((((DAT_UINT64) epnum) << 32) | (((uintptr_t) DT_Bpool_GetBuffer(op->bp, 0)) & 0xffffffffUL)); if (!DT_dto_check(phead, &dto_stat, ep_context[epnum].ep_handle, op->num_segs * op->seg_size, dto_cookie, (opcode == RDMA_WRITE ? "RDMA/WR" : "RDMA/RD"))) { goto err; } if (completion_reaped[epnum]) { DT_Tdep_PT_Printf(phead, "Test Error: %s: Secondary completion seen for endpoint 0x%p (%d)\n", opcode == RDMA_WRITE ? "RDMA/WR" : "RDMA/RD", ep_context[epnum].ep_handle, epnum); DT_Test_Error(); goto err; } completion_reaped[epnum] = 1; DT_Tdep_PT_Debug(3, (phead, "dat_ep_post_rdma_%s OK\n", (opcode == RDMA_WRITE ? "RDMA/WR" : "RDMA/RD"))); } for (i = 0; i < num_eps; i++) { if (completion_reaped[i] == 0) { DT_Tdep_PT_Printf(phead, "Test Error: %s: No completion seen for endpoint 0x%p (#%d)\n", opcode == RDMA_WRITE ? "RDMA/WR" : "RDMA/RD", ep_context[i].ep_handle, i); DT_Test_Error(); goto err; } } rc = true; err: if (completion_reaped != lcomp) DT_Mdep_Free(completion_reaped); return rc; } /* ----------------------------------------------------------- * Verify whether we (the client side) can support * the requested 'T' test. */ bool DT_check_params(Per_Test_Data_t * pt_ptr, char *module) { Transaction_Cmd_t *cmd = &pt_ptr->Params.u.Transaction_Cmd; unsigned long num_recvs = 0U; unsigned long num_sends = 0U; unsigned long num_rdma_rd = 0U; unsigned long num_rdma_wr = 0U; unsigned long max_size = 0U; unsigned long max_segs = 0U; bool rval = true; unsigned int i; DT_Tdep_Print_Head *phead; phead = pt_ptr->Params.phead; /* Count up what's requested (including -V appended sync points) */ for (i = 0; i < cmd->num_ops; i++) { unsigned int xfer_size; xfer_size = cmd->op[i].num_segs * cmd->op[i].seg_size; if (xfer_size > max_size) { max_size = xfer_size; } if (cmd->op[i].num_segs > max_segs) { max_segs = cmd->op[i].num_segs; } switch (cmd->op[i].transfer_type) { case SEND_RECV: { if (cmd->op[i].server_initiated) { num_recvs++; } else { num_sends++; } break; } case RDMA_READ: { num_rdma_rd++; break; } case RDMA_WRITE: { num_rdma_wr++; break; } } } /* * Now check the IA and EP attributes, and check for some of the * more obvious resource problems. This is hardly exhaustive, * and some things will inevitably fall through to run-time. * * We don't compare * num_rdma_rd > pt_ptr->ia_attr.max_rdma_read_per_ep * num_rdma_wr > pt_ptr->ia_attr.max_dto_per_ep * because each thread has its own EPs, and transfers are issued * synchronously (across a thread's EPs, and ignoring -f, which allows * a per-EP pipeline depth of at most 2 and applies only to SR ops), * so dapltest actually attempts almost no pipelining on a single EP. * But we do check that pre-posted recv buffers will all fit. */ if (num_recvs > pt_ptr->ia_attr.max_dto_per_ep || num_sends > pt_ptr->ia_attr.max_dto_per_ep) { DT_Tdep_PT_Printf(phead, "%s: S/R: cannot supply %ld SR ops (maximum: %d)\n", module, num_recvs > num_sends ? num_recvs : num_sends, pt_ptr->ia_attr.max_dto_per_ep); rval = false; } if (max_size > pt_ptr->ia_attr.max_lmr_block_size) { DT_Tdep_PT_Printf(phead, "%s: buffer too large: 0x%lx (maximum: " F64x " bytes)\n", module, max_size, pt_ptr->ia_attr.max_lmr_block_size); rval = false; } if (max_segs > pt_ptr->ep_attr.max_recv_iov || max_segs > pt_ptr->ep_attr.max_request_iov) { /* * In an ideal world, we'd just ask for more segments * when creating the EPs for the test, rather than * checking against default EP attributes. */ DT_Tdep_PT_Printf(phead, "%s: cannot use %ld segments (maxima: S %d, R %d)\n", module, max_segs, pt_ptr->ep_attr.max_request_iov, pt_ptr->ep_attr.max_recv_iov); rval = false; } return (rval); } /* Empty function in which to set breakpoints. */ void DT_Test_Error(void) { ; } void DT_Transaction_Cmd_PT_Print(DT_Tdep_Print_Head * phead, Transaction_Cmd_t * cmd) { unsigned int i; DT_Tdep_PT_Printf(phead, "-------------------------------------\n"); DT_Tdep_PT_Printf(phead, "TransCmd.server_name : %s\n", cmd->server_name); DT_Tdep_PT_Printf(phead, "TransCmd.num_iterations : %d\n", cmd->num_iterations); DT_Tdep_PT_Printf(phead, "TransCmd.num_threads : %d\n", cmd->num_threads); DT_Tdep_PT_Printf(phead, "TransCmd.eps_per_thread : %d\n", cmd->eps_per_thread); DT_Tdep_PT_Printf(phead, "TransCmd.validate : %d\n", cmd->validate); DT_Tdep_PT_Printf(phead, "TransCmd.dapl_name : %s\n", cmd->dapl_name); DT_Tdep_PT_Printf(phead, "TransCmd.num_ops : %d\n", cmd->num_ops); for (i = 0; i < cmd->num_ops; i++) { DT_Tdep_PT_Printf(phead, "TransCmd.op[%d].transfer_type : %s %s\n", i, cmd->op[i].transfer_type == 0 ? "RDMA_READ" : cmd->op[i].transfer_type == 1 ? "RDMA_WRITE" : "SEND_RECV", cmd->op[i]. server_initiated ? " (server)" : " (client)"); DT_Tdep_PT_Printf(phead, "TransCmd.op[%d].seg_size : %d\n", i, cmd->op[i].seg_size); DT_Tdep_PT_Printf(phead, "TransCmd.op[%d].num_segs : %d\n", i, cmd->op[i].num_segs); DT_Tdep_PT_Printf(phead, "TransCmd.op[%d].reap_send_on_recv : %d\n", i, cmd->op[i].reap_send_on_recv); } } dapl-2.1.5/test/dapltest/test/dapl_util.c000066400000000000000000000142431255317474200203540ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" /* * Map DAT_RETURN values to readable strings, * but don't assume the values are zero-based or contiguous. */ const char *DT_RetToString(DAT_RETURN ret_value) { const char *major_msg, *minor_msg; int sz; char *errmsg; dat_strerror(ret_value, &major_msg, &minor_msg); sz = strlen(major_msg) + strlen(minor_msg) + 2; /* * FIXME: The callers of this function are not freeing * the errmsg string. Hence there is a memory leak * (this function is likely only used on error paths, * so the consequences may not be that dire). */ errmsg = DT_Mdep_Malloc(sz); strcpy(errmsg, major_msg); strcat(errmsg, " "); strcat(errmsg, minor_msg); return errmsg; } /* * Map DAT_RETURN values to readable strings, * but don't assume the values are zero-based or contiguous. */ const char *DT_TransferTypeToString(DT_Transfer_Type type) { static char *DT_Type[] = { "RR", "RW", "SR" }; if ((0 <= type) && (type <= 2)) { return DT_Type[type]; } else { return "Error: Unkown Transfer Type"; } } /* * Map DAT_ASYNC_ERROR_CODE values to readable strings */ const char *DT_AsyncErr2Str(DAT_EVENT_NUMBER error_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_errors[] = { # define DATxx(x) { # x, x } DATxx(DAT_DTO_COMPLETION_EVENT), DATxx(DAT_RMR_BIND_COMPLETION_EVENT), DATxx(DAT_CONNECTION_REQUEST_EVENT), DATxx(DAT_CONNECTION_EVENT_ESTABLISHED), DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR), DATxx(DAT_CONNECTION_EVENT_DISCONNECTED), DATxx(DAT_CONNECTION_EVENT_BROKEN), DATxx(DAT_CONNECTION_EVENT_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW), DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC), DATxx(DAT_ASYNC_ERROR_EP_BROKEN), DATxx(DAT_ASYNC_ERROR_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR), DATxx(DAT_SOFTWARE_EVENT) # undef DATxx }; # define NUM_ERRORS (sizeof (dat_errors)/sizeof (dat_errors[0])) for (i = 0; i < NUM_ERRORS; i++) { if (dat_errors[i].value == error_code) { return (dat_errors[i].name); } } return ("Invalid_DAT_EVENT_NUMBER"); } /* * Map DAT_EVENT_CODE values to readable strings */ const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_events[] = { # define DATxx(x) { # x, x } DATxx(DAT_DTO_COMPLETION_EVENT), DATxx(DAT_RMR_BIND_COMPLETION_EVENT), DATxx(DAT_CONNECTION_REQUEST_EVENT), DATxx(DAT_CONNECTION_EVENT_ESTABLISHED), DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR), DATxx(DAT_CONNECTION_EVENT_DISCONNECTED), DATxx(DAT_CONNECTION_EVENT_BROKEN), DATxx(DAT_CONNECTION_EVENT_TIMED_OUT), DATxx(DAT_CONNECTION_EVENT_UNREACHABLE), DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW), DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC), DATxx(DAT_ASYNC_ERROR_EP_BROKEN), DATxx(DAT_ASYNC_ERROR_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR), DATxx(DAT_SOFTWARE_EVENT) # undef DATxx }; # define NUM_EVENTS (sizeof (dat_events)/sizeof (dat_events[0])) for (i = 0; i < NUM_EVENTS; i++) { if (dat_events[i].value == event_code) { return (dat_events[i].name); } } return ("Invalid_DAT_EVENT_NUMBER"); } /* * Map DAT_EP_STATE_CODE values to readable strings */ const char *DT_State2Str(DAT_EP_STATE state_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_state[] = { # define DATxx(x) { # x, x } DATxx(DAT_EP_STATE_UNCONNECTED), DATxx(DAT_EP_STATE_RESERVED), DATxx(DAT_EP_STATE_PASSIVE_CONNECTION_PENDING), DATxx(DAT_EP_STATE_ACTIVE_CONNECTION_PENDING), DATxx(DAT_EP_STATE_TENTATIVE_CONNECTION_PENDING), DATxx(DAT_EP_STATE_CONNECTED), DATxx(DAT_EP_STATE_DISCONNECT_PENDING), DATxx(DAT_EP_STATE_ERROR) # undef DATxx }; # define NUM_STATES (sizeof (dat_state)/sizeof (dat_state[0])) for (i = 0; i < NUM_STATES; i++) { if (dat_state[i].value == state_code) { return (dat_state[i].name); } } return ("Invalid_DAT_STATE_NUMBER"); } /* * A couple of round-up routines (for pointers and counters) * which both assume a power-of-two 'align' factor, * and do the correct thing if align == 0. */ unsigned char *DT_AlignPtr(void *val, DAT_COUNT align) { if (align) { #if defined(_WIN64) return ((unsigned char *) (((uint64_t) val + ((uint64_t) align) - 1) & ~(((uint64_t) align) - 1))); #else return ((unsigned char *) (((unsigned long)val + ((unsigned long)align) - 1) & ~(((unsigned long)align) - 1))); #endif } return (val); } DAT_COUNT DT_RoundSize(DAT_COUNT val, DAT_COUNT align) { if (align) { return (((val + align - 1) & ~(align - 1))); } return (val); } dapl-2.1.5/test/dapltest/udapl/000077500000000000000000000000001255317474200163555ustar00rootroot00000000000000dapl-2.1.5/test/dapltest/udapl/udapl_tdep.c000066400000000000000000000062011255317474200206410ustar00rootroot00000000000000/* * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. * * This Software is licensed under one of the following licenses: * * 1) under the terms of the "Common Public License 1.0" a copy of which is * in the file LICENSE.txt in the root directory. The license is also * available from the Open Source Initiative, see * http://www.opensource.org/licenses/cpl.php. * * 2) under the terms of the "The BSD License" a copy of which is in the file * LICENSE2.txt in the root directory. The license is also available from * the Open Source Initiative, see * http://www.opensource.org/licenses/bsd-license.php. * * 3) under the terms of the "GNU General Public License (GPL) Version 2" a * copy of which is in the file LICENSE3.txt in the root directory. The * license is also available from the Open Source Initiative, see * http://www.opensource.org/licenses/gpl-license.php. * * Licensee has the right to choose one of the above licenses. * * Redistributions of source code must retain the above copyright * notice and one of the license notices. * * Redistributions in binary form must reproduce both the above copyright * notice, one of the license notices in the documentation * and/or other materials provided with the distribution. */ #include "dapl_proto.h" void DT_Tdep_Init(void) { DT_Mdep_LockInit(&g_PerfTestLock); /* For kDAPL, this is done in kdapl_module.c */ } void DT_Tdep_End(void) { DT_Mdep_LockDestroy(&g_PerfTestLock); /* For kDAPL, this is done in kdapl_module.c */ } DAT_RETURN DT_Tdep_Execute_Test(Params_t * params_ptr) { return DT_Execute_Test(params_ptr); } DAT_RETURN DT_Tdep_lmr_create(DAT_IA_HANDLE ia_handle, DAT_MEM_TYPE mem_type, DAT_REGION_DESCRIPTION region, DAT_VLEN len, DAT_PZ_HANDLE pz_handle, DAT_MEM_PRIV_FLAGS priv_flag, DAT_LMR_HANDLE * lmr_handle_ptr, DAT_LMR_CONTEXT * lmr_context_ptr, DAT_RMR_CONTEXT * rmr_context_ptr, DAT_VLEN * reg_size_ptr, DAT_VADDR * reg_addr_ptr) { return dat_lmr_create(ia_handle, mem_type, region, len, pz_handle, priv_flag, DAT_VA_TYPE_VA, lmr_handle_ptr, lmr_context_ptr, rmr_context_ptr, reg_size_ptr, reg_addr_ptr); } DAT_RETURN DT_Tdep_evd_create(DAT_IA_HANDLE ia_handle, DAT_COUNT evd_min_qlen, DAT_CNO_HANDLE cno_handle, DAT_EVD_FLAGS evd_flags, DAT_EVD_HANDLE * evd_handle_ptr) { return dat_evd_create(ia_handle, evd_min_qlen, DAT_HANDLE_NULL, evd_flags, evd_handle_ptr); } DAT_RETURN DT_Tdep_evd_free(DAT_EVD_HANDLE evd_handle) { return dat_evd_free(evd_handle); } DAT_RETURN DT_Tdep_evd_wait(DAT_EVD_HANDLE evd_handle, DAT_TIMEOUT timeout, DAT_EVENT * event) { DAT_COUNT count; return dat_evd_wait(evd_handle, timeout, 1, event, &count); } void DT_Tdep_PT_Printf(DT_Tdep_Print_Head * phead, const char *fmt, ...) { char buffer[256]; va_list args; va_start(args, fmt); vsprintf(buffer, fmt, args); va_end(args); printf("%s", buffer); } DAT_RETURN DT_Tdep_evd_dequeue(DAT_EVD_HANDLE evd_handle, DAT_EVENT * event) { return dat_evd_dequeue(evd_handle, event); } dapl-2.1.5/test/dtest/000077500000000000000000000000001255317474200145535ustar00rootroot00000000000000dapl-2.1.5/test/dtest/Makefile.am000077500000000000000000000011571255317474200166160ustar00rootroot00000000000000bin_PROGRAMS = dtest dtestcm dtestsrq dtest_SOURCES = dtest.c dtest_CFLAGS = -g -Wall -D_GNU_SOURCE dtestcm_SOURCES = dtestcm.c dtestcm_CFLAGS = -g -Wall -D_GNU_SOURCE dtestsrq_SOURCES = dtestsrq.c dtestsrq_CFLAGS = -g -Wall -D_GNU_SOURCE if EXT_TYPE_IB bin_PROGRAMS += dtestx dtestx_SOURCES = dtestx.c dtestx_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_EXTENSIONS dtestx_LDADD = $(top_builddir)/dat/udat/libdat2.la endif INCLUDES = -I $(srcdir)/../../dat/include dtest_LDADD = $(top_builddir)/dat/udat/libdat2.la dtestcm_LDADD = $(top_builddir)/dat/udat/libdat2.la dtestsrq_LDADD = $(top_builddir)/dat/udat/libdat2.la dapl-2.1.5/test/dtest/Makefile.in000066400000000000000000000702061255317474200166250ustar00rootroot00000000000000# Makefile.in generated by automake 1.14 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = dtest$(EXEEXT) dtestcm$(EXEEXT) dtestsrq$(EXEEXT) \ $(am__EXEEXT_1) @EXT_TYPE_IB_TRUE@am__append_1 = dtestx subdir = test/dtest DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/config/depcomp README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @EXT_TYPE_IB_TRUE@am__EXEEXT_1 = dtestx$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_dtest_OBJECTS = dtest-dtest.$(OBJEXT) dtest_OBJECTS = $(am_dtest_OBJECTS) dtest_DEPENDENCIES = $(top_builddir)/dat/udat/libdat2.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = dtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dtest_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_dtestcm_OBJECTS = dtestcm-dtestcm.$(OBJEXT) dtestcm_OBJECTS = $(am_dtestcm_OBJECTS) dtestcm_DEPENDENCIES = $(top_builddir)/dat/udat/libdat2.la dtestcm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dtestcm_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_dtestsrq_OBJECTS = dtestsrq-dtestsrq.$(OBJEXT) dtestsrq_OBJECTS = $(am_dtestsrq_OBJECTS) dtestsrq_DEPENDENCIES = $(top_builddir)/dat/udat/libdat2.la dtestsrq_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dtestsrq_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am__dtestx_SOURCES_DIST = dtestx.c @EXT_TYPE_IB_TRUE@am_dtestx_OBJECTS = dtestx-dtestx.$(OBJEXT) dtestx_OBJECTS = $(am_dtestx_OBJECTS) @EXT_TYPE_IB_TRUE@dtestx_DEPENDENCIES = \ @EXT_TYPE_IB_TRUE@ $(top_builddir)/dat/udat/libdat2.la dtestx_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dtestx_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(dtest_SOURCES) $(dtestcm_SOURCES) $(dtestsrq_SOURCES) \ $(dtestx_SOURCES) DIST_SOURCES = $(dtest_SOURCES) $(dtestcm_SOURCES) $(dtestsrq_SOURCES) \ $(am__dtestx_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dtest_SOURCES = dtest.c dtest_CFLAGS = -g -Wall -D_GNU_SOURCE dtestcm_SOURCES = dtestcm.c dtestcm_CFLAGS = -g -Wall -D_GNU_SOURCE dtestsrq_SOURCES = dtestsrq.c dtestsrq_CFLAGS = -g -Wall -D_GNU_SOURCE @EXT_TYPE_IB_TRUE@dtestx_SOURCES = dtestx.c @EXT_TYPE_IB_TRUE@dtestx_CFLAGS = -g -Wall -D_GNU_SOURCE -DDAT_EXTENSIONS @EXT_TYPE_IB_TRUE@dtestx_LDADD = $(top_builddir)/dat/udat/libdat2.la INCLUDES = -I $(srcdir)/../../dat/include dtest_LDADD = $(top_builddir)/dat/udat/libdat2.la dtestcm_LDADD = $(top_builddir)/dat/udat/libdat2.la dtestsrq_LDADD = $(top_builddir)/dat/udat/libdat2.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/dtest/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu test/dtest/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list dtest$(EXEEXT): $(dtest_OBJECTS) $(dtest_DEPENDENCIES) $(EXTRA_dtest_DEPENDENCIES) @rm -f dtest$(EXEEXT) $(AM_V_CCLD)$(dtest_LINK) $(dtest_OBJECTS) $(dtest_LDADD) $(LIBS) dtestcm$(EXEEXT): $(dtestcm_OBJECTS) $(dtestcm_DEPENDENCIES) $(EXTRA_dtestcm_DEPENDENCIES) @rm -f dtestcm$(EXEEXT) $(AM_V_CCLD)$(dtestcm_LINK) $(dtestcm_OBJECTS) $(dtestcm_LDADD) $(LIBS) dtestsrq$(EXEEXT): $(dtestsrq_OBJECTS) $(dtestsrq_DEPENDENCIES) $(EXTRA_dtestsrq_DEPENDENCIES) @rm -f dtestsrq$(EXEEXT) $(AM_V_CCLD)$(dtestsrq_LINK) $(dtestsrq_OBJECTS) $(dtestsrq_LDADD) $(LIBS) dtestx$(EXEEXT): $(dtestx_OBJECTS) $(dtestx_DEPENDENCIES) $(EXTRA_dtestx_DEPENDENCIES) @rm -f dtestx$(EXEEXT) $(AM_V_CCLD)$(dtestx_LINK) $(dtestx_OBJECTS) $(dtestx_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtest-dtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtestcm-dtestcm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtestsrq-dtestsrq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtestx-dtestx.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< dtest-dtest.o: dtest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtest_CFLAGS) $(CFLAGS) -MT dtest-dtest.o -MD -MP -MF $(DEPDIR)/dtest-dtest.Tpo -c -o dtest-dtest.o `test -f 'dtest.c' || echo '$(srcdir)/'`dtest.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtest-dtest.Tpo $(DEPDIR)/dtest-dtest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtest.c' object='dtest-dtest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtest_CFLAGS) $(CFLAGS) -c -o dtest-dtest.o `test -f 'dtest.c' || echo '$(srcdir)/'`dtest.c dtest-dtest.obj: dtest.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtest_CFLAGS) $(CFLAGS) -MT dtest-dtest.obj -MD -MP -MF $(DEPDIR)/dtest-dtest.Tpo -c -o dtest-dtest.obj `if test -f 'dtest.c'; then $(CYGPATH_W) 'dtest.c'; else $(CYGPATH_W) '$(srcdir)/dtest.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtest-dtest.Tpo $(DEPDIR)/dtest-dtest.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtest.c' object='dtest-dtest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtest_CFLAGS) $(CFLAGS) -c -o dtest-dtest.obj `if test -f 'dtest.c'; then $(CYGPATH_W) 'dtest.c'; else $(CYGPATH_W) '$(srcdir)/dtest.c'; fi` dtestcm-dtestcm.o: dtestcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestcm_CFLAGS) $(CFLAGS) -MT dtestcm-dtestcm.o -MD -MP -MF $(DEPDIR)/dtestcm-dtestcm.Tpo -c -o dtestcm-dtestcm.o `test -f 'dtestcm.c' || echo '$(srcdir)/'`dtestcm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestcm-dtestcm.Tpo $(DEPDIR)/dtestcm-dtestcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestcm.c' object='dtestcm-dtestcm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestcm_CFLAGS) $(CFLAGS) -c -o dtestcm-dtestcm.o `test -f 'dtestcm.c' || echo '$(srcdir)/'`dtestcm.c dtestcm-dtestcm.obj: dtestcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestcm_CFLAGS) $(CFLAGS) -MT dtestcm-dtestcm.obj -MD -MP -MF $(DEPDIR)/dtestcm-dtestcm.Tpo -c -o dtestcm-dtestcm.obj `if test -f 'dtestcm.c'; then $(CYGPATH_W) 'dtestcm.c'; else $(CYGPATH_W) '$(srcdir)/dtestcm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestcm-dtestcm.Tpo $(DEPDIR)/dtestcm-dtestcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestcm.c' object='dtestcm-dtestcm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestcm_CFLAGS) $(CFLAGS) -c -o dtestcm-dtestcm.obj `if test -f 'dtestcm.c'; then $(CYGPATH_W) 'dtestcm.c'; else $(CYGPATH_W) '$(srcdir)/dtestcm.c'; fi` dtestsrq-dtestsrq.o: dtestsrq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestsrq_CFLAGS) $(CFLAGS) -MT dtestsrq-dtestsrq.o -MD -MP -MF $(DEPDIR)/dtestsrq-dtestsrq.Tpo -c -o dtestsrq-dtestsrq.o `test -f 'dtestsrq.c' || echo '$(srcdir)/'`dtestsrq.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestsrq-dtestsrq.Tpo $(DEPDIR)/dtestsrq-dtestsrq.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestsrq.c' object='dtestsrq-dtestsrq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestsrq_CFLAGS) $(CFLAGS) -c -o dtestsrq-dtestsrq.o `test -f 'dtestsrq.c' || echo '$(srcdir)/'`dtestsrq.c dtestsrq-dtestsrq.obj: dtestsrq.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestsrq_CFLAGS) $(CFLAGS) -MT dtestsrq-dtestsrq.obj -MD -MP -MF $(DEPDIR)/dtestsrq-dtestsrq.Tpo -c -o dtestsrq-dtestsrq.obj `if test -f 'dtestsrq.c'; then $(CYGPATH_W) 'dtestsrq.c'; else $(CYGPATH_W) '$(srcdir)/dtestsrq.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestsrq-dtestsrq.Tpo $(DEPDIR)/dtestsrq-dtestsrq.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestsrq.c' object='dtestsrq-dtestsrq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestsrq_CFLAGS) $(CFLAGS) -c -o dtestsrq-dtestsrq.obj `if test -f 'dtestsrq.c'; then $(CYGPATH_W) 'dtestsrq.c'; else $(CYGPATH_W) '$(srcdir)/dtestsrq.c'; fi` dtestx-dtestx.o: dtestx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestx_CFLAGS) $(CFLAGS) -MT dtestx-dtestx.o -MD -MP -MF $(DEPDIR)/dtestx-dtestx.Tpo -c -o dtestx-dtestx.o `test -f 'dtestx.c' || echo '$(srcdir)/'`dtestx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestx-dtestx.Tpo $(DEPDIR)/dtestx-dtestx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestx.c' object='dtestx-dtestx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestx_CFLAGS) $(CFLAGS) -c -o dtestx-dtestx.o `test -f 'dtestx.c' || echo '$(srcdir)/'`dtestx.c dtestx-dtestx.obj: dtestx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestx_CFLAGS) $(CFLAGS) -MT dtestx-dtestx.obj -MD -MP -MF $(DEPDIR)/dtestx-dtestx.Tpo -c -o dtestx-dtestx.obj `if test -f 'dtestx.c'; then $(CYGPATH_W) 'dtestx.c'; else $(CYGPATH_W) '$(srcdir)/dtestx.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dtestx-dtestx.Tpo $(DEPDIR)/dtestx-dtestx.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dtestx.c' object='dtestx-dtestx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dtestx_CFLAGS) $(CFLAGS) -c -o dtestx-dtestx.obj `if test -f 'dtestx.c'; then $(CYGPATH_W) 'dtestx.c'; else $(CYGPATH_W) '$(srcdir)/dtestx.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dapl-2.1.5/test/dtest/README000066400000000000000000000010271255317474200154330ustar00rootroot00000000000000simple dapl test just for initial openIB uDAPL testing... dtest/dtest.c dtest/makefile dtest/dat.conf to build (default uDAPL name == IB1, ib device == mthca0, port == 1) edit makefile and change path (DAT_LIB) to appropriate libdat.so edit dat.conf and change path to appropriate libdapl.so cp dat.conf to /etc/dat.conf to run: server: dtest client: dtest -h hostname for verbose uDAPL and uDAT debug: export DAPL_DBG_TYPE=0xffff export DAT_DBG_TYPE=0xffff dapl-2.1.5/test/dtest/dtest.c000077500000000000000000002130131255317474200160450ustar00rootroot00000000000000/* * Copyright (c) 2005-2008 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * $Id: $ */ #include #include #include #ifdef DAPL_PROVIDER #undef DAPL_PROVIDER #endif #if defined(_WIN32) || defined(_WIN64) #include #include #include #include #include #include #include "..\..\..\..\etc\user\getopt.c" #define getpid() ((int)GetCurrentProcessId()) #define F64x "%I64x" #ifdef DBG #define DAPL_PROVIDER "ibnic0v2d" #else #define DAPL_PROVIDER "ibnic0v2" #endif #define ntohll _byteswap_uint64 #define htonll _byteswap_uint64 #else // _WIN32 || _WIN64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DAPL_PROVIDER "ofa-v2-mlx4_0-1u" #define F64x "%"PRIx64"" #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #endif // _WIN32 || _WIN64 /* Debug: 1 == connect & close only, otherwise full-meal deal */ #define CONNECT_ONLY 0 #define MAX_POLLING_CNT 50000 #define MAX_RDMA_RD 4 #define MAX_PROCS 1000 /* Header files needed for DAT/uDAPL */ #include "dat2/udat.h" #include "dat2/dat_ib_extensions.h" /* definitions */ #define SERVER_CONN_QUAL 45248 #define DTO_TIMEOUT (1000*1000*5) #define CNO_TIMEOUT (1000*1000*1) #define DTO_FLUSH_TIMEOUT (1000*1000*2) #define CONN_TIMEOUT (1000*1000*100) #define SERVER_TIMEOUT DAT_TIMEOUT_INFINITE #define RDMA_BUFFER_SIZE (4*1024*1024) /* Global DAT vars */ static DAT_IA_HANDLE h_ia = DAT_HANDLE_NULL; static DAT_PZ_HANDLE h_pz = DAT_HANDLE_NULL; static DAT_EP_HANDLE h_ep = DAT_HANDLE_NULL; static DAT_PSP_HANDLE h_psp = DAT_HANDLE_NULL; static DAT_CR_HANDLE h_cr = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_async_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_req_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_rcv_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_cr_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_conn_evd = DAT_HANDLE_NULL; static DAT_CNO_HANDLE h_dto_cno = DAT_HANDLE_NULL; /* RDMA buffers */ static DAT_LMR_HANDLE h_lmr_send = DAT_HANDLE_NULL; static DAT_LMR_HANDLE h_lmr_recv = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT lmr_context_send; static DAT_LMR_CONTEXT lmr_context_recv; static DAT_RMR_CONTEXT rmr_context_send; static DAT_RMR_CONTEXT rmr_context_recv; static DAT_VLEN registered_size_send; static DAT_VLEN registered_size_recv; static DAT_VADDR registered_addr_send; static DAT_VADDR registered_addr_recv; /* Initial msg receive buf, RMR exchange, and Rdma-write notification */ #define MSG_BUF_COUNT 3 #define MSG_IOV_COUNT 1 static DAT_LMR_HANDLE h_lmr_recv_msg = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT lmr_context_recv_msg; static DAT_RMR_CONTEXT rmr_context_recv_msg; static DAT_VLEN registered_size_recv_msg; static DAT_VADDR registered_addr_recv_msg; /* message send buffer */ static DAT_LMR_HANDLE h_lmr_send_msg = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT lmr_context_send_msg; static DAT_RMR_CONTEXT rmr_context_send_msg; static DAT_VLEN registered_size_send_msg; static DAT_VADDR registered_addr_send_msg; static DAT_EP_ATTR ep_attr; char hostname[256] = { 0 }; char provider[64] = DAPL_PROVIDER; char addr_str[INET_ADDRSTRLEN]; /* allocate RMR message buffers page aligned */ static DAT_RMR_TRIPLET *p_rmr_rcv; static DAT_RMR_TRIPLET *p_rmr_snd; /* rdma pointers */ char *rbuf = NULL; char *sbuf = NULL; int status; /* timers */ double start, stop, total_us, total_sec; struct dt_time { double total; double open; double reg; double unreg; double pzc; double pzf; double evdc; double evdf; double cnoc; double cnof; double epc; double epf; double rdma_wr; double rdma_rd[MAX_RDMA_RD]; double rdma_rd_total; double rtt; double close; double conn; }; struct dt_time ts; /* defaults */ static int failed = 0; static int uni_direction = 0; static int align_data=1; static int rdma_read = 0; static int write_only = 0; static int write_immed = 0; static int performance_times = 0; static int connected = 0; static int burst = 100; static int signal_rate = 10; static int server = 1; static int verbose = 0; static int polling = 0; static int poll_count = 0; static int rdma_wr_poll_count = 0; static int conn_poll_count = 0; static int rdma_rd_poll_count[MAX_RDMA_RD] = { 0 }; static int delay = 0; static int buf_len = RDMA_BUFFER_SIZE; static int use_cno = 0; static int recv_msg_index = 0; static int burst_msg_posted = 0; static int burst_msg_index = 0; static int ucm = 0; static int rq_cnt, sq_cnt; static DAT_SOCK_ADDR6 remote; /* forward prototypes */ const char *DT_RetToStr(DAT_RETURN ret_value); const char *DT_EventToStr(DAT_EVENT_NUMBER event_code); void print_usage(void); double get_time(void); void init_data(void); DAT_RETURN send_msg(void *data, DAT_COUNT size, DAT_LMR_CONTEXT context, DAT_DTO_COOKIE cookie, DAT_COMPLETION_FLAGS flags); DAT_RETURN connect_ep(char *hostname, DAT_CONN_QUAL conn_id, struct sockaddr *ser_sa); void disconnect_ep(void); DAT_RETURN register_rdma_memory(void); DAT_RETURN unregister_rdma_memory(void); DAT_RETURN create_events(void); DAT_RETURN destroy_events(void); DAT_RETURN do_rdma_write_imm_with_msg(void); DAT_RETURN do_rdma_write_with_msg(void); DAT_RETURN do_rdma_read_with_msg(void); DAT_RETURN do_ping_pong_msg(void); #define LOGPRINTF if (verbose) printf #define CONN_PORT 15828 #define CONN_MSG_SIZE 128 /* The Format of the message we pass through sockets */ #define CONN_MSG_FMT "%04hx:%08x:%08x:%08x:%s" void flush_evds(void) { DAT_EVENT event; /* Flush async error queue */ printf("%d ERR: Checking ASYNC EVD...\n", getpid()); while (dat_evd_dequeue(h_async_evd, &event) == DAT_SUCCESS) { printf(" ASYNC EVD ENTRY: handle=%p reason=%d\n", event.event_data.asynch_error_event_data.dat_handle, event.event_data.asynch_error_event_data.reason); } /* Flush receive queue */ printf("%d ERR: Checking RECEIVE EVD...\n", getpid()); while (dat_evd_dequeue(h_dto_rcv_evd, &event) == DAT_SUCCESS) { printf(" RCV EVD ENTRY: op=%d stat=%d ln=%d ck="F64x"\n", event.event_data.dto_completion_event_data.operation, event.event_data.dto_completion_event_data.status, event.event_data.dto_completion_event_data.transfered_length, event.event_data.dto_completion_event_data.user_cookie.as_64); } /* Flush request queue */ printf("%d ERR: Checking REQUEST EVD...\n", getpid()); while (dat_evd_dequeue(h_dto_req_evd, &event) == DAT_SUCCESS) { printf(" REQ EVD ENTRY: op=%d stat=%d ln=%d ck="F64x"\n", event.event_data.dto_completion_event_data.operation, event.event_data.dto_completion_event_data.status, event.event_data.dto_completion_event_data.transfered_length, event.event_data.dto_completion_event_data.user_cookie.as_64); } } static inline DAT_RETURN collect_event(DAT_EVD_HANDLE dto_evd, DAT_EVENT *event, DAT_TIMEOUT timeout, int *counter) { DAT_EVD_HANDLE evd = DAT_HANDLE_NULL; DAT_COUNT nmore; DAT_RETURN ret = DAT_SUCCESS; if (use_cno) { retry: /* CNO wait could return EVD's in any order and * may drop some EVD notification's if already * triggered. Once woken, simply dequeue the * Evd the caller wants to collect and return. * If notification without EVD, retry. */ ret = dat_cno_wait(h_dto_cno, CNO_TIMEOUT, &evd); if (dat_evd_dequeue(dto_evd, event) != DAT_SUCCESS) { if (ret == DAT_SUCCESS) printf(" WARNING: CNO notification:" " without EVD?\n"); goto retry; } ret = DAT_SUCCESS; /* cno timed out, but EVD dequeued */ } else if (!polling) { /* use wait to dequeue */ ret = dat_evd_wait(dto_evd, timeout, 1, event, &nmore); if (ret != DAT_SUCCESS) fprintf(stderr, "Error waiting on h_dto_evd %p: %s\n", dto_evd, DT_RetToStr(ret)); } else { while (dat_evd_dequeue(dto_evd, event) == DAT_QUEUE_EMPTY) if (counter) (*counter)++; } return (ret); } static void print_ia_address(struct sockaddr *sa) { char str[INET6_ADDRSTRLEN] = {" ??? "}; switch(sa->sa_family) { case AF_INET: inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET - %s port %d\n", getpid(), str, SERVER_CONN_QUAL); break; case AF_INET6: inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET6 - %s flowinfo(QPN)=0x%x, port(LID)=0x%x\n", getpid(), str, ntohl(((struct sockaddr_in6 *)sa)->sin6_flowinfo), ntohs(((struct sockaddr_in6 *)sa)->sin6_port)); break; default: printf("%d Local Address UNKOWN FAMILY - port %d\n", getpid(), SERVER_CONN_QUAL); } } int conn_client_connect(const char *servername, int port) { struct addrinfo *res, *t; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; char *service; int n; int sockfd = -1; if (asprintf(&service, "%d", port) < 0) return -1; n = getaddrinfo(servername, service, &hints, &res); if (n < 0) { fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port); return n; } for (t = res; t; t = t->ai_next) { sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol); if (sockfd >= 0) { if (!connect(sockfd, t->ai_addr, t->ai_addrlen)) break; close(sockfd); sockfd = -1; } } freeaddrinfo(res); if (sockfd < 0) { fprintf(stderr, "Couldn't connect to %s:%d\n", servername, port); return sockfd; } return sockfd; } int conn_server_connect(int port) { struct addrinfo *res, *t; struct addrinfo hints = { .ai_flags = AI_PASSIVE, .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; char *service; int sockfd = -1, connfd; int n; if (asprintf(&service, "%d", port) < 0) return -1; n = getaddrinfo(NULL, service, &hints, &res); if (n < 0) { fprintf(stderr, "%s for port %d\n", gai_strerror(n), port); return n; } for (t = res; t; t = t->ai_next) { sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol); if (sockfd >= 0) { n = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n); if (!bind(sockfd, t->ai_addr, t->ai_addrlen)) break; close(sockfd); sockfd = -1; } } freeaddrinfo(res); if (sockfd < 0) { fprintf(stderr, "Couldn't listen to port %d\n", port); return sockfd; } listen(sockfd, 1); connfd = accept(sockfd, NULL, 0); if (connfd < 0) { perror("server accept"); fprintf(stderr, "accept() failed\n"); close(sockfd); return connfd; } close(sockfd); return connfd; } static int get_server_params(void) { int connfd, parsed; char msg[CONN_MSG_SIZE]; in_port_t ser_lid = 0; uint32_t ser_qpn = 0, ser_scope_id = 0, ser_sin_addr = 0; struct in_addr sin_addr; /* Internet address. */ connfd = conn_client_connect(hostname, CONN_PORT); if (connfd < 0) { fprintf(stderr, "%d Could not connect to %s\n", getpid(), hostname); return -1; } if (read(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't read remote address\n", getpid()); return -1; } parsed = sscanf(msg, CONN_MSG_FMT, &ser_lid, &ser_qpn, &ser_scope_id, &ser_sin_addr, provider); if (parsed != 5) { fprintf(stderr, "%d Couldn't parse line <%.*s>\n", getpid(), (int)sizeof msg, msg); return -1; } if (ser_sin_addr) { sin_addr.s_addr = ser_sin_addr; inet_ntop(AF_INET, &sin_addr, hostname, INET6_ADDRSTRLEN); LOGPRINTF("%d remote data: provider %s hostname %s\n", getpid(), provider, hostname); } else if (ser_lid && ser_qpn) { remote.sin6_family = AF_INET6; remote.sin6_port = ser_lid; remote.sin6_flowinfo = ser_qpn; remote.sin6_scope_id = ntohl(ser_scope_id); ucm = 1; LOGPRINTF("%d remote data: provider %s Client QPN 0x%x," " LID = 0x%x, scope_id 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(ser_scope_id)); } else { fprintf(stderr, "%d No valid data was received" " from the server\n", getpid()); return -1; } return 0; } static int send_server_params(struct sockaddr *ser_sa) { in_port_t ser_lid = 0; uint32_t ser_qpn = 0, scope_id = 0, ser_sin_addr = 0; int connfd; char msg[CONN_MSG_SIZE]; if (!ser_sa) { printf("%d no address\n", getpid()); return -1; } if (ser_sa->sa_family == AF_INET6) { ser_qpn = ((struct sockaddr_in6 *)ser_sa)->sin6_flowinfo; ser_lid = ((struct sockaddr_in6 *)ser_sa)->sin6_port; scope_id = htonl(((struct sockaddr_in6 *)ser_sa)->sin6_scope_id); LOGPRINTF("%d Server data to client: provider %s QPN 0x%x LID" " = 0x%x SCCOPE_ID 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(scope_id)); } else if (ser_sa->sa_family == AF_INET) { ser_sin_addr = ((struct sockaddr_in *)ser_sa)->sin_addr.s_addr; LOGPRINTF("%d Server data to client: provider %s SIN_ADDR" " 0x%x\n", getpid(), provider, ser_sin_addr); } connfd = conn_server_connect(CONN_PORT); if (connfd < 0) { fprintf(stderr, "%d Failed to connect to client\n", getpid()); return -1; } sprintf(msg, CONN_MSG_FMT, ser_lid, ser_qpn, scope_id, ser_sin_addr, provider); if (write(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't send data", getpid()); return -1; } return 0; } int main(int argc, char **argv) { int i, c; DAT_RETURN ret; DAT_EP_PARAM ep_param; DAT_IA_ATTR ia_attr; DAT_PROVIDER_ATTR pr_attr; /* parse arguments */ while ((c = getopt(argc, argv, "auwtscvpb:d:B:h:P:S:")) != -1) { switch (c) { case 'a': align_data = 1; fflush(stdout); break; case 'u': uni_direction = 1; fflush(stdout); break; case 'w': write_only = 1; fflush(stdout); break; case 't': performance_times = 1; fflush(stdout); break; case 's': server = 1; fflush(stdout); break; case 'c': use_cno = 1; printf("%d Creating CNO for DTO EVD's\n", getpid()); fflush(stdout); break; case 'v': verbose = 1; printf("%d Verbose\n", getpid()); fflush(stdout); break; case 'p': polling = 1; printf("%d Polling\n", getpid()); fflush(stdout); break; case 'B': burst = atoi(optarg); break; case 'd': delay = atoi(optarg); break; case 'b': buf_len = atoi(optarg); break; case 'h': server = 0; strcpy(hostname, optarg); break; case 'P': strcpy(provider, optarg); break; case 'S': signal_rate = atoi(optarg); break; default: print_usage(); exit(-12); } } #if defined(_WIN32) || defined(_WIN64) { WSADATA wsaData; i = WSAStartup(MAKEWORD(2, 2), &wsaData); if (i != 0) { printf("%s WSAStartup(2.2) failed? (0x%x)\n", argv[0], i); fflush(stdout); exit(1); } } #endif memset(&ts, 0, sizeof(struct dt_time)); if (signal_rate > burst) signal_rate = burst; rq_cnt = MSG_BUF_COUNT + (burst); sq_cnt = MSG_BUF_COUNT + MAX_RDMA_RD + signal_rate; if (!server) { printf("%d Running as client - waiting for server input\n", getpid()); if (get_server_params()) { printf("%d Failed to get server parameters\n", getpid()); exit(1); } printf("%d Running as %s client v2 \n", getpid(), provider); } else { printf("%d Running as server - %s v2 \n", getpid(), provider); } fflush(stdout); if (align_data) { /* allocate send and receive buffers */ if (posix_memalign((void**)&rbuf, 4096, buf_len * (burst+1)) || posix_memalign((void**)&sbuf, 4096, buf_len * (burst+1))) { perror("malloc"); exit(1); } } else { /* allocate send and receive buffers */ if (((rbuf = malloc(buf_len * (burst+1))) == NULL) || ((sbuf = malloc(buf_len * (burst+1))) == NULL)) { perror("malloc"); exit(1); } } LOGPRINTF("%d Allocated RDMA buffers (r:%p,s:%p) len %d \n", getpid(), rbuf, sbuf, buf_len); if (posix_memalign((void**)&p_rmr_rcv, 4096, 4096) || posix_memalign((void**)&p_rmr_snd, 4096, 4096)) { perror("malloc"); exit(1); } LOGPRINTF("%d Allocated RMR buffers (r:%p,s:%p) len %d \n", getpid(), p_rmr_rcv, p_rmr_snd, 4096); /* dat_ia_open, dat_pz_create */ h_async_evd = DAT_HANDLE_NULL; start = get_time(); ret = dat_ia_open(provider, 8, &h_async_evd, &h_ia); stop = get_time(); ts.open += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: Error Adaptor open: %s\n", getpid(), DT_RetToStr(ret)); exit(1); } else LOGPRINTF("%d Opened Interface Adaptor\n", getpid()); ret = dat_ia_query(h_ia, 0, DAT_IA_FIELD_ALL, &ia_attr, DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR, &pr_attr); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: Error Adaptor query: %s\n", getpid(), DT_RetToStr(ret)); exit(1); } print_ia_address(ia_attr.ia_address_ptr); if (ia_attr.extension_supported == DAT_EXTENSION_IB) write_immed = 1; /* Provider specific attributes */ for (i=0; imax_private_data_size = %d\n", getpid(), pr_attr.max_private_data_size); /* Create Protection Zone */ start = get_time(); LOGPRINTF("%d Create Protection Zone\n", getpid()); ret = dat_pz_create(h_ia, &h_pz); stop = get_time(); ts.pzc += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error creating Protection Zone: %s\n", getpid(), DT_RetToStr(ret)); exit(1); } else LOGPRINTF("%d Created Protection Zone\n", getpid()); /* Register memory */ LOGPRINTF("%d Register RDMA memory\n", getpid()); ret = register_rdma_memory(); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering RDMA memory: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d Register RDMA memory done\n", getpid()); LOGPRINTF("%d Create events\n", getpid()); ret = create_events(); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error creating events: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else { LOGPRINTF("%d Create events done\n", getpid()); } /* create EP */ memset(&ep_attr, 0, sizeof(ep_attr)); ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_rdma_size = 0x10000; ep_attr.qos = 0; ep_attr.recv_completion_flags = 0; ep_attr.max_recv_dtos = MSG_BUF_COUNT + (burst * 3); ep_attr.max_request_dtos = MSG_BUF_COUNT + (burst * 3) + MAX_RDMA_RD; ep_attr.max_recv_iov = MSG_IOV_COUNT; ep_attr.max_request_iov = MSG_IOV_COUNT; ep_attr.max_rdma_read_in = MAX_RDMA_RD; ep_attr.max_rdma_read_out = MAX_RDMA_RD; ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; ep_attr.ep_transport_specific_count = 0; ep_attr.ep_transport_specific = NULL; ep_attr.ep_provider_specific_count = 0; ep_attr.ep_provider_specific = NULL; start = get_time(); ret = dat_ep_create(h_ia, h_pz, h_dto_rcv_evd, h_dto_req_evd, h_conn_evd, &ep_attr, &h_ep); stop = get_time(); ts.epc += ((stop - start) * 1.0e6); ts.total += ts.epc; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_ep_create: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d EP created %p \n", getpid(), h_ep); /* * register message buffers, establish connection, and * exchange DMA RMR information info via messages */ ret = connect_ep(hostname, SERVER_CONN_QUAL, ia_attr.ia_address_ptr); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error connect_ep: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d connect_ep complete\n", getpid()); /* Query EP for local and remote address information, print */ ret = dat_ep_query(h_ep, DAT_EP_FIELD_ALL, &ep_param); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_ep_query: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d EP queried %p \n", getpid(), h_ep); #if defined(_WIN32) printf("\n%d Query EP: LOCAL addr %s port %lld\n", getpid(), inet_ntoa(((struct sockaddr_in *) ep_param.local_ia_address_ptr)->sin_addr), (ep_param.local_port_qual)); #else inet_ntop(AF_INET, &((struct sockaddr_in *)ep_param.local_ia_address_ptr)-> sin_addr, addr_str, sizeof(addr_str)); printf("\n%d Query EP: LOCAL addr %s port " F64x "\n", getpid(), addr_str, (ep_param.local_port_qual)); #endif #if defined(_WIN32) printf("%d Query EP: REMOTE addr %s port %lld\n", getpid(), inet_ntoa(((struct sockaddr_in *) ep_param.local_ia_address_ptr)->sin_addr), (ep_param.remote_port_qual)); #else inet_ntop(AF_INET, &((struct sockaddr_in *)ep_param.remote_ia_address_ptr)-> sin_addr, addr_str, sizeof(addr_str)); printf("%d Query EP: REMOTE addr %s port " F64x "\n", getpid(), addr_str, (ep_param.remote_port_qual)); #endif fflush(stdout); #if CONNECT_ONLY #if defined(_WIN32) || defined(_WIN64) Sleep(1 * 1000); #else sleep(1); #endif goto cleanup; #endif /*********** RDMA write data *************/ if ((write_immed) && (write_only)) ret = do_rdma_write_imm_with_msg(); else ret = do_rdma_write_with_msg(); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error do_rdma_write_%swith_msg: %s\n", getpid(), write_immed ? "imm_":"", DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d do_rdma_write_%swith_msg complete\n", getpid(), write_immed ? "imm_":""); if (write_only || !rdma_read) goto complete; /*********** RDMA read data *************/ ret = do_rdma_read_with_msg(); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error do_rdma_read_with_msg: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else LOGPRINTF("%d do_rdma_read_with_msg complete\n", getpid()); /*********** PING PING messages ************/ ret = do_ping_pong_msg(); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error do_ping_pong_msg: %s\n", getpid(), DT_RetToStr(ret)); goto cleanup; } else { LOGPRINTF("%d do_ping_pong_msg complete\n", getpid()); goto complete; } cleanup: flush_evds(); failed++; complete: /* disconnect and free EP resources */ if (h_ep != DAT_HANDLE_NULL) { /* unregister message buffers and tear down connection */ LOGPRINTF("%d Disconnect and Free EP %p \n", getpid(), h_ep); disconnect_ep(); /* free EP */ LOGPRINTF("%d Free EP %p \n", getpid(), h_ep); start = get_time(); ret = dat_ep_free(h_ep); stop = get_time(); ts.epf += ((stop - start) * 1.0e6); ts.total += ts.epf; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing EP: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d Freed EP\n", getpid()); h_ep = DAT_HANDLE_NULL; } } /* free EVDs */ LOGPRINTF("%d destroy events\n", getpid()); ret = destroy_events(); if (ret != DAT_SUCCESS) fprintf(stderr, "%d Error destroy_events: %s\n", getpid(), DT_RetToStr(ret)); else LOGPRINTF("%d destroy events done\n", getpid()); ret = unregister_rdma_memory(); LOGPRINTF("%d unregister_rdma_memory \n", getpid()); if (ret != DAT_SUCCESS) fprintf(stderr, "%d Error unregister_rdma_memory: %s\n", getpid(), DT_RetToStr(ret)); else LOGPRINTF("%d unregister_rdma_memory done\n", getpid()); /* Free protection domain */ LOGPRINTF("%d Freeing pz\n", getpid()); start = get_time(); ret = dat_pz_free(h_pz); stop = get_time(); ts.pzf += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing PZ: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d Freed pz\n", getpid()); h_pz = NULL; } /* close the device */ LOGPRINTF("%d Closing Interface Adaptor\n", getpid()); start = get_time(); ret = dat_ia_close(h_ia, DAT_CLOSE_ABRUPT_FLAG); stop = get_time(); ts.close += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: Error Adaptor close: %s\n", getpid(), DT_RetToStr(ret)); } else LOGPRINTF("%d Closed Interface Adaptor\n", getpid()); /* free rdma buffers */ free(rbuf); free(sbuf); if (ts.rtt) printf("%d: Message RTT: Total=%6.2lf usec, %d bursts, itime=%6.2lf usec, pc=%d\n", getpid(), ts.rtt, burst, ts.rtt / burst, poll_count); if (ts.rdma_wr && (!server || (server && !uni_direction))) { int msgs = uni_direction ? burst : burst * 2; printf("\n%d: RDMA write (%s): Total=%6.2lf usec, itime=%6.2lf us, poll=%d, %d x %d, %4.2lf MB/sec\n", getpid(), uni_direction ? "uni-direction" : "bi-direction", ts.rdma_wr, ts.rdma_wr / msgs, rdma_wr_poll_count, msgs, buf_len, (double)(1/(ts.rdma_wr/msgs/buf_len))); } if (!performance_times) goto finish; for (i = 0; i < MAX_RDMA_RD; i++) { printf("%d: RDMA read: Total=%10.2lf usec, %d bursts, " "itime=%10.2lf usec, pc=%d\n", getpid(), ts.rdma_rd_total, MAX_RDMA_RD, ts.rdma_rd[i], rdma_rd_poll_count[i]); } printf("%d: open: %10.2lf usec\n", getpid(), ts.open); printf("%d: close: %10.2lf usec\n", getpid(), ts.close); printf("%d: PZ create: %10.2lf usec\n", getpid(), ts.pzc); printf("%d: PZ free: %10.2lf usec\n", getpid(), ts.pzf); printf("%d: LMR create:%10.2lf usec\n", getpid(), ts.reg); printf("%d: LMR free: %10.2lf usec\n", getpid(), ts.unreg); printf("%d: EVD create:%10.2lf usec\n", getpid(), ts.evdc); printf("%d: EVD free: %10.2lf usec\n", getpid(), ts.evdf); if (use_cno) { printf("%d: CNO create: %10.2lf usec\n", getpid(), ts.cnoc); printf("%d: CNO free: %10.2lf usec\n", getpid(), ts.cnof); } printf("%d: EP create: %10.2lf usec\n", getpid(), ts.epc); printf("%d: EP free: %10.2lf usec\n", getpid(), ts.epf); if (!server) printf("%d: connect: %10.2lf usec, poll_cnt=%d\n", getpid(), ts.conn, conn_poll_count); printf("%d: TOTAL: %10.2lf usec\n", getpid(), ts.total); finish: printf("\n%d: DAPL Test Complete. %s\n\n", getpid(), failed ? "FAILED" : "PASSED"); fflush(stderr); fflush(stdout); #if defined(_WIN32) || defined(_WIN64) WSACleanup(); #endif return (0); } double get_time(void) { struct timeval tp; gettimeofday(&tp, NULL); return ((double)tp.tv_sec + (double)tp.tv_usec * 1e-6); } void init_data(void) { memset(rbuf, 'a', buf_len); memset(sbuf, 'b', buf_len); } DAT_RETURN send_msg(void *data, DAT_COUNT size, DAT_LMR_CONTEXT context, DAT_DTO_COOKIE cookie, DAT_COMPLETION_FLAGS flags) { DAT_LMR_TRIPLET iov; DAT_EVENT event; DAT_RETURN ret; iov.lmr_context = context; #if defined(_WIN32) iov.virtual_address = (DAT_VADDR) data; #else iov.virtual_address = (DAT_VADDR) (unsigned long)data; #endif iov.segment_length = size; LOGPRINTF("%d calling post_send\n", getpid()); cookie.as_64 = 0xaaaa; ret = dat_ep_post_send(h_ep, 1, &iov, cookie, flags); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: dat_ep_post_send() %s\n", getpid(), DT_RetToStr(ret)); return ret; } if (!(flags & DAT_COMPLETION_SUPPRESS_FLAG)) { if (collect_event(h_dto_req_evd, &event, DTO_TIMEOUT, &poll_count) != DAT_SUCCESS) return (DAT_ABORT); /* validate event number, len, cookie, and status */ if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d: ERROR: DTO event number %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data. transfered_length != size) || (event.event_data.dto_completion_event_data.user_cookie. as_64 != 0xaaaa)) { fprintf(stderr, "%d: ERROR: DTO len %d or cookie " F64x " \n", getpid(), event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data. user_cookie.as_64); return (DAT_ABORT); } if (event.event_data.dto_completion_event_data.status != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: DTO event status %s\n", getpid(), DT_RetToStr(ret)); return (DAT_ABORT); } } return DAT_SUCCESS; } DAT_RETURN connect_ep(char *hostname, DAT_CONN_QUAL conn_id, struct sockaddr *ser_sa) { DAT_IA_ADDRESS_PTR remote_addr = (DAT_IA_ADDRESS_PTR)&remote; DAT_RETURN ret; DAT_REGION_DESCRIPTION region; DAT_EVENT event; DAT_COUNT nmore; DAT_LMR_TRIPLET l_iov; DAT_RMR_TRIPLET r_iov; DAT_DTO_COOKIE cookie; int i; unsigned char *buf; DAT_CR_PARAM cr_param = { 0 }; unsigned char pdata[48] = { 0 }; /* Register send message buffer */ LOGPRINTF("%d Registering send Message Buffer %p, len %d\n", getpid(), p_rmr_snd, (int)sizeof(DAT_RMR_TRIPLET)); region.for_va = p_rmr_snd; ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, sizeof(DAT_RMR_TRIPLET), h_pz, DAT_MEM_PRIV_LOCAL_WRITE_FLAG, DAT_VA_TYPE_VA, &h_lmr_send_msg, &lmr_context_send_msg, &rmr_context_send_msg, ®istered_size_send_msg, ®istered_addr_send_msg); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering send msg buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d Registered send Message Buffer %p \n", getpid(), region.for_va); /* Register Receive buffers */ LOGPRINTF("%d Registering Receive Message Buffer %p\n", getpid(), p_rmr_rcv); region.for_va = p_rmr_rcv; ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, sizeof(DAT_RMR_TRIPLET) * MSG_BUF_COUNT, h_pz, DAT_MEM_PRIV_LOCAL_WRITE_FLAG, DAT_VA_TYPE_VA, &h_lmr_recv_msg, &lmr_context_recv_msg, &rmr_context_recv_msg, ®istered_size_recv_msg, ®istered_addr_recv_msg); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering recv msg buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d Registered Receive Message Buffer %p\n", getpid(), region.for_va); for (i = 0; i < MSG_BUF_COUNT; i++) { cookie.as_64 = i; l_iov.lmr_context = lmr_context_recv_msg; #if defined(_WIN32) l_iov.virtual_address = (DAT_VADDR) &p_rmr_rcv[i]; #else l_iov.virtual_address = (DAT_VADDR) (unsigned long)&p_rmr_rcv[i]; #endif l_iov.segment_length = sizeof(DAT_RMR_TRIPLET); LOGPRINTF("%d Posting Receive Message Buffer %p\n", getpid(), &p_rmr_rcv[i]); ret = dat_ep_post_recv(h_ep, 1, &l_iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering recv msg buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d Registered Receive Message Buffer %p\n", getpid(), region.for_va); } /* setup receive rdma buffer to initial string to be overwritten */ strcpy((char *)rbuf, "blah, blah, blah\n"); /* clear event structure */ memset(&event, 0, sizeof(DAT_EVENT)); if (server) { /* SERVER */ /* Exchange info with client */ printf("%d Server is waiting for client connection to send" " server info\n", getpid()); if (send_server_params(ser_sa)) { printf("%d Failed to send server params\n", getpid()); return -1; } /* create the service point for server listen */ LOGPRINTF("%d Creating service point for listen\n", getpid()); ret = dat_psp_create(h_ia, conn_id, h_cr_evd, DAT_PSP_CONSUMER_FLAG, &h_psp); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_psp_create: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d dat_psp_created for server listen\n", getpid()); printf("%d Server waiting for connect request on port " F64x "\n", getpid(), conn_id); ret = dat_evd_wait(h_cr_evd, SERVER_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_wait: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d dat_evd_wait for cr_evd completed\n", getpid()); if (event.event_number != DAT_CONNECTION_REQUEST_EVENT) { fprintf(stderr, "%d Error unexpected cr event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.cr_arrival_event_data.conn_qual != SERVER_CONN_QUAL) || (event.event_data.cr_arrival_event_data.sp_handle. psp_handle != h_psp)) { fprintf(stderr, "%d Error wrong cr event data : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } /* use to test rdma_cma timeout logic */ #if defined(_WIN32) || defined(_WIN64) if (delay) Sleep(delay * 1000); #else if (delay) sleep(delay); #endif /* accept connect request from client */ h_cr = event.event_data.cr_arrival_event_data.cr_handle; LOGPRINTF("%d Accepting connect request from client\n", getpid()); /* private data - check and send it back */ dat_cr_query(h_cr, DAT_CSP_FIELD_ALL, &cr_param); buf = (unsigned char *)cr_param.private_data; LOGPRINTF("%d CONN REQUEST Private Data %p[0]=%d [47]=%d\n", getpid(), buf, buf[0], buf[47]); for (i = 0; i < 48; i++) { if (buf[i] != i + 1) { fprintf(stderr, "%d Error with CONNECT REQUEST" " private data: %p[%d]=%d s/be %d\n", getpid(), buf, i, buf[i], i + 1); dat_cr_reject(h_cr, 0, NULL); return (DAT_ABORT); } buf[i]++; /* change for trip back */ } #ifdef TEST_REJECT_WITH_PRIVATE_DATA printf("%d REJECT request with 48 bytes of private data\n", getpid()); ret = dat_cr_reject(h_cr, 48, cr_param.private_data); printf("\n%d: DAPL Test Complete. %s\n\n", getpid(), ret ? "FAILED" : "PASSED"); exit(0); #endif ret = dat_cr_accept(h_cr, h_ep, 48, cr_param.private_data); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_cr_accept: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d dat_cr_accept completed\n", getpid()); } else { /* CLIENT */ struct addrinfo *target; int rval; if (ucm) goto no_resolution; #if defined(_WIN32) || defined(_WIN64) if ((rval = getaddrinfo(hostname, "ftp", NULL, &target)) != 0) { printf("\n remote name resolution failed! %s\n", gai_strerror(rval)); exit(1); } rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr; #else if (getaddrinfo(hostname, NULL, NULL, &target) != 0) { perror("\n remote name resolution failed!"); exit(1); } rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr; #endif printf("%d Server Name: %s \n", getpid(), hostname); printf("%d Server Net Address: %d.%d.%d.%d port " F64x "\n", getpid(), (rval >> 0) & 0xff, (rval >> 8) & 0xff, (rval >> 16) & 0xff, (rval >> 24) & 0xff, conn_id); remote_addr = (DAT_IA_ADDRESS_PTR)target->ai_addr; /* IP */ no_resolution: for (i = 0; i < 48; i++) /* simple pattern in private data */ pdata[i] = i + 1; LOGPRINTF("%d Connecting to server\n", getpid()); start = get_time(); ret = dat_ep_connect(h_ep, remote_addr, conn_id, CONN_TIMEOUT, 48, (DAT_PVOID) pdata, 0, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_ep_connect: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d dat_ep_connect completed\n", getpid()); if (!ucm) freeaddrinfo(target); } printf("%d Waiting for connect response\n", getpid()); if (polling) while (DAT_GET_TYPE(dat_evd_dequeue(h_conn_evd, &event)) == DAT_QUEUE_EMPTY) conn_poll_count++; else ret = dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); if (!server) { stop = get_time(); ts.conn += ((stop - start) * 1.0e6); } #ifdef TEST_REJECT_WITH_PRIVATE_DATA if (event.event_number != DAT_CONNECTION_EVENT_PEER_REJECTED) { fprintf(stderr, "%d expected conn reject event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } /* get the reject private data and validate */ buf = (unsigned char *)event.event_data.connect_event_data.private_data; printf("%d Received REJECT with private data %p[0]=%d [47]=%d\n", getpid(), buf, buf[0], buf[47]); for (i = 0; i < 48; i++) { if (buf[i] != i + 2) { fprintf(stderr, "%d client: Error with REJECT event" " private data: %p[%d]=%d s/be %d\n", getpid(), buf, i, buf[i], i + 2); dat_ep_disconnect(h_ep, DAT_CLOSE_ABRUPT_FLAG); return (DAT_ABORT); } } printf("\n%d: DAPL Test Complete. PASSED\n\n", getpid()); exit(0); #endif if (event.event_number != DAT_CONNECTION_EVENT_ESTABLISHED) { fprintf(stderr, "%d Error unexpected conn event : 0x%x %s\n", getpid(), event.event_number, DT_EventToStr(event.event_number)); return (DAT_ABORT); } /* check private data back from server */ if (!server) { buf = (unsigned char *)event.event_data.connect_event_data. private_data; LOGPRINTF("%d CONN Private Data %p[0]=%d [47]=%d\n", getpid(), buf, buf[0], buf[47]); for (i = 0; i < 48; i++) { if (buf[i] != i + 2) { fprintf(stderr, "%d Error with CONNECT event" " private data: %p[%d]=%d s/be %d\n", getpid(), buf, i, buf[i], i + 2); dat_ep_disconnect(h_ep, DAT_CLOSE_ABRUPT_FLAG); LOGPRINTF ("%d waiting for disconnect event...\n", getpid()); dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); return (DAT_ABORT); } } } printf("\n%d CONNECTED!\n\n", getpid()); connected = 1; #if CONNECT_ONLY return 0; #endif /* * Setup our remote memory and tell the other side about it */ p_rmr_snd->virtual_address = htonll((DAT_VADDR) (uintptr_t) rbuf); p_rmr_snd->segment_length = htonl(RDMA_BUFFER_SIZE); p_rmr_snd->rmr_context = htonl(rmr_context_recv); printf("%d Send RMR msg to remote: r_key_ctx=0x%x,va=%p,len=0x%x\n", getpid(), rmr_context_recv, rbuf, RDMA_BUFFER_SIZE); ret = send_msg(p_rmr_snd, sizeof(DAT_RMR_TRIPLET), lmr_context_send_msg, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else LOGPRINTF("%d send_msg completed\n", getpid()); /* * Wait for remote RMR information for RDMA */ if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &poll_count) != DAT_SUCCESS) return (DAT_ABORT); printf("%d remote RMR data arrived!\n", getpid()); if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d Error unexpected DTO event: 0x%x %s\n", getpid(), event.event_number, DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data.transfered_length != sizeof(DAT_RMR_TRIPLET)) || (event.event_data.dto_completion_event_data.user_cookie.as_64 != recv_msg_index)) { fprintf(stderr, "ERR recv event: len=%d cookie=" F64x " expected %d/%d\n", (int)event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data.user_cookie. as_64, (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index); return (DAT_ABORT); } /* swap received RMR msg: network order to host order */ r_iov = p_rmr_rcv[recv_msg_index]; p_rmr_rcv[recv_msg_index].rmr_context = ntohl(r_iov.rmr_context); p_rmr_rcv[recv_msg_index].virtual_address = ntohll(r_iov.virtual_address); p_rmr_rcv[recv_msg_index].segment_length = ntohl(r_iov.segment_length); printf("%d Received RMR from remote: " "r_iov: r_key_ctx=%x,va=" F64x ",len=0x%x\n", getpid(), p_rmr_rcv[recv_msg_index].rmr_context, p_rmr_rcv[recv_msg_index].virtual_address, p_rmr_rcv[recv_msg_index].segment_length); recv_msg_index++; return (DAT_SUCCESS); } void disconnect_ep(void) { DAT_RETURN ret; DAT_EVENT event; DAT_COUNT nmore; if (connected) { /* * Only the client needs to call disconnect. The server _should_ be able * to just wait on the EVD associated with connection events for a * disconnect request and then exit. */ if (!server) { LOGPRINTF("%d dat_ep_disconnect\n", getpid()); ret = dat_ep_disconnect(h_ep, DAT_CLOSE_DEFAULT); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_ep_disconnect: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d dat_ep_disconnect completed\n", getpid()); } } else { LOGPRINTF("%d Server waiting for disconnect...\n", getpid()); } ret = dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_wait: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d dat_evd_wait for h_conn_evd completed\n", getpid()); } } /* destroy service point */ if ((server) && (h_psp != DAT_HANDLE_NULL)) { ret = dat_psp_free(h_psp); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_psp_free: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d dat_psp_free completed\n", getpid()); } } /* Unregister Send message Buffer */ if (h_lmr_send_msg != DAT_HANDLE_NULL) { LOGPRINTF("%d Unregister send message h_lmr %p \n", getpid(), h_lmr_send_msg); ret = dat_lmr_free(h_lmr_send_msg); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error deregistering send msg mr: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d Unregistered send message Buffer\n", getpid()); h_lmr_send_msg = NULL; } } /* Unregister recv message Buffer */ if (h_lmr_recv_msg != DAT_HANDLE_NULL) { LOGPRINTF("%d Unregister recv message h_lmr %p \n", getpid(), h_lmr_recv_msg); ret = dat_lmr_free(h_lmr_recv_msg); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error deregistering recv msg mr: %s\n", getpid(), DT_RetToStr(ret)); } else { LOGPRINTF("%d Unregistered recv message Buffer\n", getpid()); h_lmr_recv_msg = NULL; } } return; } DAT_RETURN do_rdma_write_with_msg(void) { DAT_EVENT event; DAT_LMR_TRIPLET l_iov[MSG_IOV_COUNT]; DAT_RMR_TRIPLET r_iov; DAT_DTO_COOKIE cookie; DAT_RETURN ret; int i; printf("\n %d RDMA WRITE DATA with SEND MSG\n\n", getpid()); cookie.as_64 = 0x5555; if (recv_msg_index >= MSG_BUF_COUNT) return (DAT_ABORT); /* get RMR information from previously received message */ r_iov = p_rmr_rcv[recv_msg_index - 1]; if (server) strcpy((char *)sbuf, "server RDMA write data..."); else strcpy((char *)sbuf, "client RDMA write data..."); for (i = 0; i < MSG_IOV_COUNT; i++) { l_iov[i].lmr_context = lmr_context_send; l_iov[i].segment_length = buf_len / MSG_IOV_COUNT; l_iov[i].virtual_address = (DAT_VADDR) (uintptr_t) (&sbuf[l_iov[i].segment_length * i]); LOGPRINTF("%d rdma_write iov[%d] buf=%p,len=%d\n", getpid(), i, &sbuf[l_iov[i].segment_length * i], l_iov[i].segment_length); } start = get_time(); for (i = 0; i < burst; i++) { cookie.as_64 = 0x9999; ret = dat_ep_post_rdma_write(h_ep, // ep_handle MSG_IOV_COUNT, // num_segments l_iov, // LMR cookie, // user_cookie &r_iov, // RMR DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: dat_ep_post_rdma_write() %s\n", getpid(), DT_RetToStr(ret)); return (DAT_ABORT); } LOGPRINTF("%d rdma_write # %d completed\n", getpid(), i + 1); } /* * Send RMR information a 2nd time to indicate completion * NOTE: already swapped to network order in connect_ep */ printf("%d Sending RDMA WRITE completion message\n", getpid()); ret = send_msg(p_rmr_snd, sizeof(DAT_RMR_TRIPLET), lmr_context_send_msg, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d send_msg completed\n", getpid()); } /* inbound recv event, send completion's suppressed */ if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &rdma_wr_poll_count) != DAT_SUCCESS) return (DAT_ABORT); stop = get_time(); ts.rdma_wr = ((stop - start) * 1.0e6); /* validate event number and status */ printf("%d inbound rdma_write; send message arrived!\n", getpid()); if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d Error unexpected DTO event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data.transfered_length != sizeof(DAT_RMR_TRIPLET)) || (event.event_data.dto_completion_event_data.user_cookie.as_64 != recv_msg_index)) { fprintf(stderr, "unexpected event data for receive: len=%d cookie=" F64x " exp %d/%d\n", (int)event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data.user_cookie. as_64, (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index); return (DAT_ABORT); } /* swap received RMR msg: network order to host order */ r_iov = p_rmr_rcv[recv_msg_index]; p_rmr_rcv[recv_msg_index].virtual_address = ntohll(p_rmr_rcv[recv_msg_index].virtual_address); p_rmr_rcv[recv_msg_index].segment_length = ntohl(p_rmr_rcv[recv_msg_index].segment_length); p_rmr_rcv[recv_msg_index].rmr_context = ntohl(p_rmr_rcv[recv_msg_index].rmr_context); printf("%d Received RMR from remote: " "r_iov: r_key_ctx=%x,va=" F64x ",len=0x%x\n", getpid(), p_rmr_rcv[recv_msg_index].rmr_context, p_rmr_rcv[recv_msg_index].virtual_address, p_rmr_rcv[recv_msg_index].segment_length); LOGPRINTF("%d inbound rdma_write; send msg event SUCCESS!!\n", getpid()); printf("%d %s RDMA write buffer contains: %s\n", getpid(), server ? "SERVER:" : "CLIENT:", rbuf); recv_msg_index++; return (DAT_SUCCESS); } DAT_RETURN do_rdma_write_imm_with_msg(void) { DAT_EVENT event; DAT_LMR_TRIPLET l_iov[MSG_IOV_COUNT]; DAT_RMR_TRIPLET r_iov; DAT_DTO_COOKIE cookie; DAT_RETURN ret; int i, flags = DAT_COMPLETION_SUPPRESS_FLAG; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA*) event.event_extension_data; printf("\n %d RDMA WRITE IMM DATA with SEND MSG\n\n", getpid()); cookie.as_64 = 0x5555; if (recv_msg_index >= MSG_BUF_COUNT) return (DAT_ABORT); /* get RMR information from previously received message */ r_iov = p_rmr_rcv[recv_msg_index - 1]; if (server) strcpy((char *)sbuf, "server RDMA write data..."); else strcpy((char *)sbuf, "client RDMA write data..."); for (i = 0; i < MSG_IOV_COUNT; i++) { l_iov[i].lmr_context = lmr_context_send; l_iov[i].segment_length = buf_len / MSG_IOV_COUNT; l_iov[i].virtual_address = (DAT_VADDR) (uintptr_t) (&sbuf[l_iov[i].segment_length * i]); LOGPRINTF("%d rdma_write iov[%d] buf=%p,len=%d\n", getpid(), i, &sbuf[l_iov[i].segment_length * i], l_iov[i].segment_length); } if (uni_direction && server) goto done; start = get_time(); for (i = 0; i < burst; i++) { if (i==0) sprintf(&sbuf[25],"rdma_writes= "); sprintf(&sbuf[25], "rdma writes completed == %d", i+1); sbuf[buf_len-1] = i; if (!((i+1) % signal_rate)) flags = DAT_COMPLETION_DEFAULT_FLAG; else flags = DAT_COMPLETION_SUPPRESS_FLAG; cookie.as_64 = i; LOGPRINTF("%d rdma_write # %d %s\n", getpid(), i + 1, flags ? "SUPPRESS":"SIGNAL"); /* last message is write_immed with buf_len as imm_data */ if (i == (burst - 1)) { ret = dat_ib_post_rdma_write_immed( h_ep, MSG_IOV_COUNT, l_iov, cookie, &r_iov, 0x7777, flags); } else { ret = dat_ep_post_rdma_write(h_ep, MSG_IOV_COUNT, l_iov, cookie, &r_iov, flags); } if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: dat_rdma_write() %s\n", getpid(), DT_RetToStr(ret)); return (DAT_ABORT); } LOGPRINTF("%d rdma_write # %d completed\n", getpid(), i + 1); if (flags == DAT_COMPLETION_DEFAULT_FLAG) { if (collect_event(h_dto_req_evd, &event, DTO_TIMEOUT, &rdma_wr_poll_count) != DAT_SUCCESS) return (DAT_ABORT); if (dto_event->user_cookie.as_64 != i) { fprintf(stderr, "ERROR rdma_write: cookie=" " "F64x " exp 0x%x\n", dto_event->user_cookie.as_64, i); return (DAT_ABORT); } } } done: if ((!uni_direction) || (uni_direction && server)) { /* Wait to RECEIVE the LAST message, immediate data expected */ LOGPRINTF("%d Waiting for final inbound RW_imm from peer\n", getpid()); if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &rdma_wr_poll_count) != DAT_SUCCESS) return (DAT_ABORT); if (event.event_number != (int)DAT_IB_DTO_EVENT || ext_event->type != DAT_IB_RDMA_WRITE_IMMED_DATA || ext_event->val.immed.data != 0x7777) { printf("unexpected event 0x%x type 0x%x or idata 0x%x" ", waiting for RW-IMMED #0x%x\n", event.event_number, ext_event->type, ext_event->val.immed.data, DAT_IB_DTO_EVENT); return (DAT_ABORT); } recv_msg_index++; /* Send last message received ACK message back */ cookie.as_64 = 0x9999; ret = send_msg(p_rmr_snd, sizeof(DAT_RMR_TRIPLET), lmr_context_send_msg, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d send_msg completed\n", getpid()); } } if (!uni_direction || !server) { /* Wait for my LAST message ACK from remote side */ printf("%d waiting for LAST msg ACK from remote\n", getpid()); if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &rdma_wr_poll_count) != DAT_SUCCESS) return (DAT_ABORT); printf("%d LAST rdma write ACK message arrived!\n", getpid()); if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d Error unexpected DTO event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((dto_event->transfered_length != sizeof(DAT_RMR_TRIPLET)) || (dto_event->user_cookie.as_64 != recv_msg_index)) { fprintf(stderr, "unexpected event data for receive: len=%d " "cookie=" F64x" exp %d/%d\n", (int)dto_event->transfered_length, dto_event->user_cookie.as_64, (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index); return (DAT_ABORT); } printf("%d LAST RDMA_WRITE ACK from remote \n", getpid()); } stop = get_time(); ts.rdma_wr = ((stop - start) * 1.0e6); LOGPRINTF("%d last rdma_write ACK'ed SUCCESS!!\n", getpid()); if (server || (!server && !uni_direction)) printf("%d %s RDMA write buffer contains: %s last byte=%d\n", getpid(), server ? "SERVER:" : "CLIENT:", rbuf, rbuf[buf_len-1]); if (server && uni_direction) sleep(1); recv_msg_index++; return (DAT_SUCCESS); } DAT_RETURN do_rdma_read_with_msg(void) { DAT_EVENT event; DAT_LMR_TRIPLET l_iov; DAT_RMR_TRIPLET r_iov; DAT_DTO_COOKIE cookie; DAT_RETURN ret; int i; printf("\n %d RDMA READ DATA with SEND MSG\n\n", getpid()); if (recv_msg_index >= MSG_BUF_COUNT) return (DAT_ABORT); /* get RMR information from previously received message */ r_iov = p_rmr_rcv[recv_msg_index - 1]; /* setup rdma read buffer to initial string to be overwritten */ strcpy((char *)sbuf, "blah, blah, blah\n"); if (server) strcpy((char *)rbuf, "server RDMA read data..."); else strcpy((char *)rbuf, "client RDMA read data..."); l_iov.lmr_context = lmr_context_send; l_iov.virtual_address = (DAT_VADDR) (uintptr_t) sbuf; l_iov.segment_length = buf_len; for (i = 0; i < MAX_RDMA_RD; i++) { cookie.as_64 = 0x9999; start = get_time(); ret = dat_ep_post_rdma_read(h_ep, // ep_handle 1, // num_segments &l_iov, // LMR cookie, // user_cookie &r_iov, // RMR DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: dat_ep_post_rdma_read() %s\n", getpid(), DT_RetToStr(ret)); return (DAT_ABORT); } /* RDMA read completion event */ if (collect_event(h_dto_req_evd, &event, DTO_TIMEOUT, &rdma_rd_poll_count[i]) != DAT_SUCCESS) return (DAT_ABORT); /* validate event number, len, cookie, and status */ if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d: ERROR: DTO event number %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data. transfered_length != buf_len) || (event.event_data.dto_completion_event_data.user_cookie. as_64 != 0x9999)) { fprintf(stderr, "%d: ERROR: DTO len %d or cookie " F64x "\n", getpid(), event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data. user_cookie.as_64); return (DAT_ABORT); } if (event.event_data.dto_completion_event_data.status != DAT_SUCCESS) { fprintf(stderr, "%d: ERROR: DTO event status %s\n", getpid(), DT_RetToStr(ret)); return (DAT_ABORT); } stop = get_time(); ts.rdma_rd[i] = ((stop - start) * 1.0e6); ts.rdma_rd_total += ts.rdma_rd[i]; LOGPRINTF("%d rdma_read # %d completed\n", getpid(), i + 1); } /* * Send RMR information a 3rd time to indicate completion * NOTE: already swapped to network order in connect_ep */ printf("%d Sending RDMA read completion message\n", getpid()); /* give remote chance to process read completes */ if (use_cno) { #if defined(_WIN32) || defined(_WIN64) Sleep(1000); #else sleep(1); #endif } ret = send_msg(p_rmr_snd, sizeof(DAT_RMR_TRIPLET), lmr_context_send_msg, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d send_msg completed\n", getpid()); } printf("%d Waiting for inbound message....\n", getpid()); if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &poll_count) != DAT_SUCCESS) return (DAT_ABORT); /* validate event number and status */ printf("%d inbound rdma_read; send message arrived!\n", getpid()); if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d Error unexpected DTO event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data.transfered_length != sizeof(DAT_RMR_TRIPLET)) || (event.event_data.dto_completion_event_data.user_cookie.as_64 != recv_msg_index)) { fprintf(stderr, "unexpected event data for receive: len=%d cookie=" F64x " exp %d/%d\n", (int)event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data.user_cookie. as_64, (int)sizeof(DAT_RMR_TRIPLET), recv_msg_index); return (DAT_ABORT); } /* swap received RMR msg: network order to host order */ r_iov = p_rmr_rcv[recv_msg_index]; p_rmr_rcv[recv_msg_index].virtual_address = ntohll(p_rmr_rcv[recv_msg_index].virtual_address); p_rmr_rcv[recv_msg_index].segment_length = ntohl(p_rmr_rcv[recv_msg_index].segment_length); p_rmr_rcv[recv_msg_index].rmr_context = ntohl(p_rmr_rcv[recv_msg_index].rmr_context); printf("%d Received RMR from remote: " "r_iov: r_key_ctx=%x,va=" F64x ",len=0x%x\n", getpid(), p_rmr_rcv[recv_msg_index].rmr_context, p_rmr_rcv[recv_msg_index].virtual_address, p_rmr_rcv[recv_msg_index].segment_length); LOGPRINTF("%d inbound rdma_write; send msg event SUCCESS!!\n", getpid()); printf("%d %s RCV RDMA read buffer contains: %s\n", getpid(), server ? "SERVER:" : "CLIENT:", sbuf); recv_msg_index++; return (DAT_SUCCESS); } DAT_RETURN do_ping_pong_msg() { DAT_EVENT event; DAT_DTO_COOKIE cookie; DAT_LMR_TRIPLET l_iov; DAT_RETURN ret; int i; char *snd_buf; char *rcv_buf; printf("\n %d PING DATA with SEND MSG\n\n", getpid()); snd_buf = sbuf; rcv_buf = rbuf; /* pre-post all buffers */ for (i = 0; i < burst; i++) { burst_msg_posted++; cookie.as_64 = i; l_iov.lmr_context = lmr_context_recv; l_iov.virtual_address = (DAT_VADDR) (uintptr_t) rcv_buf; l_iov.segment_length = buf_len; LOGPRINTF("%d Pre-posting Receive Message Buffers %p\n", getpid(), rcv_buf); ret = dat_ep_post_recv(h_ep, 1, &l_iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error posting recv msg buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Posted Receive Message Buffer %p\n", getpid(), rcv_buf); } /* next buffer */ rcv_buf += buf_len; } #if defined(_WIN32) || defined(_WIN64) Sleep(1000); #else sleep(1); #endif /* Initialize recv_buf and index to beginning */ rcv_buf = rbuf; burst_msg_index = 0; /* client ping 0x55, server pong 0xAA in first byte */ start = get_time(); for (i = 0; i < burst; i++) { /* walk the send and recv buffers */ if (!server) { *snd_buf = 0x55; LOGPRINTF("%d %s SND buffer %p contains: 0x%x len=%d\n", getpid(), server ? "SERVER:" : "CLIENT:", snd_buf, *snd_buf, buf_len); ret = send_msg(snd_buf, buf_len, lmr_context_send, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d send_msg completed\n", getpid()); } } /* recv message, send completions suppressed */ if (collect_event(h_dto_rcv_evd, &event, DTO_TIMEOUT, &poll_count) != DAT_SUCCESS) return (DAT_ABORT); /* start timer after first message arrives on server */ if (i == 0) { start = get_time(); } /* validate event number and status */ LOGPRINTF("%d inbound message; message arrived!\n", getpid()); if (event.event_number != DAT_DTO_COMPLETION_EVENT) { fprintf(stderr, "%d Error unexpected DTO event : %s\n", getpid(), DT_EventToStr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.dto_completion_event_data. transfered_length != buf_len) || (event.event_data.dto_completion_event_data.user_cookie. as_64 != burst_msg_index)) { fprintf(stderr, "ERR: recv event: len=%d cookie=" F64x " exp %d/%d\n", (int)event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data. user_cookie.as_64, (int)buf_len, (int)burst_msg_index); return (DAT_ABORT); } LOGPRINTF("%d %s RCV buffer %p contains: 0x%x len=%d\n", getpid(), server ? "SERVER:" : "CLIENT:", rcv_buf, *rcv_buf, buf_len); burst_msg_index++; /* If server, change data and send it back to client */ if (server) { *snd_buf = 0xaa; LOGPRINTF("%d %s SND buffer %p contains: 0x%x len=%d\n", getpid(), server ? "SERVER:" : "CLIENT:", snd_buf, *snd_buf, buf_len); ret = send_msg(snd_buf, buf_len, lmr_context_send, cookie, DAT_COMPLETION_SUPPRESS_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error send_msg: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d send_msg completed\n", getpid()); } } /* next buffers */ rcv_buf += buf_len; snd_buf += buf_len; } stop = get_time(); ts.rtt = ((stop - start) * 1.0e6); return (DAT_SUCCESS); } /* Register RDMA Receive buffer */ DAT_RETURN register_rdma_memory(void) { DAT_RETURN ret; DAT_REGION_DESCRIPTION region; region.for_va = rbuf; start = get_time(); ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, buf_len * (burst+1), h_pz, DAT_MEM_PRIV_ALL_FLAG, DAT_VA_TYPE_VA, &h_lmr_recv, &lmr_context_recv, &rmr_context_recv, ®istered_size_recv, ®istered_addr_recv); stop = get_time(); ts.reg += ((stop - start) * 1.0e6); ts.total += ts.reg; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering Receive RDMA buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Registered Receive RDMA Buffer %p\n", getpid(), region.for_va); } /* Register RDMA Send buffer */ region.for_va = sbuf; ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, buf_len * (burst + 1), h_pz, DAT_MEM_PRIV_ALL_FLAG, DAT_VA_TYPE_VA, &h_lmr_send, &lmr_context_send, &rmr_context_send, ®istered_size_send, ®istered_addr_send); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error registering send RDMA buffer: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Registered Send RDMA Buffer %p\n", getpid(), region.for_va); } return DAT_SUCCESS; } /* * Unregister RDMA memory */ DAT_RETURN unregister_rdma_memory(void) { DAT_RETURN ret; /* Unregister Recv Buffer */ if (h_lmr_recv != DAT_HANDLE_NULL) { LOGPRINTF("%d Unregister h_lmr %p \n", getpid(), h_lmr_recv); start = get_time(); ret = dat_lmr_free(h_lmr_recv); stop = get_time(); ts.unreg += ((stop - start) * 1.0e6); ts.total += ts.unreg; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error deregistering recv mr: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Unregistered Recv Buffer\n", getpid()); h_lmr_recv = NULL; } } /* Unregister Send Buffer */ if (h_lmr_send != DAT_HANDLE_NULL) { LOGPRINTF("%d Unregister h_lmr %p \n", getpid(), h_lmr_send); ret = dat_lmr_free(h_lmr_send); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error deregistering send mr: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Unregistered send Buffer\n", getpid()); h_lmr_send = NULL; } } return DAT_SUCCESS; } /* * Create CNO, CR, CONN, and DTO events */ DAT_RETURN create_events(void) { DAT_RETURN ret; DAT_EVD_PARAM param; /* create CNO */ if (use_cno) { start = get_time(); #if defined(_WIN32) || defined(_WIN64) { DAT_OS_WAIT_PROXY_AGENT pa = { NULL, NULL }; ret = dat_cno_create(h_ia, pa, &h_dto_cno); } #else ret = dat_cno_create(h_ia, DAT_OS_WAIT_PROXY_AGENT_NULL, &h_dto_cno); #endif stop = get_time(); ts.cnoc += ((stop - start) * 1.0e6); ts.total += ts.cnoc; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_cno_create: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d cr_evd created, %p\n", getpid(), h_dto_cno); } } /* create cr EVD */ start = get_time(); ret = dat_evd_create(h_ia, 10, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &h_cr_evd); stop = get_time(); ts.evdc += ((stop - start) * 1.0e6); ts.total += ts.evdc; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_create: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d cr_evd created %p\n", getpid(), h_cr_evd); } /* create conn EVD */ ret = dat_evd_create(h_ia, 10, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_create: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d con_evd created %p\n", getpid(), h_conn_evd); } /* create dto SND EVD, with CNO if use_cno was set */ ret = dat_evd_create(h_ia, (MSG_BUF_COUNT + MAX_RDMA_RD + burst) * 2, h_dto_cno, DAT_EVD_DTO_FLAG, &h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_create REQ: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d dto_req_evd created %p\n", getpid(), h_dto_req_evd); } /* create dto RCV EVD, with CNO if use_cno was set */ ret = dat_evd_create(h_ia, MSG_BUF_COUNT + burst, h_dto_cno, DAT_EVD_DTO_FLAG, &h_dto_rcv_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_create RCV: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d dto_rcv_evd created %p\n", getpid(), h_dto_rcv_evd); } /* query DTO req EVD and check size */ ret = dat_evd_query(h_dto_req_evd, DAT_EVD_FIELD_EVD_QLEN, ¶m); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error dat_evd_query request evd: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else if (param.evd_qlen < (MSG_BUF_COUNT + MAX_RDMA_RD + burst) * 2) { fprintf(stderr, "%d Error dat_evd qsize too small: %d < %d\n", getpid(), param.evd_qlen, (MSG_BUF_COUNT + MAX_RDMA_RD + burst) * 2); return (ret); } LOGPRINTF("%d dto_req_evd QLEN - requested %d and actual %d\n", getpid(), (MSG_BUF_COUNT + MAX_RDMA_RD + burst) * 2, param.evd_qlen); return DAT_SUCCESS; } /* * Destroy CR, CONN, CNO, and DTO events */ DAT_RETURN destroy_events(void) { DAT_RETURN ret; /* free cr EVD */ if (h_cr_evd != DAT_HANDLE_NULL) { LOGPRINTF("%d Free cr EVD %p \n", getpid(), h_cr_evd); ret = dat_evd_free(h_cr_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing cr EVD: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Freed cr EVD\n", getpid()); h_cr_evd = DAT_HANDLE_NULL; } } /* free conn EVD */ if (h_conn_evd != DAT_HANDLE_NULL) { LOGPRINTF("%d Free conn EVD %p \n", getpid(), h_conn_evd); ret = dat_evd_free(h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing conn EVD: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Freed conn EVD\n", getpid()); h_conn_evd = DAT_HANDLE_NULL; } } /* free RCV dto EVD */ if (h_dto_rcv_evd != DAT_HANDLE_NULL) { LOGPRINTF("%d Free RCV dto EVD %p \n", getpid(), h_dto_rcv_evd); start = get_time(); ret = dat_evd_free(h_dto_rcv_evd); stop = get_time(); ts.evdf += ((stop - start) * 1.0e6); ts.total += ts.evdf; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing dto EVD: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Freed dto EVD\n", getpid()); h_dto_rcv_evd = DAT_HANDLE_NULL; } } /* free REQ dto EVD */ if (h_dto_req_evd != DAT_HANDLE_NULL) { LOGPRINTF("%d Free REQ dto EVD %p \n", getpid(), h_dto_req_evd); ret = dat_evd_free(h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing dto EVD: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Freed dto EVD\n", getpid()); h_dto_req_evd = DAT_HANDLE_NULL; } } /* free CNO */ if (h_dto_cno != DAT_HANDLE_NULL) { LOGPRINTF("%d Free dto CNO %p \n", getpid(), h_dto_cno); start = get_time(); ret = dat_cno_free(h_dto_cno); stop = get_time(); ts.cnof += ((stop - start) * 1.0e6); ts.total += ts.cnof; if (ret != DAT_SUCCESS) { fprintf(stderr, "%d Error freeing dto CNO: %s\n", getpid(), DT_RetToStr(ret)); return (ret); } else { LOGPRINTF("%d Freed dto CNO\n", getpid()); h_dto_cno = DAT_HANDLE_NULL; } } return DAT_SUCCESS; } /* * Map DAT_RETURN values to readable strings, * but don't assume the values are zero-based or contiguous. */ char errmsg[512] = { 0 }; const char *DT_RetToStr(DAT_RETURN ret_value) { const char *major_msg, *minor_msg; dat_strerror(ret_value, &major_msg, &minor_msg); strcpy(errmsg, major_msg); strcat(errmsg, " "); strcat(errmsg, minor_msg); return errmsg; } /* * Map DAT_EVENT_CODE values to readable strings */ const char *DT_EventToStr(DAT_EVENT_NUMBER event_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_events[] = { # define DATxx(x) { # x, x } DATxx(DAT_DTO_COMPLETION_EVENT), DATxx(DAT_RMR_BIND_COMPLETION_EVENT), DATxx(DAT_CONNECTION_REQUEST_EVENT), DATxx(DAT_CONNECTION_EVENT_ESTABLISHED), DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR), DATxx(DAT_CONNECTION_EVENT_DISCONNECTED), DATxx(DAT_CONNECTION_EVENT_BROKEN), DATxx(DAT_CONNECTION_EVENT_TIMED_OUT), DATxx(DAT_CONNECTION_EVENT_UNREACHABLE), DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW), DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC), DATxx(DAT_ASYNC_ERROR_EP_BROKEN), DATxx(DAT_ASYNC_ERROR_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR), DATxx(DAT_SOFTWARE_EVENT) # undef DATxx }; # define NUM_EVENTS (sizeof(dat_events)/sizeof(dat_events[0])) for (i = 0; i < NUM_EVENTS; i++) { if (dat_events[i].value == event_code) { return (dat_events[i].name); } } return ("Invalid_DAT_EVENT_NUMBER"); } void print_usage(void) { printf("\n DAPL USAGE \n\n"); printf("s: server\n"); printf("u: unidirectional bandwidth (default=bidirectional\n"); printf("w: rdma write only\n"); printf("t: performance times\n"); printf("c: use cno\n"); printf("v: verbose\n"); printf("p: polling\n"); printf("d: delay before accept\n"); printf("b: buf length to allocate\n"); printf("B: burst count, rdma and msgs \n"); printf("h: hostname/address of server, specified on client\n"); printf("P: provider name (default = ofa-v2-mlx4_0-1u)\n"); printf("S: signal_rate (default=10, completion every 10 iterations\n"); printf("\n"); } dapl-2.1.5/test/dtest/dtestcm.c000066400000000000000000000714101255317474200163650ustar00rootroot00000000000000/* * Copyright (c) 2009 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * $Id: $ */ #include #include #include #ifdef DAPL_PROVIDER #undef DAPL_PROVIDER #endif #if defined(_WIN32) || defined(_WIN64) #include #include #include #include #include #include #include "..\..\..\..\etc\user\getopt.c" #define getpid() ((int)GetCurrentProcessId()) #define F64x "%I64x" #define F64d "%I64d" #ifdef DBG #define DAPL_PROVIDER "ibnic0v2d" #else #define DAPL_PROVIDER "ibnic0v2" #endif #define ntohll _byteswap_uint64 #define htonll _byteswap_uint64 #else // _WIN32 || _WIN64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DAPL_PROVIDER "ofa-v2-ib0" #define F64x "%"PRIx64"" #define F64d "%"PRId64"" #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #endif // _WIN32 || _WIN64 #define MAX_POLLING_CNT 50000 /* Header files needed for DAT/uDAPL */ #include "dat2/udat.h" #include "dat2/dat_ib_extensions.h" /* definitions */ #define SERVER_CONN_QUAL 45248 #define CONN_TIMEOUT (1000*1000*100) #define CR_TIMEOUT DAT_TIMEOUT_INFINITE /* Global DAT vars */ static DAT_IA_HANDLE h_ia = DAT_HANDLE_NULL; static DAT_PZ_HANDLE h_pz = DAT_HANDLE_NULL; static DAT_EP_HANDLE *h_ep; static DAT_PSP_HANDLE *h_psp; static DAT_CR_HANDLE h_cr = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_async_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_req_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_rcv_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_cr_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_conn_evd = DAT_HANDLE_NULL; static DAT_EP_ATTR ep_attr; char hostname[256] = { 0 }; char provider[64] = DAPL_PROVIDER; char addr_str[INET_ADDRSTRLEN]; int status; /* timers */ double start, stop, total_us, total_sec; struct dt_time { double total; double open; double reg; double unreg; double pzc; double pzf; double evdc; double evdf; double cnoc; double cnof; double epc; double epf; double rtt; double close; double conn; }; struct dt_time ts; /* defaults */ static int connected = 0; static int multi_listens = 0; static int ud_test = 0; static int server = 1; static int waiting = 0; static int verbose = 0; static int cr_poll_count = 0; static int conn_poll_count = 0; static int delay = 0; static int connections = 1000; static int burst = 100; static int port_id = SERVER_CONN_QUAL; static int ucm = 0; static DAT_SOCK_ADDR6 remote; /* forward prototypes */ const char *DT_RetToString(DAT_RETURN ret_value); const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code); void print_usage(void); double get_time(void); DAT_RETURN conn_client(void); DAT_RETURN conn_server(void); DAT_RETURN disconnect_eps(void); DAT_RETURN create_events(void); DAT_RETURN destroy_events(void); #define LOGPRINTF if (verbose) printf void flush_evds(void) { DAT_EVENT event; /* Flush async error queue */ printf(" ERR: Checking ASYNC EVD...\n"); while (dat_evd_dequeue(h_async_evd, &event) == DAT_SUCCESS) { printf(" ASYNC EVD ENTRY: handle=%p reason=%d\n", event.event_data.asynch_error_event_data.dat_handle, event.event_data.asynch_error_event_data.reason); } } static void print_ia_address(struct sockaddr *sa) { char str[INET6_ADDRSTRLEN] = {" ??? "}; switch(sa->sa_family) { case AF_INET: inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET - %s port %d\n", getpid(), str, SERVER_CONN_QUAL); break; case AF_INET6: inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET6 - %s flowinfo(QPN)=0x%x, port(LID)=0x%x\n", getpid(), str, ntohl(((struct sockaddr_in6 *)sa)->sin6_flowinfo), ntohs(((struct sockaddr_in6 *)sa)->sin6_port)); break; default: printf("%d Local Address UNKOWN FAMILY - port %d\n", getpid(), SERVER_CONN_QUAL); } } int main(int argc, char **argv) { int i, c, len; DAT_RETURN ret; DAT_IA_ATTR ia_attr; /* parse arguments */ while ((c = getopt(argc, argv, "smwvub:c:d:h:P:p:q:l:")) != -1) { switch (c) { case 's': server = 1; break; case 'm': multi_listens = 1; break; case 'w': waiting = 1; break; case 'u': ud_test = 1; break; case 'c': connections = atoi(optarg); break; case 'p': port_id = atoi(optarg); break; case 'v': verbose = 1; fflush(stdout); break; case 'd': delay = atoi(optarg); break; case 'b': burst = atoi(optarg); break; case 'h': server = 0; strcpy(hostname, optarg); break; case 'P': strcpy(provider, optarg); break; case 'q': /* map UCM qpn into AF_INET6 sin6_flowinfo */ remote.sin6_family = AF_INET6; remote.sin6_flowinfo = htonl(strtol(optarg,NULL,0)); ucm = 1; server = 0; break; case 'l': /* map UCM lid into AF_INET6 sin6_port */ remote.sin6_family = AF_INET6; remote.sin6_port = htons(strtol(optarg,NULL,0)); ucm = 1; server = 0; break; default: print_usage(); exit(-12); } } #if defined(_WIN32) || defined(_WIN64) { WSADATA wsaData; i = WSAStartup(MAKEWORD(2, 2), &wsaData); if (i != 0) { printf("%s WSAStartup(2.2) failed? (0x%x)\n", argv[0], i); fflush(stdout); exit(1); } } #endif if (!server) { printf(" Running client on %s with %d %s connections\n", provider, connections, ud_test ? "UD" : "RC"); } else { printf(" Running server on %s with %d %s connections\n", provider, connections, ud_test ? "UD" : "RC"); } fflush(stdout); if (burst > connections) burst = connections; /* allocate EP handles for all connections */ h_ep = (DAT_EP_HANDLE*)malloc(connections * sizeof(DAT_EP_HANDLE)); if (h_ep == NULL) { perror("malloc ep"); exit(1); } memset(h_ep, 0, (connections * sizeof(DAT_EP_HANDLE))); /* allocate PSP handles, check for multi-listens */ if (multi_listens) len = burst * sizeof(DAT_PSP_HANDLE); else len = sizeof(DAT_PSP_HANDLE); h_psp = (DAT_PSP_HANDLE*)malloc(len); if (h_psp == NULL) { perror("malloc psp"); exit(1); } memset(h_psp, 0, len); memset(&ts, 0, sizeof(struct dt_time)); /* dat_ia_open, dat_pz_create */ h_async_evd = DAT_HANDLE_NULL; start = get_time(); ret = dat_ia_open(provider, 8, &h_async_evd, &h_ia); stop = get_time(); ts.open += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error Adaptor open: %s\n", DT_RetToString(ret)); exit(1); } else LOGPRINTF(" Opened Interface Adaptor\n"); /* query for UCM addressing */ ret = dat_ia_query(h_ia, 0, DAT_IA_FIELD_ALL, &ia_attr, 0, 0); if (ret != DAT_SUCCESS) { fprintf(stderr, "%d: Error Adaptor query: %s\n", getpid(), DT_RetToString(ret)); exit(1); } print_ia_address(ia_attr.ia_address_ptr); /* Create Protection Zone */ start = get_time(); LOGPRINTF(" Create Protection Zone\n"); ret = dat_pz_create(h_ia, &h_pz); stop = get_time(); ts.pzc += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error creating Protection Zone: %s\n", DT_RetToString(ret)); exit(1); } else LOGPRINTF(" Created Protection Zone\n"); LOGPRINTF(" Create events\n"); ret = create_events(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error creating events: %s\n", DT_RetToString(ret)); goto cleanup; } else { LOGPRINTF(" Create events done\n"); } /* create EP */ memset(&ep_attr, 0, sizeof(ep_attr)); if (ud_test) { ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD; ep_attr.max_message_size = 2048; } else { ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_rdma_size = 0x10000; ep_attr.max_rdma_read_in = 4; ep_attr.max_rdma_read_out = 4; } ep_attr.max_recv_dtos = 1; ep_attr.max_request_dtos = 1; ep_attr.max_recv_iov = 1; ep_attr.max_request_iov = 1; ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; start = get_time(); for (i = 0; i < connections; i++) { ret = dat_ep_create(h_ia, h_pz, h_dto_rcv_evd, h_dto_req_evd, h_conn_evd, &ep_attr, &h_ep[i]); } stop = get_time(); ts.epc += ((stop - start) * 1.0e6); ts.total += ts.epc; if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_ep_create: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" EP created %p \n", h_ep[i]); /* create the service point for server listen */ if (server) { LOGPRINTF(" Creating server service point(s)\n"); for (i = 0; i < burst; i++) { ret = dat_psp_create(h_ia, port_id+i, h_cr_evd, DAT_PSP_CONSUMER_FLAG, &h_psp[i]); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR psp_create: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" psp_created for listen\n"); printf(" Server ready on port %d\n", port_id+i); if (!multi_listens) break; } } /* Connect all */ if (server) ret = conn_server(); else ret = conn_client(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error %s: %s\n", server ? "server()" : "client()", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" connect_ep complete\n"); connected = 1; goto complete; cleanup: flush_evds(); goto bail; complete: /* disconnect and free EP resources */ if (h_ep[0]) { /* unregister message buffers and tear down connection */ LOGPRINTF(" Disconnect EPs\n"); ret = disconnect_eps(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error disconnect_eps: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" disconnect_eps complete\n"); } } /* destroy server service point(s) */ if ((server) && (h_psp[0] != DAT_HANDLE_NULL)) { for (i = 0; i < burst; i++) { ret = dat_psp_free(h_psp[i]); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_psp_free: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" psp_free[%d] complete\n",i); } if (!multi_listens) break; } } /* free EVDs */ LOGPRINTF(" destroy events\n"); ret = destroy_events(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error destroy_events: %s\n", DT_RetToString(ret)); goto bail; } else LOGPRINTF(" destroy events done\n"); /* Free protection domain */ LOGPRINTF(" Freeing pz\n"); start = get_time(); ret = dat_pz_free(h_pz); stop = get_time(); ts.pzf += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing PZ: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" Freed pz\n"); h_pz = NULL; } /* close the device */ LOGPRINTF(" Closing Interface Adaptor\n"); start = get_time(); ret = dat_ia_close(h_ia, DAT_CLOSE_ABRUPT_FLAG); stop = get_time(); ts.close += ((stop - start) * 1.0e6); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error Adaptor close: %s\n", DT_RetToString(ret)); goto bail; } else LOGPRINTF(" Closed Interface Adaptor\n"); printf(" DAPL Connection Test Complete.\n"); printf(" open: %10.2lf usec\n", ts.open); printf(" close: %10.2lf usec\n", ts.close); printf(" PZ create: %10.2lf usec\n", ts.pzc); printf(" PZ free: %10.2lf usec\n", ts.pzf); printf(" LMR create:%10.2lf usec\n", ts.reg); printf(" LMR free: %10.2lf usec\n", ts.unreg); printf(" EVD create:%10.2lf usec\n", ts.evdc); printf(" EVD free: %10.2lf usec\n", ts.evdf); printf(" EP create: %10.2lf usec avg\n", ts.epc/connections); printf(" EP free: %10.2lf usec avg\n", ts.epf/connections); if (!server) { printf(" Connections: %8.2lf usec, CPS %7.2lf " "Total %4.2lf secs, poll_cnt=%u, Num=%d\n", (double)(ts.conn/connections), (double)(1/(ts.conn/1000000/connections)), (double)(ts.conn/1000000), conn_poll_count, connections); } printf(" TOTAL: %4.2lf sec\n", ts.total/1000000); fflush(stderr); fflush(stdout); bail: free(h_ep); free(h_psp); #if defined(_WIN32) || defined(_WIN64) WSACleanup(); #endif return (0); } double get_time(void) { struct timeval tp; gettimeofday(&tp, NULL); return ((double)tp.tv_sec + (double)tp.tv_usec * 1e-6); } DAT_RETURN conn_server() { DAT_RETURN ret; DAT_EVENT event; DAT_COUNT nmore; int i,bi; unsigned char *buf; DAT_CR_ARRIVAL_EVENT_DATA *cr_event = &event.event_data.cr_arrival_event_data; DAT_CR_PARAM cr_param = { 0 }; printf(" Accepting...\n"); for (i = 0; i < connections; i++) { /* poll for CR's */ if (!waiting) { cr_poll_count = 0; while (DAT_GET_TYPE(dat_evd_dequeue(h_cr_evd, &event)) == DAT_QUEUE_EMPTY) cr_poll_count++; } else { ret = dat_evd_wait(h_cr_evd, CR_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR: CR dat_evd_wait() %s\n", DT_RetToString(ret)); return ret; } } if ((event.event_number != DAT_CONNECTION_REQUEST_EVENT) && (ud_test && event.event_number != DAT_IB_UD_CONNECTION_REQUEST_EVENT)) { fprintf(stderr, " Error unexpected CR event : %s\n", DT_EventToSTr(event.event_number)); return (DAT_ABORT); } /* use to test rdma_cma timeout logic */ #if defined(_WIN32) || defined(_WIN64) if (delay) { printf(" Accept delayed by %d seconds...\n", delay); Sleep(delay * 1000); } #else if (delay) { printf(" Accept delayed by %d seconds...\n", delay); sleep(delay); } #endif /* accept connect request from client */ h_cr = cr_event->cr_handle; LOGPRINTF(" Accepting connect request from client\n"); /* private data - check and send it back */ dat_cr_query(h_cr, DAT_CSP_FIELD_ALL, &cr_param); buf = (unsigned char *)cr_param.private_data; LOGPRINTF(" CONN REQUEST Private Data %p[0]=%d [47]=%d\n", buf, buf[0], buf[47]); for (bi = 0; bi < 48; bi++) { if (buf[bi] != bi + 1) { fprintf(stderr, " ERR on CONNECT REQUEST" " private data: %p[%d]=%d s/be %d\n", buf, bi, buf[bi], bi + 1); dat_cr_reject(h_cr, 0, NULL); return (DAT_ABORT); } buf[bi]++; /* change for trip back */ } #ifdef TEST_REJECT_WITH_PRIVATE_DATA printf(" REJECT request with 48 bytes of private data\n"); ret = dat_cr_reject(h_cr, 48, cr_param.private_data); printf("\n DAPL Test Complete. %s\n\n", ret ? "FAILED" : "PASSED"); exit(0); #endif ret = dat_cr_accept(h_cr, h_ep[i], 48, cr_param.private_data); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR dat_cr_accept: %s\n", DT_RetToString(ret)); return (ret); } else LOGPRINTF(" accept[%d] complete\n", i); event.event_number = 0; } /* process the RTU, ESTABLISHMENT event */ printf(" Completing...\n"); for (i=0;iai_addr)->sin_addr.s_addr; #else if (getaddrinfo(hostname, NULL, NULL, &target) != 0) { perror("\n remote name resolution failed!"); exit(1); } rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr; #endif printf(" Connecting to Server: %s \n", hostname); printf(" Address: %d.%d.%d.%d port %d\n", (rval >> 0) & 0xff, (rval >> 8) & 0xff, (rval >> 16) & 0xff, (rval >> 24) & 0xff, port_id); raddr = (DAT_IA_ADDRESS_PTR)target->ai_addr; no_resolution: for (i = 0; i < 48; i++) /* simple pattern in private data */ pdata[i] = i + 1; printf(" Connecting...\n"); start = get_time(); for (i = 0; i < connections; i += burst) { for (ii = 0; ii < burst; ii++) { /* conn_reqs */ if (multi_listens) conn_id = port_id + ii; else conn_id = port_id; ret = dat_ep_connect(h_ep[i+ii], raddr, conn_id, CONN_TIMEOUT, 48, (DAT_PVOID) pdata, 0, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR dat_ep_connect: %s\n", DT_RetToString(ret)); return (ret); } else LOGPRINTF(" dat_ep_connect[%d] complete\n", i+ii); } for (ii = 0; ii < burst; ii++) { /* conn_events */ if (!waiting) { conn_poll_count = 0; while (DAT_GET_TYPE(dat_evd_dequeue( h_conn_evd, &event)) == DAT_QUEUE_EMPTY) conn_poll_count++; } else { ret = dat_evd_wait(h_conn_evd, CONN_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR: CONN evd_wait() %s\n", DT_RetToString(ret)); return ret; } } #ifdef TEST_REJECT_WITH_PRIVATE_DATA if (event.event_number != DAT_CONNECTION_EVENT_PEER_REJECTED) { fprintf(stderr, " expected conn reject " "event : %s\n", DT_EventToSTr(event.event_number)); return (DAT_ABORT); } /* get the reject private data and validate */ buf = (unsigned char *)conn_event->private_data; printf(" Recv REJ with pdata %p[0]=%d [47]=%d\n", buf, buf[0], buf[47]); for (bi = 0; bi < 48; bi++) { if (buf[bi] != idx + 2) { fprintf(stderr, " client: Error" " with REJECT event private" " data: %p[%d]=%d s/be %d\n", buf, bi, buf[bi], bi + 2); dat_ep_disconnect(h_ep[i+ii], 0); return (DAT_ABORT); } } printf("\n Rej Test Done. PASSED\n\n"); exit(0); #endif if ((event.event_number != DAT_CONNECTION_EVENT_ESTABLISHED) && (ud_test && event.event_number != DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)) { fprintf(stderr, " Error unexpected conn " "event : 0x%x %s\n", event.event_number, DT_EventToSTr(event.event_number)); return (DAT_ABORT); } /* check private data back from server */ buf = (unsigned char *)conn_event->private_data; LOGPRINTF(" CONN[%d] Private Data " "%p[0]=%d [47]=%d\n", i+ii, buf, buf[0], buf[47]); for (bi = 0; bi < 48; bi++) { if (buf[bi] != bi + 2) { DAT_COUNT nmore; fprintf(stderr, " ERR CONN event" " pdata: %p[%d]=%d s/be %d\n", buf, bi, buf[bi], bi + 2); dat_ep_disconnect(h_ep[i+ii], DAT_CLOSE_ABRUPT_FLAG); LOGPRINTF(" waiting for disc...\n"); dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); return (DAT_ABORT); } } event.event_number = 0; } } stop = get_time(); ts.conn += ((stop - start) * 1.0e6); if (!ucm) freeaddrinfo(target); printf("\n ALL %d CONNECTED on Client!\n\n", connections); return (DAT_SUCCESS); } /* validate disconnected EP's and free them */ DAT_RETURN disconnect_eps(void) { DAT_RETURN ret; DAT_EVENT event; DAT_COUNT nmore; int i,ii; DAT_CONNECTION_EVENT_DATA *conn_event = &event.event_data.connect_event_data; if (!connected) return DAT_SUCCESS; /* UD, no connection to disconnect, just free EP's */ if (ud_test) { for (i = 0; i < connections; i++) { ret = dat_ep_free(h_ep[i]); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR free EP[%d] %p: %s\n", i, h_ep[i], DT_RetToString(ret)); } else { LOGPRINTF(" Freed EP[%d] %p\n", i, h_ep[i]); h_ep[i] = DAT_HANDLE_NULL; } } stop = get_time(); ts.epf += ((stop - start) * 1.0e6); ts.total += ts.epf; return DAT_SUCCESS; } /* * Only the client needs to call disconnect. The server _should_ be able * to just wait on the EVD associated with connection events for a * disconnect request and then exit. */ if (!server) { start = get_time(); for (i = 0; i < connections; i++) { LOGPRINTF(" dat_ep_disconnect[%d]\n",i); ret = dat_ep_disconnect(h_ep[i], DAT_CLOSE_DEFAULT); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error disconnect: %s\n", DT_RetToString(ret)); return ret; } else { LOGPRINTF(" disconnect completed[%d]\n", i); } } } else { LOGPRINTF(" Server waiting for disconnect...\n"); } LOGPRINTF(" Wait for Disc event, free EPs as completed\n"); start = get_time(); nmore = 0; for (i = 0; i < connections; i++) { LOGPRINTF(" waiting for disc event %d of %d, nmore = %d\n", i+1, connections, nmore); event.event_number = 0; conn_event->ep_handle = NULL; ret = dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_wait: %s\n", DT_RetToString(ret)); return ret; } else { LOGPRINTF(" disc event[%d] complete," " check for valid EP...\n", i); } /* check for valid EP in creation list */ for (ii = 0; ii < connections; ii++) { if (h_ep[ii] == conn_event->ep_handle) { LOGPRINTF(" valid EP[%d] %p !\n", ii, h_ep[ii]); ret = dat_ep_free(h_ep[ii]); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR free EP[%d] %p: %s\n", i, h_ep[ii], DT_RetToString(ret)); } else { LOGPRINTF(" Freed EP[%d] %p\n", i, h_ep[ii]); h_ep[ii] = DAT_HANDLE_NULL; } break; } else { continue; } } if (ii == connections) { LOGPRINTF(" %s: invalid EP[%d] %p via DISC event!\n", server ? "Server" : "Client", i, conn_event->ep_handle); return DAT_INVALID_HANDLE; } } /* free EPs */ stop = get_time(); ts.epf += ((stop - start) * 1.0e6); ts.total += ts.epf; LOGPRINTF(" Successfully disconnected all %d EP's\n", connections); return DAT_SUCCESS; } /* * Create CR, CONN, and DTO events */ DAT_RETURN create_events(void) { DAT_RETURN ret; /* create cr EVD */ start = get_time(); ret = dat_evd_create(h_ia, connections, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &h_cr_evd); stop = get_time(); ts.evdc += ((stop - start) * 1.0e6); ts.total += ts.evdc; if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" cr_evd created %p\n", h_cr_evd); } /* create conn EVD */ ret = dat_evd_create(h_ia, connections*2, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" con_evd created %p\n", h_conn_evd); } /* create dto SND EVD */ ret = dat_evd_create(h_ia, 1, NULL, DAT_EVD_DTO_FLAG, &h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create REQ: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" dto_req_evd created %p\n", h_dto_req_evd); } /* create dto RCV EVD */ ret = dat_evd_create(h_ia, 1, NULL, DAT_EVD_DTO_FLAG, &h_dto_rcv_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create RCV: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" dto_rcv_evd created %p\n", h_dto_rcv_evd); } return DAT_SUCCESS; } /* * Destroy CR, CONN, CNO, and DTO events */ DAT_RETURN destroy_events(void) { DAT_RETURN ret; /* free cr EVD */ if (h_cr_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free cr EVD %p \n", h_cr_evd); ret = dat_evd_free(h_cr_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing cr EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed cr EVD\n"); h_cr_evd = DAT_HANDLE_NULL; } } /* free conn EVD */ if (h_conn_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free conn EVD %p\n", h_conn_evd); ret = dat_evd_free(h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing conn EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed conn EVD\n"); h_conn_evd = DAT_HANDLE_NULL; } } /* free RCV dto EVD */ if (h_dto_rcv_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free RCV dto EVD %p\n", h_dto_rcv_evd); start = get_time(); ret = dat_evd_free(h_dto_rcv_evd); stop = get_time(); ts.evdf += ((stop - start) * 1.0e6); ts.total += ts.evdf; if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing dto EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed dto EVD\n"); h_dto_rcv_evd = DAT_HANDLE_NULL; } } /* free REQ dto EVD */ if (h_dto_req_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free REQ dto EVD %p\n", h_dto_req_evd); ret = dat_evd_free(h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing dto EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed dto EVD\n"); h_dto_req_evd = DAT_HANDLE_NULL; } } return DAT_SUCCESS; } /* * Map DAT_RETURN values to readable strings, * but don't assume the values are zero-based or contiguous. */ char errmsg[512] = { 0 }; const char *DT_RetToString(DAT_RETURN ret_value) { const char *major_msg, *minor_msg; dat_strerror(ret_value, &major_msg, &minor_msg); strcpy(errmsg, major_msg); strcat(errmsg, " "); strcat(errmsg, minor_msg); return errmsg; } /* * Map DAT_EVENT_CODE values to readable strings */ const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_events[] = { # define DATxx(x) { # x, x } DATxx(DAT_DTO_COMPLETION_EVENT), DATxx(DAT_RMR_BIND_COMPLETION_EVENT), DATxx(DAT_CONNECTION_REQUEST_EVENT), DATxx(DAT_CONNECTION_EVENT_ESTABLISHED), DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR), DATxx(DAT_CONNECTION_EVENT_DISCONNECTED), DATxx(DAT_CONNECTION_EVENT_BROKEN), DATxx(DAT_CONNECTION_EVENT_TIMED_OUT), DATxx(DAT_CONNECTION_EVENT_UNREACHABLE), DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW), DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC), DATxx(DAT_ASYNC_ERROR_EP_BROKEN), DATxx(DAT_ASYNC_ERROR_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR), DATxx(DAT_SOFTWARE_EVENT) # undef DATxx }; # define NUM_EVENTS (sizeof(dat_events)/sizeof(dat_events[0])) for (i = 0; i < NUM_EVENTS; i++) { if (dat_events[i].value == event_code) { return (dat_events[i].name); } } return ("Invalid_DAT_EVENT_NUMBER"); } void print_usage(void) { printf("\n DAPL USAGE \n\n"); printf("s: server\n"); printf("c: connections (default = 1000)\n"); printf("v: verbose\n"); printf("w: wait on event (default, polling)\n"); printf("d: delay before accept\n"); printf("h: hostname/address of server, specified on client\n"); printf("P: provider name (default = OpenIB-v2-ib0)\n"); printf("\n"); } dapl-2.1.5/test/dtest/dtestsrq.c000066400000000000000000001256461255317474200166060ustar00rootroot00000000000000/* * Copyright (c) 2009 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * $Id: $ */ #include #include #include #ifdef DAPL_PROVIDER #undef DAPL_PROVIDER #endif #if defined(_WIN32) || defined(_WIN64) #include #include #include #include #include #include #include "..\..\..\..\etc\user\getopt.c" #define getpid() ((int)GetCurrentProcessId()) #define F64x "%I64x" #define F64d "%I64d" #ifdef DBG #define DAPL_PROVIDER "ibnic0v2d" #else #define DAPL_PROVIDER "ibnic0v2" #endif #define ntohll _byteswap_uint64 #define htonll _byteswap_uint64 #else // _WIN32 || _WIN64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DAPL_PROVIDER "ofa-v2-ib0" #define F64x "%"PRIx64"" #define F64d "%"PRId64"" #if __BYTE_ORDER == __BIG_ENDIAN #define htonll(x) (x) #define ntohll(x) (x) #elif __BYTE_ORDER == __LITTLE_ENDIAN #define htonll(x) bswap_64(x) #define ntohll(x) bswap_64(x) #endif #endif // _WIN32 || _WIN64 /* Header files needed for DAT/uDAPL */ #include "dat2/udat.h" #include "dat2/dat_ib_extensions.h" /* definitions */ #define SERVER_CONN_QUAL 45248 #define CONN_TIMEOUT (1000*1000*100) #define DTO_TIMEOUT (1000*1000*5) #define CR_TIMEOUT DAT_TIMEOUT_INFINITE #define MAX_CONN 100 #define MAX_BURST 100 #define MSG_IOV_COUNT 1 /* Global DAT vars */ static DAT_IA_HANDLE h_ia = DAT_HANDLE_NULL; static DAT_PZ_HANDLE h_pz = DAT_HANDLE_NULL; static DAT_SRQ_HANDLE h_srq = DAT_HANDLE_NULL; static DAT_CR_HANDLE h_cr = DAT_HANDLE_NULL; static DAT_PSP_HANDLE h_psp = DAT_HANDLE_NULL; static DAT_IB_ADDR_HANDLE *remote_ah = DAT_HANDLE_NULL; static DAT_EP_HANDLE *h_ep; static DAT_EVD_HANDLE h_async_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_req_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_dto_rcv_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_cr_evd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE h_conn_evd = DAT_HANDLE_NULL; static DAT_EP_ATTR ep_attr; char hostname[256] = { 0 }; char provider[64] = DAPL_PROVIDER; char addr_str[INET_ADDRSTRLEN]; int status; /* defaults */ static int server = 1; static int verbose = 0; static int connections = 1; static int bursts_number = 3; static int burst_size = 1; static int server_port_id = SERVER_CONN_QUAL; static int client_port_id = SERVER_CONN_QUAL + 1; static int ucm = 0; static int ud_test = 0; static int srq_test = 1; /* RDMA buffers */ static DAT_LMR_HANDLE h_lmr_send = DAT_HANDLE_NULL; static DAT_LMR_HANDLE h_lmr_recv = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT lmr_context_send; static DAT_LMR_CONTEXT lmr_context_recv; static DAT_RMR_CONTEXT rmr_context_send; static DAT_RMR_CONTEXT rmr_context_recv; static DAT_VLEN registered_size_send; static DAT_VLEN registered_size_recv; static DAT_VADDR registered_addr_send; static DAT_VADDR registered_addr_recv; static int tx_buf_len = 0, rx_buf_len; static int connected = 0; char *rbuf = NULL; char *sbuf = NULL; static DAT_SOCK_ADDR6 remote; /* forward prototypes */ const char *DT_RetToString(DAT_RETURN ret_value); const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code); void print_usage(void); void flush_evds(void); static void print_ia_address(struct sockaddr *sa); DAT_RETURN conn_client(void); DAT_RETURN conn_server(void); DAT_RETURN disconnect_eps(void); DAT_RETURN create_events(void); DAT_RETURN destroy_events(void); DAT_RETURN register_rdma_memory(void); void unregister_rdma_memory(void); DAT_RETURN send_msg(char *buff, char msg_head, DAT_UINT32 ep_num, DAT_UINT32 msg_num); DAT_RETURN process_cr(void); DAT_RETURN process_conn(void); #define LOGPRINTF if (verbose) printf int main(int argc, char **argv) { int i, j, c, ep_post_num; DAT_RETURN ret; DAT_IA_ATTR ia_attr; DAT_SRQ_ATTR srq_attr; DAT_DTO_COOKIE cookie; DAT_LMR_TRIPLET l_iov; DAT_COUNT nmore; DAT_EVENT event; int tx_before = 0, ep_num, b_num, ib_mtu = 0; char *snd_buf; char *rcv_buf, *msg_buf; char incoming_header, recv_expected_header; DAT_UINT32 incoming_ep_num, incoming_msg_num; DAT_UINT32 *last_msg_num_from_ep; DAT_UINT64 recv_buf_index; DAT_PROVIDER_ATTR pr_attr; /* parse arguments */ while ((c = getopt(argc, argv, "svuB:c:t:h:P:p:q:l:b:S:")) != -1) { switch (c) { case 's': server = 1; break; case 'v': verbose = 1; fflush(stdout); break; case 'c': connections = atoi(optarg); if (connections > MAX_CONN) { printf("Too many connections. Max %d.\n", MAX_CONN); exit(-12); } break; case 'b': tx_buf_len = atoi(optarg); if (tx_buf_len <= 0) { printf(" Buffer size need to be positive\n"); exit(-12); } break; case 't': bursts_number = atoi(optarg); if (bursts_number < 0) { printf("Bursts number (%d) can't be negative.\n", bursts_number); exit(-12); } break; case 'p': server_port_id = atoi(optarg); client_port_id = server_port_id + 1; break; case 'S': srq_test = atoi(optarg); break; case 'B': burst_size = atoi(optarg); if (burst_size > MAX_BURST) { printf("Burst size is too big. Max %d\n", MAX_BURST); exit(-12); } break; case 'h': server = 0; strcpy(hostname, optarg); break; case 'P': strcpy(provider, optarg); break; case 'q': /* map UCM qpn into AF_INET6 sin6_flowinfo */ remote.sin6_family = AF_INET6; remote.sin6_flowinfo = htonl(strtol(optarg,NULL,0)); ucm = 1; server = 0; break; case 'l': /* map UCM lid into AF_INET6 sin6_port */ remote.sin6_family = AF_INET6; remote.sin6_port = htons(strtol(optarg,NULL,0)); ucm = 1; server = 0; break; case 'u': ud_test = 1; break; default: print_usage(); exit(-12); } } #if defined(_WIN32) || defined(_WIN64) { WSADATA wsaData; i = WSAStartup(MAKEWORD(2, 2), &wsaData); if (i != 0) { printf("%s WSAStartup(2.2) failed? (0x%x)\n", argv[0], i); fflush(stdout); exit(1); } } #endif printf(" Running %s %s test as %s on %s with %d connections," " %d burst%s of %d messages\n", ud_test ? "UD":"RC", srq_test ? "SRQ":"none SRQ", server ? "SERVER:" : "CLIENT:", provider, connections, bursts_number, bursts_number> 1 ? "s" : "", burst_size); fflush(stdout); /* allocate EP handles for all connections */ h_ep = (DAT_EP_HANDLE*)malloc(connections * sizeof(DAT_EP_HANDLE)); if (h_ep == NULL) { perror("malloc ep"); exit(1); } memset(h_ep, 0, (connections * sizeof(DAT_EP_HANDLE))); if (ud_test) { remote_ah = (DAT_IB_ADDR_HANDLE*)malloc(connections * sizeof(DAT_IB_ADDR_HANDLE)); if (remote_ah == NULL) { perror("malloc remote ah"); exit(1); } memset(remote_ah, 0, connections * sizeof(DAT_IB_ADDR_HANDLE)); } /* Save last message number for each ep */ last_msg_num_from_ep = malloc(connections * sizeof(DAT_UINT32)); if (last_msg_num_from_ep == NULL) { perror("malloc last_msg_num_from_ep"); exit(1); } memset(last_msg_num_from_ep, 0, (connections * sizeof(DAT_UINT32))); /* dat_ia_open, dat_pz_create */ h_async_evd = DAT_HANDLE_NULL; ret = dat_ia_open(provider, 8, &h_async_evd, &h_ia); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error Adaptor open: %s\n", DT_RetToString(ret)); exit(1); } else LOGPRINTF(" Opened Interface Adaptor %p\n", h_ia); /* query for UCM addressing */ ret = dat_ia_query(h_ia, 0, DAT_IA_FIELD_ALL, &ia_attr, DAT_PROVIDER_FIELD_PROVIDER_SPECIFIC_ATTR, &pr_attr); if (ret != DAT_SUCCESS) { fprintf(stderr, " Err Adaptor query: %s\n", DT_RetToString(ret)); exit(1); } /* Set tx_buf_len to IB_MTU if it was not specified by the user */ for (i = 0; i < pr_attr.num_provider_specific_attr; i++) { if (!strcmp (pr_attr.provider_specific_attr[i].name, "DAT_IB_TRANSPORT_MTU")) { ib_mtu = atoi(pr_attr.provider_specific_attr[i].value); break; } } if (ud_test) { if (!ib_mtu) { fprintf(stderr, " Error: ud test: IB_MTU was not found" " in provider attr\n"); exit(1); } if (tx_buf_len > ib_mtu) { fprintf(stderr, " Error: ud test: user buf len (%d)" "bigger than IB_MTU (%d)\n", tx_buf_len, ib_mtu); exit(1); } } if (!tx_buf_len) { /* no user input - set tx_buf_len to IB_MTU */ if (!ib_mtu) { fprintf(stderr, " Error: no user input and IB_MTU was" " not found in provider attr\n"); exit(1); } tx_buf_len = ib_mtu; } LOGPRINTF(" Tx buffer len set to device MTU %d\n", tx_buf_len); rx_buf_len = tx_buf_len; if (ud_test) rx_buf_len = tx_buf_len + 40; LOGPRINTF(" Rx buffer len set to %d\n", rx_buf_len); print_ia_address(ia_attr.ia_address_ptr); /* Create Protection Zone */ LOGPRINTF(" Create Protection Zone\n"); ret = dat_pz_create(h_ia, &h_pz); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error creating Protection Zone: %s\n", DT_RetToString(ret)); exit(1); } else LOGPRINTF(" Created Protection Zone\n"); LOGPRINTF(" Create events\n"); ret = create_events(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error creating events: %s\n", DT_RetToString(ret)); goto cleanup; } else { LOGPRINTF(" Create events done\n"); } /* Create SRQ */ if (srq_test) { LOGPRINTF(" Create SRQ\n"); srq_attr.max_recv_dtos = connections * burst_size; srq_attr.max_recv_iov = MSG_IOV_COUNT; srq_attr.low_watermark = 0; ret = dat_srq_create(h_ia, h_pz, &srq_attr, &h_srq); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_srq_create: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" SRQ created %p \n", h_srq); } /* allocate send and receive buffers */ if (((rbuf = malloc(connections * rx_buf_len * burst_size)) == NULL) || ((sbuf = malloc(connections * tx_buf_len * burst_size)) == NULL)) { fprintf(stderr, " Error allocating snd/rcv buffers\n"); goto cleanup; } /* Register memory */ LOGPRINTF(" Register RDMA memory\n"); ret = register_rdma_memory(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error registering RDMA memory: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" Register RDMA memory done\n"); /* create EP */ memset(&ep_attr, 0, sizeof(ep_attr)); if (ud_test) { ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD; ep_attr.max_message_size = tx_buf_len; } else { ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_message_size = 0; } ep_attr.max_request_dtos = (server ? burst_size : (connections * burst_size)); ep_attr.max_recv_dtos = (server ? burst_size : (connections * burst_size)); ep_attr.max_rdma_size = 0; ep_attr.qos = 0; ep_attr.recv_completion_flags = 0; ep_attr.max_recv_iov = MSG_IOV_COUNT; ep_attr.max_request_iov = MSG_IOV_COUNT; ep_attr.max_rdma_read_in = 0; ep_attr.max_rdma_read_out = 0; ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; ep_attr.ep_transport_specific_count = 0; ep_attr.ep_transport_specific = NULL; ep_attr.ep_provider_specific_count = 0; ep_attr.ep_provider_specific = NULL; for (i = 0; i < connections; i++) { if (srq_test) ret = dat_ep_create_with_srq(h_ia, h_pz, h_dto_rcv_evd, h_dto_req_evd, h_conn_evd, h_srq, &ep_attr, &h_ep[i]); else ret = dat_ep_create(h_ia, h_pz, h_dto_rcv_evd, h_dto_req_evd, h_conn_evd, &ep_attr, &h_ep[i]); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_ep_create: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" EP %d created %p\n", i, h_ep[i]); /* For client in UD test we use one EP to many EPs on server */ if (!server && ud_test) break; } /* pre-post all buffers */ rcv_buf = rbuf; for (i = 0; i < connections; i++) { for (j = 0; j < burst_size; j++) { cookie.as_64 = i * burst_size + j; l_iov.lmr_context = lmr_context_recv; l_iov.virtual_address = (DAT_VADDR) (uintptr_t) rcv_buf; l_iov.segment_length = rx_buf_len; if (srq_test) { LOGPRINTF(" Pre SRQ post receive msg buff %p cookie %ld.....", rcv_buf, cookie.as_64); ret = dat_srq_post_recv(h_srq, 1, &l_iov, cookie); } else { if(server || !ud_test) ep_post_num = i; else ep_post_num = 0; LOGPRINTF(" Pre post receive for EP %d msg buff %p.....", ep_post_num, rcv_buf); ret = dat_ep_post_recv(h_ep[ep_post_num], 1, &l_iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); } if (ret != DAT_SUCCESS) { fprintf(stderr, "\n Error posting recv msg buffer: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF("Done\n"); /* next buffer */ rcv_buf += rx_buf_len; } } /* create the service point for server listen */ if (server) { LOGPRINTF(" Creating server service point\n"); ret = dat_psp_create(h_ia, server ? server_port_id : client_port_id, h_cr_evd, DAT_PSP_CONSUMER_FLAG, &h_psp); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR psp_create: %s\n", DT_RetToString(ret)); goto cleanup; } else printf(" %s ready on port %d\n", server ? "server" : "client", server ? server_port_id : client_port_id); } /* Connect all */ if (server) ret = conn_server(); else ret = conn_client(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error %s: %s\n", server ? "server()" : "client()", DT_RetToString(ret)); goto cleanup; } else printf("\n ALL %d CONNECTED on %s!\n\n", connections, server ? "server" : "client"); connected = 1; /* * Client ping: 0x55, ep_num, ep msg_num * Server pong: 0xAA, ep, ep smg_num */ if (server) recv_expected_header = 0x55; else recv_expected_header = 0xaa; for (b_num = 0; b_num < bursts_number; b_num++) { /* Initialize snd_buf to the beginning */ snd_buf = sbuf; if (!server) { /* Send Ping */ for (ep_num = 0; ep_num < connections; ep_num++) { for (i = 0; i < burst_size; i++) { /* walk the send */ ret = send_msg(snd_buf, 0x55, ep_num, tx_before + i + 1); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR: dat_ep_post_send() %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF(" send_msg completed\n"); /* next buffers */ snd_buf += tx_buf_len; } } } for (ep_num = 0; ep_num < connections; ep_num++) { for (i = 0; i < burst_size; i++) { /* walk the rcv */ ret = dat_evd_wait(h_dto_rcv_evd, DTO_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error waiting on h_dto_evd %p: %s\n", h_dto_rcv_evd, DT_RetToString(ret)); goto cleanup; } /* validate event number and status */ LOGPRINTF(" inbound message; message arrived!\n"); if (event.event_number != DAT_DTO_COMPLETION_EVENT && ud_test && event.event_number != DAT_IB_DTO_EVENT) { fprintf(stderr, " Error unexpected DTO event (%d): %s\n", event.event_number, DT_EventToSTr(event.event_number)); goto cleanup; } if (event.event_data.dto_completion_event_data. transfered_length != rx_buf_len) { fprintf(stderr, " ERR: recv event: len=%d " "cookie=" F64x " exp len %d\n", (int)event.event_data.dto_completion_event_data. transfered_length, event.event_data.dto_completion_event_data. user_cookie.as_64, (int)rx_buf_len); goto cleanup; } /* Check data */ recv_buf_index = event.event_data.dto_completion_event_data. user_cookie.as_64; rcv_buf = rbuf + recv_buf_index * rx_buf_len; if (ud_test) msg_buf = rcv_buf + 40; else msg_buf = rcv_buf; incoming_header = *msg_buf; incoming_ep_num = ntohl(*((DAT_UINT32 *)(msg_buf + 4))); incoming_msg_num = ntohl(*((DAT_UINT32 *)(msg_buf + 8))); LOGPRINTF(" %s recv buffer %p (index %ld) buf len %d " " incoming data: header %d, ep num %d, ep msg num %d " " (nmore = %d)\n", server ? "SERVER:" : "CLIENT:", rcv_buf, recv_buf_index, rx_buf_len, incoming_header, incoming_ep_num, incoming_msg_num, nmore); /* May have race condition between EPs therefore * need to track each ep last message number */ if (last_msg_num_from_ep[incoming_ep_num] + 1 != incoming_msg_num) { fprintf(stderr, " ERR: ep %d recv msg %d exp %d\n", incoming_ep_num, incoming_msg_num, last_msg_num_from_ep[incoming_ep_num] + 1); goto cleanup; } last_msg_num_from_ep[incoming_ep_num] = incoming_msg_num; if (incoming_header != recv_expected_header) { fprintf(stderr, " ERR: ep %d recv header" " 0x%x exp 0x%x\n", incoming_ep_num, incoming_header, recv_expected_header); goto cleanup; } /* Done with Recv buffer - post the buffer back */ cookie.as_64 = recv_buf_index; l_iov.lmr_context = lmr_context_recv; l_iov.virtual_address = (DAT_VADDR) (uintptr_t) rcv_buf; l_iov.segment_length = rx_buf_len; if (srq_test) { LOGPRINTF(" Pre SRQ post receive msg buff %p.....", (DAT_PVOID)l_iov.virtual_address); ret = dat_srq_post_recv(h_srq, 1, &l_iov, cookie); } else { LOGPRINTF(" Pre osted receive msg, " "from ep %p buffer %p.....", event.event_data. dto_completion_event_data. ep_handle , rcv_buf); ret = dat_ep_post_recv(event.event_data. dto_completion_event_data. ep_handle, 1, &l_iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); } if (ret != DAT_SUCCESS) { fprintf(stderr, "\n Error posting recv " "msg buffer: %s\n", DT_RetToString(ret)); goto cleanup; } else LOGPRINTF("Done\n"); } } if (server) { /* Send pong */ for (ep_num = 0; ep_num < connections; ep_num++) { for (i = 0; i < burst_size; i++) { /* walk the send */ ret = send_msg(snd_buf, 0xaa, ep_num, tx_before + i + 1); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERROR: dat_ep_post_send() %s\n", DT_EventToSTr(ret)); goto cleanup; } else LOGPRINTF(" send_msg completed\n"); /* next buffers */ snd_buf += tx_buf_len; } } } tx_before += burst_size; /* clean req evd */ for (ep_num = 0; ep_num < connections; ep_num++) { for (i = 0; i < burst_size; i++) { ret = dat_evd_wait(h_dto_req_evd, DTO_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error waiting on h_req_evd %p: %s\n", h_dto_req_evd, DT_RetToString(ret)); goto cleanup; } if ((event.event_data.dto_completion_event_data. transfered_length != tx_buf_len) || event.event_data.dto_completion_event_data. status != DAT_SUCCESS) { fprintf(stderr, " ERROR: DTO REQ size %d, status %d\n", event.event_data.dto_completion_event_data. transfered_length, event.event_data. dto_completion_event_data.status); goto cleanup; } } } } goto complete; cleanup: flush_evds(); goto bail; complete: /* disconnect and free EP resources */ if (h_ep[0]) { /* unregister message buffers and tear down connection */ LOGPRINTF(" Disconnect EPs\n"); ret = disconnect_eps(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error disconnect_eps: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" disconnect_eps complete\n"); } } /* destroy server service point(s) */ if (h_psp != DAT_HANDLE_NULL) { ret = dat_psp_free(h_psp); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_psp_free: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" psp_free complete\n"); } } unregister_rdma_memory(); /* Free SRQ */ if (h_srq != DAT_HANDLE_NULL) { LOGPRINTF(" Free SRQ %p \n", h_srq); ret = dat_srq_free(h_srq); if (ret != DAT_SUCCESS) { fprintf(stderr, " Err freeing SRQ: %s\n", DT_RetToString(ret)); } else { LOGPRINTF(" SRQ Freed\n"); h_srq = DAT_HANDLE_NULL; } } /* free EVDs */ LOGPRINTF(" destroy events\n"); ret = destroy_events(); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error destroy_events: %s\n", DT_RetToString(ret)); goto bail; } else LOGPRINTF(" destroy events done\n"); /* Free protection domain */ LOGPRINTF(" Freeing pz\n"); ret = dat_pz_free(h_pz); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing PZ: %s\n", DT_RetToString(ret)); goto bail; } else { LOGPRINTF(" Freed pz\n"); h_pz = NULL; } /* close the device */ LOGPRINTF(" Closing Interface Adaptor\n"); ret = dat_ia_close(h_ia, DAT_CLOSE_ABRUPT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error Adaptor close: %s\n", DT_RetToString(ret)); goto bail; } else LOGPRINTF(" Closed Interface Adaptor\n"); printf(" DAPL %s %s Test Complete.\n\n", ud_test ? "UD" : "RC", srq_test ? "SRQ" : "none SRQ"); fflush(stderr); fflush(stdout); bail: free(h_ep); if(remote_ah) free(remote_ah); #if defined(_WIN32) || defined(_WIN64) WSACleanup(); #endif return (0); } DAT_RETURN process_cr() { DAT_RETURN ret; DAT_EVENT event; DAT_COUNT nmore; DAT_CR_PARAM cr_param; int i, pdata; DAT_CR_ARRIVAL_EVENT_DATA *cr_event = &event.event_data.cr_arrival_event_data; printf(" Accepting...\n"); fflush(stdout); for (i = 0; i < connections; i++) { /* Wait for CR's */ ret = dat_evd_wait(h_cr_evd, CR_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR: CR dat_evd_wait() %s\n", DT_RetToString(ret)); return ret; } if (event.event_number != DAT_CONNECTION_REQUEST_EVENT && (ud_test && event.event_number != DAT_IB_UD_CONNECTION_REQUEST_EVENT)) { fprintf(stderr, " Error unexpected cr event : %s\n", DT_EventToSTr(event.event_number)); return (DAT_ABORT); } if ((event.event_data.cr_arrival_event_data.conn_qual != (server ? server_port_id : client_port_id)) || (event.event_data.cr_arrival_event_data.sp_handle. psp_handle != h_psp)) { fprintf(stderr, " Error wrong cr event data : %s\n", DT_EventToSTr(event.event_number)); return (DAT_ABORT); } /* accept connect request from client */ h_cr = cr_event->cr_handle; ret = dat_cr_query(h_cr, DAT_CSP_FIELD_ALL, &cr_param); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error: unable to query cr\n"); return (DAT_ABORT); } /* use private data to select EP */ pdata = ntohl(*((int *)cr_param.private_data)); LOGPRINTF(" Accepting connect request %d from client:\n", pdata); ret = dat_cr_accept(h_cr, h_ep[pdata], 4, cr_param.private_data); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR dat_cr_accept: %s\n", DT_RetToString(ret)); return (ret); } else LOGPRINTF(" Accept[%d] complete\n", i); event.event_number = 0; } return DAT_SUCCESS; } DAT_RETURN process_conn() { DAT_RETURN ret; DAT_EVENT event; DAT_COUNT nmore; int i, exp_event, pdata; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0]; DAT_CONNECTION_EVENT_DATA *conn_event = &event.event_data.connect_event_data; if (ud_test) exp_event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED; else exp_event = DAT_CONNECTION_EVENT_ESTABLISHED; /* process the RTU, ESTABLISHMENT event */ printf(" Completing...\n"); for (i = 0; i < connections; i++) { /* process completions */ ret = dat_evd_wait(h_conn_evd, CONN_TIMEOUT, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR: CONN evd_wait() %s\n", DT_RetToString(ret)); return ret; } if (event.event_number != exp_event) { fprintf(stderr, " Err unexpected conn event : 0x%x %s\n", event.event_number, DT_EventToSTr(event.event_number)); return (DAT_ABORT); } event.event_number = 0; LOGPRINTF(" CONN_EST[%d] complete\n", i); /* RC we are done */ if (!ud_test) continue; /* store each remote_ah according to remote EP index */ pdata = ntohl(*((int *)conn_event->private_data)); LOGPRINTF(" Got private data=0x%x\n", pdata); /* UD, get AH for sends. * NOTE: bi-directional AH resolution results in a CONN_EST * for both outbound connect and inbound CR. * Use Active CONN_EST which includes server's CR * pdata for remote_ah idx to send. * * DAT_IB_UD_PASSIVE_REMOTE_AH == passive side CONN_EST * DAT_IB_UD_REMOTE_AH == active side CONN_EST */ if (ext_event->type == DAT_IB_UD_REMOTE_AH) { remote_ah[pdata] = ext_event->remote_ah; LOGPRINTF(" Active side - remote_ah[%d]: ah=%p, qpn=0x%x " "addr=%s\n", pdata, remote_ah[pdata].ah, remote_ah[pdata].qpn, inet_ntoa(((struct sockaddr_in *) &remote_ah[pdata]. ia_addr)->sin_addr)); } else if (ext_event->type == DAT_IB_UD_PASSIVE_REMOTE_AH) { remote_ah[pdata] = ext_event->remote_ah; LOGPRINTF(" Passive side - remote_ah[%d]: ah=%p, qpn=0x%x " "addr=%s\n", pdata, remote_ah[pdata].ah, remote_ah[pdata].qpn, inet_ntoa(((struct sockaddr_in *) &remote_ah[pdata]. ia_addr)->sin_addr)); } else { printf(" Error - unexpected UD ext_event type: 0x%x\n", ext_event->type); exit(1); } } return DAT_SUCCESS; } DAT_RETURN conn_server() { DAT_RETURN ret; /* wait for conn REQ and accept */ ret = process_cr(); if (ret != DAT_SUCCESS) return ret; /* wait for conn EST */ ret = process_conn(); if (ret != DAT_SUCCESS) return ret; return DAT_SUCCESS; } DAT_RETURN conn_client() { DAT_IA_ADDRESS_PTR raddr = (DAT_IA_ADDRESS_PTR)&remote; DAT_RETURN ret; struct addrinfo *target; int rval, i, pdata; if (ucm) goto no_resolution; #if defined(_WIN32) || defined(_WIN64) if ((rval = getaddrinfo(hostname, "ftp", NULL, &target)) != 0) { printf("\n remote name resolution failed! %s\n", gai_strerror(rval)); exit(1); } rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr; #else if (getaddrinfo(hostname, NULL, NULL, &target) != 0) { perror("\n remote name resolution failed!"); exit(1); } rval = ((struct sockaddr_in *)target->ai_addr)->sin_addr.s_addr; #endif printf(" Connecting to Server: %s \n", hostname); printf(" Address: %d.%d.%d.%d port %d\n", (rval >> 0) & 0xff, (rval >> 8) & 0xff, (rval >> 16) & 0xff, (rval >> 24) & 0xff, server_port_id); raddr = (DAT_IA_ADDRESS_PTR)target->ai_addr; no_resolution: printf(" Connecting...\n"); for (i = 0; i < connections; i++) { /* Client in UD test is one EP to many */ pdata = htonl(i); ret = dat_ep_connect(ud_test ? h_ep[0]: h_ep[i], raddr, server_port_id, CONN_TIMEOUT, 4, &pdata, 0, DAT_CONNECT_DEFAULT_FLAG); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR dat_ep_connect: %s\n", DT_RetToString(ret)); return (ret); } else LOGPRINTF(" dat_ep_connect [%d] complete\n", i); } /* wait for conn EST */ ret = process_conn(); if (ret != DAT_SUCCESS) return ret; if (!ucm) freeaddrinfo(target); return (DAT_SUCCESS); } /* validate disconnected EP's and free them */ DAT_RETURN disconnect_eps(void) { DAT_RETURN ret; DAT_EVENT event, async_event; DAT_COUNT nmore; int i,ii; DAT_CONNECTION_EVENT_DATA *conn_event = &event.event_data.connect_event_data; if (!connected) return DAT_SUCCESS; if (ud_test) { for (ii = 0; ii < connections; ii++) { LOGPRINTF(" Free EP[%d] %p\n", ii, h_ep[ii]); ret = dat_ep_free(h_ep[ii]); if (ret != DAT_SUCCESS) { fprintf(stderr, "ERR free EP[%d] %p: %s\n", ii, h_ep[ii], DT_RetToString(ret)); } else { LOGPRINTF(" Freed EP[%d] %p\n", ii, h_ep[ii]); h_ep[ii] = DAT_HANDLE_NULL; } /* Client use only EP zero in UD test */ if (!server) break; } return DAT_SUCCESS; } /* * Only the client needs to call disconnect. The server _should_ be able * to just wait on the EVD associated with connection events for a * disconnect request and then exit. */ for (i = 0; i < connections; i++) { if (!server) { LOGPRINTF(" dat_ep_disconnect[%d]\n",i); ret = dat_ep_disconnect(h_ep[i], DAT_CLOSE_DEFAULT); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error disconnect: %s\n", DT_RetToString(ret)); return ret; } else { LOGPRINTF(" disconnect completed[%d]\n", i); } } else { LOGPRINTF(" Server waiting for disconnect...\n"); } LOGPRINTF(" Wait for Disc event\n"); nmore = 0; event.event_number = 0; conn_event->ep_handle = NULL; ret = dat_evd_wait(h_conn_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_wait: %s\n", DT_RetToString(ret)); return ret; } else LOGPRINTF(" disc event[%d] complete\n", i); if (srq_test) { LOGPRINTF(" Wait for EP async event\n"); async_event.event_number = 0; ret = dat_evd_wait(h_async_evd, DAT_TIMEOUT_INFINITE, 1, &async_event, &nmore); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_wait async evd: %s\n", DT_RetToString(ret)); return ret; } else LOGPRINTF(" Async event 0x%x received for EP %p\n", async_event.event_number, async_event.event_data.asynch_error_event_data.dat_handle); if (async_event.event_number != DAT_ASYNC_ERROR_EP_BROKEN) { LOGPRINTF(" Invalid async event number 0x%x expected 0x%x\n", async_event.event_number, DAT_ASYNC_ERROR_EP_BROKEN); return DAT_INVALID_HANDLE; } if (conn_event->ep_handle != async_event. event_data.asynch_error_event_data.dat_handle) { LOGPRINTF(" Invalid EP via async event. conn event EP = %p," " async event EP = %p\n", conn_event->ep_handle, async_event.event_data.asynch_error_event_data.dat_handle); return DAT_INVALID_HANDLE; } } LOGPRINTF(" Check for valid EP and free it\n"); /* check for valid EP in creation list */ for (ii = 0; ii < connections; ii++) { if (h_ep[ii] == conn_event->ep_handle) { LOGPRINTF(" valid EP[%d] %p\n", ii, h_ep[ii]); ret = dat_ep_free(h_ep[ii]); if (ret != DAT_SUCCESS) { fprintf(stderr, " ERR free EP[%d] %p: %s\n", ii, h_ep[ii], DT_RetToString(ret)); return ret; } else { LOGPRINTF(" Freed EP[%d] %p\n", ii, h_ep[ii]); h_ep[ii] = DAT_HANDLE_NULL; } break; } } if (ii == connections) { LOGPRINTF(" %s: invalid EP[%d] %p via DISC event!\n", server ? "Server" : "Client", i, conn_event->ep_handle); return DAT_INVALID_HANDLE; } } /* free EPs */ LOGPRINTF(" Successfully disconnected all %d EP's\n", connections); return DAT_SUCCESS; } /* * Create CR, CONN, and DTO events */ DAT_RETURN create_events(void) { DAT_RETURN ret; DAT_EVD_PARAM param; DAT_COUNT evd_min_qlen; /*** create CR EVD ***/ evd_min_qlen = connections; ret = dat_evd_create(h_ia, evd_min_qlen, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &h_cr_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create CR: %s\n", DT_RetToString(ret)); return (ret); } /* query and check size */ ret = dat_evd_query(h_cr_evd, DAT_EVD_FIELD_EVD_QLEN, ¶m); if (ret != DAT_SUCCESS) { fprintf(stderr, " Err dat_evd_query CR evd: %s\n", DT_RetToString(ret)); return (ret); } else if (param.evd_qlen < evd_min_qlen) { fprintf(stderr, " Error dat_evd qsize too small: %d < %d\n", param.evd_qlen, evd_min_qlen); return (ret); } LOGPRINTF(" cr_evd created (%p). QLEN - requested %d and actual %d\n", h_cr_evd, evd_min_qlen, param.evd_qlen); /*** create conn EVD ***/ evd_min_qlen = connections * 2; ret = dat_evd_create(h_ia, evd_min_qlen, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create CONN: %s\n", DT_RetToString(ret)); return (ret); } /* query and check size */ ret = dat_evd_query(h_conn_evd, DAT_EVD_FIELD_EVD_QLEN, ¶m); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_query CONN evd: %s\n", DT_RetToString(ret)); return (ret); } else if (param.evd_qlen < evd_min_qlen) { fprintf(stderr, " Error dat_evd qsize too small: %d < %d\n", param.evd_qlen, evd_min_qlen); return (ret); } LOGPRINTF(" conn_evd created (%p). QLEN - requested %d and actual %d\n", h_conn_evd, evd_min_qlen, param.evd_qlen); /*** create dto SND EVD ***/ evd_min_qlen = connections * burst_size; ret = dat_evd_create(h_ia, evd_min_qlen, NULL, DAT_EVD_DTO_FLAG, &h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create REQ: %s\n", DT_RetToString(ret)); return (ret); } /* query and check size */ ret = dat_evd_query(h_dto_req_evd, DAT_EVD_FIELD_EVD_QLEN, ¶m); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_query REQ evd: %s\n", DT_RetToString(ret)); return (ret); } else if (param.evd_qlen < evd_min_qlen) { fprintf(stderr, " Error dat_evd qsize too small: %d < %d\n", param.evd_qlen, evd_min_qlen); return (ret); } LOGPRINTF(" req_evd created (%p). QLEN - requested %d and actual %d\n", h_dto_req_evd, evd_min_qlen, param.evd_qlen); /*** create dto RCV EVD ***/ evd_min_qlen = connections * burst_size; ret = dat_evd_create(h_ia, evd_min_qlen, NULL, DAT_EVD_DTO_FLAG, &h_dto_rcv_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_create RCV: %s\n", DT_RetToString(ret)); return (ret); } /* query and check size */ ret = dat_evd_query(h_dto_rcv_evd, DAT_EVD_FIELD_EVD_QLEN, ¶m); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error dat_evd_query RCV evd: %s\n", DT_RetToString(ret)); return (ret); } else if (param.evd_qlen < evd_min_qlen) { fprintf(stderr, " Error dat_evd qsize too small: %d < %d\n", param.evd_qlen, evd_min_qlen); return (ret); } LOGPRINTF(" rcv_evd created (%p). QLEN - requested %d and actual %d\n", h_dto_rcv_evd, evd_min_qlen, param.evd_qlen); return DAT_SUCCESS; } /* * Destroy CR, CONN, CNO, and DTO events */ DAT_RETURN destroy_events(void) { DAT_RETURN ret; /* free cr EVD */ if (h_cr_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free cr EVD %p \n", h_cr_evd); ret = dat_evd_free(h_cr_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing cr EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed cr EVD\n"); h_cr_evd = DAT_HANDLE_NULL; } } /* free conn EVD */ if (h_conn_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free conn EVD %p\n", h_conn_evd); ret = dat_evd_free(h_conn_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing conn EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed conn EVD\n"); h_conn_evd = DAT_HANDLE_NULL; } } /* free RCV dto EVD */ if (h_dto_rcv_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free RCV dto EVD %p\n", h_dto_rcv_evd); ret = dat_evd_free(h_dto_rcv_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing dto EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed dto EVD\n"); h_dto_rcv_evd = DAT_HANDLE_NULL; } } /* free REQ dto EVD */ if (h_dto_req_evd != DAT_HANDLE_NULL) { LOGPRINTF(" Free REQ dto EVD %p\n", h_dto_req_evd); ret = dat_evd_free(h_dto_req_evd); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error freeing dto EVD: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Freed dto EVD\n"); h_dto_req_evd = DAT_HANDLE_NULL; } } return DAT_SUCCESS; } /* * Map DAT_RETURN values to readable strings, * but don't assume the values are zero-based or contiguous. */ char errmsg[512] = { 0 }; const char *DT_RetToString(DAT_RETURN ret_value) { const char *major_msg, *minor_msg; dat_strerror(ret_value, &major_msg, &minor_msg); strcpy(errmsg, major_msg); strcat(errmsg, " "); strcat(errmsg, minor_msg); return errmsg; } /* * Map DAT_EVENT_CODE values to readable strings */ const char *DT_EventToSTr(DAT_EVENT_NUMBER event_code) { unsigned int i; static struct { const char *name; DAT_RETURN value; } dat_events[] = { # define DATxx(x) { # x, x } DATxx(DAT_DTO_COMPLETION_EVENT), DATxx(DAT_RMR_BIND_COMPLETION_EVENT), DATxx(DAT_CONNECTION_REQUEST_EVENT), DATxx(DAT_CONNECTION_EVENT_ESTABLISHED), DATxx(DAT_CONNECTION_EVENT_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_NON_PEER_REJECTED), DATxx(DAT_CONNECTION_EVENT_ACCEPT_COMPLETION_ERROR), DATxx(DAT_CONNECTION_EVENT_DISCONNECTED), DATxx(DAT_CONNECTION_EVENT_BROKEN), DATxx(DAT_CONNECTION_EVENT_TIMED_OUT), DATxx(DAT_CONNECTION_EVENT_UNREACHABLE), DATxx(DAT_ASYNC_ERROR_EVD_OVERFLOW), DATxx(DAT_ASYNC_ERROR_IA_CATASTROPHIC), DATxx(DAT_ASYNC_ERROR_EP_BROKEN), DATxx(DAT_ASYNC_ERROR_TIMED_OUT), DATxx(DAT_ASYNC_ERROR_PROVIDER_INTERNAL_ERROR), DATxx(DAT_SOFTWARE_EVENT) # undef DATxx }; # define NUM_EVENTS (sizeof(dat_events)/sizeof(dat_events[0])) for (i = 0; i < NUM_EVENTS; i++) { if (dat_events[i].value == event_code) { return (dat_events[i].name); } } return ("Invalid_DAT_EVENT_NUMBER"); } void flush_evds(void) { DAT_EVENT event; /* Flush async error queue */ printf(" ERR: Checking ASYNC EVD...\n"); while (dat_evd_dequeue(h_async_evd, &event) == DAT_SUCCESS) { printf(" ASYNC EVD ENTRY: handle=%p reason=%d\n", event.event_data.asynch_error_event_data.dat_handle, event.event_data.asynch_error_event_data.reason); } } static void print_ia_address(struct sockaddr *sa) { char str[INET6_ADDRSTRLEN] = {" ??? "}; switch(sa->sa_family) { case AF_INET: inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, str, INET6_ADDRSTRLEN); printf(" Local Address AF_INET - %s port %d\n", str, server_port_id); break; case AF_INET6: inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr, str, INET6_ADDRSTRLEN); printf(" Local Address AF_INET6 - %s flowinfo(QPN)=0x%x, port(LID)=0x%x\n", str, ntohl(((struct sockaddr_in6 *)sa)->sin6_flowinfo), ntohs(((struct sockaddr_in6 *)sa)->sin6_port)); break; default: printf(" Local Address UNKOWN FAMILY - port %d\n", server_port_id); } } /* Register RDMA Receive buffer */ DAT_RETURN register_rdma_memory(void) { DAT_RETURN ret; DAT_REGION_DESCRIPTION region; region.for_va = rbuf; ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, connections * rx_buf_len * burst_size, h_pz, DAT_MEM_PRIV_ALL_FLAG, DAT_VA_TYPE_VA, &h_lmr_recv, &lmr_context_recv, &rmr_context_recv, ®istered_size_recv, ®istered_addr_recv); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error registering Receive RDMA buffer: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Registered RCV RDMA Buffer %p\n", region.for_va); } /* Register RDMA Send buffer */ region.for_va = sbuf; ret = dat_lmr_create(h_ia, DAT_MEM_TYPE_VIRTUAL, region, connections * tx_buf_len * burst_size, h_pz, DAT_MEM_PRIV_ALL_FLAG, DAT_VA_TYPE_VA, &h_lmr_send, &lmr_context_send, &rmr_context_send, ®istered_size_send, ®istered_addr_send); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error registering send RDMA buffer: %s\n", DT_RetToString(ret)); return (ret); } else { LOGPRINTF(" Registered Send RDMA Buffer %p\n", region.for_va); } return DAT_SUCCESS; } void unregister_rdma_memory() { DAT_RETURN ret; /* Unregister Send message Buffer */ if (h_lmr_send != DAT_HANDLE_NULL) { LOGPRINTF(" Unregister send message h_lmr %p \n", h_lmr_send); ret = dat_lmr_free(h_lmr_send); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error deregistering send msg mr: %s\n", DT_RetToString(ret)); } else { LOGPRINTF(" Unregistered send message Buffer\n"); h_lmr_send = NULL; } } /* Unregister recv message Buffer */ if (h_lmr_recv != DAT_HANDLE_NULL) { LOGPRINTF(" Unregister recv message h_lmr %p \n", h_lmr_recv); ret = dat_lmr_free(h_lmr_recv); if (ret != DAT_SUCCESS) { fprintf(stderr, " Error deregistering recv msg mr: %s\n", DT_RetToString(ret)); } else { LOGPRINTF(" Unregistered recv message Buffer\n"); h_lmr_recv = NULL; } } } DAT_RETURN send_msg(char *buff, char msg_head, DAT_UINT32 ep_num, DAT_UINT32 msg_num) { DAT_DTO_COOKIE cookie; DAT_LMR_TRIPLET l_iov; *buff = msg_head; *((DAT_UINT32 *)(buff + 4)) = htonl(ep_num); *((DAT_UINT32 *)(buff + 8)) = htonl(msg_num); l_iov.lmr_context = lmr_context_send; #if defined(_WIN32) l_iov.virtual_address = (DAT_VADDR) buff; #else l_iov.virtual_address = (DAT_VADDR)(unsigned long)buff; #endif l_iov.segment_length = tx_buf_len; if (!ud_test) { LOGPRINTF(" %s RC SEND, ep %d, msg num %d, buffer %p len=%d\n", server ? "SERVER:" : "CLIENT:", ep_num, msg_num, buff, tx_buf_len); return dat_ep_post_send(h_ep[ep_num], 1, &l_iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); } else { /* UD section */ int ep_idx = (server ? ep_num : 0); int ah_idx = (server ? 0 : ep_num); LOGPRINTF(" %s UD SND, from ep %d to ep %d, msg num %d, buffer %p len %d\n", server ? "SERVER:" : "CLIENT:", ep_idx, ah_idx, msg_num, buff, tx_buf_len); LOGPRINTF(" %s sending on ep=%p to remote_ah %p" " qpn=0x%x addr=%s\n", server ? "Server" : "Client", h_ep[ep_idx], remote_ah[ah_idx].ah, remote_ah[ah_idx].qpn, inet_ntoa(((struct sockaddr_in *) &remote_ah[ah_idx].ia_addr)->sin_addr)); /* client use all data in on first EP */ return dat_ib_post_send_ud(h_ep[ep_idx], 1, &l_iov, &remote_ah[ah_idx], cookie, DAT_COMPLETION_DEFAULT_FLAG); } } void print_usage(void) { printf("\n DAPL SRQ USAGE \n\n"); printf("s: server\n"); printf("c: connections (default = 1, max = 100)\n"); printf("B: burst messages per connection (default = 1, max = 100)\n"); printf("t: bursts number per connection (default = 3)\n"); printf("b: buffer length to allocate (default DAT_IB_TRANSPORT_MTU)\n"); printf("v: verbose\n"); printf("h: hostname/address of server, specified on client\n"); printf("P: provider name (default = OpenIB-cma)\n"); printf("l: server lid (required ucm provider)\n"); printf("q: server qpn (required ucm provider)\n"); printf("u unreliable datagram test (default false)\n"); printf("S use SRQ (default = 1 = use SQR)\n"); printf("\n"); } dapl-2.1.5/test/dtest/dtestx.c000077500000000000000000001342751255317474200162510ustar00rootroot00000000000000/* * Copyright (c) 2007-2008 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * $Id: $ */ #include #include #if defined(_WIN32) || defined(_WIN64) #include #include #include #include #include #include #include "..\..\..\..\etc\user\getopt.c" #define __BYTE_ORDER __LITTLE_ENDIAN #define getpid() ((int)GetCurrentProcessId()) #define F64x "%I64x" #define F64u "%I64u" #define DAPL_PROVIDER "ibnic0v2" #else #include #include #include #include #include #include #include #include #include #include #define DAPL_PROVIDER "ofa-v2-mlx4_0-1u" #define F64x "%"PRIx64"" #define F64u "%"PRIu64"" #endif #include "dat2/udat.h" #include "dat2/dat_ib_extensions.h" int disconnect_ep(void); #define _OK(status, str) \ {\ const char *maj_msg, *min_msg;\ if (status != DAT_SUCCESS) {\ dat_strerror(status, &maj_msg, &min_msg);\ fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\ dat_ia_close(ia, DAT_CLOSE_DEFAULT);\ exit(1);\ } else if (verbose) {\ printf("dtestx: %s success\n",str);\ }\ } #define _OK2(status, str)\ {\ const char *maj_msg, *min_msg;\ if (status != DAT_SUCCESS) {\ dat_strerror(status, &maj_msg, &min_msg);\ fprintf(stderr, str " returned %s : %s\n", maj_msg, min_msg);\ dat_ia_close(ia, DAT_CLOSE_DEFAULT);\ exit(1);\ } else if (verbose) {\ printf("dtestx: %s\n",str);\ }\ } /* byte swap helpers from Complib */ #if __BYTE_ORDER == __LITTLE_ENDIAN #define ntoh16(x) (uint16_t)( \ (((uint16_t)(x) & 0x00FF) << 8) | \ (((uint16_t)(x) & 0xFF00) >> 8)) #define hton16(x) ntoh16(x) #define ntoh32(x) (uint32_t)( \ (((uint32_t)(x) & 0x000000FF) << 24)| \ (((uint32_t)(x) & 0x0000FF00) << 8) | \ (((uint32_t)(x) & 0x00FF0000) >> 8) | \ (((uint32_t)(x) & 0xFF000000) >> 24)) #define hton32(x) ntoh32(x) #define ntoh64(x) (uint64_t)( \ (((uint64_t)x & 0x00000000000000FFULL) << 56) | \ (((uint64_t)x & 0x000000000000FF00ULL) << 40) | \ (((uint64_t)x & 0x0000000000FF0000ULL) << 24) | \ (((uint64_t)x & 0x00000000FF000000ULL) << 8 ) | \ (((uint64_t)x & 0x000000FF00000000ULL) >> 8 ) | \ (((uint64_t)x & 0x0000FF0000000000ULL) >> 24) | \ (((uint64_t)x & 0x00FF000000000000ULL) >> 40) | \ (((uint64_t)x & 0xFF00000000000000ULL) >> 56)) #define hton64(x) ntoh64(x) #elif __BYTE_ORDER == __BIG_ENDIAN #define hton16(x) (x) #define ntoh16(x) (x) #define hton32(x) (x) #define ntoh32(x) (x) #define hton64(x) (x) #define ntoh64(x) (x) #endif /* __BYTE_ORDER == __BIG_ENDIAN */ #define MIN(a, b) ((a < b) ? (a) : (b)) #define MAX(a, b) ((a > b) ? (a) : (b)) #define DTO_TIMEOUT (1000*1000*5) #define CONN_TIMEOUT (1000*1000*30) #define SERVER_TIMEOUT (DAT_TIMEOUT_INFINITE) #define CLIENT_ID 31111 #define SERVER_ID 31112 #define BUF_SIZE 256 #define BUF_SIZE_ATOMIC 8 #define REG_MEM_COUNT 10 #define SND_RDMA_BUF_INDEX 0 #define RCV_RDMA_BUF_INDEX 1 #define SEND_BUF_INDEX 2 #define RECV_BUF_INDEX 3 #define MAX_EP_COUNT 1000 #define MAX_AH_COUNT (MAX_EP_COUNT * 2) DAT_VADDR *atomic_buf; DAT_LMR_HANDLE lmr_atomic; DAT_LMR_CONTEXT lmr_atomic_context; DAT_RMR_CONTEXT rmr_atomic_context; DAT_VLEN reg_atomic_size; DAT_VADDR reg_atomic_addr; DAT_LMR_HANDLE lmr[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_LMR_CONTEXT lmr_context[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_RMR_TRIPLET rmr[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_RMR_CONTEXT rmr_context[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_VLEN reg_size[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_VADDR reg_addr[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_RMR_TRIPLET *buf[REG_MEM_COUNT * MAX_EP_COUNT]; DAT_EP_HANDLE ep[MAX_EP_COUNT]; DAT_EVD_HANDLE async_evd = DAT_HANDLE_NULL; DAT_IA_HANDLE ia = DAT_HANDLE_NULL; DAT_PZ_HANDLE pz = DAT_HANDLE_NULL; DAT_EVD_HANDLE cr_evd = DAT_HANDLE_NULL; DAT_EVD_HANDLE con_evd = DAT_HANDLE_NULL; DAT_EVD_HANDLE dto_evd = DAT_HANDLE_NULL; DAT_PSP_HANDLE psp = DAT_HANDLE_NULL; int server = 1; int remote_host = 0; int ud_test = 0; int multi_eps = 0; int buf_size = BUF_SIZE; int msg_size = sizeof(DAT_RMR_TRIPLET); char provider[64] = DAPL_PROVIDER; char hostname[256] = { 0 }; static DAT_IB_ADDR_HANDLE remote_ah[MAX_EP_COUNT][MAX_AH_COUNT]; int eps = 1; int verbose = 0; int counters = 0; int counters_ok = 0; static int ucm = 0; static DAT_SOCK_ADDR6 remote; static DAT_IA_ATTR ia_attr; static DAT_PROVIDER_ATTR prov_attrs; #define LOGPRINTF if (verbose) printf #define CONN_PORT 15828 #define CONN_MSG_SIZE 128 #define CONN_MSG_FMT "%04hx:%08x:%08x:%08x:%s" void print_usage(void) { printf("\n dtestx usage \n\n"); printf("v: verbose\n"); printf("p: print counters\n"); printf("u unreliable datagram test\n"); printf("U: unreliable datagram test, UD endpoint count\n"); printf("m unreliable datagram test, multiple Server endpoints\n"); printf("b: buf length to allocate\n"); printf("h: hostname/address of Server, client and UDP server\n"); printf("c: Client\n"); printf("s: Server, default\n"); printf("P: provider name (default = ofa-v2-mlx4_0-1u)\n"); printf("\n"); } #if defined(_WIN32) || defined(_WIN64) static void sleep(int secs) { Sleep(secs * 1000); } #define _WSACleanup() WSACleanup() #else #define _WSACleanup() #endif static void print_ia_address(struct sockaddr *sa) { char str[INET6_ADDRSTRLEN] = {" ??? "}; switch(sa->sa_family) { case AF_INET: inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET - %s port %d\n", getpid(), str, SERVER_ID); break; case AF_INET6: inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr, str, INET6_ADDRSTRLEN); printf("%d Local Address AF_INET6 - %s flowinfo(QPN)=0x%x, port(LID)=0x%x\n", getpid(), str, ntohl(((struct sockaddr_in6 *)sa)->sin6_flowinfo), ntohs(((struct sockaddr_in6 *)sa)->sin6_port)); break; default: printf("%d Local Address UNKOWN FAMILY - port %d\n", getpid(), SERVER_ID); } } int conn_client_connect(const char *servername, int port) { struct addrinfo *res, *t; struct addrinfo hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; char *service; int n; int sockfd = -1; if (asprintf(&service, "%d", port) < 0) return -1; n = getaddrinfo(servername, service, &hints, &res); if (n < 0) { fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port); return n; } for (t = res; t; t = t->ai_next) { sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol); if (sockfd >= 0) { if (!connect(sockfd, t->ai_addr, t->ai_addrlen)) break; close(sockfd); sockfd = -1; } } freeaddrinfo(res); if (sockfd < 0) { fprintf(stderr, "Couldn't connect to %s:%d\n", servername, port); return sockfd; } return sockfd; } int conn_server_connect(int port) { struct addrinfo *res, *t; struct addrinfo hints = { .ai_flags = AI_PASSIVE, .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }; char *service; int sockfd = -1, connfd; int n; if (asprintf(&service, "%d", port) < 0) return -1; n = getaddrinfo(NULL, service, &hints, &res); if (n < 0) { fprintf(stderr, "%s for port %d\n", gai_strerror(n), port); return n; } for (t = res; t; t = t->ai_next) { sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol); if (sockfd >= 0) { n = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n); if (!bind(sockfd, t->ai_addr, t->ai_addrlen)) break; close(sockfd); sockfd = -1; } } freeaddrinfo(res); if (sockfd < 0) { fprintf(stderr, "Couldn't listen to port %d\n", port); return sockfd; } listen(sockfd, 1); connfd = accept(sockfd, NULL, 0); if (connfd < 0) { perror("server accept"); fprintf(stderr, "accept() failed\n"); close(sockfd); return connfd; } close(sockfd); return connfd; } static int get_server_params(struct sockaddr *my_sa) { int connfd, parsed; in_port_t ser_lid = 0; uint32_t scope_id = 0, ser_qpn = 0, ser_scope_id = 0, ser_sin_addr = 0; struct in_addr sin_addr; /* Internet address. */ char msg[CONN_MSG_SIZE]; connfd = conn_client_connect(hostname, CONN_PORT); if (connfd < 0) { fprintf(stderr, "%d Could not connect to %s\n", getpid(), hostname); return -1; } if (read(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't read remote address\n", getpid()); return -1; } parsed = sscanf(msg, CONN_MSG_FMT, &ser_lid, &ser_qpn, &ser_scope_id, &ser_sin_addr, provider); if (parsed != 5) { fprintf(stderr, "%d Couldn't parse line <%.*s>\n", getpid(), (int)sizeof msg, msg); return -1; } if (ser_sin_addr) { sin_addr.s_addr = ser_sin_addr; inet_ntop(AF_INET, &sin_addr, hostname, INET6_ADDRSTRLEN); LOGPRINTF("%d remote data: provider %s hostname %s\n", getpid(), provider, hostname); } else if (ser_lid && ser_qpn) { remote.sin6_family = AF_INET6; remote.sin6_port = ser_lid; remote.sin6_flowinfo = ser_qpn; remote.sin6_scope_id = ntohl(ser_scope_id); ucm = 1; LOGPRINTF("%d remote data: provider %s Client QPN 0x%x," " LID = 0x%x, scope_id 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(ser_scope_id)); } else { fprintf(stderr, "%d No valid data was received" " from the server\n", getpid()); return -1; } /* send client addr back to server */ if (my_sa->sa_family == AF_INET6) { ser_qpn = ((struct sockaddr_in6 *)my_sa)->sin6_flowinfo; ser_lid = ((struct sockaddr_in6 *)my_sa)->sin6_port; scope_id = htonl(((struct sockaddr_in6 *)my_sa)->sin6_scope_id); LOGPRINTF("%d Client data to server: provider %s QPN 0x%x LID" " = 0x%x SCCOPE_ID 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(scope_id)); } else if (my_sa->sa_family == AF_INET) { ser_sin_addr = ((struct sockaddr_in *)my_sa)->sin_addr.s_addr; LOGPRINTF("%d Server data to client: provider %s SIN_ADDR" " 0x%x\n", getpid(), provider, ser_sin_addr); } sprintf(msg, CONN_MSG_FMT, ser_lid, ser_qpn, scope_id, ser_sin_addr, provider); if (write(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't send data", getpid()); return -1; } return 0; } static int send_server_params(struct sockaddr *ser_sa) { in_port_t ser_lid = 0; uint32_t scope_id = 0, ser_qpn = 0, ser_scope_id = 0, ser_sin_addr = 0; int parsed, connfd; struct in_addr sin_addr; /* Internet address. */ char msg[CONN_MSG_SIZE]; if (!ser_sa) { printf("%d no address\n", getpid()); return -1; } if (ser_sa->sa_family == AF_INET6) { ser_qpn = ((struct sockaddr_in6 *)ser_sa)->sin6_flowinfo; ser_lid = ((struct sockaddr_in6 *)ser_sa)->sin6_port; scope_id = htonl(((struct sockaddr_in6 *)ser_sa)->sin6_scope_id); LOGPRINTF("%d Server data to client: provider %s QPN 0x%x LID" " = 0x%x SCCOPE_ID 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(scope_id)); } else if (ser_sa->sa_family == AF_INET) { ser_sin_addr = ((struct sockaddr_in *)ser_sa)->sin_addr.s_addr; LOGPRINTF("%d Server data to client: provider %s SIN_ADDR" " 0x%x\n", getpid(), provider, ser_sin_addr); } connfd = conn_server_connect(CONN_PORT); if (connfd < 0) { fprintf(stderr, "%d Failed to connect to client\n", getpid()); return -1; } sprintf(msg, CONN_MSG_FMT, ser_lid, ser_qpn, scope_id, ser_sin_addr, provider); if (write(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't send data", getpid()); return -1; } ser_lid = ser_qpn = ser_scope_id = ser_sin_addr = 0; /* get remote address from Client */ if (read(connfd, msg, sizeof msg) != sizeof msg) { fprintf(stderr, "%d Couldn't read remote address\n", getpid()); return -1; } parsed = sscanf(msg, CONN_MSG_FMT, &ser_lid, &ser_qpn, &ser_scope_id, &ser_sin_addr, provider); if (parsed != 5) { fprintf(stderr, "%d Couldn't parse line <%.*s>\n", getpid(), (int)sizeof msg, msg); return -1; } if (ser_sin_addr) { sin_addr.s_addr = ser_sin_addr; inet_ntop(AF_INET, &sin_addr, hostname, INET6_ADDRSTRLEN); LOGPRINTF("%d remote data: provider %s hostname %s\n", getpid(), provider, hostname); } else if (ser_lid && ser_qpn) { remote.sin6_family = AF_INET6; remote.sin6_port = ser_lid; remote.sin6_flowinfo = ser_qpn; remote.sin6_scope_id = ntohl(ser_scope_id); ucm = 1; LOGPRINTF("%d remote data: provider %s Client QPN 0x%x," " LID = 0x%x, scope_id 0x%x\n", getpid(), provider, ntohl(ser_qpn), ntohs(ser_lid), ntohl(ser_scope_id)); } else { fprintf(stderr, "%d No valid data was received" " from the server\n", getpid()); return -1; } return 0; } void send_msg(void *data, DAT_COUNT size, DAT_LMR_CONTEXT context, DAT_DTO_COOKIE cookie, DAT_COMPLETION_FLAGS flags) { DAT_LMR_TRIPLET iov; DAT_EVENT event; DAT_COUNT nmore; DAT_RETURN status; int i, ep_idx = 0, ah_idx = 0; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; iov.lmr_context = context; iov.virtual_address = (DAT_VADDR) (uintptr_t) data; iov.segment_length = (DAT_VLEN) size; for (i = 0; i < eps; i++) { if (ud_test) { /* * single QP - ep[0] and ah[0] for client and server * multi QP - ep[i]->ah[i] for client, i to i * ep[0]->ah[i] for server, 0 to all */ if (multi_eps) { ah_idx = i; if (!server) ep_idx = i; } printf("%s send on ep=%p -> remote_ah[%d][%d]: ah=%p" " qpn=0x%x\n", server ? "Server" : "Client", ep[ep_idx], ep_idx, ah_idx, remote_ah[ep_idx][ah_idx].ah, remote_ah[ep_idx][ah_idx].qpn); /* client expects all data in on first EP */ status = dat_ib_post_send_ud(ep[ep_idx], 1, &iov, &remote_ah[ep_idx][ah_idx], cookie, flags); } else { status = dat_ep_post_send(ep[0], 1, &iov, cookie, flags); } _OK(status, "dat_ep_post_send"); if (!(flags & DAT_COMPLETION_SUPPRESS_FLAG)) { status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait after dat_ep_post_send"); if (event.event_number != DAT_DTO_COMPLETION_EVENT && ud_test && event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event waiting post_send " "completion - 0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status for post_send"); } } } /* RC - Server only, UD - Server and Client, one per EP */ void process_cr(int idx) { DAT_EVENT event; DAT_COUNT nmore; DAT_RETURN status; int pdata; DAT_CR_HANDLE cr = DAT_HANDLE_NULL; DAT_CONN_QUAL exp_qual = server ? SERVER_ID : CLIENT_ID; DAT_CR_PARAM cr_param; DAT_CR_ARRIVAL_EVENT_DATA *cr_event = &event.event_data.cr_arrival_event_data; LOGPRINTF("%s waiting for connect[%d] request\n", server ? "Server" : "Client", idx); status = dat_evd_wait(cr_evd, SERVER_TIMEOUT, 1, &event, &nmore); _OK(status, "CR dat_evd_wait"); if (event.event_number != DAT_CONNECTION_REQUEST_EVENT && (ud_test && event.event_number != DAT_IB_UD_CONNECTION_REQUEST_EVENT)) { printf("unexpected event,!conn req: 0x%x\n", event.event_number); exit(1); } if ((cr_event->conn_qual != exp_qual) || (cr_event->sp_handle.psp_handle != psp)) { printf("wrong cr event data\n"); exit(1); } cr = cr_event->cr_handle; status = dat_cr_query(cr, DAT_CSP_FIELD_ALL, &cr_param); _OK(status, "dat_cr_query"); /* use private data to select EP */ pdata = ntoh32(*((int *)cr_param.private_data)); LOGPRINTF("%s recvd pdata=0x%x, send pdata=0x%x\n", server ? "Server" : "Client", pdata, *(int *)cr_param.private_data); status = dat_cr_accept(cr, ep[pdata], 4, cr_param.private_data); _OK(status, "dat_cr_accept"); printf("%s accepted CR on EP[%d]=%p\n", server ? "Server" : "Client", pdata, ep[pdata]); } /* RC - Client and Server: 1, UD - Client: 1 per EP, Server: 2 per EP's */ void process_conn(int idx) { DAT_EVENT event; DAT_COUNT nmore; DAT_RETURN status; int i, ep_r = 0, ep_l = 0, exp_event; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *) &event.event_extension_data[0]; DAT_CONNECTION_EVENT_DATA *conn_event = &event.event_data.connect_event_data; LOGPRINTF("%s waiting for connect[%d] establishment\n", server ? "Server" : "Client", idx); status = dat_evd_wait(con_evd, CONN_TIMEOUT, 1, &event, &nmore); _OK(status, "CONN dat_evd_wait"); LOGPRINTF("%s got connect[%d] event 0x%x, pdata %p sz=%d\n", server ? "Server" : "Client", idx, event.event_number, conn_event->private_data, conn_event->private_data_size); if (ud_test) exp_event = DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED; else exp_event = DAT_CONNECTION_EVENT_ESTABLISHED; /* Waiting on CR's or CONN_EST */ if (event.event_number != exp_event) { printf("unexpected event, !conn established: 0x%x\n", event.event_number); exit(1); } /* RC or PASSIVE CONN_EST we are done */ if (!ud_test) return; /* Initialize local EP index */ for (i=0;iep_handle) { ep_l = i; break; } } LOGPRINTF(" Client got private data: ep_idx = %d\n", ep_r); /* UD, save AH for sends, active side only * NOTE: bi-directional AH resolution results in a CONN_EST * for both outbound connect and inbound CR. * Active pdata includes remote_ah EP idx. * * DAT_IB_UD_PASSIVE_REMOTE_AH == passive side CONN_EST * DAT_IB_UD_REMOTE_AH == active side CONN_EST */ if (ext_event->type == DAT_IB_UD_REMOTE_AH) { ep_r = ntoh32(*((int *)conn_event->private_data)); /* AH exists for this remote EP, FREE if provider supports */ if (remote_ah[ep_l][ep_r].ah && ia_attr.extension_version >= 209) dat_ib_ud_ah_free(ep[ep_l], &ext_event->remote_ah); else remote_ah[ep_l][ep_r] = ext_event->remote_ah; printf("CONNECT EP_L[%d]=%p (%p) -> remote_ah[%d][%d]: ah=%p," "qpn=0x%x cm_ctx %p %lu\n", ep_l, ep[ep_l], conn_event->ep_handle, ep_l, ep_r, remote_ah[ep_l][ep_r].ah, remote_ah[ep_l][ep_r].qpn, ext_event->context.as_ptr, sizeof(*ext_event)); } else if (ext_event->type == DAT_IB_UD_PASSIVE_REMOTE_AH) { if (ia_attr.extension_version >= 209) { LOGPRINTF("PASSIVE EP_L[%d]=%p -> remote_ah %p qpn %d" " AH_FREE\n", ep_l, ep[ep_l], ext_event->remote_ah.ah, ext_event->remote_ah.qpn); dat_ib_ud_ah_free(ep[ep_l], &ext_event->remote_ah); } } else { printf("wrong UD ext_event type: 0x%x\n", ext_event->type); exit(1); } if (ia_attr.extension_version >= 209) { LOGPRINTF("%s EP_L[%d]=%p -> cm %p CM_FREE\n", ext_event->type == DAT_IB_UD_PASSIVE_REMOTE_AH ? "PASSIVE":"ACTIVE ", ep_l, ep[ep_l], ext_event->context.as_ptr); dat_ib_ud_cm_free(ep[ep_l], ext_event->context.as_ptr); } } int connect_ep(char *hostname, struct sockaddr *ser_sa) { DAT_IA_ADDRESS_PTR remote_addr = (DAT_IA_ADDRESS_PTR)&remote; DAT_EP_ATTR ep_attr; DAT_RETURN status; DAT_REGION_DESCRIPTION region; DAT_EVENT event; DAT_COUNT nmore; DAT_LMR_TRIPLET iov; DAT_RMR_TRIPLET *r_iov; DAT_DTO_COOKIE cookie; DAT_CONN_QUAL conn_qual; DAT_BOOLEAN in, out; int i, ii, pdata, ctx, qdepth = REG_MEM_COUNT; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; /* make sure provider supports counters */ if ((counters) && (!counters_ok)) { printf("Disable dat_query_counters:" " Provider not built with counters\n"); counters = 0; } status = dat_pz_create(ia, &pz); _OK(status, "dat_pz_create"); status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &cr_evd); _OK(status, "dat_evd_create CR"); status = dat_evd_create(ia, eps * 2, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &con_evd); _OK(status, "dat_evd_create CR"); status = dat_evd_create(ia, eps * 10, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG, &dto_evd); _OK(status, "dat_evd_create DTO"); memset(&ep_attr, 0, sizeof(ep_attr)); if (ud_test) { msg_size += 40; ep_attr.service_type = DAT_IB_SERVICE_TYPE_UD; ep_attr.max_message_size = buf_size; ep_attr.max_rdma_read_in = 0; ep_attr.max_rdma_read_out = 0; } else { ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_rdma_size = 0x10000; ep_attr.max_rdma_read_in = 4; ep_attr.max_rdma_read_out = 4; } ep_attr.qos = 0; ep_attr.recv_completion_flags = 0; if (ud_test && !multi_eps) qdepth = eps * REG_MEM_COUNT; ep_attr.max_recv_dtos = qdepth; ep_attr.max_request_dtos = qdepth; ep_attr.max_recv_iov = 1; ep_attr.max_request_iov = 1; ep_attr.request_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; ep_attr.ep_transport_specific_count = 0; ep_attr.ep_transport_specific = NULL; ep_attr.ep_provider_specific_count = 0; ep_attr.ep_provider_specific = NULL; for (i = 0; i < eps; i++) { status = dat_ep_create(ia, pz, dto_evd, dto_evd, con_evd, &ep_attr, &ep[i]); _OK(status, "dat_ep_create"); LOGPRINTF(" create_ep[%d]=%p\n", i, ep[i]); } for (i = 0; i < REG_MEM_COUNT * eps; i++) { buf[i] = (DAT_RMR_TRIPLET *) malloc(buf_size); region.for_va = buf[i]; status = dat_lmr_create(ia, DAT_MEM_TYPE_VIRTUAL, region, buf_size, pz, DAT_MEM_PRIV_ALL_FLAG | DAT_IB_MEM_PRIV_REMOTE_ATOMIC, DAT_VA_TYPE_VA, &lmr[i], &lmr_context[i], &rmr_context[i], ®_size[i], ®_addr[i]); _OK(status, "dat_lmr_create"); } /* register atomic return buffer for original data */ atomic_buf = (DAT_UINT64 *) malloc(BUF_SIZE_ATOMIC); region.for_va = atomic_buf; status = dat_lmr_create(ia, DAT_MEM_TYPE_VIRTUAL, region, BUF_SIZE_ATOMIC, pz, DAT_MEM_PRIV_ALL_FLAG | DAT_IB_MEM_PRIV_REMOTE_ATOMIC, DAT_VA_TYPE_VA, &lmr_atomic, &lmr_atomic_context, &rmr_atomic_context, ®_atomic_size, ®_atomic_addr); _OK(status, "dat_lmr_create atomic"); for (ii = 0; ii < eps; ii++) { for (i = RECV_BUF_INDEX; i < REG_MEM_COUNT; i++) { int ep_idx = 0; cookie.as_64 = (ii * REG_MEM_COUNT) + i; iov.lmr_context = lmr_context[(ii * REG_MEM_COUNT) + i]; iov.virtual_address = (DAT_VADDR) (uintptr_t) buf[(ii * REG_MEM_COUNT) + i]; iov.segment_length = buf_size; LOGPRINTF(" post_recv buf[%d]=(%p) on ep[%d]=%p\n", (ii * REG_MEM_COUNT) + i, buf[(ii * REG_MEM_COUNT) + i], ii, ep[ii]); /* ep[0], unless multi EP's */ if (multi_eps) { ep_idx = ii; cookie.as_64 = i; } status = dat_ep_post_recv(ep[ep_idx], 1, &iov, cookie, DAT_COMPLETION_DEFAULT_FLAG); _OK(status, "dat_ep_post_recv"); } } /* setup receive buffer to initial string to be overwritten */ strcpy((char *)buf[RCV_RDMA_BUF_INDEX], "blah, blah, blah\n"); if (server) { /* Exchange info with client */ printf("%d Server - Client: waiting to snd addr\n", getpid()); if (send_server_params(ser_sa)) { printf("%d Failed to send server params\n", getpid()); return -1; } } /* ud can resolve_ah and connect both ways, same EP */ if (server || (!server && ud_test)) { if (server) { conn_qual = SERVER_ID; strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Server data"); } else { conn_qual = CLIENT_ID; strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client data"); } status = dat_psp_create(ia, conn_qual, cr_evd, DAT_PSP_CONSUMER_FLAG, &psp); _OK(status, "dat_psp_create"); /* Server always waits for first CR from Client */ if (server) process_cr(0); } /* ud can resolve_ah and connect both ways */ if (!server || (server && ud_test)) { struct addrinfo *target; if (ucm) goto no_resolution; if (getaddrinfo(hostname, NULL, NULL, &target) != 0) { printf("Error getting remote address.\n"); exit(1); } printf("Remote %s Name: %s \n", server ? "Client" : "Server", hostname); printf("Remote %s Net Address: %s\n", server ? "Client" : "Server", inet_ntoa(((struct sockaddr_in *) target->ai_addr)->sin_addr)); strcpy((char *)buf[SND_RDMA_BUF_INDEX], "Client written data"); remote_addr = (DAT_IA_ADDRESS_PTR)target->ai_addr; /* IP */ no_resolution: /* one Client EP, multiple Server EPs, same conn_qual * use private data to select EP on Server */ for (i = 0; i < eps; i++) { int ep_l = 0; /* pdata selects Server EP, * support both muliple Server and single EP's */ if (multi_eps) { if (!server) ep_l = i; pdata = hton32(i); } else pdata = 0; /* just use first EP */ status = dat_ep_connect(ep[ep_l], remote_addr, (server ? CLIENT_ID : SERVER_ID), CONN_TIMEOUT, 4, (DAT_PVOID) &pdata, 0, DAT_CONNECT_DEFAULT_FLAG); _OK(status, "dat_ep_connect"); printf("%s EP_L[%d]=%p connect to EP_R[%d]\n", server ? "Server" : "Client", ep_l, ep[ep_l], ntoh32(pdata)); } if (!ucm) freeaddrinfo(target); } /* UD: process CR's starting with 2nd on server, 1st for client */ if (ud_test) { for (i = (server ? 1 : 0); i < eps; i++) process_cr(i); } /* RC and UD: process CONN EST events */ for (i = 0; i < eps; i++) process_conn(i); /* UD: CONN EST events for CONN's and CR's */ if (ud_test) { for (i = 0; i < eps; i++) process_conn(i); } printf("Connected! %d endpoints\n", eps); /* * Setup our remote memory and tell the other side about it * Swap to network order. */ r_iov = (DAT_RMR_TRIPLET *) buf[SEND_BUF_INDEX]; r_iov->rmr_context = hton32(rmr_context[RCV_RDMA_BUF_INDEX]); r_iov->virtual_address = hton64((DAT_VADDR) (uintptr_t) buf[RCV_RDMA_BUF_INDEX]); r_iov->segment_length = hton32(buf_size); printf("Send RMR message: r_key_ctx=0x%x,va=" F64x ",len=0x%x\n", hton32(r_iov->rmr_context), hton64(r_iov->virtual_address), hton32(r_iov->segment_length)); send_msg(buf[SEND_BUF_INDEX], sizeof(DAT_RMR_TRIPLET), lmr_context[SEND_BUF_INDEX], cookie, DAT_COMPLETION_SUPPRESS_FLAG); dat_ep_get_status(ep[0], NULL, &in, &out); printf("EP[0] status: posted buffers: Req=%d, Rcv=%d\n", in, out); /* * Wait for their RMR */ for (i = 0, ctx = 0; i < eps; i++, ctx++) { /* expected cookie, recv buf idx in every mem pool */ ctx = (ctx % REG_MEM_COUNT) ? ctx : ctx + RECV_BUF_INDEX; LOGPRINTF("Waiting for remote to send RMR data\n"); status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait for receive message"); if ((event.event_number != DAT_DTO_COMPLETION_EVENT) && (ud_test && event.event_number != DAT_IB_DTO_EVENT)) { printf("unexpected event waiting for RMR context " "- 0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status for post_recv"); /* * multi_eps - receive multi messages on single EP * !mutli_eps - receive one message across multiple EPs */ if (!multi_eps) { if (dto_event->transfered_length != msg_size || dto_event->user_cookie.as_64 != ctx) { printf("unexpected event data on recv: len=%d" " cookie=" F64x " expected %d/%d\n", (int)dto_event->transfered_length, dto_event->user_cookie.as_64, msg_size, ctx); exit(1); } } else { if (dto_event->transfered_length != msg_size || dto_event->user_cookie.as_64 != RECV_BUF_INDEX) { printf("unexpected event data on recv: len=%d" " cookie=" F64x " expected %d/%d\n", (int)dto_event->transfered_length, dto_event->user_cookie.as_64, msg_size, RECV_BUF_INDEX); exit(1); } } /* swap RMR,address info to host order */ if (!multi_eps) r_iov = (DAT_RMR_TRIPLET *) buf[ctx]; else r_iov = (DAT_RMR_TRIPLET *) buf[((i * REG_MEM_COUNT) + RECV_BUF_INDEX)]; if (ud_test) r_iov = (DAT_RMR_TRIPLET *) ((char *)r_iov + 40); r_iov->rmr_context = ntoh32(r_iov->rmr_context); r_iov->virtual_address = ntoh64(r_iov->virtual_address); r_iov->segment_length = ntoh32(r_iov->segment_length); printf("Recv RMR message: buf[%d] r_iov(%p):" " r_key_ctx=%x,va=" F64x "," " len=0x%x on EP=%p ck=" F64x " \n", multi_eps ? ((i * REG_MEM_COUNT) + RECV_BUF_INDEX):ctx, r_iov, r_iov->rmr_context, r_iov->virtual_address, r_iov->segment_length, dto_event->ep_handle, dto_event->user_cookie.as_64); } return (0); } int disconnect_ep(void) { DAT_RETURN status; DAT_EVENT event; DAT_COUNT nmore; int i, ii; if (counters) { /* examples of query and print */ int ii; DAT_UINT64 ia_cntrs[DCNT_IA_ALL_COUNTERS]; dat_query_counters(ia, DCNT_IA_ALL_COUNTERS, ia_cntrs, 0); printf(" IA Cntrs:"); for (ii = 0; ii < DCNT_IA_ALL_COUNTERS; ii++) printf(" " F64u "", ia_cntrs[ii]); printf("\n"); dat_print_counters(ia, DCNT_IA_ALL_COUNTERS, 0); } if (!ud_test) { status = dat_ep_disconnect(ep[0], DAT_CLOSE_DEFAULT); _OK2(status, "dat_ep_disconnect"); status = dat_evd_wait(con_evd, DAT_TIMEOUT_INFINITE, 1, &event, &nmore); _OK(status, "dat_evd_wait"); } if (psp) { status = dat_psp_free(psp); _OK2(status, "dat_psp_free"); } for (i = 0; i < REG_MEM_COUNT * eps; i++) { status = dat_lmr_free(lmr[i]); _OK2(status, "dat_lmr_free"); } if (lmr_atomic) { status = dat_lmr_free(lmr_atomic); _OK2(status, "dat_lmr_free_atomic"); } for (i = 0; i < eps; i++) { if (counters) { /* examples of query and print */ int ii; DAT_UINT64 ep_cntrs[DCNT_EP_ALL_COUNTERS]; dat_query_counters(ep[i], DCNT_EP_ALL_COUNTERS, ep_cntrs, 0); printf(" EP[%d] Cntrs:", i); for (ii = 0; ii < DCNT_EP_ALL_COUNTERS; ii++) printf(" " F64u "", ep_cntrs[ii]); printf("\n"); dat_print_counters(ep[i], DCNT_EP_ALL_COUNTERS, 0); } /* free UD AH resources */ if (ia_attr.extension_version >= 209) { for (ii = 0; ii < MAX_AH_COUNT; ii++) { if (remote_ah[i][ii].ah) { printf( "UD_AH_FREE on EP %p, AH EP[%d][%d]" "ib_ah = %p\n", ep[i], i, ii, remote_ah[i][ii].ah); dat_ib_ud_ah_free(ep[i], &remote_ah[i][ii]); } remote_ah[i][ii].ah = NULL; } } status = dat_ep_free(ep[i]); _OK2(status, "dat_ep_free"); } if (counters) { /* examples of query and print */ int ii; DAT_UINT64 evd_cntrs[DCNT_EVD_ALL_COUNTERS]; dat_query_counters(dto_evd, DCNT_EVD_ALL_COUNTERS, evd_cntrs, 0); printf(" DTO_EVD Cntrs:"); for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++) printf(" " F64u "", evd_cntrs[ii]); printf("\n"); dat_print_counters(dto_evd, DCNT_EVD_ALL_COUNTERS, 0); dat_query_counters(con_evd, DCNT_EVD_ALL_COUNTERS, evd_cntrs, 0); printf(" CONN_EVD Cntrs:"); for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++) printf(" " F64u "", evd_cntrs[ii]); printf("\n"); dat_print_counters(con_evd, DCNT_EVD_ALL_COUNTERS, 0); dat_query_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, evd_cntrs, 0); printf(" CR_EVD Cntrs:"); for (ii = 0; ii < DCNT_EVD_ALL_COUNTERS; ii++) printf(" " F64u "", evd_cntrs[ii]); printf("\n"); dat_print_counters(cr_evd, DCNT_EVD_ALL_COUNTERS, 0); } status = dat_evd_free(dto_evd); _OK2(status, "dat_evd_free DTO"); status = dat_evd_free(con_evd); _OK2(status, "dat_evd_free CON"); status = dat_evd_free(cr_evd); _OK2(status, "dat_evd_free CR"); status = dat_pz_free(pz); _OK2(status, "dat_pz_free"); status = dat_ia_close(ia, DAT_CLOSE_DEFAULT); _OK2(status, "dat_ia_close"); return (0); } int do_immediate() { DAT_EVENT event; DAT_COUNT nmore; DAT_LMR_TRIPLET iov; DAT_RMR_TRIPLET r_iov; DAT_DTO_COOKIE cookie; DAT_RETURN status; DAT_UINT32 immed_data; DAT_UINT32 immed_data_recv = 0; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0]; printf("\nDoing RDMA WRITE IMMEDIATE DATA\n"); if (server) { immed_data = 0x1111; } else { immed_data = 0x7777; } cookie.as_64 = 0x5555; /* RMR info already swapped back to host order in connect_ep */ r_iov = *buf[RECV_BUF_INDEX]; iov.lmr_context = lmr_context[SND_RDMA_BUF_INDEX]; iov.virtual_address = (DAT_VADDR) (uintptr_t) buf[SND_RDMA_BUF_INDEX]; iov.segment_length = buf_size; cookie.as_64 = 0x9999; status = dat_ib_post_rdma_write_immed(ep[0], // ep_handle 1, // segments &iov, // LMR cookie, // user_cookie &r_iov, // RMR immed_data, DAT_COMPLETION_DEFAULT_FLAG); _OK(status, "dat_ib_post_rdma_write_immed"); /* * Collect first event, write completion or inbound recv with immed */ status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait after dat_ib_post_rdma_write"); if (event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event #0x%x waiting for WR-IMMED #0x%x\n", event.event_number, DAT_IB_DTO_EVENT); exit(1); } if (nmore) printf("%s() nmore %d\n", __FUNCTION__, nmore); _OK(dto_event->status, "DTO event status"); if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) { if ((dto_event->transfered_length != buf_size) || (dto_event->user_cookie.as_64 != 0x9999)) { printf ("unexpected event data for rdma_write_immed: len=%d " "cookie=0x%x\n", (int)dto_event->transfered_length, (int)dto_event->user_cookie.as_64); exit(1); } } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) { if ((dto_event->transfered_length != buf_size) || (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) { printf ("unexpected event data of immediate write: len=%d " "cookie=" F64x " expected %d/%d\n", (int)dto_event->transfered_length, dto_event->user_cookie.as_64, (int)sizeof(int), RECV_BUF_INDEX + 1); exit(1); } /* get immediate data from event */ immed_data_recv = ext_event->val.immed.data; } else { printf("unexpected extension type for event - 0x%x, 0x%x\n", event.event_number, ext_event->type); exit(1); } /* * Collect second event, write completion or inbound recv with immed */ status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait after dat_ib_post_rdma_write"); if (event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event # waiting for WR-IMMED - 0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status"); if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED) { if ((dto_event->transfered_length != buf_size) || (dto_event->user_cookie.as_64 != 0x9999)) { printf ("unexpected event data for rdma_write_immed: len=%d " "cookie=0x%x\n", (int)dto_event->transfered_length, (int)dto_event->user_cookie.as_64); exit(1); } } else if (ext_event->type == DAT_IB_RDMA_WRITE_IMMED_DATA) { if ((dto_event->transfered_length != buf_size) || (dto_event->user_cookie.as_64 != RECV_BUF_INDEX + 1)) { printf ("unexpected event data of immediate write: len=%d " "cookie=" F64x " expected %d/%d\n", (int)dto_event->transfered_length, dto_event->user_cookie.as_64, (int)sizeof(int), RECV_BUF_INDEX + 1); exit(1); } /* get immediate data from event */ immed_data_recv = ext_event->val.immed.data; } else { printf("unexpected extension type for event - 0x%x, 0x%x\n", event.event_number, ext_event->type); exit(1); } if ((server) && (immed_data_recv != 0x7777)) { printf("ERROR: Server: unexpected imm_data_recv 0x%x/0x%x\n", 0x7777, immed_data_recv); exit(1); } else if ((!server) && (immed_data_recv != 0x1111)) { printf("ERROR: Client: unexpected imm_data_recv 0x%x/0x%x\n", 0x1111, immed_data_recv); exit(1); } if (server) printf("Server received immed_data=0x%x\n", immed_data_recv); else printf("Client received immed_data=0x%x\n", immed_data_recv); printf("rdma buffer %p contains: %s\n", buf[RCV_RDMA_BUF_INDEX], (char *)buf[RCV_RDMA_BUF_INDEX]); printf("\n RDMA_WRITE_WITH_IMMEDIATE_DATA test - PASSED\n"); return (0); } int do_cmp_swap() { DAT_DTO_COOKIE cookie; DAT_RETURN status; DAT_EVENT event; DAT_COUNT nmore; DAT_LMR_TRIPLET l_iov; DAT_RMR_TRIPLET r_iov; volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX]; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0]; printf("\nDoing CMP and SWAP\n"); /* RMR info already swapped back to host order in connect_ep */ r_iov = *buf[RECV_BUF_INDEX]; l_iov.lmr_context = lmr_atomic_context; l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf; l_iov.segment_length = BUF_SIZE_ATOMIC; cookie.as_64 = 3333; if (server) { *target = 0x12345; sleep(1); /* Server does not compare and should not swap */ printf("dtx svr - starting cmp_swap\n"); status = dat_ib_post_cmp_and_swap(ep[0], (DAT_UINT64) 0x654321, (DAT_UINT64) 0x6789A, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); printf("dtx svr - done cmp_swap, chk status\n"); } else { *target = 0x54321; sleep(1); printf("dtx cli - starting cmp_swap\n"); /* Client does compare and should swap */ status = dat_ib_post_cmp_and_swap(ep[0], (DAT_UINT64) 0x12345, (DAT_UINT64) 0x98765, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); printf("dtx cli - done cmp_swap, chk status\n"); } _OK(status, "dat_ib_post_cmp_and_swap"); status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait for compare and swap"); if (event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event after post_cmp_and_swap: 0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status for CMP and SWAP"); if (ext_event->type != DAT_IB_CMP_AND_SWAP) { printf("unexpected event data of cmp_swap: type=%d cookie=%d " "original " F64x "\n", (int)ext_event->type, (int)dto_event->user_cookie.as_64, *atomic_buf); exit(1); } sleep(2); /* wait for other side to complete swap */ if (server) { printf("Server got original data = " F64x ", expected " "0x54321\n", *atomic_buf); printf("Client final result (on Server) = " F64x ", expected " "0x98765\n", *target); if (*atomic_buf != 0x54321 || *target != 0x98765) { printf("ERROR: Server CMP_SWAP\n"); exit(1); } } else { printf("Client got original data = " F64x ", expected " "0x12345\n", *atomic_buf); printf("Server final result (on Client) = 0x" F64x ", expected " "0x54321\n", *target); if (*atomic_buf != 0x12345 || *target != 0x54321) { printf("ERROR: Client CMP_SWAP\n"); exit(1); } } printf("\n CMP_SWAP test - PASSED\n"); return (0); } int do_fetch_add() { DAT_DTO_COOKIE cookie; DAT_RETURN status; DAT_EVENT event; DAT_COUNT nmore; DAT_LMR_TRIPLET l_iov; DAT_RMR_TRIPLET r_iov; volatile DAT_UINT64 *target = (DAT_UINT64 *) buf[RCV_RDMA_BUF_INDEX]; DAT_DTO_COMPLETION_EVENT_DATA *dto_event = &event.event_data.dto_completion_event_data; DAT_IB_EXTENSION_EVENT_DATA *ext_event = (DAT_IB_EXTENSION_EVENT_DATA *) & event.event_extension_data[0]; printf("\nDoing FETCH and ADD\n"); /* RMR info already swapped back to host order in connect_ep */ r_iov = *buf[RECV_BUF_INDEX]; l_iov.lmr_context = lmr_atomic_context; l_iov.virtual_address = (DAT_UINT64) (uintptr_t) atomic_buf; l_iov.segment_length = BUF_SIZE_ATOMIC; cookie.as_64 = 0x7777; if (server) { /* Wait for Client to finish cmp_swap */ while (*target != 0x98765) sleep(1); *target = 0x10; sleep(1); status = dat_ib_post_fetch_and_add(ep[0], (DAT_UINT64) 0x100, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); } else { /* Wait for Server, no swap so nothing to check */ *target = 0x100; sleep(1); status = dat_ib_post_fetch_and_add(ep[0], (DAT_UINT64) 0x10, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); } _OK(status, "dat_ib_post_fetch_and_add"); status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait for fetch and add"); if (event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event after post_fetch_and_add: 0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status for FETCH and ADD"); if (ext_event->type != DAT_IB_FETCH_AND_ADD) { printf("unexpected event data of fetch and add : type=%d " "cookie=%d original%d\n", (int)ext_event->type, (int)dto_event->user_cookie.as_64, (int)*atomic_buf); exit(1); } if (server) { printf("Client original data (on Server) = " F64x ", expected " "0x100\n", *atomic_buf); } else { printf("Server original data (on Client) = " F64x ", expected " "0x10\n", *atomic_buf); } sleep(1); if (server) { status = dat_ib_post_fetch_and_add(ep[0], (DAT_UINT64) 0x100, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); } else { status = dat_ib_post_fetch_and_add(ep[0], (DAT_UINT64) 0x10, &l_iov, cookie, &r_iov, DAT_COMPLETION_DEFAULT_FLAG); } status = dat_evd_wait(dto_evd, DTO_TIMEOUT, 1, &event, &nmore); _OK(status, "dat_evd_wait for second fetch and add"); if (event.event_number != DAT_IB_DTO_EVENT) { printf("unexpected event after second post_fetch_and_add: " "0x%x\n", event.event_number); exit(1); } _OK(dto_event->status, "event status for second FETCH and ADD"); if (ext_event->type != DAT_IB_FETCH_AND_ADD) { printf("unexpected event data of second fetch and add : " "type=%d cookie=%d original%p\n", (int)ext_event->type, (int)dto_event->user_cookie.as_64, atomic_buf); exit(1); } sleep(1); /* wait for other side to complete fetch_add */ if (server) { printf("Server got original data = " F64x ", expected " "0x200\n", *atomic_buf); printf("Client final result (on Server) = " F64x ", expected " "0x30\n", *target); if (*atomic_buf != 0x200 || *target != 0x30) { printf("ERROR: Server FETCH_ADD\n"); exit(1); } } else { printf("Server side original data = " F64x ", expected " "0x20\n", *atomic_buf); printf("Server final result (on Client) = " F64x ", expected " "0x300\n", *target); if (*atomic_buf != 0x20 || *target != 0x300) { printf("ERROR: Server FETCH_ADD\n"); exit(1); } } printf("\n FETCH_ADD test - PASSED\n"); return (0); } int main(int argc, char **argv) { int i, rc; DAT_RETURN status; /* parse arguments */ while ((rc = getopt(argc, argv, "csvumpU:h:b:P:")) != -1) { switch (rc) { case 'u': ud_test = 1; eps = 4; break; case 'm': multi_eps = 1; break; case 'c': server = 0; break; case 's': server = 1; break; case 'p': counters = 1; break; case 'h': remote_host = 1; strcpy(hostname, optarg); break; case 'b': buf_size = atoi(optarg); break; case 'U': ud_test = 1; eps = MIN(atoi(optarg), MAX_EP_COUNT); break; case 'P': strcpy(provider, optarg); break; case 'v': verbose = 1; break; default: print_usage(); exit(-12); } } #if defined(_WIN32) || defined(_WIN64) { WSADATA wsaData; int i; i = WSAStartup(MAKEWORD(2, 2), &wsaData); if (i != 0) { printf("%s WSAStartup(2.2) fail? (0x%x)\n", argv[0], i); fflush(stdout); exit(1); } } #endif status = dat_ia_open(provider, 8, &async_evd, &ia); _OK(status, "dat_ia_open"); memset(&prov_attrs, 0, sizeof(prov_attrs)); status = dat_ia_query(ia, NULL, DAT_IA_FIELD_ALL, &ia_attr, DAT_PROVIDER_FIELD_ALL, &prov_attrs); _OK(status, "dat_ia_query"); if (ia_attr.extension_supported != DAT_EXTENSION_IB) { printf("%d ERROR: IB extension not supported\n", getpid()); exit(1); } print_ia_address(ia_attr.ia_address_ptr); /* Print provider specific attributes */ for (i = 0; i < prov_attrs.num_provider_specific_attr; i++) { LOGPRINTF(" Provider Specific Attribute[%d] %s=%s\n", i, prov_attrs.provider_specific_attr[i].name, prov_attrs.provider_specific_attr[i].value); rc = strcmp(prov_attrs.provider_specific_attr[i].name, "DAT_COUNTERS"); if (!rc) counters_ok = 1; } /* for non UD tests, -h is always client */ if (remote_host && !ud_test) server = 0; if (!server) { printf("%d Client: waiting for server input\n", getpid()); if (get_server_params(ia_attr.ia_address_ptr)) { printf("%d Failed to get server parameters\n", getpid()); exit(1); } printf("\nRunning as Client - %s %s %d endpoint(s) v%d\n", provider, ud_test ? "UD test" : "", eps, ia_attr.extension_version); } else { printf("\nRunning as Server - %s %s %d endpoint(s) v%d\n", provider, ud_test ? "UD test" : "", eps, ia_attr.extension_version); } /* * connect */ if (connect_ep(hostname, ia_attr.ia_address_ptr)) { _WSACleanup(); exit(1); } if (!ud_test) { if (do_immediate()) { _WSACleanup(); exit(1); } if (do_cmp_swap()) { _WSACleanup(); exit(1); } if (do_fetch_add()) { _WSACleanup(); exit(1); } } rc = disconnect_ep(); dat_ia_close(ia, DAT_CLOSE_DEFAULT); _WSACleanup(); if (!rc) printf("\n IB extension test - %s test PASSED\n\n", ud_test ? "UD" : "immed/atomic"); return rc; }